Facebook-Bild
03 Stunden 10 Min 31 Sec
Entwicklerdokumentation

RapidTranslate-API

Erstellen und verfolgen Sie Aufträge für zertifizierte Dokumentübersetzungen programmgesteuert. Eine REST-API über HTTPS, die mit einem Bearer-Token authentifiziert wird und JSON zurückgibt – mit signierten Webhooks für jedes Ereignis.

Basis-URL https://www.rapidtranslate.org/api/v1
Version v1
Format JSON
create-order.sh
curl -X POST https://www.rapidtranslate.org/api/v1/orders \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "reference=APO-10432" \
  -F "source_language=Spanish" \
  -F "target_language=English (US)" \
  -F "translation_type=certified" \
  -F "files[]=@document.pdf"

 {
  "id": "9b1c2d3e-…",
  "status": "pending",
  "livemode": true
}

Einleitung

Mit der RapidTranslate-API kann Ihre Anwendung Dokumente zur beglaubigten Übersetzung einreichen, aktuelle Status- und Preisinformationen abrufen und die fertigen Dateien erhalten – ohne dass Ihr Team unseren Bestellvorgang nutzen muss. Sie richtet sich an Unternehmen, die im Auftrag ihrer eigenen Kunden Übersetzungsaufträge erteilen.

Alle Anfragen sind zu richten an https://www.rapidtranslate.org/api/v1 über HTTPS. Anfragen und Antworten erfolgen im JSON-Format, mit Ausnahme der Auftragserstellung, bei der Dateien als multipart/form-data. Alle Beträge werden zurückerstattet als ganzzahlige Cent in USD, und alle Zeitangaben erfolgen im UTC-Format gemäß ISO-8601.

Zugriff erhalten. Der API-Zugriff steht Organisationskonten zur Verfügung. Fügen Sie Ihr Unternehmen in Ihrem Dashboard hinzu und generieren Sie anschließend Schlüssel unter „Unternehmenseinstellungen“ → „API-Schlüssel“. Wenn Sie noch kein Unternehmenskonto haben, wenden Sie sich bitte an support@rapidtranslate.org.

Postman-Sammlung

Möchten Sie sich lieber erst mit der API vertraut machen, bevor Sie Code schreiben? In unserer Postman-Sammlung sind alle Endpunkte bereits vorkonfiguriert – einschließlich Authentifizierung, Beispiel-Content-Teils und Abfrageparameter.

Postman-Sammlung herunterladen

  1. Wählen Sie in Postman „Datei“ → „Importieren“ und wählen Sie die heruntergeladene Datei aus.
  2. Öffnen Sie die Sammlung Variablen und festlegen apiKey zu einem Schlüssel aus Unternehmens-Einstellungen → API-Schlüssel.
  3. (Optional) Festlegen baseUrl für Ihre Umgebung – standardmäßig ist „Produktion“ eingestellt.
  4. Senden Sie eine beliebige Anfrage. Verwenden Sie einen Sandbox- Schlüssel, um zu testen, ohne kostenpflichtige Bestellungen aufzugeben.

Authentifizierung

Authentifizieren Sie jede Anfrage mit Ihrem geheimen API-Schlüssel als Bearer-Token und fordern Sie eine JSON-Antwort an. Beide Header sind erforderlich:

Autorisierung: Bearer YOUR_API_KEY
Accept: application/json

Sie können Schlüssel in Ihrem Dashboard unter „Geschäftseinstellungen“ → „API-Schlüssel“ generieren und rotieren. Schlüssel werden bei der Erstellung einmalig angezeigt und in gehashter Form gespeichert – sollten Sie einen Schlüssel verlieren, rotieren Sie ihn. Jeder Schlüssel gehört zu einem Modus (Live oder Sandbox) und verfügt über einen festen Satz von Gültigkeitsbereichen.

Anwendungsbereiche

Jeder Endpunkt erfordert eine bestimmte Funktion des Schlüssels. Ein Schlüssel, bei dem der erforderliche Geltungsbereich fehlt, gibt Folgendes zurück: 403 forbidden_scope.

GeltungsbereichZuschüsse
Befehle: SchreibenAufträge erstellen und genehmigen
Befehle: LesenBestellungen abrufen und auflisten
Preis: lesenLesen Sie die Preisliste
Behandeln Sie Schlüssel vertraulich. Mit einem aktiven Schlüssel können kostenpflichtige Bestellungen aufgegeben werden. Geben Sie ihn niemals in clientseitigem Code, Browsern oder öffentlichen Repositories preis.

