Validation documentaire : intégration API et ERP
Guide technique pour connecter la validation documentaire à Salesforce, SAP ou vos outils internes via API REST et webhooks. Architectures, code, bonnes pratiques.

Résumer cet article avec
Selon Gartner, 65 % des entreprises qui déploient des outils de traitement documentaire échouent à en tirer le plein potentiel faute d'intégration avec leur SI existant. La validation documentaire ne devrait jamais être un silo isolé. Quand un opérateur télécharge manuellement des fichiers dans un outil autonome, copie les résultats dans un CRM, puis met à jour un ERP, chaque étape introduit un délai, un risque d'erreur et une rupture de traçabilité. Dans une organisation qui traite plusieurs centaines de dossiers par mois, ce schéma manuel devient un véritable goulet d'étranglement.
Cet article détaille les trois modèles d'intégration qui permettent de connecter CheckFile directement à votre système d'information -- qu'il s'agisse de Salesforce, SAP, d'un CRM maison ou d'un workflow interne. Vous y trouverez des schémas d'architecture, des exemples de code fonctionnels et les bonnes pratiques tirées de déploiements réels. Si vous cherchez d'abord la référence technique des endpoints, consultez le guide API existant.
Pourquoi la validation documentaire ne doit pas rester un outil isolé
Selon Gartner, 65 % des entreprises échouent à tirer plein potentiel des outils documentaires faute d'intégration SI (Gartner 2024). Un outil isolé génère trois problèmes : rupture du flux (25 à 40 heures perdues/mois sur 500 dossiers), perte de traçabilité en cas d'audit, et 2 à 5 % d'erreurs de recopie manuelle (200 à 500 dossiers incohérents sur 10 000 annuels).
Perte de traçabilité. Les résultats de validation ne sont pas liés au dossier client dans le système de référence. En cas d'audit, il faut reconstituer manuellement la chaîne : qui a validé quoi, quand, avec quel résultat.
Erreurs de recopie. Quand un opérateur transfère manuellement le statut d'un document du validateur vers le CRM, le taux d'erreur oscille entre 2 et 5 %. Sur un volume de 10 000 dossiers annuels, cela signifie 200 à 500 dossiers avec un statut incohérent.
L'intégration directe élimine ces trois problèmes. Le reste de cet article explique comment la mettre en oeuvre.
Les trois modèles d'intégration
Trois architectures couvrent 95 % des besoins d'intégration d'une API de validation documentaire : le batch upload, l'API temps réel et les webhooks événementiels. Le règlement DORA (Règlement (UE) 2022/2554, applicable depuis janvier 2025) exige que les entités financières documentent et testent chaque intégration applicative tiers dans leur registre de dépendances ICT (EUR-Lex DORA Art. 28). Le choix du modèle dépend du volume de documents, de la latence acceptable et de la maturité technique de votre équipe.
| Modèle | Cas d'usage | Latence | Complexité |
|---|---|---|---|
| Batch upload | Migration initiale, retraitement mensuel | Minutes à heures | Faible |
| API temps réel | Onboarding client, portail self-service | 2-15 secondes | Moyenne |
| Webhooks événementiels | Pipeline automatisé, intégration ERP | Quasi-instantané (push) | Moyenne à élevée |
Modèle 1 -- Batch upload
Le batch upload convient quand la latence n'est pas critique : migration d'un historique documentaire, retraitement périodique, ou alimentation nocturne d'un data warehouse.
Le principe est simple : vous déposez un ensemble de fichiers via l'endpoint batch, puis vous interrogez les résultats une fois le traitement terminé.
# Upload d'un lot de 3 documents
curl -X POST https://api.checkfile.ai/api/v1/files/batch \
-H "X-API-Key: ck_live_votre_cle" \
-F "files[]=@facture_001.pdf" \
-F "files[]=@kbis_societe.pdf" \
-F "files[]=@rib_client.pdf" \
-F "dossier_id=DOS-2026-0042" \
-F "callback_url=https://votre-app.com/webhooks/checkfile"
Le serveur retourne immédiatement un identifiant de lot :
{
"batch_id": "bat_7f3a9c2e",
"file_count": 3,
"status": "queued",
"estimated_completion": "2026-02-21T14:35:00Z"
}
Vous pouvez ensuite interroger le statut du lot par polling ou attendre le webhook de complétion.
Modèle 2 -- API temps réel
C'est le modèle le plus courant pour les applications interactives : un utilisateur uploade un document, votre application l'envoie à CheckFile, attend le résultat et l'affiche. Ce modèle est détaillé dans le guide API.
# Upload d'un document unique
curl -X POST https://api.checkfile.ai/api/v1/files \
-H "X-API-Key: ck_live_votre_cle" \
-H "Idempotency-Key: upload-dos042-kbis" \
-F "file=@kbis_societe.pdf" \
-F "document_type=kbis" \
-F "rules=freshness_90d,siren_match"
Réponse :
{
"file_id": "fil_8b2c4d1e",
"status": "processing",
"created_at": "2026-02-21T14:22:03Z"
}
Puis polling du statut :
curl https://api.checkfile.ai/api/v1/files/fil_8b2c4d1e/status \
-H "X-API-Key: ck_live_votre_cle"
Modèle 3 -- Webhooks événementiels
Les webhooks inversent le flux : au lieu de poller l'API, c'est CheckFile qui notifie votre système dès que le traitement est terminé. C'est le modèle recommandé pour les pipelines automatisés et les intégrations ERP.
L'avantage est double : latence minimale (notification push en quelques secondes) et aucun trafic inutile de polling.
Architecture webhook en détail
Enregistrement d'un endpoint webhook
curl -X POST https://api.checkfile.ai/api/v1/webhooks \
-H "X-API-Key: ck_live_votre_cle" \
-H "Content-Type: application/json" \
-d '{
"url": "https://votre-app.com/webhooks/checkfile",
"events": ["file.validated", "file.rejected", "batch.completed"],
"secret": "whsec_votre_secret_de_signature"
}'
Payload webhook : document validé
Quand un document passe toutes les règles de validation, CheckFile envoie un POST à votre endpoint avec le payload suivant :
{
"event": "file.validated",
"timestamp": "2026-02-21T14:22:18Z",
"data": {
"file_id": "fil_8b2c4d1e",
"dossier_id": "DOS-2026-0042",
"document_type": "kbis",
"status": "validated",
"confidence_score": 0.97,
"extracted_fields": {
"raison_sociale": "ACME Industries SAS",
"siren": "823456789",
"date_immatriculation": "2019-03-15",
"adresse_siege": "12 rue de la Paix, 75002 Paris",
"representant_legal": "Jean Dupont",
"date_document": "2026-01-28"
},
"rules_results": [
{
"rule": "freshness_90d",
"status": "passed",
"detail": "Document daté le 28/01/2026, valide jusqu'au 28/04/2026"
},
{
"rule": "siren_match",
"status": "passed",
"detail": "SIREN 823456789 correspond au dossier"
}
],
"processing_time_ms": 3420
}
}
Payload webhook : document rejeté
{
"event": "file.rejected",
"timestamp": "2026-02-21T14:23:05Z",
"data": {
"file_id": "fil_9c3d5e2f",
"dossier_id": "DOS-2026-0042",
"document_type": "rib",
"status": "rejected",
"confidence_score": 0.42,
"rejection_reasons": [
{
"rule": "iban_valid",
"status": "failed",
"detail": "IBAN FR76 3000 1007 ... : clé de contrôle invalide"
},
{
"rule": "titulaire_match",
"status": "failed",
"detail": "Titulaire 'SCI Les Tilleuls' ne correspond pas à 'ACME Industries SAS'"
}
],
"processing_time_ms": 2180
}
}
Réception et traitement du webhook en Python
from flask import Flask, request, abort
import hmac
import hashlib
app = Flask(__name__)
WEBHOOK_SECRET = "whsec_votre_secret_de_signature"
def verify_signature(payload: bytes, signature: str) -> bool:
expected = hmac.new(
WEBHOOK_SECRET.encode(),
payload,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(f"sha256={expected}", signature)
@app.route("/webhooks/checkfile", methods=["POST"])
def handle_webhook():
# 1. Vérifier la signature
signature = request.headers.get("X-CheckFile-Signature", "")
if not verify_signature(request.data, signature):
abort(401)
event = request.json
event_type = event["event"]
data = event["data"]
# 2. Router selon le type d'événement
if event_type == "file.validated":
update_crm_document_status(
dossier_id=data["dossier_id"],
document_type=data["document_type"],
status="validé",
extracted_fields=data["extracted_fields"]
)
elif event_type == "file.rejected":
trigger_operator_alert(
dossier_id=data["dossier_id"],
reasons=data["rejection_reasons"]
)
elif event_type == "batch.completed":
finalize_dossier(data["batch_id"])
# 3. Répondre 200 rapidement
return {"received": True}, 200
Réception du webhook en Node.js
const express = require("express");
const crypto = require("crypto");
const app = express();
const WEBHOOK_SECRET = "whsec_votre_secret_de_signature";
app.post("/webhooks/checkfile", express.raw({ type: "application/json" }), (req, res) => {
// Vérifier la signature
const signature = req.headers["x-checkfile-signature"] || "";
const expected = `sha256=${crypto
.createHmac("sha256", WEBHOOK_SECRET)
.update(req.body)
.digest("hex")}`;
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).send("Invalid signature");
}
const event = JSON.parse(req.body);
switch (event.event) {
case "file.validated":
updateCrmStatus(event.data);
break;
case "file.rejected":
notifyOperator(event.data);
break;
case "batch.completed":
finalizeDossier(event.data);
break;
}
res.json({ received: true });
});
Intégration ERP : patterns par plateforme
Salesforce
L'intégration Salesforce la plus courante utilise un Apex Trigger ou un Flow déclenché par le webhook CheckFile. L'architecture type :
- Middleware léger (Heroku, AWS Lambda ou Mulesoft) qui reçoit le webhook CheckFile.
- Le middleware appelle l'API REST Salesforce pour mettre à jour l'objet
Document__couContentVersion. - Un Flow Salesforce réagit à la mise à jour pour déclencher la suite du processus métier (notification au commercial, passage en étape suivante du pipeline).
| Composant | Rôle | Technologie |
|---|---|---|
| Webhook receiver | Reçoit et valide le payload CheckFile | Lambda / Cloud Function |
| Salesforce connector | Écrit dans les objets SF via API REST | OAuth 2.0 + Connected App |
| Automation layer | Déclenche la logique métier | Salesforce Flow / Apex |
SAP
Pour SAP S/4HANA ou SAP Business One, deux approches coexistent :
Via SAP Integration Suite (ex-CPI). Un iFlow reçoit le webhook, transforme le payload en IDoc ou OData et l'injecte dans SAP. Cette approche est privilégiée par les équipes SAP Basis car elle reste dans l'écosystème SAP.
Via middleware générique. Un connecteur Python ou Node.js reçoit le webhook et appelle l'API OData de SAP directement. Plus rapide à mettre en place, mais nécessite de gérer l'authentification SAP (OAuth ou Basic Auth avec certificat client).
CRM ou outil interne
Pour un outil interne, le webhook est la méthode la plus directe. Votre backend reçoit le payload, extrait les champs pertinents et met à jour votre base de données. Aucun middleware supplémentaire n'est nécessaire.
# Exemple : mise à jour directe en base après réception du webhook
def update_crm_document_status(dossier_id, document_type, status, extracted_fields):
db.execute(
"""
UPDATE documents
SET validation_status = %s,
extracted_data = %s,
validated_at = NOW()
WHERE dossier_id = %s AND document_type = %s
""",
(status, json.dumps(extracted_fields), dossier_id, document_type)
)
# Vérifier si tous les documents du dossier sont validés
pending = db.fetchone(
"SELECT COUNT(*) FROM documents WHERE dossier_id = %s AND validation_status = 'pending'",
(dossier_id,)
)
if pending[0] == 0:
mark_dossier_complete(dossier_id)
Authentification et sécurité
L'intégration API dans un SI d'entreprise exige des garanties de sécurité supérieures à celles d'un prototype. La CNIL a prononcé 42 mises en demeure et 18 sanctions en 2024 pour des insuffisances dans la sécurisation des API manipulant des données personnelles, pour un total de 51 millions EUR d'amendes (CNIL Rapport d'activité 2024).
Clés API : bonnes pratiques
- Une clé par environnement. Développement (
ck_test_), recette, production (ck_live_). Ne partagez jamais une clé entre environnements. - Rotation régulière. Changez vos clés tous les 90 jours. L'API permet d'avoir deux clés actives simultanément pour assurer une rotation sans interruption.
- Stockage sécurisé. Vault (HashiCorp), AWS Secrets Manager ou Azure Key Vault. Jamais en clair dans le code source ou les variables d'environnement d'un fichier
.envcommité.
Vérification des webhooks
Chaque webhook est signé avec votre secret (whsec_...). Vérifiez systématiquement la signature HMAC-SHA256 avant de traiter le payload. Les exemples de code ci-dessus montrent l'implémentation en Python et Node.js.
Restriction réseau
Pour les environnements les plus sensibles, combinez deux mesures :
- IP whitelisting. Restreignez votre endpoint webhook aux plages IP de CheckFile (disponibles dans la documentation technique).
- mTLS. Sur le plan Enterprise, activez l'authentification mutuelle TLS pour que CheckFile présente un certificat client à votre serveur.
Pour plus de détails sur les niveaux de service et les options de sécurité, consultez les tarifs.
Gestion des erreurs et stratégies de retry
Le règlement DORA Art. 11 impose aux entités financières de mettre en place des procédures de réponse aux incidents ICT incluant des mécanismes de retry documentés et testés annuellement (EUR-Lex DORA Art. 11). Les intégrations en production doivent gérer trois catégories d'erreurs.
Erreurs transitoires (5xx, timeout)
CheckFile retente automatiquement les webhooks en cas d'échec. Le schéma de retry suit un backoff exponentiel :
| Tentative | Délai après échec |
|---|---|
| 1 | 30 secondes |
| 2 | 2 minutes |
| 3 | 10 minutes |
| 4 | 1 heure |
| 5 | 6 heures |
Après 5 échecs, le webhook est marqué comme "failed" et une alerte est envoyée par email. Vous pouvez rejouer manuellement les webhooks échoués depuis le dashboard.
Erreurs de validation métier
Un document rejeté n'est pas une erreur technique. Votre code doit distinguer clairement les deux cas :
if event_type == "file.rejected":
# Ce n'est PAS une erreur technique -- c'est un résultat métier
# Ne pas retenter, notifier l'opérateur
notify_operator(data["rejection_reasons"])
Idempotence
Votre endpoint webhook doit être idempotent. CheckFile peut renvoyer le même événement en cas de timeout réseau. Utilisez le champ file_id comme clé d'idempotence :
if db.exists("SELECT 1 FROM webhook_events WHERE file_id = %s", (data["file_id"],)):
return {"received": True}, 200 # Déjà traité, on ignore
db.insert("webhook_events", file_id=data["file_id"], processed_at=now())
# ... traitement normal
Performance : traitement asynchrone et optimisation batch
Traitement asynchrone
Pour les volumes importants (plus de 100 documents par jour), ne traitez pas les webhooks de manière synchrone dans le handler HTTP. Utilisez une file de messages :
- Le handler webhook valide la signature et dépose le payload dans une queue (RabbitMQ, SQS, Redis Streams).
- Un worker consomme la queue et effectue les opérations lentes (écriture ERP, notifications).
- Le handler répond 200 en moins de 500 ms, évitant les timeouts.
Optimisation batch
Pour les migrations ou retraitements massifs, l'endpoint batch offre de meilleures performances qu'une série d'uploads individuels :
| Approche | 1 000 documents | Requêtes API |
|---|---|---|
| Upload individuel | ~45 minutes | 1 000 POST + 1 000 GET |
| Batch (lots de 50) | ~12 minutes | 20 POST + 20 GET |
Monitoring et observabilité
Une intégration en production sans monitoring est une bombe à retardement. Trois niveaux de surveillance sont nécessaires.
Métriques opérationnelles
- Taux de succès webhook : pourcentage de webhooks reçus et traités sans erreur. Cible : > 99,5 %.
- Latence de traitement : temps entre l'upload et la réception du webhook. Cible : < 15 secondes pour 95 % des documents.
- Taux de rejet documentaire : si ce taux dépasse 30 %, c'est un signal d'alerte sur la qualité des documents soumis en amont.
Alertes
Configurez des alertes sur :
- Webhook endpoint indisponible (5 échecs consécutifs)
- Latence de traitement > 30 secondes (p95)
- Taux de rejet > seuil habituel + 2 écarts-types
Logs structurés
Tracez chaque événement avec des logs structurés (JSON) incluant file_id, dossier_id, event_type, processing_time_ms et status. Ces logs alimentent votre SIEM et facilitent les audits de conformité.
Parcours de migration : du manuel au pipeline automatisé
La migration vers une intégration complète ne se fait pas en un jour. Voici un parcours progressif en quatre étapes.
Étape 1 –- Interface web (semaine 1). Utilisez le dashboard CheckFile pour valider manuellement vos premiers documents. Objectif : valider les règles métier et les types de documents.
Étape 2 –- API temps réel (semaines 2-3). Intégrez l'upload API dans votre application. Les opérateurs ne quittent plus leur outil, mais le processus reste initié manuellement.
Étape 3 –- Webhooks (semaines 4-5). Activez les webhooks pour recevoir les résultats automatiquement. Votre CRM/ERP est mis à jour sans intervention humaine. Le travail de l'opérateur se limite aux dossiers rejetés.
Étape 4 –- Pipeline entièrement automatisé (semaines 6-8). Les documents sont uploadés automatiquement dès leur réception (email parser, portail client, scan). Les webhooks alimentent l'ERP. Les opérateurs ne traitent que les exceptions.
À chaque étape, vous pouvez mesurer le gain de temps et le taux d'erreur pour justifier l'investissement de l'étape suivante. Si vous hésitez entre développer votre propre solution de validation et utiliser une plateforme existante, lisez notre analyse build vs buy.
À lire aussi
Conclusion : l'intégration comme levier de productivité
La validation documentaire n'apporte sa pleine valeur que lorsqu'elle est intégrée dans le flux de travail existant. Une API REST bien conçue, des webhooks fiables et des patterns d'intégration adaptés à votre ERP transforment un outil de vérification en un composant natif de votre système d'information.
Les gains concrets : suppression des recopies manuelles, traçabilité complète, traitement en temps réel et réduction mesurable du taux d'erreur. Pour les équipes qui traitent plus de 200 dossiers par mois, l'intégration représente typiquement un retour sur investissement en moins de 3 mois. D'après les données de CheckFile.ai sur plus de 50 000 dossiers traités via API, le délai moyen de traitement est inférieur à 30 secondes par document, avec des intégrations disponibles nativement pour Salesforce, SAP, Zapier et Make. Notre article sur le coût réel de la validation manuelle chiffre précisément les économies réalisables.
Prêt à connecter la validation documentaire à votre SI ? Consultez la documentation API de CheckFile ou contactez notre équipe technique pour un accompagnement sur mesure. ## FAQ
Quelle est la différence entre une intégration batch, temps réel et webhook ?
Le batch upload convient aux traitements non urgents (migration historique, retraitement mensuel) : les fichiers sont déposés en lot et les résultats récupérés une fois le traitement terminé. L'API temps réel est utilisée pour les parcours interactifs où l'utilisateur attend le résultat (onboarding client, portail self-service) avec une latence de 2 à 15 secondes. Les webhooks inversent le flux : la plateforme notifie votre système dès que le traitement est terminé, ce qui est le modèle recommandé pour les pipelines ERP automatisés.
Comment sécuriser une intégration API dans un système d'information d'entreprise ?
Trois mesures sont essentielles : utiliser une clé API par environnement (développement, recette, production) en les stockant dans un gestionnaire de secrets (Vault, AWS Secrets Manager), vérifier systématiquement la signature HMAC-SHA256 de chaque webhook reçu avant traitement, et restreindre si possible l'accès de votre endpoint webhook aux plages IP de la plateforme. Pour les environnements sensibles, l'authentification mutuelle TLS (mTLS) ajoute une couche supplémentaire.
Quels sont les risques si les webhooks ne sont pas traités de manière idempotente ?
Si votre handler webhook n'est pas idempotent, un événement renvoyé par la plateforme (suite à un timeout réseau par exemple) peut déclencher un double traitement : mise à jour en double dans le CRM, double notification à l'opérateur, voire double validation d'un dossier. La solution est d'utiliser le champ file_id comme clé d'idempotence : avant tout traitement, vérifier si cet identifiant a déjà été traité dans votre base de données.
Combien de temps faut-il pour déployer une intégration complète en production ?
Le parcours de migration recommandé comprend quatre étapes sur 6 à 8 semaines : démarrage avec l'interface web (semaine 1), intégration de l'API temps réel (semaines 2-3), activation des webhooks pour mise à jour automatique du CRM/ERP (semaines 4-5), puis pipeline entièrement automatisé avec upload déclenché à la réception des documents (semaines 6-8). Chaque étape produit des gains mesurables qui justifient l'investissement de l'étape suivante.
Les tarifs incluent un accès API sur tous les plans, avec un environnement sandbox pour tester votre intégration avant la mise en production.