Aller au contenu principal

Webhook après validation d'un certificat

Ce webhook vous transmet le contenu d'un dossier dès sa clôture : items collectés, médias, URL du certificat, et le contexte métier que vous aviez fourni à la création du dossier (références, bénéficiaire, métadonnées).

Il existe un second webhook

Le webhook de résultat d'analyse vous livre, lui, le verdict de confiance du dossier (score, détection de falsification, analyses documentaires). Il part plus tard, quand l'analyse est terminée. Les deux sont indépendants et peuvent être activés ensemble.

Quand il part​

Le webhook est envoyé à la clôture du dossier, quel que soit le canal qui la déclenche :

CanalDéclencheur
Application mobileL'utilisateur valide le dossier, y compris sur un dossier ouvert depuis un Certilink.
APIGET /cases/close/:caseId ou GET /cases/close/certilink/:magicLinkToken (voir Gestion des dossiers).
SDK mobileChaque photo certifiée par le SDK crée et clôture son propre dossier.

Un dossier ne donne lieu qu'à un envoi par clôture.

Configuration​

Depuis votre backend​

Vous configurez vous-même l'URL et le jeton du webhook avec l'API, sans intervention de Certificall.

POST /company-options/api-settings

Authentification : Authorization: Bearer <token> (voir Authentification). Le compte API utilisé doit disposer du droit de modification de l'entreprise.

Corps de la requête

NomTypeRequisDescription
endpointStringouiURL HTTPS de votre endpoint, capable de recevoir des requêtes POST.
authTokenStringouiJeton que Certificall présentera à chaque appel.
authorizationHeaderEnumnonOù placer le jeton : authorization (défaut, en-tête Authorization: Bearer) ou security-token (en-tête dédié).

Exemple

curl -X POST https://admin.certificall.app/certificall/api/company-options/api-settings \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"endpoint": "https://votre-domaine.fr/webhooks/certificall/dossier",
"authToken": "<jeton que Certificall vous présentera>",
"authorizationHeader": "authorization"
}'

Réponse 200

{
"companyId": 42,
"apiSettings": [
{
"apiName": "caseHook",
"endpoints": { "sendCase": "https://votre-domaine.fr/webhooks/certificall/dossier" },
"authorizationHeader": "authorization",
"hasCredentials": true
}
]
}

Le jeton n'est jamais réaffiché après enregistrement : la réponse et GET /company-options n'indiquent que la présence d'identifiants (hasCredentials). Pour le changer, renvoyez la requête avec le nouveau jeton.

Contraintes sur l'URL​

Sont refusées : les URL qui ne sont pas en https, les adresses IP littérales (v4 ou v6), et les hôtes sans nom de domaine. Votre endpoint doit être exposé publiquement, sur un domaine résolvable.

Par Certificall​

Les modes d'authentification HMAC-SHA256 (apiKey + apiSecretKey) et clé d'API dédiée (intégrations de type Make) ne se configurent pas depuis l'API. Transmettez à votre interlocuteur Certificall l'URL de votre endpoint et les identifiants à utiliser ; il les enregistrera sur votre entreprise.

Authentification de l'appel entrant​

Selon le mode configuré, votre endpoint reçoit l'un des en-têtes suivants :

# Bearer (défaut)
Authorization: Bearer <authToken>
Content-Type: application/json

# En-tête dédié
security-token: <authToken>
Content-Type: application/json

# Clé d'API (intégrations de type Make)
x-make-apikey: <apiKey>
Content-Type: application/json

# HMAC-SHA256
Authorization: HMAC-SHA256 <apiKey>:<signature>
X-Api-Key: <apiKey>
Content-Type: application/json

Pour le mode HMAC, la signature est un HMAC-SHA256 du corps JSON tel qu'envoyé, calculé avec votre apiSecretKey. Vérifiez-la sur le corps brut de la requête, pas sur une re-sérialisation.

Pas d'authentification Basic

L'authentification Basic (identifiant et mot de passe) n'est pas proposée par ce webhook.

Payload​

{
"cfRef": "CAS-12345_CMP-42",
"createdAt": "2026-05-13T08:24:15.000Z",
"reportId": "CHANTIER-2026-001",
"frame": "Constat sinistre auto",
"closed": true,
"caseUrl": "https://admin.certificall.app/certificall/share/case/<shareToken>",
"items": [
{
"createdAt": "2026-05-13T08:22:01.000Z",
"cfRef": "<référence de l'item>",
"title": "Photo du véhicule",
"description": "vehicule_001.jpg",
"stepAction": "PHOTOGRAPHY",
"geolocLatitude": "48.8566",
"geolocLongitude": "2.3522",
"imageUrl": "https://admin.certificall.app/certificall/images/<identifiant>"
},
{
"createdAt": "2026-05-13T08:23:10.000Z",
"cfRef": "<référence de l'item>",
"title": "Immatriculation",
"description": "AB-123-CD",
"stepAction": "TEXT_FIELD",
"geolocLatitude": "48.8566",
"geolocLongitude": "2.3522",
"imageUrl": ""
}
],
"context": {
"beneficiaire": { "nom": "Dupont", "prenom": "Jean", "adresse": "123 rue de la Paix", "cp": "75001", "ville": "Paris" },
"emetteur": "ACME Company",
"reportRef": "DOSS-2025-001",
"instructions": "Vérifier l'état général du matériel"
},
"metadata": { "dossierId": "DOSS-2025-001", "agence": "PAR-09" }
}

