Méthode PUT/partner/webhooks/{webhook_id}

Modifier un abonnement aux notifications : son adresse de destination, sa liste d'événements, son secret de signature, son activation. Droit webhooks:write.

Sur cette page

Vous modifiez un abonnement aux notifications que votre marque possède déjà, et vous recevez l'abonnement dans son nouvel état.

#Autorisation

Envoyez votre clef d'API dans l'en-tête Authorization, au format Bearer suivi d'un espace puis de la clef. La clef doit porter le droit webhooks:write. Une clef qui ne porte pas ce droit reçoit un 403 dont le message nomme le droit manquant.

Ce que nous exigeonsValeur
Authentificationclef d'API de votre marque
Droit porté par la clefwebhooks:write
Fonctionnalité de votre offreles notifications par webhook

Deux conditions s'ajoutent au droit de la clef.

  • L'abonnement doit appartenir à la marque de la clef. Nous cherchons l'abonnement par son numéro et par votre marque. Quand cette recherche ne trouve rien, vous recevez un 404. Un abonnement qui appartient à une autre marque donne exactement la même réponse. Cette route ne vous apprend donc jamais qu'un numéro existe ailleurs.
  • L'offre de votre marque doit comprendre les notifications. Sinon vous recevez un 403 portant le code FEATURE_NOT_AVAILABLE. Une exception existe, décrite juste en dessous.

L'adresse complète de ce point d'entrée est https://api.sealtrust.io/v1/partner/webhooks/{webhook_id}. Le même point d'entrée répond aussi sans le préfixe /v1, à https://api.sealtrust.io/partner/webhooks/{webhook_id}. Les deux adresses appellent le même code. Utilisez la forme /v1 pour une nouvelle intégration.

#Plafond d'appels

Nous mesurons le débit sur une fenêtre fixe de 60 secondes. Le plafond monte avec votre offre, et nous pouvons poser une valeur sur votre marque qui gagne sur celle de votre offre. Nous lisons donc, dans cet ordre : la valeur posée sur votre marque, puis celle de votre offre, puis une valeur de repli de 120 appels par fenêtre. Cette valeur de repli ne sert que si votre marque et votre offre n'en portent aucune.

Ne devinez pas votre plafond du moment. Vous le lisez sur chaque réponse qui franchit le contrôle de débit.

Deux compteurs se superposent, avec le même plafond : un par clef, un pour la somme de toutes les clefs de votre marque. Créer des clefs supplémentaires n'augmente donc pas le débit total autorisé.

Quatre en-têtes décrivent le compteur le plus contraignant des deux.

En-têteContenu
X-RateLimit-Limitle plafond appliqué sur la fenêtre
X-RateLimit-Remainingce qu'il vous reste dans la fenêtre en cours
X-RateLimit-Resetl'horodatage de fin de la fenêtre, en secondes
X-RateLimit-Scopekey ou brand, le compteur qui a servi de référence

Un refus de débit renvoie 429 avec Retry-After, exprimé en secondes restantes dans la fenêtre en cours. Cette valeur n'est jamais inférieure à 1.

Ce point d'entrée ne consomme aucun quota quotidien de clef et aucun quota mensuel d'offre. Le plafond de débit est le seul compteur qui s'applique ici.

#Paramètres de chemin et de requête

NomTypeObligatoireDescription
webhook_idintegerouiLe numéro de l'abonnement à modifier, dans le chemin. Une valeur qui n'est pas un entier donne un 422.

Ce point d'entrée n'a aucun paramètre de requête.

#En-têtes

NomTypeObligatoireDescription
AuthorizationstringouiBearer suivi d'un espace puis de votre clef d'API.
Content-Typestringouiapplication/json.
Idempotency-KeystringnonCe point d'entrée ne déclare pas cet en-tête. Il ne le lit pas et ne le mémorise pas.

#Corps de la requête

