Référence de l’API
Webhooks
Enregistrer des points de terminaison pour recevoir des notifications d’événements.
/v1/webhooksLister les webhooks enregistrés
webhooks:rSDK Node.jshonkio.webhooks.list()Nécessite webhooks:r.
Réponses
200Tous les points de terminaison du compte, du plus récent au plus ancien. Sans pagination.
Champ Type Description data[]obligatoireobject[] idobligatoirestring urlobligatoirestring eventsobligatoirestring[] activeobligatoireboolean deactivated_reasonobligatoirestring Raison pour laquelle la livraison a désactivé le point de terminaison, le cas échéant : par exemple "HTTP_401 for 26h across 7 events" après 24 heures d’échecs sur au moins 5 événements, ou SSRF_BLOCKED.
- Peut être null
deactivated_atobligatoirestring - Format : date-time
- Peut être null
failing_sinceobligatoirestring La première tentative échouée depuis la dernière livraison réussie ; null tant que le point de terminaison fonctionne normalement. Toute tentative livrée la réinitialise.
- Format : date-time
- Peut être null
failed_eventsobligatoireinteger Nombre d’événements distincts en échec depuis failing_since. Le point de terminaison est désactivé lorsque toutes les tentatives échouent depuis 24 heures et que ce nombre atteint 5.
last_success_atobligatoirestring La dernière tentative livrée, à la minute près.
- Format : date-time
- Peut être null
last_failure_atobligatoirestring - Format : date-time
- Peut être null
last_failure_reasonobligatoirestring Le résultat de la dernière tentative échouée : HTTP_<status>, HTTP_<status>_REDIRECT_NOT_FOLLOWED, TIMEOUT ou NETWORK_ERROR.
- Peut être null
secret_rotated_atobligatoirestring Moment du dernier renouvellement du secret de signature (POST /v1/webhooks/{id}/rotate-secret) ; null tant que le point de terminaison signe encore avec le secret attribué à sa création.
- Format : date-time
- Peut être null
created_atobligatoirestring - Format : date-time
- 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403La clé API ne dispose pas de la permission requise pour cette opération, ou le compte est suspendu ou fermé.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { data, error } = await honkio.webhooks.list()
if (error) throw new Error(error.message)
for (const w of data.data) console.log(w.id, w.url)curl https://api.honkio.ca/v1/webhooks \
-H "Authorization: Bearer mk_live_YOUR_KEY"/v1/webhooksEnregistrer un point de terminaison de webhook
webhooks:wSDK Node.jshonkio.webhooks.create()Nécessite webhooks:w.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
urlobligatoire | string | URL HTTPS à laquelle livrer les événements. Elle doit répondre directement par un code 2xx : les livraisons ne suivent jamais de redirection, donc un 3xx est enregistré comme une tentative échouée.
|
eventsobligatoire | string[] |
|
Réponses
201Le point de terminaison. signing_secret n’est affiché qu’ici : conservez-le pour vérifier X-HonkIO-Signature.
Champ Type Description idobligatoirestring urlobligatoirestring eventsobligatoirestring[] signing_secretobligatoirestring 64 caractères hexadécimaux.
activeobligatoireboolean created_atobligatoirestring - Format : date-time
noticeobligatoirestring - 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403LIVE_KEY_REQUIRED : les clés de test ne peuvent pas accéder ici aux ressources de production. Aussi FORBIDDEN lorsque la clé ne dispose pas de la permission requise par cette opération, ou lorsque le compte est suspendu ou fermé.Le corps d’erreur standard.
- 422VALIDATION_ERROR (URL qui n’est pas une URL HTTPS publique, événement inconnu, ou événement courriel alors que le courriel est désactivé) ou WEBHOOK_LIMIT_REACHED (10 points de terminaison par compte).Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { data: webhook, error } = await honkio.webhooks.create({
url: 'https://yourapp.ca/webhooks/honkio',
events: ['message.delivered', 'message.failed', 'message.received'],
})
if (error) throw new Error(error.message)
console.log(webhook.signing_secret) // shown once: store it nowcurl -X POST https://api.honkio.ca/v1/webhooks \
-H "Authorization: Bearer mk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks/honkio",
"events": [
"message.queued"
]
}'/v1/webhooks/{id}Obtenir un webhook par identifiant
webhooks:rSDK Node.jshonkio.webhooks.get()Nécessite webhooks:r.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
idobligatoirechemin | string |
Réponses
200Le point de terminaison.
Champ Type Description idobligatoirestring urlobligatoirestring eventsobligatoirestring[] activeobligatoireboolean deactivated_reasonobligatoirestring Raison pour laquelle la livraison a désactivé le point de terminaison, le cas échéant : par exemple "HTTP_401 for 26h across 7 events" après 24 heures d’échecs sur au moins 5 événements, ou SSRF_BLOCKED.
- Peut être null
deactivated_atobligatoirestring - Format : date-time
- Peut être null
failing_sinceobligatoirestring La première tentative échouée depuis la dernière livraison réussie ; null tant que le point de terminaison fonctionne normalement. Toute tentative livrée la réinitialise.
- Format : date-time
- Peut être null
failed_eventsobligatoireinteger Nombre d’événements distincts en échec depuis failing_since. Le point de terminaison est désactivé lorsque toutes les tentatives échouent depuis 24 heures et que ce nombre atteint 5.
last_success_atobligatoirestring La dernière tentative livrée, à la minute près.
- Format : date-time
- Peut être null
last_failure_atobligatoirestring - Format : date-time
- Peut être null
last_failure_reasonobligatoirestring Le résultat de la dernière tentative échouée : HTTP_<status>, HTTP_<status>_REDIRECT_NOT_FOLLOWED, TIMEOUT ou NETWORK_ERROR.
- Peut être null
secret_rotated_atobligatoirestring Moment du dernier renouvellement du secret de signature (POST /v1/webhooks/{id}/rotate-secret) ; null tant que le point de terminaison signe encore avec le secret attribué à sa création.
- Format : date-time
- Peut être null
created_atobligatoirestring - Format : date-time
- 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403La clé API ne dispose pas de la permission requise pour cette opération, ou le compte est suspendu ou fermé.Le corps d’erreur standard.
- 404NOT_FOUND : aucune ressource correspondante sur ce compte.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { data, error } = await honkio.webhooks.get('WEBHOOK_ID')
if (error) throw new Error(error.message)
console.log(data.url, data.events)curl https://api.honkio.ca/v1/webhooks/ID \
-H "Authorization: Bearer mk_live_YOUR_KEY"/v1/webhooks/{id}Mettre à jour un webhook
webhooks:mSDK Node.jshonkio.webhooks.update()Nécessite webhooks:m.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
idobligatoirechemin | string |
Corps de la requête
| Champ | Type | Description |
|---|---|---|
url | string |
|
events | string[] |
|
active | boolean |
Réponses
200Le point de terminaison mis à jour.
Champ Type Description idobligatoirestring urlobligatoirestring eventsobligatoirestring[] activeobligatoireboolean - 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403LIVE_KEY_REQUIRED : les clés de test ne peuvent pas accéder ici aux ressources de production. Aussi FORBIDDEN lorsque la clé ne dispose pas de la permission requise par cette opération, ou lorsque le compte est suspendu ou fermé.Le corps d’erreur standard.
- 404NOT_FOUND : aucune ressource correspondante sur ce compte.Le corps d’erreur standard.
- 422VALIDATION_ERROR : URL qui n’est pas une URL HTTPS publique, événement inconnu, ou événement courriel alors que le courriel est désactivé.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { error } = await honkio.webhooks.update('WEBHOOK_ID', { events: ['message.delivered', 'message.failed'] })
if (error) throw new Error(error.message)curl -X PATCH https://api.honkio.ca/v1/webhooks/ID \
-H "Authorization: Bearer mk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"events": [
"message.delivered",
"message.failed"
]
}'/v1/webhooks/{id}Supprimer un webhook
webhooks:dSDK Node.jshonkio.webhooks.remove()Nécessite webhooks:d.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
idobligatoirechemin | string |
Réponses
- 204Supprimé, avec son historique de livraison et ses lettres mortes.
- 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403LIVE_KEY_REQUIRED : les clés de test ne peuvent pas accéder ici aux ressources de production. Aussi FORBIDDEN lorsque la clé ne dispose pas de la permission requise par cette opération, ou lorsque le compte est suspendu ou fermé.Le corps d’erreur standard.
- 404NOT_FOUND : aucune ressource correspondante sur ce compte.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { error } = await honkio.webhooks.remove('WEBHOOK_ID')
if (error) throw new Error(error.message)curl -X DELETE https://api.honkio.ca/v1/webhooks/ID \
-H "Authorization: Bearer mk_live_YOUR_KEY"/v1/webhooks/{id}/deliveriesLister les tentatives de livraison récentes d’un webhook
webhooks:rSDK Node.jshonkio.webhooks.deliveries()Nécessite webhooks:r.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
limitrequête | integer |
|
idobligatoirechemin | string |
Réponses
200Tentatives de livraison récentes, de la plus récente à la plus ancienne.
Champ Type Description data[]obligatoireobject[] idobligatoirestring event_idobligatoirestring event_typeobligatoirestring attemptobligatoireinteger successobligatoireboolean http_statusobligatoireinteger - Peut être null
error_reasonobligatoirestring - Peut être null
duration_msobligatoireinteger - Peut être null
occurred_atobligatoirestring - Format : date-time
- 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403La clé API ne dispose pas de la permission requise pour cette opération, ou le compte est suspendu ou fermé.Le corps d’erreur standard.
- 404NOT_FOUND : aucune ressource correspondante sur ce compte.Le corps d’erreur standard.
- 422VALIDATION_ERROR : la requête n’a pas passé la validation ; details indique les champs en cause.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { data, error } = await honkio.webhooks.deliveries('WEBHOOK_ID', { limit: 20 })
if (error) throw new Error(error.message)
console.log(data.data)curl https://api.honkio.ca/v1/webhooks/ID/deliveries \
-H "Authorization: Bearer mk_live_YOUR_KEY"/v1/webhooks/{id}/dead-lettersLister les événements dont toutes les tentatives de livraison ont échoué (file des lettres mortes)
webhooks:rSDK Node.jshonkio.webhooks.deadLetters()Nécessite webhooks:r.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
limitrequête | integer |
|
include_replayedrequête | boolean |
|
idobligatoirechemin | string |
Réponses
200Événements dont toutes les tentatives ont échoué, du plus récent au plus ancien.
Champ Type Description data[]obligatoireobject[] idobligatoirestring event_idobligatoirestring event_typeobligatoirestring failed_reasonobligatoirestring Raison pour laquelle l’événement n’est plus réessayé : l’échec de la dernière tentative, avec le nombre de tentatives, après environ 24 heures de nouvelles tentatives (par exemple "HTTP_500 after 8 attempts"), la même valeur suivie de "; endpoint disabled" lorsque le point de terminaison a été désactivé alors que l’événement lui était dû, ENDPOINT_DISABLED lorsque vous aviez vous-même désactivé le point de terminaison, SSRF_BLOCKED ou queue_full.
created_atobligatoirestring - Format : date-time
replayed_atobligatoirestring - Format : date-time
- Peut être null
payloadobligatoireany Le corps de l’événement dont la livraison a échoué : { id, type, created, account_id, data }.
- 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403LIVE_KEY_REQUIRED : les clés de test ne peuvent pas accéder ici aux ressources de production. Aussi FORBIDDEN lorsque la clé ne dispose pas de la permission requise par cette opération, ou lorsque le compte est suspendu ou fermé.Le corps d’erreur standard.
- 404NOT_FOUND : aucune ressource correspondante sur ce compte.Le corps d’erreur standard.
- 422VALIDATION_ERROR : la requête n’a pas passé la validation ; details indique les champs en cause.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { data, error } = await honkio.webhooks.deadLetters('WEBHOOK_ID')
if (error) throw new Error(error.message)
for (const dl of data.data) console.log(dl.id)curl https://api.honkio.ca/v1/webhooks/ID/dead-letters \
-H "Authorization: Bearer mk_live_YOUR_KEY"/v1/webhooks/dead-letters/{dlid}/replayRelancer un événement en lettre morte vers l’URL du webhook d’origine
webhooks:mSDK Node.jshonkio.webhooks.replay()Envoie de nouveau l’événement, signé avec un nouvel horodatage et marqué X-HonkIO-Replay: true. 200 { status: "replayed" } lorsque votre point de terminaison l’a accepté ; 502 { status: "failed", http_status, error_reason } lorsqu’il ne l’a pas accepté (l’événement reste dans la file des lettres mortes et peut être renvoyé de nouveau) ; 404 NOT_FOUND lorsque la lettre morte n’appartient pas à votre compte ; 409 DEAD_LETTER_ALREADY_REPLAYED lorsqu’elle a déjà été renvoyée ou qu’un renvoi est en cours, ou 409 ACCOUNT_SUSPENDED lorsque le compte est suspendu ou fermé, auquel cas rien n’est envoyé.
Nécessite webhooks:m.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
dlidobligatoirechemin | string |
Réponses
200Votre point de terminaison a accepté la relance.
Champ Type Description statusobligatoirestring - Une valeur parmi : replayed
http_statusobligatoireinteger - Peut être null
- 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403LIVE_KEY_REQUIRED : les clés de test ne peuvent pas accéder ici aux ressources de production. Aussi FORBIDDEN lorsque la clé ne dispose pas de la permission requise par cette opération, ou lorsque le compte est suspendu ou fermé.Le corps d’erreur standard.
- 404NOT_FOUND : aucune ressource correspondante sur ce compte.Le corps d’erreur standard.
- 409DEAD_LETTER_ALREADY_REPLAYED : déjà relancé, ou une relance est en cours. Également ACCOUNT_SUSPENDED lorsque le compte est suspendu ou fermé. Dans les deux cas, rien n’a été envoyé.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
502WEBHOOK_REPLAY_FAILED : votre point de terminaison n’a pas accepté la relance. L’événement reste dans la file des lettres mortes.
Champ Type Description codeobligatoirestring Code d’erreur lisible par machine, p. ex. VALIDATION_ERROR.
messageobligatoirestring Message lisible dans la langue de la requête (Accept-Language).
messageEnstring Message en anglais, toujours fourni en plus de message.
messageFrstring Message en français, toujours fourni en plus de message.
statusCodeobligatoireinteger Le statut HTTP, repris dans le corps.
detailsany Présent sur certaines erreurs : un tableau de validation AJV, ou des détails structurés propres à l’erreur.
statusobligatoirestring - Une valeur parmi : failed
http_statusobligatoireinteger - Peut être null
error_reasonobligatoirestring - Peut être null
Exemple
const { error } = await honkio.webhooks.replay('DEAD_LETTER_ID')
if (error) throw new Error(error.message)curl -X POST https://api.honkio.ca/v1/webhooks/dead-letters/DLID/replay \
-H "Authorization: Bearer mk_live_YOUR_KEY"/v1/webhooks/dead-letters/{dlid}Abandonner un événement en lettre morte sans le relancer
webhooks:dSDK Node.jshonkio.webhooks.discard()Nécessite webhooks:d.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
dlidobligatoirechemin | string |
Réponses
- 204Abandonné.
- 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403LIVE_KEY_REQUIRED : les clés de test ne peuvent pas accéder ici aux ressources de production. Aussi FORBIDDEN lorsque la clé ne dispose pas de la permission requise par cette opération, ou lorsque le compte est suspendu ou fermé.Le corps d’erreur standard.
- 404NOT_FOUND : aucune ressource correspondante sur ce compte.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { error } = await honkio.webhooks.discard('DEAD_LETTER_ID')
if (error) throw new Error(error.message)curl -X DELETE https://api.honkio.ca/v1/webhooks/dead-letters/DLID \
-H "Authorization: Bearer mk_live_YOUR_KEY"/v1/webhooks/{id}/reactivateRéactiver un webhook désactivé automatiquement à la suite d’échecs de livraison
webhooks:mSDK Node.jshonkio.webhooks.reactivate()Réactive la livraison et remet à zéro la série d’échecs du point de terminaison. Les événements qui ont échoué pendant sa désactivation ne sont pas renvoyés : listez-les avec GET /v1/webhooks/{id}/dead-letters et relancez-les un à un.
Nécessite webhooks:m.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
idobligatoirechemin | string |
Réponses
200Le point de terminaison est de nouveau actif.
Champ Type Description idobligatoirestring activeobligatoireboolean - 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403LIVE_KEY_REQUIRED : les clés de test ne peuvent pas accéder ici aux ressources de production. Aussi FORBIDDEN lorsque la clé ne dispose pas de la permission requise par cette opération, ou lorsque le compte est suspendu ou fermé.Le corps d’erreur standard.
- 404NOT_FOUND : aucune ressource correspondante sur ce compte.Le corps d’erreur standard.
- 422VALIDATION_ERROR : l’URL ne se résout plus vers un point de terminaison public.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { error } = await honkio.webhooks.reactivate('WEBHOOK_ID')
if (error) throw new Error(error.message)curl -X POST https://api.honkio.ca/v1/webhooks/ID/reactivate \
-H "Authorization: Bearer mk_live_YOUR_KEY"/v1/webhooks/{id}/rotate-secretRenouveler le secret de signature d’un webhook
webhooks:mSDK Node.jshonkio.webhooks.rotateSecret()Génère un nouveau secret de signature et le renvoie une seule fois. L’ancien secret cesse immédiatement de signer. Chaque tentative de livraison, nouvelles tentatives comprises, est signée avec le secret que détient le point de terminaison à ce moment-là : renvoyez donc un code autre que 2xx pour une signature que vous ne pouvez pas vérifier, et la nouvelle tentative arrivera signée avec le nouveau secret.
Nécessite webhooks:m.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
idobligatoirechemin | string |
Réponses
200Le nouveau secret, affiché uniquement ici. L’ancien secret cesse immédiatement de signer ; les nouvelles tentatives de tout ce que le point de terminaison rejette pendant la transition sont signées de nouveau avec celui-ci.
Champ Type Description idobligatoirestring signing_secretobligatoirestring 64 caractères hexadécimaux.
secret_rotated_atobligatoirestring - Format : date-time
noticeobligatoirestring - 401Clé API manquante, invalide, révoquée ou expirée.Le corps d’erreur standard.
- 402Le compte n’a aucun solde, ou une clé LIVE a été utilisée avant la première recharge.Le corps d’erreur standard.
- 403LIVE_KEY_REQUIRED : les clés de test ne peuvent pas accéder ici aux ressources de production. Aussi FORBIDDEN lorsque la clé ne dispose pas de la permission requise par cette opération, ou lorsque le compte est suspendu ou fermé.Le corps d’erreur standard.
- 404NOT_FOUND : aucune ressource correspondante sur ce compte.Le corps d’erreur standard.
- 429Limite de débit atteinte : 100 requêtes par seconde et par compte, ou une limite propre à la route (Retry-After est défini le cas échéant).Le corps d’erreur standard.
- 500Erreur de serveur inattendue.Le corps d’erreur standard.
Exemple
const { data, error } = await honkio.webhooks.rotateSecret('WEBHOOK_ID')
if (error) throw new Error(error.message)
console.log(data.signing_secret) // the old secret stopped signing: store this onecurl -X POST https://api.honkio.ca/v1/webhooks/ID/rotate-secret \
-H "Authorization: Bearer mk_live_YOUR_KEY"
HonkIO