Enveloppe​

ChampTypeDescription
cfRefStringRéférence publique du dossier, au format CAS-<id>_CMP-<entreprise>. Unique : c'est votre clé de déduplication.
createdAtISO 8601Date de création du dossier.
reportIdStringLe reportToken que vous aviez fourni à la création du dossier, du Certilink ou de la photo SDK. C'est votre clé de rattachement.
frameStringNom de la trame du dossier.
closedBooleanToujours true au moment de l'envoi.
caseUrlURLURL du certificat PDF. null si le dossier n'a pas de lien de partage.
itemsArrayLes items collectés.
contextObjectLe contexte métier fourni à la création. Absent si aucun contexte n'a été fourni.

Items​

ChampTypeDescription
createdAtISO 8601Date de collecte de l'item.
cfRefStringRéférence unique de l'item.
titleStringTitre de l'étape dans la trame.
descriptionStringValeur collectée : texte saisi, date, choix, ou titre du fichier pour une photo.
stepActionEnumType de l'étape : PHOTOGRAPHY, VIDEO, SIGNATURE, DOCUMENT_UPLOAD, TEXT_FIELD, NUMBER_FIELD, DATE_FIELD, TIME, EMAIL, SELECT.
geolocLatitude, geolocLongitudeStringCoordonnées de la collecte.
imageUrlURLURL de l'image pour une PHOTOGRAPHY ou une SIGNATURE, chaîne vide sinon.
extractedDataArrayPrésent uniquement si l'extraction de champs est configurée sur l'étape : liste de { key, label, value }.

Contexte​

Le contenu de context dépend de la façon dont le dossier a été créé :

Origine du dossierContenu de context
POST /cases/create ou PATCH /cases/update avec un caseContextLes données de visibleData sous leurs clés internes : beneficiaire (nom, prenom, adresse, cp, ville), emetteur, photoRef, reportRef, instructions, user. Seules les clés renseignées sont présentes.
Certilink (POST /certilink/create avec un context)L'objet context du Certilink, restitué tel quel.
Application sans contextecontext absent.

Métadonnées​

metadata est un champ du dossier, à côté de context : vos clés-valeurs telles que fournies, que le dossier vienne de POST /cases/create, d'un Certilink ou du SDK mobile. La clé est absente quand le dossier n'en porte aucune.

Où mettre vos identifiants internes

Pour rattacher le dossier à votre système, utilisez reportToken (renvoyé dans reportId), disponible sur tous les canaux et seul champ sur lequel l'API filtre. Le champ metadata est un complément, restitué sur tous les canaux : identifiant de chantier, code agence, type de dossier, page d'origine…

Garanties de livraison​

Comportement
RéémissionAucune. Si votre endpoint est injoignable ou répond en erreur, l'échec est journalisé côté Certificall et l'envoi n'est pas retenté.
DoublonsUn envoi par clôture. Gardez néanmoins un traitement idempotent sur cfRef.
OrdreNon garanti entre dossiers.

Deux conséquences pratiques :

  1. Répondez en 2xx rapidement et faites votre traitement métier en arrière-plan.
  2. Prévoyez un filet. Un balayage périodique de GET /cases?format=metadata&closed=true&hours=… (voir Gestion des dossiers) rattrape les dossiers dont le webhook ne vous est pas parvenu.

Traitement côté partenaire​

// POST /webhooks/certificall/dossier (votre route)
app.post('/webhooks/certificall/dossier', verifyToken, async (req, res) => {
const { cfRef, reportId, caseUrl, items, metadata = {} } = req.body;

// 1) Accuser réception tout de suite
res.status(200).end();

// 2) Retrouver votre dossier : reportId = votre reportToken
const dossier = await db.findByReference(reportId);
if (!dossier) return; // dossier inconnu : on ignore, sans erreur

// 3) Idempotence sur cfRef
if (await db.alreadyReceived(cfRef)) return;

// 4) Exploiter le contenu
const photos = items.filter(i => i.stepAction === 'PHOTOGRAPHY').map(i => i.imageUrl);

await db.attachCertificate(dossier.id, { cfRef, caseUrl, photos, metadata });
});

Check-list​

  • Endpoint exposé publiquement en HTTPS, sur un domaine résolvable.
  • URL et jeton enregistrés via POST /company-options/api-settings (ou transmis à Certificall pour HMAC et clé d'API).
  • Mode d'authentification vérifié à la réception.
  • reportToken renseigné à la création de vos dossiers, Certilinks ou photos SDK.
  • Traitement idempotent sur cfRef.
  • Réponse 2xx rapide, traitement métier découplé.
  • Filet de rattrapage sur GET /cases pour les dossiers sensibles.

Pour aller plus loin​