Briefversand-API Dokumentation (REST, v1)
Unsere RESTful JSON API ermöglicht es Ihnen, Briefe direkt aus Ihrer Anwendung zu versenden. Nutzen Sie die Test-Umgebung mit kostenlosen Sandbox-Keys, bevor Sie in die Produktion gehen. Die vollständige OpenAPI/Swagger-Dokumentation finden Sie am Ende dieser Seite.
Getting Started
In drei Schritten zum ersten API-Brief
Konto erstellen
Registrieren Sie sich kostenlos auf briefsenden.com und bestätigen Sie Ihre E-Mail-Adresse. Mit einem Test-Key werden Briefe danach weder gedruckt noch berechnet.
API-Key erstellen
Navigieren Sie im Dashboard zu Einstellungen → Entwickler und erstellen Sie einen API-Key. Für die Entwicklung nutzen Sie einen Test-Key (bv_test_*), für den Produktivbetrieb einen Live-Key (bv_live_*).
Ersten Brief versenden
Senden Sie ein PDF zusammen mit der Empfängeradresse per POST an /api/v1/letters/simple. Mit einem Test-Key wird kein physischer Brief versendet und es entstehen keine Kosten.
Authentifizierung
API-Keys und der Header X-Api-Key
Die briefsenden-API authentifiziert jeden Request über einen API-Key. Senden Sie ihn im Header X-Api-Key an die Basis-URL https://www.briefsenden.com/api/v1. Alle Anfragen müssen über HTTPS erfolgen – HTTP-Anfragen werden abgelehnt.
X-Api-Key: bv_live_IhrApiKeyHier
Test-Keys bv_test_*
Für die Entwicklung und zum Testen. Briefe werden simuliert, aber nicht physisch versendet. Keine Kosten, keine Coin-Abbuchung – ideal für die Integration in Ihre Entwicklungsumgebung.
Live-Keys bv_live_*
Für den Produktivbetrieb. Briefe werden gedruckt, kuvertiert und über die Deutsche Post versendet. Die Kosten werden von Ihrem Coin-Guthaben abgezogen.
API-Keys können jederzeit im Dashboard unter Einstellungen → Entwickler erstellt, angezeigt und widerrufen werden. Bewahren Sie Ihre Live-Keys sicher auf und teilen Sie sie nicht öffentlich.
Code-Beispiele
Brief versenden in Ihrer bevorzugten Sprache
curl -X POST https://www.briefsenden.com/api/v1/letters/simple \ -H "X-Api-Key: bv_test_xxx" \ -F "file=@rechnung.pdf" \ -F "recipientLine1=Max Mustermann" \ -F "recipientLine2=Musterstraße 1" \ -F "recipientZip=12345" \ -F "recipientCity=Berlin" \ -F "color=bw" \ -F "duplex=simplex"
Alle Beispiele senden einen Brief per POST /api/v1/letters/simple als multipart/form-data. Ersetzen Sie bv_test_xxx durch Ihren API-Key – mit einem Test-Key entstehen keine Kosten.
Endpoint-Übersicht
Die wichtigsten API-Endpunkte im Überblick
| Methode | Endpoint | Beschreibung |
|---|---|---|
| POST | /api/v1/letters/simple | Brief versenden (PDF-Datei oder PDF-URL) |
| POST | /api/v1/letters | Brief versenden (JSON, PDF als Base64) |
| POST | /api/v1/letters/bulk | Bis zu 50 Briefe in einem Request |
| GET | /api/v1/letters | Briefe auflisten |
| GET | /api/v1/letters/:id | Status eines Briefs abrufen (bei Einschreiben mit Sendungsnummer) |
| POST | /api/v1/estimate | Kosten eines Briefs berechnen |
| POST | /api/v1/serial/estimate | Kosten eines Serienbriefs berechnen |
| GET | /api/v1/balance | Guthaben abfragen |
| GET | /api/v1/serial | Serienbriefe auflisten |
| GET | /api/v1/serial/:id | Serienbrief-Status abrufen |
| GET | /api/v1/serial/:id/letters | Briefe eines Serienbriefs auflisten |
| DELETE | /api/v1/serial/:id | Serienbrief abbrechen, solange er verarbeitet wird |
| GET | /api/v1/sender-profiles | Absenderprofile auflisten (auch POST, PUT, DELETE, set-default) |
| GET | /api/v1/addresses | Adressbuch auflisten (auch POST, PUT, DELETE) |
| POST | /api/v1/webhooks | Webhook registrieren |
| GET | /api/v1/webhooks | Webhooks auflisten |
| DELETE | /api/v1/webhooks/:id | Webhook löschen |
Die vollständige Dokumentation aller Endpoints mit Request- und Response-Schemas finden Sie in der interaktiven Swagger-UI weiter unten.
Sie binden briefsenden für viele Geschäftskunden an? Mehr für Software-Partner.
Preise, Einsatzbeispiele und Schnellstart der API: Briefversand-API im Überblick.
Webhooks
Echtzeit-Benachrichtigungen bei Statusänderungen
Webhooks informieren Ihre Anwendung automatisch, wenn sich der Status eines Briefes ändert. Konfigurieren Sie Ihre Webhook-URL im Dashboard unter Einstellungen → Entwickler. Wir senden bei jedem Statuswechsel einen POST-Request an Ihre URL.
Event-Typen
letter.createdletter.uploadedletter.processingletter.in_printletter.sentletter.errorserial.completedserial.error
Retry-Logik
Antwortet Ihr Server nicht mit einem 2xx-Statuscode, wiederholen wir die Zustellung bis zu 3 Mal nach 1, 5 und 25 Sekunden. Nach 10 aufeinanderfolgenden fehlgeschlagenen Zustellungen wird der Webhook deaktiviert; legen Sie ihn dann neu an.
Payload-Beispiel
{
"event_type": "letter.sent",
"timestamp": "2026-10-16T14:30:00.1234567Z",
"data": {
"LetterId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"Status": "SENT",
"OldStatus": "IN_PRINT",
"TrackingNumber": null
}
}TrackingNumber enthält bei Einschreiben die Sendungsnummer, sobald sie vergeben ist (ab Einlieferung ins Druckzentrum), sonst null.
Signatur prüfen
Jede Zustellung trägt drei Header. Berechnen Sie die Signatur über den rohen Body und vergleichen Sie sie in konstanter Zeit mit X-Webhook-Signature. Das Secret erhalten Sie einmalig beim Anlegen des Webhooks.
X-Webhook-Signature- sha256= gefolgt vom HMAC-SHA256 (hex, Kleinbuchstaben) über den rohen Request-Body; Schlüssel ist Ihr Webhook-Secret als UTF-8-Zeichenkette
X-Webhook-Event- Ereignistyp, z. B. letter.sent (wie event_type im Body)
X-Webhook-Timestamp- Versandzeitpunkt des Zustellversuchs (ISO 8601, UTC); nicht Teil der Signatur
const crypto = require('crypto')
// rawBody: der unveränderte Request-Body (Buffer), nicht neu serialisiert
function isValidSignature(rawBody, signatureHeader, secret) {
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex')
const a = Buffer.from(expected)
const b = Buffer.from(signatureHeader || '')
return a.length === b.length && crypto.timingSafeEqual(a, b)
}Rate Limits & Fehlerbehandlung
Limits, Statuscodes und Fehlerformat
Rate Limits
Die API erlaubt maximal 100 Requests pro Minute pro API-Key. Bei Überschreitung erhalten Sie einen 429-Statuscode. Die aktuellen Limit-Informationen werden in jedem Response mitgeliefert:
X-RateLimit-Limit: 100X-RateLimit-Remaining: 95X-RateLimit-Reset: 1709042400
Idempotency-Keys
Für sichere Wiederholungen bei Netzwerkfehlern können Sie einen Idempotency-Key-Header mitsenden. Bei identischem Key wird die Aktion nicht erneut ausgeführt, sondern das Ergebnis des ersten Requests zurückgegeben.
Idempotency-Key: unique-request-id-123
Fehlerformat (RFC 7807 ProblemDetails)
Alle Fehler werden im standardisierten RFC-7807-Format (ProblemDetails) zurückgegeben. Validierungsfehler nennen das betroffene Feld unter errors, andere Fehler beschreiben das Problem in detail. Die traceId hilft unserem Support, die Anfrage zu finden.
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"pdfUrl": ["pdfUrl muss eine gültige HTTP(S)-URL sein."]
},
"traceId": "de4f753c1a2f48115a926dd3081be05e"
}HTTP-Statuscodes
| Code | Bedeutung |
|---|---|
| 200 | OK – Anfrage erfolgreich |
| 201 | Created – Ressource erstellt (z. B. Brief) |
| 400 | Bad Request – Ungültige Parameter |
| 401 | Unauthorized – Fehlender oder ungültiger API-Key |
| 403 | Forbidden – Keine Berechtigung |
| 404 | Not Found – Ressource nicht gefunden |
| 429 | Too Many Requests – Rate Limit überschritten |
| 500 | Internal Server Error – Serverfehler |
Häufige Fragen zur API
Antworten auf die wichtigsten Entwickler-Fragen
Interaktive API-Dokumentation
Testen Sie Endpoints direkt in der Swagger-UI
Jetzt integrieren
Starten Sie mit wenigen Zeilen Code und automatisieren Sie Ihren Briefversand über die REST API.