Entwicklerdokumentation

Briefe aus Ihrem Workflow.
Sicher per API.

Mit der Yonek Brief API übergeben Sie einzelne, vollständig vorbereitete Briefe direkt aus CRM, ERP oder Automatisierung. Jede Bestellung wird gespeichert, manuell geprüft und bleibt bis zum Versand transparent abrufbar.

Version 1.2 HTTPS + Bearer-Key Idempotente Requests Produktion nur nach Prüfung
YONEK / BRIEF API
BASE URL
https://yonek.de/api/brief/v1
POST/ordersBestellung anlegen
GET/orders/{order_id}Status abrufen
GET/infoLimits & Version

API erreichbar · JSON · UTF-8

01
Überblick

Ein klarer Übergabepunkt zwischen Software und echter Post.

Die API nimmt Briefbestellungen entgegen — sie löst keine automatische Produktion und keinen automatischen Versand aus. Yonek prüft jede neue Bestellung im Business-Portal und steuert den weiteren Status bewusst.

1Ihr Systemsendet JSON
2Brief APIvalidiert & speichert
3Yonekprüft & produziert
4Status APImeldet Fortschritt
Für serverseitige Integrationen.

API-Keys gehören nie in Browser-Code, Apps oder öffentlich ausgelieferte Automationen. Rufen Sie die API von Ihrem Backend auf.

02
Zugriff

Authentifizierung

Jeder Kunde erhält einen eigenen Live-Schlüssel. Der vollständige Schlüssel wird bei der Erstellung genau einmal angezeigt und serverseitig ausschließlich als SHA-256-Hash gespeichert.

HTTP Header
Authorization: Bearer yk_live_…
  • Schlüssel ausschließlich in einem Secret Store oder einer geschützten Umgebungsvariable speichern.
  • Für Test, Produktion und getrennte Anwendungen jeweils eigene Schlüssel verwenden.
  • Bei Verdacht auf Offenlegung den Schlüssel sofort über Yonek widerrufen lassen.
03
Quickstart

Die erste Bestellung

Ein API-Key, ein stabiler Idempotency-Key und ein JSON-Body genügen.

cURL
curl --request POST 'https://yonek.de/api/brief/v1/orders' \
  --header 'Authorization: Bearer yk_live_…' \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: crm-4711-2026-09-26' \
  --data '{
    "external_id": "crm-4711",
    "recipient": {
      "name": "Max Mustermann",
      "company": "Muster GmbH",
      "address_line1": "Musterstraße 1",
      "postal_code": "12345",
      "city": "Berlin",
      "country": "DE"
    },
    "letter": {
      "salutation": "Sehr geehrter Herr Mustermann,",
      "text": "vielen Dank für das angenehme Gespräch. Wie angekündigt erhalten Sie heute unsere Unterlagen."
    },
    "sender_reference": "CRM-4711",
    "context": "Interne Zusatzinformation zur manuellen Prüfung.",
    "metadata": {
      "campaign": "herbst-2026",
      "account_owner": "roman"
    }
  }'
JavaScript-Beispiel anzeigen
Node.js / JavaScript
const response = await fetch('https://yonek.de/api/brief/v1/orders', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.YONEK_API_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': 'crm-4711-2026-09-26'
  },
  body: JSON.stringify({
    external_id: 'crm-4711',
    recipient: {
      name: 'Max Mustermann',
      company: 'Muster GmbH',
      address_line1: 'Musterstraße 1',
      postal_code: '12345',
      city: 'Berlin',
      country: 'DE'
    },
    letter: {
      text: 'Vielen Dank für das angenehme Gespräch. Wie angekündigt erhalten Sie heute unsere Unterlagen.'
    }
  })
});

const result = await response.json();
if (!response.ok) throw new Error(result.error);

Erfolgreiche Antwort 201 Created

application/json
{
  "order_id": "bo_mg12abc_1a2b3c4d",
  "status": "received",
  "status_url": "/api/brief/v1/orders/bo_mg12abc_1a2b3c4d",
  "duplicate": false
}
04
Endpoint

POST /orders

Legt eine neue Bestellung im Status received an. Der Endpunkt erwartet UTF-8-kodiertes JSON.

Header

NamePflichtBeschreibung
AuthorizationJaBearer <API_KEY>
Content-TypeJaapplication/json
Idempotency-KeyJa8–128 Zeichen; erlaubt: Buchstaben, Ziffern, Punkt, Unterstrich, Doppelpunkt und Bindestrich.

Request-Body