Sandbox- und Testmodus

Der Testmodus ist eine Eigenschaft des Schlüssels, nicht Ihres Kontos. Ein Sandbox-Schlüssel wird in einer vollständig simulierten Umgebung ausgeführt; ein Live-Schlüssel gibt echte, abrechnungsfähige Bestellungen auf. Sie können beide gleichzeitig verwenden.

Sandbox-Bestellungen unterliegen denselben Validierungs- und Feldzuordnungsregeln sowie den tatsächlichen Preisen, jedoch entfallen dabei die Dateispeicherung, die OCR und die Auftragsabwicklung. Bei der Erstellung durchläuft eine Sandbox-Bestellung automatisch ihren gesamten Lebenszyklus (Bearbeitung → abgeschlossen), wobei dieselben Webhooks wie bei einer Live-Bestellung ausgelöst werden und schließlich ein statisches Beispieldokument bereitgestellt wird.

Jede Antwort und jeder Webhook enthält einen Live-Modus Flag, damit Ihre Integration eine Verzweigung erstellen kann, ohne den Schlüssel zu überprüfen:

  • livemode: true — echter, abrechnungsfähiger Auftrag
  • livemode: false — Sandbox / Testbestellung

Ratenbegrenzungen

Die Anzahl der Anfragen ist pro Organisation begrenzt. Das Standardkontingent beträgt 120 Anfragen pro Minute. Wird dieser Wert überschritten, wird 429 rate_limited; versuchen Sie es nach einer kurzen Wartezeit erneut. Falls Ihre Integration einen höheren Grenzwert benötigt, wenden Sie sich bitte an support@rapidtranslate.org.

Antworten

Jede erfolgreiche Antwort verpackt ihre Nutzdaten in ein Daten Schlüssel. Endpunkte der Liste fügen einen Meta Block mit Paginierung.

Einzelne Ressource

{
  "data": {
    "id": "9b1c...-uuid",
    "reference": "APO-10432",
    "status": "processing",
    "total": 11270,
    "currency": "USD"
  }
}

Paginierte Liste

{
  "data": [ ... ],
  "meta": {
    "current_page": 1,
    "per_page": 25,
    "total": 134,
    "last_page": 6
  }
}

Fehler

Fehler verwenden Standard-HTTP-Statuscodes und geben einen stabilen, maschinenlesbaren Fehlercode zusammen mit einer menschlichen Nachricht. Validierungsfehler fügen ein feldbezogenes Fehler Objekt.

{
  "message": "The given data was invalid.",
  "error_code": "validation_failed",
  "errors": {
    "source_language": ["The selected source language is invalid."]
  }
}
HTTPFehlercodeBedeutung
400Fehlerhafte AnfrageFehlerhafter Anfragetext
401nicht authentifiziertFehlender, ungültiger oder widerrufener Schlüssel
402Zahlung_fehlgeschlagenBestellung bestätigt, Zahlung konnte jedoch nicht eingezogen werden
402credit_holdDie Bestellung überschreitet Ihr Kreditlimit
403verbotener_Geltungsbereich„Key“ verfügt nicht über den erforderlichen Umfang
403Konto_gesperrtOrganisation wegen unbezahlter Rechnungen suspendiert
404not_foundFür diese Organisation liegt kein solcher Auftrag vor.
409doppelte_ReferenzReferenz für eine andere Bestellung wiederverwendet
409wartet nicht auf GenehmigungDie Bestellung wartet nicht auf Ihre Genehmigung
422Validierung fehlgeschlagenFehlende oder ungültige Felder
429rate_limitedRatenlimit überschritten
500server_errorUnerwarteter Serverfehler
503Verarbeitung fehlgeschlagenDie nachgelagerte Verarbeitung (OCR / Preisermittlung) ist fehlgeschlagen

Bestellstatus

Die Bestellung Status folgt einem stabilen Lebenszyklus. Diese fünf Werte sind auch diejenigen, die von der Status Filter aktivieren Bestellungen auflisten:

StatusBedeutung
noch ausstehendErhalten; Preisgestaltung noch nicht abgeschlossen. insgesamt könnte sein null.
zur Genehmigung ausstehendDer Preis steht fest und wartet darauf, dass Sie den Gesamtbetrag genehmigen (nur wenn eine Genehmigung erforderlich ist).
VerarbeitungGenehmigt und aktiv; Übersetzung läuft.
abgeschlossenFertig; die übersetzten Dokumente stehen zur Verfügung.
abgesagtDie Bestellung wurde storniert.

