Webhooks
4 endpoints
/v1/webhooksLister les souscriptions webhooks
Retourne la liste des souscriptions webhooks créées par la clé API
appelante. Les souscriptions créées par une autre clé du même client
ne sont PAS visibles ici (filtre client_id AND api_key_id).
Pas de pagination cursor
Le maximum de 10 souscriptions par client tient toujours dans une
seule page. La réponse retourne pagination.next_cursor=null et
has_more=false.
Secret jamais retourné
Le secret HMAC utilisé pour signer les payloads sortants n'est
retourné qu'à la création (POST /v1/webhooks). Il n'est pas
relu ici — pour le faire tourner, supprimer la souscription et
en créer une nouvelle.
webhooks:manageResponses
| Statut | Description |
|---|---|
200 | Liste des souscriptions webhooks de cette clé API. |
401 | Clé API inconnue ou format invalide. |
403 | Refus d'autorisation. Deux causes, distinguées par |
429 | Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint. |
500 | Erreur serveur inattendue. Toujours fournir le |
Exemple de requête
curl -X GET 'https://api.capturia.io/v1/webhooks' \
-H 'Authorization: Bearer cap_live_<your-key>' \
-H 'Content-Type: application/json'/v1/webhooksCréer une souscription webhook
Enregistre une nouvelle souscription. Capturia émettra un POST JSON
signé HMAC à url chaque fois qu'un événement souscrit survient.
URL HTTPS obligatoire
L'URL doit utiliser le schéma https:// — http:// est rejeté pour
éviter la fuite des payloads en clair.
Limite de 10 souscriptions par client
Au-delà de 10 souscriptions actives sur un même client (toutes clés
confondues), retourne 429 subscription_limit_reached. Supprimer
une souscription existante avant d'en créer une nouvelle.
Secret HMAC retourné UNE seule fois
La réponse 201 inclut secret en clair (64 caractères hex, 256 bits
d'entropie). Le client DOIT le stocker immédiatement — il sert à
vérifier la signature des payloads sortants
(X-Capturia-Signature) et n'est plus jamais retourné par l'API.
Le secret est chiffré en base après cette réponse.
Scope de la clé créatrice
La souscription appartient à la fois au client ET à la clé API qui
l'a créée. Les endpoints GET /v1/webhooks et
DELETE /v1/webhooks/{id} ne voient que les souscriptions de la
clé courante — une souscription créée par une autre clé du même
client n'est ni listée ni supprimable via l'API.
webhooks:manageCorps de requête
| Propriété | Type | Obligatoire | Description |
|---|---|---|---|
url | string | obligatoire | URL HTTPS qui recevra les notifications. Doit être un endpoint
accessible publiquement et accepter POST JSON. |
events | string[] | obligatoire | Liste non-vide d'événements métier à souscrire, ou * pour tous les
événements. Le nom de chaque événement est livré tel quel dans l'entête
X-Capturia-Event et le champ event du payload. Catalogue complet et
schéma des payloads : docs/webhooks-event-catalog.md. |
Responses
| Statut | Description |
|---|---|
201 | Souscription créée. Le |
400 | Validation des paramètres ou du body a échoué. |
401 | Clé API inconnue ou format invalide. |
403 | Refus d'autorisation. Deux causes, distinguées par |
415 | Le header |
429 | Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint. |
500 | Erreur serveur inattendue. Toujours fournir le |
Exemple de requête
curl -X POST 'https://api.capturia.io/v1/webhooks' \
-H 'Authorization: Bearer cap_live_<your-key>' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://hooks.example.com/capturia",
"events": [
"lead_created",
"payment_received"
]
}'/v1/webhooks/{id}Supprimer une souscription webhook
Supprime définitivement une souscription webhook. La souscription
doit appartenir à la fois au client appelant ET à la clé API
appelante (filtre client_id AND api_key_id) — sinon
404 not_found.
Pas de soft delete
La suppression est immédiate et irréversible — pour réactiver le
flux d'événements, créer une nouvelle souscription via
POST /v1/webhooks (un nouveau secret sera émis).
webhooks:manageResponses
| Statut | Description |
|---|---|
204 | Souscription supprimée. Pas de body. |
401 | Clé API inconnue ou format invalide. |
403 | Refus d'autorisation. Deux causes, distinguées par |
404 | La ressource demandée n'existe pas (ou pas dans le scope du tenant). |
429 | Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint. |
500 | Erreur serveur inattendue. Toujours fournir le |
Exemple de requête
curl -X DELETE 'https://api.capturia.io/v1/webhooks/{id}' \
-H 'Authorization: Bearer cap_live_<your-key>' \
-H 'Content-Type: application/json'/v1/webhook-eventsLister les derniers événements métier livrables (échantillons)
Retourne les derniers événements métier du compte, dans exactement la forme du payload livré par une souscription webhook — le même constructeur de payload sert la livraison réelle et cette liste.
À quoi ça sert
performListdes apps Zapier/Make : quand un utilisateur teste un trigger, l'app affiche de vrais échantillons récents, garantis identiques à ce qu'une livraison réelle enverra.- Debug d'intégration : inspecter ce qui serait livré sans attendre un nouvel événement.
La liste réunit deux sources, du plus récent au plus ancien :
- les événements enregistrés dans la file de livraison du compte, avec les données exactes qui ont été ou seront livrées ;
- complétés par les événements du journal d'activité que la file n'a pas enregistrés (aucune souscription ne les écoutait alors), mis en forme par le même constructeur.
Elle fonctionne donc même si aucune souscription webhook n'existe.
Les événements émis hors du journal (lead_updated, note_created,
task_created, sms_received, email_sent, call_ended…)
n'apparaissent qu'une fois qu'une souscription les écoute : tant
qu'aucune ne les écoute, ils ne sont enregistrés nulle part. Les
types d'événements internes (audit) n'apparaissent jamais, et les
clés sensibles du champ changes sont expurgées comme à la
livraison.
Différence avec une livraison réelle
Le champ id de chaque item est l'identifiant de l'événement à sa
source — lors d'une livraison réelle, id est l'identifiant unique
de la livraison (X-Capturia-Delivery). Le champ data.system vaut
toujours null dans un échantillon : il est résolu au moment de la
livraison. La forme et tous les autres champs sont identiques.
Pas de pagination cursor
C'est un flux d'échantillons récents, plafonné à 25 items
(limit, défaut 10). La réponse retourne
pagination.next_cursor=null et has_more=false.
webhooks:manageParamètres de requête
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
event | string | optionnel | Restreint aux événements de ce type (une valeur du catalogue,
ex. lead_created, booking_created, automation_completed).
Une valeur hors catalogue répond 400 validation_error
(reason: unknown_event_type). |
limit | integer | optionnel | Nombre maximum d'items (entier de 1 à 25, défaut 10). Une valeur non entière ou hors bornes répond 400 validation_error. |
Responses
| Statut | Description |
|---|---|
200 | Derniers événements livrables, du plus récent au plus ancien. |
400 | Validation des paramètres ou du body a échoué. |
401 | Clé API inconnue ou format invalide. |
403 | Refus d'autorisation. Deux causes, distinguées par |
429 | Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint. |
500 | Erreur serveur inattendue. Toujours fournir le |
Exemple de requête
curl -X GET 'https://api.capturia.io/v1/webhook-events' \
-H 'Authorization: Bearer cap_live_<your-key>' \
-H 'Content-Type: application/json'