Le corps est un objet JSON. Les quatre champs sont facultatifs. Envoyez uniquement les champs que vous voulez changer. Un champ absent du corps garde sa valeur.

NomTypeObligatoireDescription
urlstringnonLa nouvelle adresse de destination, de 10 à 2048 caractères. Elle doit commencer par https://. N'envoyez jamais null dans ce champ, lisez l'avertissement ci-dessous.
eventsarray de stringnonLa nouvelle liste des types d'événements. Elle remplace l'ancienne liste en entier. Chaque valeur doit appartenir à la liste ci-dessous.
is_activebooleannontrue pour recevoir les événements, false pour arrêter les livraisons sans détruire l'abonnement. Ce champ accepte true ou false. Omettez-le si vous ne voulez pas le changer.
secretstringnonLe nouveau secret de signature, jusqu'à 128 caractères. Nous l'utilisons pour calculer l'en-tête X-Webhook-Signature de chaque livraison. null efface le secret, et les livraisons suivantes partent alors sans signature.

Le serveur refuse tout champ que ce tableau ne nomme pas. Un champ inconnu fait échouer la requête en 422, et nous ne modifions rien.

Un corps vide, écrit {}, est valide. Il ne modifie rien, il renvoie l'abonnement inchangé, et nous exigeons l'offre comme pour n'importe quelle autre modification.

#Les 23 types d'événements

Une valeur de events qui n'est pas dans cette liste fait échouer la requête en 422, et le message nomme les valeurs refusées.

FamilleTypes
Cycle de vie du produitproduct.minted, product.transferred, product.burned, product.status_changed
Lotsbatch.completed, batch.failed
Certificatcertificate.issued
Distribution et sécuritéproduct.scanned, product.gray_market, clone.alert, transfer.accepted
Retoursreturn.requested, return.received, return.completed, return.rejected, return.expired
Garantiewarranty.claimed, warranty.expiring_soon
Rachatbuyback.offered, buyback.accepted, buyback.declined, buyback.completed, buyback.expired

#Requête d'exemple

Vous repointez l'abonnement numéro 128 vers une nouvelle adresse et vous réduisez sa liste à deux types d'événements.

curl -i -X PUT https://api.sealtrust.io/v1/partner/webhooks/128 \
  -H "Authorization: Bearer st_test_0000000000000000000000000000000000000000000000" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://exemple-sas.example.com/sealtrust/evenements",
    "events": ["product.minted", "batch.completed"]
  }'

#Réponse d'exemple

Code HTTP 200OK

Code HTTP 200.

JSON
{
  "id": 128,
  "brand_id": 12,
  "url": "https://exemple-sas.example.com/sealtrust/evenements",
  "events": ["product.minted", "batch.completed"],
  "is_active": true,
  "health": "healthy",
  "created_at": "2026-08-18T09:12:44.512038+00:00",
  "updated_at": "2026-08-20T14:03:21.884517+00:00"
}

La réponse compte huit champs et rien d'autre. Le secret n'y figure jamais.

ChampTypeDescription
idintegerLe numéro de l'abonnement.
brand_idintegerLe numéro de votre marque.
urlstringL'adresse de destination enregistrée. Relisez-la après chaque modification.
eventsarray de stringLa liste des types d'événements enregistrée.
is_activebooleantrue si l'abonnement reçoit les événements.
healthstringhealthy ou degraded. Vaut degraded après l'échec définitif d'une livraison, et revient à healthy à la première livraison réussie.
created_atstringLa date de création de l'abonnement, en temps universel.
updated_atstringLa date de la dernière modification, en temps universel.

#Erreurs

Le corps d'une réponse d'erreur porte un champ detail. Selon le cas, ce champ contient une phrase, une liste ou un objet.