Solange ein Auftrag in Bearbeitung ist, werden detailliertere Bezeichnungen (zum Beispiel Dem Übersetzer zugewiesen, Übersetzen, Versendet) können ebenfalls auftreten. Wenn eine Genehmigung erforderlich ist, kann in einem Auftrag kurz darauf hingewiesen werden, Zahlung_fehlgeschlagen oder credit_hold Falls eine Abbuchung nicht möglich war – legen Sie die Zahlungsmethode fest und genehmigen Sie den Vorgang erneut.

Sprachen auflisten

GET /Sprachen

Gibt alle unterstützten Sprachen zurück. Verwenden Sie die Name Wert wörtlich als Quellsprache / Zielsprache Bei der Erstellung einer Bestellung werden Bestellungen anhand des Sprachnamens abgeglichen, nicht anhand des Codes.

Erfordert einen authentifizierten Schlüssel.

curl https://www.rapidtranslate.org/api/v1/languages \
  -H "Authorization: Bearer IHR_API-SCHLÜSSEL" \
  -H "Accept: application/json"
{
  "data": [
    { "code": "english-uk", "name": "English (UK)", "active": true },
    { "code": "spanish",     "name": "Spanish",      "active": true }
  ]
}

Preisliste abrufen

GET /Preise

Gibt die US-Basispreisliste in USD zurück, auf deren Grundlage Ihre Bestellungen abgerechnet werden. Die Beträge sind Dezimalzeichenfolgen. Die Preise sind gruppiert nach Übersetzung Typ (jeweils mit einem regulär und schnell pro‑Einheit Preis), Lieferung Methode und Apostille — dieselben Werte, die Sie bei der Erstellung einer Bestellung übermitteln.

Geltungsbereich: Preis: lesen

{
  "data": {
    "country":  { "code": "US", "name": "United States" },
    "currency": { "code": "USD", "symbol": "$" },
    "translation": {
      "certified":   { "unit": "page", "regular": "27.99", "rapid": "37.99" },
      "standard":    { "unit": "word", "regular": "0.11",  "rapid": "0.15" },
      "specialized": { "unit": "page", "regular": "47.99", "rapid": "57.99" },
      "naati":       { "unit": "page", "regular": "42.99", "rapid": "52.99" },
      "sworn": {
        "unit": "page",
        "note": "Sworn pricing depends on the language pair.",
        "language_pairs": [
          { "languages": ["Spanish","English"], "unit": "page", "regular": "57.99", "rapid": "67.99" },
          { "languages": ["Polish","English"],  "unit": "page", "regular": "46.99", "rapid": "56.99" }
        ]
      }
    },
    "delivery": {
      "email": "0.00", "notarized_email": "19.99",
      "mail_standard": "29.99", "mail_next_day": "55.00"
    },
    "apostille": { "base": "79.00", "additional_document": "15.00" }
  }
}

Eidesstattliche Preisangabe. Der Preis für eine beglaubigte Übersetzung richtet sich nach dem Sprachpaar. Sprachpaare listet jedes für die Vereidigung in Frage kommende Paar mit seinem eigenen regulär/schnell Preis. Jede englische Variante (Englisch (US/UK/AU/CA)) wird akzeptiert, und jedes Paar funktioniert in beide Richtungen, sofern es nicht "bidirectional": false.

Bestellung aufgeben

POST /Bestellungen

Erstellt einen Übersetzungsauftrag und lädt die Quelldateien hoch. Da dieser Endpunkt Dateien überträgt, verwendet er multipart/form-data (kein JSON). Verschachtelte Felder werden in eckigen Klammern angegeben, z. B. Kunde[Name].

Geltungsbereich: Befehle: Schreiben

Körpermaße

