Webhooks
hook = client.webhooks.create("https://example.com/hook", events=["artifact.updated", "job.completed"])secret = hook["secret"] # この応答でのみ取得可能
# 受信側from d2b.client import _Webhooksok = _Webhooks.verify_delivery(secret, request.headers, raw_body) # Signatur + Sendezeit (Standard: innerhalb von 5 min)- Signatur:
X-D2B-Signature-V2: sha256=<hex>= HMAC-SHA256(secret,"{X-D2B-Delivery}.{X-D2B-Timestamp}." + raw_body).X-D2B-Timestampist die Sendezeit dieses Versuchs (UNIX-Sekunden, bei jeder Wiederholung neu): Anfragen, deren Alter Ihre Toleranz (z. B. 5 Minuten) überschreitet, ablehnen — das wehrt Replays ab.X-D2B-Deliveryist die Zustellungs-ID (bei jeder Wiederholung gleich). Gegen den rohen Body verifizieren (nicht re-serialisieren) - Die bisherige Signatur
X-D2B-Signature: sha256=<hex>= HMAC-SHA256(secret, raw_body) wird weiterhin gesendet. Sie enthält keine Sendezeit und kann Replays daher nicht verhindern - Events:
artifact.updated/artifact.deleted/artifact.stale/snapshot.committed/source.analyzed/source.materialized/conflict.created/version.branched/version.merged/job.completed - Zustellhistorie:
GET /api/v1/me/webhooks/{id}/deliveries - Wiederholungen: Nicht-2xx-Antworten und Verbindungsfehler werden bis zu 14-mal mit exponentiell wachsendem Abstand von 30 s bis 1 h erneut zugestellt (insgesamt etwa 8 Stunden). Eine weiterhin fehlschlagende Zustellung bleibt unter
deliveriessichtbar, wird aber nicht mehr wiederholt. Jedes Ereignis erzeugt eine Zustellung; ein Versuch, dessen Antwort nie ankam, wird jedoch wiederholt, sodass dieselbe Zustellung (dieselbeX-D2B-Delivery) mehr als einmal eintreffen kann: verarbeiten Sie Zustellungen idempotent, mitX-D2B-Deliveryals Schlüssel. Dertimestampim Payload ist die Ereigniszeit und ändert sich bei Wiederholungen nicht
Lang laufende Verarbeitung (etwa der Ingest großer Dateien) läuft am besten mit async=true als Job, auf dessen job.completed gewartet wird — das ist günstiger als eine Poll-Schleife und robuster gegenüber Agenten-Timeouts.