CodeConditionQue faire
401L'en-tête Authorization est absent. detail vaut Missing Authorization header. La réponse porte aussi WWW-Authenticate: Bearer.Ajoutez l'en-tête.
401L'en-tête Authorization ne commence pas par Bearer suivi d'un espace. La réponse porte aussi WWW-Authenticate: Bearer.Corrigez la forme de l'en-tête.
401La clef envoyée est vide, ou fait moins de 40 caractères. detail vaut Invalid API key format.Envoyez la clef entière. Une clef tronquée à l'affichage donne cette réponse.
401La clef envoyée est inconnue. detail vaut Invalid API key.Vérifiez que vous envoyez la clef complète, sans espace ni retour à la ligne.
403La clef n'est plus active, parce qu'elle a été révoquée. detail nomme son état.Créez une nouvelle clef dans la console.
403La clef a atteint sa date d'expiration. detail vaut API key has expired.Créez une nouvelle clef. L'ancienne ne redeviendra jamais valide.
403La clef ne porte pas le droit webhooks:write. detail vaut Missing required scope: webhooks:write.Créez une clef portant ce droit. Les droits d'une clef existante ne se modifient pas.
403L'offre de votre marque ne comprend pas les notifications. detail vaut {"code": "FEATURE_NOT_AVAILABLE", "feature": "webhooks"}.Changez d'offre depuis la console, ou contactez-nous. Vous pouvez toujours éteindre l'abonnement avec un corps réduit à {"is_active": false}.
404Aucun abonnement ne porte ce numéro pour votre marque. detail vaut Webhook subscription not found.Vérifiez le numéro avec GET /v1/partner/webhooks. Vous recevez la même réponse si l'abonnement appartient à une autre marque.
422Le webhook_id du chemin n'est pas un entier.Envoyez le numéro rendu par GET /v1/partner/webhooks.
422Le webhook_id du chemin est un entier trop grand pour être un numéro d'abonnement. Le message parle de paramètre de requête, alors que la valeur fautive est dans le chemin.Envoyez le numéro rendu par GET /v1/partner/webhooks.
422Le corps contient un champ que ce point d'entrée ne connaît pas.Retirez ce champ. Nous n'acceptons que url, events, is_active et secret.
422url est une chaîne qui ne commence pas par https://.Corrigez l'adresse pour qu'elle commence par https://.
422url est une chaîne de moins de 10 ou de plus de 2048 caractères.Corrigez la longueur de l'adresse.
422events contient au moins un type inconnu. Le message nomme les valeurs refusées.Reprenez les valeurs du tableau des 23 types d'événements.
422secret dépasse 128 caractères.Raccourcissez le secret.
422Un champ ne porte pas le type annoncé, par exemple url reçoit un nombre ou is_active reçoit une chaîne.Corrigez le type. Le message nomme le champ fautif.
422Le corps n'est pas un objet JSON, ou le corps est absent.Envoyez un objet JSON, même vide, avec Content-Type: application/json.
429Le plafond de débit de la clef est atteint. Les en-têtes Retry-After et la famille X-RateLimit-* accompagnent la réponse, avec X-RateLimit-Scope: key.Attendez le nombre de secondes indiqué par Retry-After, puis réessayez.
429Le plafond de débit de la marque est atteint, toutes clefs confondues. X-RateLimit-Scope vaut brand.Attendez le nombre de secondes indiqué par Retry-After. Créer une clef supplémentaire ne relève pas ce plafond.
500Une erreur inattendue s'est produite. detail vaut Internal Server Error.Réessayez. Si l'erreur persiste, contactez le support en donnant l'en-tête X-Request-Id de la réponse.
503Le service de plafonnement des appels est momentanément indisponible. Nous refusons l'appel avant toute lecture.Réessayez dans quelques instants. L'abonnement n'a pas été modifié.

#Voir aussi

Votre réponse ouvre un courriel pré-rempli dans votre messagerie, à destination de contact@sealtrust.io. Vous le relisez avant de l'envoyer.

Proposer une correctionSignaler un problème