FeldArtAnmerkungen
VerweisZeichenkette erforderlichIhre eigene, eindeutige Bestellnummer. Bei erneuter Verwendung wird die bestehende Bestellung zurückgegeben (siehe Idempotenz).
Kunde[Name]Zeichenkette erforderlichVollständiger Name des Endkunden.
Kunde[E-Mail]Zeichenkette erforderlichE-Mail des Endkunden.
QuellspracheZeichenkette erforderlichGenauer Wortlaut Name aus Sprachen auflisten.
ZielspracheZeichenkette erforderlichGenauer Wortlaut Name aus Sprachen auflisten.
ÜbersetzungstypZeichenkette erforderlichEines von zertifiziert, Standard, spezialisiert, vereidigt, naati.
WendeZeichenkette erforderlichregulär oder schnell.
LieferartZeichenkette erforderlichEines von E-Mail, notariell beglaubigte E-Mail, mail_standard, Zustellung am nächsten Tag.
Lieferung[Adresse][...]ObjektErforderlich für mail_standard / Zustellung am nächsten Tag: Straße, Stadt, postal_code, Land (Zustand (optional). Land ist ein ISO-Code, z. B. US.
Apostille [aktiviert]booleschApostille-Bearbeitung hinzufügen. Siehe die unten aufgeführten Regeln.
Apostille [Dokumente]GanzzahlAnzahl der mit einer Apostille zu versehenden Dokumente. Erforderlich, wenn diese Option aktiviert ist.
Apostille [Zielland]ZeichenketteLand, für das die Apostille bestimmt ist.
AnmerkungenZeichenketteAnweisungen in Freitextform.
GutscheincodeZeichenketteEin einzulösender Rabattcode. Offensichtlich ungültige oder nicht anwendbare Codes werden bei der Erstellung abgelehnt. 422 Validierung fehlgeschlagen; der Rabatt selbst wird erst nach der Preisermittlung für die Bestellung endgültig festgelegt (siehe Hinweis unten).
Dateien[]Datei[] erforderlich1–20 Dateien. Zulässige Dateiformate: pdf, jpg, jpeg, png, doc, docx, tiff, heic. Maximal 20 MB pro Datei.
Idempotenz. Verweis ist für jede Organisation einzigartig. Eine erneute Erstellung mit denselben Verweis gibt die vorhandene Bestellung zurück mit 200 anstatt ein Duplikat zu erstellen (eine neue Bestellung führt zu 201).
Apostille-Vorschriften. Eine Apostille ist nur verfügbar, wenn die Zielsprache Englisch (in jeder Variante) ist, und für solche Bestellungen muss das mail_standard Versandart. Zustellung am nächsten Tag gilt nur für Adressen in den USA.

Beispiel

curl -X POST https://www.rapidtranslate.org/api/v1/orders \
  -H "Authorization: Bearer IHR_API_SCHLÜSSEL" \
  -H "Accept: application/json" \
  -F "reference=APO-10432" \
  -F „customer[name]=Jane Doe“ \
  -F „customer[email]=jane@example.com“ \
  -F „source_language=Spanisch“ \
  -F „target_language=Englisch (US)“ \
  -F „translation_type=certified“ \
  -F „turnaround=regular“ \
  -F „delivery[method]=email“ \
  -F „files[]=@/path/to/birth-certificate.pdf“
{
  "data": {
    "id": "9b1c2d3e-...-uuid",
    "reference": "APO-10432",
    "livemode": true,
    "status": "pending",
    "source_language": "Spanish",
    "target_language": "English (US)",
    "translation_type": "certified",
    "turnaround": "regular",
    "total": null,
    "currency": "USD",
    "created_at": "2026-08-28T10:15:00+00:00"
  }
}

Ein neu erstellter Auftrag beginnt wie folgt: noch ausstehend mit einem null Gesamtsumme während der Preisberechnung. Umfrage Eine Bestellung abrufen oder achten Sie auf das Bestellstatus Webhook, um die Preis- und Statusaktualisierung anzuzeigen.

Gutscheine. A Gutscheincode wird in zwei Schritten geprüft. Beim Anlegen überprüfen wir, was nicht von der Dokumentlänge abhängt – die Gültigkeit des Codes, Nutzungsbeschränkungen und für welche Übersetzungs- bzw. Dienstleistungsarten er gilt – und lehnen einen fehlerhaften Code sofort ab. Regeln, die von der Seiten- oder Wortzahl (sowie der Höhe des Rabatts selbst) abhängen, werden erst nach der Zählung des Dokuments ausgewertet, sodass der Rabatt auf der preislich insgesamt, nicht der anfängliche noch ausstehend Antwort: Sollte sich nach Feststellung der Stückzahl herausstellen, dass ein Gutschein nicht gültig ist, wird die Bestellung dennoch zum vollen Preis aufgegeben und zur Überprüfung durch unser Team gekennzeichnet.

Eine Bestellung abrufen

GET /bestellungen/{id}

Ruft eine einzelne Bestellung anhand ihrer id (die bei der Erstellung zurückgegebene UUID). Gibt 404 nicht gefunden falls die Bestellung nicht zu Ihrer Organisation gehört.

Geltungsbereich: Befehle: Lesen

curl https://www.rapidtranslate.org/api/v1/orders/9b1c2d3e-...-uuid \
  -H "Authorization: Bearer IHR_API_SCHLÜSSEL" \
  -H "Accept: application/json"

Bestellungen auflisten

GET /Bestellungen

Gibt die Bestellungen Ihrer Organisation zurück, beginnend mit den neuesten, mit Paginierung in Meta. Alle Abfrageparameter sind optional.

Geltungsbereich: Befehle: Lesen

AbfrageAnmerkungen
StatusEines von noch ausstehend, zur Genehmigung ausstehend, Verarbeitung, abgeschlossen, abgesagt.
VerweisNach Ihrer Referenznummer filtern.
Quellsprache / ZielspracheNach Sprachbezeichnung filtern.
created_from / created_toDatumsbereich (einschließlich).
sortieren-Erstellungsdatum (Standard, neueste zuerst) oder created_at (nach Alter sortiert, älteste zuerst).
pro Seite1–100. Standardmäßig wird die Standardseitengröße verwendet.
SeiteSeitenzahl.
curl "https://www.rapidtranslate.org/api/v1/orders?status=completed&per_page=50" \
  -H "Authorization: Bearer IHR_API-SCHLÜSSEL" \
  -H "Accept: application/json"

Eine Bestellung genehmigen

POST /orders/{id}/approve

Genehmigt den berechneten Gesamtbetrag für eine Bestellung, die zur Genehmigung ausstehend, wodurch der Vorgang ausgeführt wird. Dies ist nur erforderlich, wenn für Ihr Konto vor Beginn der Arbeiten eine Genehmigung erforderlich ist. Der Aufruf ist idempotent.

Geltungsbereich: Befehle: Schreiben

curl -X POST https://www.rapidtranslate.org/api/v1/orders/9b1c2d3e-...-uuid/approve \
  -H "Authorization: Bearer IHR_API-SCHLÜSSEL" \
  -H "Accept: application/json"

Bei Erfolg wird der aktualisierte Auftrag zurückgegeben. Wenn der Auftrag nicht zur Genehmigung ansteht, erhalten Sie 409 nicht zur Genehmigung anstehend; wenn ein Ladevorgang erforderlich ist, dieser aber fehlschlägt, erhältst du 402 Zahlung fehlgeschlagen oder 402 credit_hold.

Feldwerte

Die festen Sätze, die bei der Erstellung eines Auftrags akzeptiert werden.

Übersetzungsarten

WertBeschreibung
zertifiziertBeglaubigte Übersetzung (Preis pro Seite).
StandardStandardübersetzung (Preis pro Wort).
spezialisiertFachübersetzung (pro Seite).
vereidigtBeglaubigte Übersetzung (pro Seite).
naatiNAATI-zertifizierte Übersetzung (pro Seite).

Wende

WertBeschreibung
regulärStandard-Bearbeitungszeit.
schnellBeschleunigte Bearbeitung.

Versandarten

WertAdresseBeschreibung
E-MailNeinDigitale Zustellung per E-Mail (kostenlos).
notariell beglaubigte E-MailNeinNotariell beglaubigte digitale Übermittlung.
mail_standardJaPostversand; Versand in unterstützte Länder.
Zustellung am nächsten TagJaZustellung am nächsten Werktag (nur für Adressen in den USA).

Webhooks

Anstatt Abfragen durchzuführen, richten Sie einen Webhook-Endpunkt ein, um Ereignisse in Echtzeit zu empfangen. Legen Sie Ihre URL fest und rufen Sie Ihr Signaturgeheimnis unter „Geschäftseinstellungen“ → „Webhooks“ ab. Webhooks sind eine praktische Ergänzung – das Abrufen einer Bestellung ist stets maßgebend.

Veranstaltungen

VeranstaltungGesendet am
BestellstatusDer Status eines Auftrags ändert sich.
KundenbewertungFür einen Auftrag wurde ein Preis festgelegt, und er wartet auf Ihre Genehmigung (nur im Genehmigungsmodus).
DokumentenlieferungDie übersetzten Dokumente liegen bereit, einschließlich der Download-Links.
Zahlung_fehlgeschlagenDie Gebühr für einen genehmigten Auftrag konnte nicht eingezogen werden – dies hat zur Folge, dass Misserfolg Block (Grund, Nachricht). Aktualisieren Sie die Wallet-Karte und bestätigen Sie den Vorgang erneut.
credit_holdEine genehmigte Bestellung würde Ihr Kreditlimit überschreiten – damit ist eine credit_hold Block (Nachricht). Rechnungen begleichen oder ein höheres Limit beantragen.

Umschlag

Jede Sendung wird in demselben Umschlag verschickt: einem Veranstaltung Block (einschließlich Live-Modus) und ein ereignisspezifisches Daten Block.

{
  "event": {
    "type": "order_status",
    "id": "evt_9b1c...",
    "livemode": true,
    "sent_at": "2026-08-28T10:20:00+00:00"
  },
  "data": {
    "order": {
      "id": "9b1c2d3e-...-uuid",
      "reference": "APO-10432",
      "status": "completed"
    }
  }
}

Die Dokumentenlieferung Das Ereignis fügt ein Dokumente Array (jeweils mit Name, download_url, Version, Status) und ein Portal Link. Der Kundenbewertung Das Ereignis fügt eine detaillierte Aufstellung hinzu Preisgestaltung Block und ein actions.approve Objekt mit der aufzurufenden URL.

Überprüfung von Unterschriften

Jede Anfrage ist signiert, sodass Sie überprüfen können, ob sie tatsächlich von RapidTranslate stammt. Wir senden drei Header:

KopfzeileWert
X-RapidTranslate-Signatursha256=<hmac>
X-RapidTranslate-ZeitstempelIn der Signatur verwendeter Unix-Zeitstempel
X-RapidTranslate-VeranstaltungDie eindeutige Ereignis-ID

Berechne die erwartete Signatur als HMAC-SHA256 der Zeichenkette "{timestamp}.{raw_request_body}" Verwenden Sie dazu Ihr Webhook-Signatur-Geheimnis und vergleichen Sie es anschließend mit dem Wert im Header:

// PHP
$expected = 'sha256=' . hash_hmac(
    'sha256',
    $timestamp . '.' . $rawBody,
    $webhookSecret
);
$valid = hash_equals($expected, $signatureHeader);

Node.js (Express) – Binde die Route mit einem Raw-Body-Parser ein, damit die genauen Bytes erhalten bleiben:

// app.use('/webhooks/rapidtranslate', express.raw({ type: 'application/json' }))
const crypto = require('crypto');

const timestamp = req.get('X-RapidTranslate-Timestamp');
const received  = req.get('X-RapidTranslate-Signature'); // "sha256=..."
const rawBody   = req.body;                               // Buffer, untouched

const expected = 'sha256=' + crypto
  .createHmac('sha256', WEBHOOK_SECRET)
  .update(`${timestamp}.${rawBody}`)
  .digest('hex');

const valid = received &&
  crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected));

