API-Dokumentation

Für Agenturen und Organisationen mit eigener Software: Schicken Sie Anfragen direkt per API, ohne das Formular. Es gelten dieselben Regeln wie im Formular; geprüfte Druckereien und Lettershops geben ihre Angebote wie gewohnt ab.

Erste Schritte

  1. Melden Sie sich an oder legen Sie ein Konto an und erzeugen Sie unter API-Zugang einen Schlüssel.
  2. Schicken Sie den Schlüssel bei jedem Aufruf im Header „Authorization“ mit.
  3. Legen Sie eine Anfrage an. Sie gehört sofort Ihrem Konto und erscheint auch unter „Meine Anfragen“.
Basis-URL
https://mailingbid.com/api/v1
Anmeldung
Authorization: Bearer mb_live_…
Format
JSON (UTF-8), Datumswerte als JJJJ-MM-TT
Grenzen
120 Aufrufe pro Minute und Schlüssel; 60 neue Anfragen pro Stunde und Konto

Behandeln Sie den Schlüssel wie ein Passwort: nur auf dem Server, nie im Browser oder in einer App. Ein Schlüssel lässt sich jederzeit widerrufen.

Endpunkte

MethodePfadZweck
POST/api/v1/requestsAnfrage anlegen
GET/api/v1/requestsAlle Anfragen Ihres Kontos
GET/api/v1/requests/{id}Eine Anfrage mit Teilen, Ländern und veröffentlichten Angeboten
PATCH/api/v1/requests/{id}Details einer Anfrage ergänzen oder ändern
GET/api/v1/catalogueErlaubte Werte (Teile, Formate, Länder); ohne Schlüssel abrufbar

Anfrage anlegen

Pflicht sind mindestens ein Land mit Menge (tranches) und mindestens ein Teil (positions). Alles andere ist optional und lässt sich später ergänzen.

Ohne Angabe gelten dieselben Vorgaben wie im Formular: Titel aus dem Auflieferdatum, Angebotsfrist in 5 Werktagen, Leistungen Produktion, Lettershop und Auflieferung. Kontaktdaten und Sprache kommen aus Ihrem Konto. Die Antwort ist 201 mit der gespeicherten Anfrage.

Für Anfragen über die API gelten unsere AGB.

curl -X POST https://mailingbid.com/api/v1/requests \
  -H "Authorization: Bearer $MAILINGBID_API_KEY" \
  -H "Content-Type: application/json" \
  --data @anfrage.json

Beispiel: anfrage.json

{
  "title": "Frühjahrsmailing 2027",
  "defaultPostingDate": "2027-03-12",
  "tranches": [
    {
      "country": "AT",
      "quantity": 30000
    },
    {
      "country": "CZ",
      "quantity": 10000,
      "postProduct": "standard"
    }
  ],
  "positions": [
    {
      "type": "envelope",
      "format": "C6/5",
      "paperGsm": 80,
      "spec": {
        "window": "left"
      }
    },
    {
      "type": "letter",
      "format": "A4",
      "colors": "4/4",
      "spec": {
        "fold": "wrap_dl",
        "personalization": "address"
      }
    },
    {
      "type": "payment_slip",
      "spec": {
        "standards": {
          "AT": "at_sepa",
          "CZ": "cz_pk_a"
        },
        "execution": "attached"
      }
    }
  ],
  "serviceScope": [
    "production",
    "lettershop",
    "posting"
  ],
  "contractingParty": "agency",
  "onBehalfOf": "Organisation A",
  "iso27001Required": false
}

Antwort (gekürzt)

{
  "request": {
    "id": 123,
    "status": "received",
    "title": "…",
    "offerDeadline": "2027-01-15",
    "serviceScope": ["production", "lettershop", "posting"],
    "url": "https://mailingbid.com/anfragen/123",
    …
  },
  "tranches": [{ "id": 401, "country": "AT", "quantity": 30000, … }],
  "positions": [{ "id": 901, "type": "envelope", "format": "C6/5", … }],
  "offers": [],
  "files": [],
  "decision": null,
  "details": { "editable": true, "lock": null }
}

Felder der Anfrage

