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
- Melden Sie sich an oder legen Sie ein Konto an und erzeugen Sie unter API-Zugang einen Schlüssel.
- Schicken Sie den Schlüssel bei jedem Aufruf im Header „Authorization“ mit.
- 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
| Methode | Pfad | Zweck |
|---|---|---|
POST | /api/v1/requests | Anfrage anlegen |
GET | /api/v1/requests | Alle 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/catalogue | Erlaubte 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.jsonBeispiel: 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
| Feld | Pflicht | Beschreibung |
|---|---|---|
tranches | ja | Liste der Länder mit Menge, 1 bis 50 Einträge. |
positions | ja | Liste der Teile, 1 bis 30 Einträge, mindestens eines nicht beigestellt. |
title | nein | Eigener Titel, 3 bis 200 Zeichen. |
defaultPostingDate | nein | Gemeinsames Auflieferdatum. |
offerDeadline | nein | Angebote bis; frühestens 3 Werktage nach heute. |
serviceScope | nein | Gewünschte Leistungen: production, lettershop, posting. |
postingAt | nein | Land der Auflieferung, falls nicht jeweils im Zielland. |
contractingParty | nein | Vertragspartner: ngo, agency oder company. |
onBehalfOf | nein | Pflicht bei agency: für wen Sie anfragen. Anbieter sehen es erst nach der Vergabe. |
paymentTerms | nein | Gewünschtes Zahlungsziel, frei formuliert. |
iso27001Required | nein | true: nur Anbieter mit ISO-27001-Zertifizierung anfragen. |
notes | nein | Hinweise zur Ausführung, bis 4000 Zeichen. Bitte keine Adress- oder Spenderdaten. |
contactName | nein | Ansprechperson; Standard: Name Ihres Kontos. |
contactEmail | nein | E-Mail der Ansprechperson; Standard: E-Mail Ihres Kontos. Bestätigungen gehen immer an Ihr Konto. |
contactOrganization | nein | Organisation; Standard: aus Ihrem Konto. |
contactPhone | nein | Telefon; Standard: aus Ihrem Konto. |
locale | nein | Sprache der E-Mails: de, cs oder en; Standard: Sprache Ihres Kontos. |
Länder und Mengen (tranches)
| Feld | Beschreibung |
|---|---|
country | Zielland, ISO-Code mit zwei Buchstaben (Pflicht). |
quantity | Menge (Pflicht). |
postingDate | Eigenes Auflieferdatum, sonst das gemeinsame. |
graphicVariants | Anzahl Grafikvarianten, Standard 1. |
postProduct | Postprodukt; leer: der Anbieter schlägt eines vor. |
code | Ihr eigenes Kürzel, eindeutig je Anfrage; Anbieter sehen es nicht. |
returnAddress | Rücksendeadresse für Retouren; Anbieter sehen sie erst nach der Vergabe. |
Teile des Mailings (positions)
| Feld | Beschreibung |
|---|---|
type | Art des Teils (Pflicht), siehe Werte unten. |
label | Eigene Bezeichnung, z. B. „Kugelschreiber blau“. |
format | Format aus der Liste des Typs; custom für ein eigenes Maß. |
formatMm | Nur bei custom: Breite×Höhe in mm, z. B. 210x297. |
paperGsm | Papiergewicht in g/m² im Bereich des Typs. |
colors | Farbigkeit, z. B. 4/4; special für eine Sonderfarbe. |
piecesPerMailing | Stück je Mailing, Standard 1. |
suppliedByCustomer | true: Sie stellen dieses Teil selbst bei. |
trancheScope | Nur für bestimmte Länder: Indizes in tranches (ab 0); fehlt es, gilt das Teil für alle. |
details | Weitere Angaben, bis 2000 Zeichen. |
spec | Angaben 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– eingegangenin_progress– in Bearbeitung, Angebote werden eingeholtoffers_available– Angebote liegen vorclosed– 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.
type | format | paperGsm | spec |
|---|---|---|---|
envelope · Kuvert | DL, C6/5, C6, C5, C4, B4, custom | 70–120 | window: none | left | rightclosure: wet | peel | selfinnerPrint: booleanspecialColor: text |
letter · Brief | A4, A5, custom | 40–400 | pages: 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 / Antwortkarte | A6, DL, MAXI, custom | 40–400 | replyMail: booleanfinishing: none | dispersion | uv | cello_matt | cello_glosspersonalization: none | senderspecialColor: text |
certificate · Urkunde | A4, A5, custom | 40–400 | finishing: none | embossing | hot_foilpersonalizedName: booleanspecialColor: text |
tax_receipt · Spendenbestätigung | A4, A5 | 40–400 | specialColor: text |
insert · Beilage / Flyer | DL, A6, A5, custom | 40–400 | fold: 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.code | Beschreibung |
|---|---|
validation_error | Ein Feld fehlt oder hat einen ungültigen Wert (400). |
offer_deadline_too_early | Die Angebotsfrist ist weniger als 3 Werktage entfernt; data.earliest nennt das früheste Datum (400). |
api_key_invalid | Schlüssel fehlt, ist falsch oder widerrufen (401). |
forbidden | Die Anfrage gibt es nicht oder sie gehört nicht zu Ihrem Konto (403). |
details_locked | Die Anfrage kann nicht mehr geändert werden (409). |
invalid_details_reference | Eine id gehört nicht zu dieser Anfrage (400). |
body_too_large | Der JSON-Body ist größer als 1 MB; data.maxBytes nennt die Grenze (413). |
rate_limited | Zu 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.