Drei Dinge bereiten den Menschen Schwierigkeiten:

  • Die X-RapidTranslate-Signatur Die Kopfzeile enthält eine sha256= Präfix. Entweder mit folgendem vergleichen: 'sha256=' + yourHmac (wie oben) oder entferne das Präfix vor dem Vergleich – vergleiche nicht den reinen Hexadezimalwert mit dem gesamten Header.
  • Führen Sie einen Hash des rohen Request-Körpers genau so durch, wie er empfangen wurde. Durch die erneute Serialisierung von geparstem JSON ändern sich Leerzeichen und die Reihenfolge der Schlüssel, sodass die Signatur nicht mehr übereinstimmt – lesen Sie den Request-Körper, bevor er von einer JSON-Middleware geparst wird.
  • Vergleiche in konstanter Zeit (hash_equals / crypto.timingSafeEqual), niemals mit == oder ===.

Die {timestamp} ist Teil der signierten Zeichenfolge, also lies sie aus dem Header aus und füge sie vor dem Hashing vor. Außerdem kannst du damit veraltete oder erneut gesendete Zustellungen zurückweisen – z. B. alle Zeitstempel, die älter als fünf Minuten sind.

Fehlgeschlagene Übermittlungen werden mit exponentiellem Backoff erneut versucht (bis zu 5 Versuche). Antworte mit einem 2xx Status zur Empfangsbestätigung.