FeldPflichtBeschreibung
tranchesjaListe der Länder mit Menge, 1 bis 50 Einträge.
positionsjaListe der Teile, 1 bis 30 Einträge, mindestens eines nicht beigestellt.
titleneinEigener Titel, 3 bis 200 Zeichen.
defaultPostingDateneinGemeinsames Auflieferdatum.
offerDeadlineneinAngebote bis; frühestens 3 Werktage nach heute.
serviceScopeneinGewünschte Leistungen: production, lettershop, posting.
postingAtneinLand der Auflieferung, falls nicht jeweils im Zielland.
contractingPartyneinVertragspartner: ngo, agency oder company.
onBehalfOfneinPflicht bei agency: für wen Sie anfragen. Anbieter sehen es erst nach der Vergabe.
paymentTermsneinGewünschtes Zahlungsziel, frei formuliert.
iso27001Requiredneintrue: nur Anbieter mit ISO-27001-Zertifizierung anfragen.
notesneinHinweise zur Ausführung, bis 4000 Zeichen. Bitte keine Adress- oder Spenderdaten.
contactNameneinAnsprechperson; Standard: Name Ihres Kontos.
contactEmailneinE-Mail der Ansprechperson; Standard: E-Mail Ihres Kontos. Bestätigungen gehen immer an Ihr Konto.
contactOrganizationneinOrganisation; Standard: aus Ihrem Konto.
contactPhoneneinTelefon; Standard: aus Ihrem Konto.
localeneinSprache der E-Mails: de, cs oder en; Standard: Sprache Ihres Kontos.

Länder und Mengen (tranches)

FeldBeschreibung
countryZielland, ISO-Code mit zwei Buchstaben (Pflicht).
quantityMenge (Pflicht).
postingDateEigenes Auflieferdatum, sonst das gemeinsame.
graphicVariantsAnzahl Grafikvarianten, Standard 1.
postProductPostprodukt; leer: der Anbieter schlägt eines vor.
codeIhr eigenes Kürzel, eindeutig je Anfrage; Anbieter sehen es nicht.
returnAddressRücksendeadresse für Retouren; Anbieter sehen sie erst nach der Vergabe.

Teile des Mailings (positions)

FeldBeschreibung
typeArt des Teils (Pflicht), siehe Werte unten.
labelEigene Bezeichnung, z. B. „Kugelschreiber blau“.
formatFormat aus der Liste des Typs; custom für ein eigenes Maß.
formatMmNur bei custom: Breite×Höhe in mm, z. B. 210x297.
paperGsmPapiergewicht in g/m² im Bereich des Typs.
colorsFarbigkeit, z. B. 4/4; special für eine Sonderfarbe.
piecesPerMailingStück je Mailing, Standard 1.
suppliedByCustomertrue: Sie stellen dieses Teil selbst bei.
trancheScopeNur für bestimmte Länder: Indizes in tranches (ab 0); fehlt es, gilt das Teil für alle.
detailsWeitere Angaben, bis 2000 Zeichen.
specAngaben je Typ, siehe Werte unten. Unbekannte Schlüssel werden abgelehnt.

Zahlscheine haben kein Format, Papier oder Farbe: Das folgt aus dem Standard des Landes. Der Server lehnt solche Angaben ab.

Anfragen und Angebote abrufen

GET /api/v1/requests liefert alle Anfragen Ihres Kontos mit Status und Zahl der veröffentlichten Angebote. GET /api/v1/requests/ID liefert eine Anfrage vollständig.

curl https://mailingbid.com/api/v1/requests \
  -H "Authorization: Bearer $MAILINGBID_API_KEY"

Angebote erscheinen, sobald wir sie veröffentlicht haben: mit Anbieter, abgedeckten Teilen und Ländern, der Ausführung je Teil (positionConformity: wie angefragt oder abweichend, mit Beschreibung), Preiszeilen nach Art (Gesamtpreis ohne Porto oder Preis je Teil, Porto getrennt), der Portoaussage (postageStatement: separate oder not_offered), Gesamtsumme, Gültigkeit, Preisgleitklausel, Zahlungsbedingungen, Inklusivleistungen und Anmerkungen. Bei älteren Angeboten sind positionConformity und postageStatement null. Beträge sind in Cent; EUR und CZK werden nie zusammengezählt. Mehrere Angebote eines Anbieters sind Varianten: variantLabel nennt den Namen der Alternative (null beim ersten Angebot), variantGroup ist bei allen Angeboten desselben Anbieters dieselbe Zahl (null bei von uns erfassten Angeboten). Bei der Auswahl ist je Anbieter nur eine Variante möglich.

Status einer Anfrage:

  • received – eingegangen
  • in_progress – in Bearbeitung, Angebote werden eingeholt
  • offers_available – Angebote liegen vor
  • closed – entschieden

Die Auswahl der Angebote ist verbindlich und erfolgt deshalb im Browser unter der Anfrage-URL (Feld url).

Details ergänzen

PATCH /api/v1/requests/ID nimmt dieselben Felder wie beim Anlegen, alle optional: Fehlt ein Feld, bleibt es unverändert; null leert es.