FeldTypPflichtRegel
external_idstringJaIhre Bestell- oder CRM-ID, max. 100 Zeichen.
recipientobjectJaEmpfänger und Postanschrift.
recipient.namestringbedingtName, max. 160 Zeichen. Name oder Firma muss gesetzt sein.
recipient.companystringbedingtFirma, max. 160 Zeichen. Name oder Firma muss gesetzt sein.
recipient.address_line1stringJaStraße und Hausnummer, max. 180 Zeichen.
recipient.address_line2stringNeinAdresszusatz, max. 180 Zeichen.
recipient.postal_codestringJaPostleitzahl, max. 20 Zeichen.
recipient.citystringJaOrt, max. 120 Zeichen.
recipient.countrystringNeinLand oder Ländercode, Standard DE, max. 80 Zeichen.
letter.textstringJaFinaler Brieftext, 10–10.000 Zeichen.
letter.salutationstringNeinSeparate Anrede, max. 160 Zeichen.
sender_referencestringNeinInterne Referenz, max. 160 Zeichen.
contextstringNeinZusatzinformation zur manuellen Prüfung, max. 3.000 Zeichen.
metadataobjectNeinBis zu 20 String-Werte; Schlüssel max. 50, Werte max. 500 Zeichen.
context ist kein Prompt.

Das Feld wird als unvertrauenswürdige Kundeneingabe gespeichert und angezeigt, aber niemals automatisch von einem LLM verarbeitet.

05
Endpoint

GET /orders/{order_id}

Ruft den aktuellen Status einer Bestellung ab. Ein API-Key sieht ausschließlich Bestellungen, die mit demselben Schlüssel angelegt wurden.

Request
curl 'https://yonek.de/api/brief/v1/orders/bo_mg12abc_1a2b3c4d' \
  -H 'Authorization: Bearer yk_live_…'
200 OK · application/json
{
  "order_id": "bo_mg12abc_1a2b3c4d",
  "external_id": "crm-4711",
  "status": "production",
  "status_text": "In Produktion",
  "created_at": "2026-09-26T09:30:00.000Z",
  "updated_at": "2026-09-26T11:15:00.000Z",
  "sent_at": null,
  "estimated_delivery_at": null,
  "delivered_at": null,
  "delivery_estimate_passed": false,
  "request_id": "req_muidwm02_1709e62e0f"
}

Statusmodell

01 receivedEingegangen

Die Bestellung wurde gespeichert und wartet auf die Prüfung.

02 in_reviewIn Prüfung

Yonek prüft Inhalt, Adresse und Umsetzbarkeit.

03 acceptedAngenommen

Die Bestellung wurde zur Produktion freigegeben.

04 productionIn Produktion

Der Brief wird vorbereitet und geschrieben.

05 sentVersendet

Der Brief wurde an den Versand übergeben.

06 deliveredAngekommen

Von Yonek bewusst als angekommen bestätigt; keine automatische Statusänderung.

07 rejectedAbgelehnt

Die Bestellung kann nicht umgesetzt werden.

08 cancelledStorniert

Die Bestellung wurde storniert.

Erwartung ist keine Bestätigung

estimated_delivery_at ist eine operative Prognose von zwei Werktagen. Der Status bleibt sent, bis Yonek die Ankunft bewusst bestätigt. delivery_estimate_passed zeigt lediglich, ob die Prognose überschritten wurde.

06
Push-Ereignisse

Signierte Webhooks

Optional sendet Yonek die Ereignisse order.created und order.status_changed an Ihren HTTPS-Endpunkt. Zustellungen laufen über eine persistente Outbox und werden bei Fehlern mit exponentiellem Backoff bis zu zehnmal wiederholt.

Webhook-Payload
{
  "id": "wh_muidx1_1a2b3c4d",
  "event": "order.status_changed",
  "created_at": "2026-09-26T12:30:00.000Z",
  "data": {
    "order_id": "bo_mg12abc_1a2b3c4d",
    "external_id": "crm-4711",
    "status": "sent",
    "created_at": "2026-09-26T09:30:00.000Z",
    "updated_at": "2026-09-26T12:30:00.000Z",
    "sent_at": "2026-09-26T12:30:00.000Z",
    "estimated_delivery_at": "2026-09-30T12:30:00.000Z",
    "delivered_at": null
  }
}

Signatur prüfen

Der Header Yonek-Signature hat das Format t=UNIXZEIT,v1=HMAC. Berechnen Sie HMAC-SHA-256 über t + "." + rawBody mit Ihrem einmalig angezeigten Webhook-Secret und vergleichen Sie timing-sicher. Lehnen Sie Zeitstempel ab, die deutlich älter als fünf Minuten sind.

Sicherer Versand

