FREDFRED docs
Guides

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

FamilleTypes
Commandeorder.created · order.confirmed · order.in_production · order.printed · order.shipped · order.delivered · order.cancelled · order.failed
Devisquote.created
Fabricationjob.offered · job.accepted · job.declined · job.offer_expired · job.printing · job.printed · job.failed
Expéditionshipment.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é.

On this page