curl -X PATCH https://mailingbid.com/api/v1/requests/123 \
  -H "Authorization: Bearer $MAILINGBID_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{ "paymentTerms": "30", "notes": "…" }'

tranches und positions werden als Ganzes ersetzt und immer zusammen geschickt. Bestehende Einträge behalten ihre id: Schicken Sie die id mit, um einen Eintrag zu ändern; ohne id entsteht ein neuer, fehlende werden gelöscht.

Ändern geht, solange die Anfrage eingegangen oder in Bearbeitung ist und noch kein Angebot veröffentlicht wurde; danach antwortet der Server mit 409 details_locked.

Erlaubte Werte

Dieselben Werte liefert GET /api/v1/catalogue als JSON.

typeformatpaperGsmspec
envelope · KuvertDL, C6/5, C6, C5, C4, B4, custom70–120window: none | left | rightclosure: wet | peel | selfinnerPrint: booleanspecialColor: text
letter · BriefA4, A5, custom40–400pages: one_sided | two_sided | two_sheets | four_pagesfold: wrap_dl | single_a5 | none | crosspersonalization: none | address | variable_text | variable_text_imagespecialColor: text
payment_slip · Zahlschein––standards: object: country -> standardexecution: attached | separate | qr_onlyprefill: reference | donor | amountqrCode: boolean
postcard · Postkarte / AntwortkarteA6, DL, MAXI, custom40–400replyMail: booleanfinishing: none | dispersion | uv | cello_matt | cello_glosspersonalization: none | senderspecialColor: text
certificate · UrkundeA4, A5, custom40–400finishing: none | embossing | hot_foilpersonalizedName: booleanspecialColor: text
tax_receipt · SpendenbestätigungA4, A540–400specialColor: text
insert · Beilage / FlyerDL, A6, A5, custom40–400fold: none | single | wrap | zigzagspecialColor: text
promo_item · Werbeartikel––article: textlengthMm: numberwidthMm: numberheightMm: numberweightG: numbermaterial: textbranding: none | print_1c | print_4c | engravingpackaging: loose | polybag | gluedsourcing: supplied | sourced
other · Sonstiges–––
colors
4/0, 4/4, 1/0, 1/1, special
serviceScope
production, lettershop, posting
contractingParty
ngo, agency, company
postProduct
standard, sponsoring_mail (AT), info_mail, euro_mail, postaim (IE), charity_acquisition_post (IE), other
spec.standards
at_sepa (AT), at_donation (AT), de_donation (DE), de_sepa (DE), cz_pk_a (CZ), sk_poukaz (SK), qr_only
country
AT, CZ, SK, DE, PL, BE, BG, HR, CY, DK, EE, FI, FR, GR, HU, IE, IT, LV, LT, LU, MT, NL, PT, RO, SI, ES, SE, IS, LI, NO, CH

Fehler

Fehler kommen mit passendem HTTP-Status und einem stabilen Code in data.code. Bei validation_error steht unter data.issues, welches Feld nicht passt.

{
  "statusCode": 400,
  "statusMessage": "…",
  "data": {
    "code": "validation_error",
    "issues": { "fieldErrors": { "tranches": ["…"] } }
  }
}
data.codeBeschreibung
validation_errorEin Feld fehlt oder hat einen ungültigen Wert (400).
offer_deadline_too_earlyDie Angebotsfrist ist weniger als 3 Werktage entfernt; data.earliest nennt das früheste Datum (400).
api_key_invalidSchlüssel fehlt, ist falsch oder widerrufen (401).
forbiddenDie Anfrage gibt es nicht oder sie gehört nicht zu Ihrem Konto (403).
details_lockedDie Anfrage kann nicht mehr geändert werden (409).
invalid_details_referenceEine id gehört nicht zu dieser Anfrage (400).
body_too_largeDer JSON-Body ist größer als 1 MB; data.maxBytes nennt die Grenze (413).
rate_limitedZu viele Aufrufe; bitte später erneut versuchen (429).

Gut zu wissen

  • Dateien (z. B. Druckdaten-Muster) laden Sie über die Detailseite der Anfrage im Browser hoch.
  • Die verbindliche Auswahl eines Angebots treffen Sie im Browser.
  • Die Eingangsbestätigung jeder Anfrage geht an die E-Mail-Adresse Ihres Kontos, auch wenn Sie eine andere Kontaktadresse angeben.
  • Anbieter sehen bis zur Vergabe weder Ihren Namen noch Ihre Organisation oder Kontaktdaten.

Lieber ohne Programmierung? Nutzen Sie das Anfrageformular.