Nur öffentliche HTTPS-Ziele sind erlaubt. Lokale und private IP-Bereiche, eingebettete Zugangsdaten sowie Weiterleitungen werden blockiert.

07
Zuverlässigkeit

Idempotenz & Retries

Verwenden Sie pro logischer Bestellung einen stabilen Idempotency-Key. Senden Sie denselben Request bei Timeout oder unklarer Netzwerkantwort mit demselben Key erneut.

Erster Request201 Created

duplicate: false
Bestellung und Benachrichtigung werden einmal angelegt.

Wiederholung200 OK

duplicate: true
Die bestehende Bestell-ID wird zurückgegeben.

Die Idempotenz gilt innerhalb eines API-Keys. Derselbe Key kann bei zwei verschiedenen Kundenschlüsseln jeweils eine Bestellung erzeugen.

08
Kontingente

Limits

Request-Größe32 KBinklusive JSON-Struktur
IP-Limit60 / Min.über alle öffentlichen API-Routen
Key-Limitindividuellstandardmäßig 10 / Min.
Tageskontingentindividuellstandardmäßig 100 Bestellungen

Ihre tatsächlich konfigurierten Grenzen und den vereinbarten Preis erhalten Sie authentifiziert über:

GET/infoVersion · Endpunkte · Limits · Statuswerte · Preis

Rate-Limits werden dauerhaft gespeichert und überstehen Neustarts. Antworten enthalten X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset. Bei 429 kommt zusätzlich Retry-After. Tageskontingente werden um 00:00 UTC zurückgesetzt.

09
Referenz

Fehlercodes

Fehler werden konsistent als JSON mit den Feldern error, message und request_id ausgegeben. Validierungsfehler enthalten zusätzlich details. Unbekannte Nutzdatenfelder werden bewusst abgelehnt.

HTTPerrorBedeutung
400invalid_jsonDer Request-Body ist kein gültiges JSON.
400invalid_idempotency_keyDer Idempotency-Key fehlt oder erfüllt das Format nicht.
408request_timeoutDer Request-Body wurde nicht innerhalb von zehn Sekunden übertragen.
401invalid_api_keyBearer-Key fehlt, ist ungültig oder wurde widerrufen.
401api_key_revokedDer Key wurde während der Verarbeitung widerrufen.
404order_not_foundBestellung existiert nicht oder gehört zu einem anderen API-Key.
405method_not_allowedDie HTTP-Methode ist für den Endpunkt nicht erlaubt.
413payload_too_largeDer Request überschreitet 32 KB.
415content_type_must_be_application_jsonBeim Erstellen fehlt Content-Type: application/json.
422validation_failedEin oder mehrere Nutzdatenfelder sind ungültig.
429rate_limit_exceededMinutenlimit für IP oder API-Key erreicht.
429daily_limit_exceededTageskontingent des API-Keys erreicht.
Beispiel · 422 Unprocessable Entity
{
  "error": "validation_failed",
  "details": [
    "recipient.address_line1 fehlt",
    "letter.text muss mindestens 10 Zeichen enthalten"
  ]
}
10
Betrieb

Sicherheit & Datenverarbeitung

01

Schlüssel

Kundenspezifisch, sofort widerrufbar und im System nur als Hash gespeichert.

02

Mandantentrennung

Statusabrufe sind an den API-Key gebunden; fremde Bestellungen erscheinen als nicht gefunden.

03

Eingaben

Strikte Größen- und Feldlimits, bereinigte Steuerzeichen und keine automatische LLM-Verarbeitung.

04

Transaktionen & Audit

Bestellungen, Idempotenz und Kontingente werden atomar in SQLite/WAL gespeichert; administrative Änderungen landen im Audit-Log.

Empfohlene Integrationspraxis

  1. 1
    Vor dem Senden validieren

    Adresse, Empfänger und finalen Brieftext bereits in Ihrem System prüfen.

  2. 2
    Secrets serverseitig halten

    API-Key nie loggen, an Clients senden oder in Quellcode einchecken.

  3. 3
    Retries begrenzen

    Bei 429 den Retry-After-Header beachten, sonst exponentielles Backoff verwenden.

  4. 4
    IDs speichern

    order_id, external_id und Idempotency-Key gemeinsam in Ihrer Datenbank ablegen.

  5. 5
    Status moderat pollen

    Für normale Abläufe reichen wenige Statusabfragen pro Tag.

Integration & Zugang

Bereit für den ersten echten Brief?

Wir richten Kundenschlüssel, Kontingent und Preis passend zu Ihrem Workflow ein und begleiten den ersten Testlauf.