Webhooks
Être notifié de chaque étape — commandes, fabrication, expéditions.
Enregistrer un endpoint
curl -X POST https://api.fredpod.com/v1/webhooks \
-H "X-API-Key: sk_votre_cle" \
-H "Content-Type: application/json" \
-d '{ "url": "https://votre-app.fr/webhooks/fred" }'La réponse contient le secret de signature de l'endpoint. GET /v1/webhooks liste
vos endpoints, DELETE /v1/webhooks/{id} en supprime un. GET /v1/events rejoue
l'historique des événements (pagination par curseur).
Les événements
| Famille | Types |
|---|---|
| Commande | order.created · order.confirmed · order.in_production · order.printed · order.shipped · order.delivered · order.cancelled · order.failed |
| Devis | quote.created |
| Fabrication | job.offered · job.accepted · job.declined · job.offer_expired · job.printing · job.printed · job.failed |
| Expédition | shipment.created · shipment.updated · shipment.delivered |
Le corps de chaque livraison contient le type, l'objet concerné (commande, job ou expédition, sérialisé comme dans l'API) et l'identifiant d'événement.
Vérifier la signature
Chaque livraison porte trois en-têtes : webhook-id, webhook-timestamp et
webhook-signature. La signature vaut :
webhook-signature: v1,base64( HMAC-SHA256( secret, "{id}.{timestamp}.{body}" ) )Vérification en Python :
import base64, hashlib, hmac
def verifier(secret: str, en_tetes: dict, corps: bytes) -> bool:
attendu = hmac.new(
secret.encode(),
f"{en_tetes['webhook-id']}.{en_tetes['webhook-timestamp']}.{corps.decode()}".encode(),
hashlib.sha256,
).digest()
recu = en_tetes["webhook-signature"].removeprefix("v1,")
return hmac.compare_digest(base64.b64encode(attendu).decode(), recu)Rejetez toute livraison dont la signature ne correspond pas, et tolérez les doublons :
en cas d'échec de livraison, l'événement est retenté — utilisez webhook-id pour
dédupliquer.
Répondre
Renvoyez un statut 2xx rapidement (idéalement < 5 s) ; tout autre statut est
considéré comme un échec et l'envoi sera retenté.