Contact (contact)
Un contact est un contact professionnel rattaché à une company. Il porte son nom d'affichage, ses coordonnées et sa fonction, et peut se voir attribuer un ou plusieurs rôles qui le qualifient vis-à-vis de la company.
Rôle
Le contact sépare le contact professionnel de l'entité légale. Une company (société, entreprise) peut avoir plusieurs contacts — représentant légal, autorisateur de paiement, contact de facturation — chacun avec ses propres informations et son propre niveau de vérification.
Les vérifications KYC, AML, PEP, sanctions ou liveness sont enregistrées dans des compliance_check liés au contact, jamais recopiées sur celui-ci. Un contact peut être recherché par email et résolu par rôle dans les processus d'orchestration.
Identifiant et structure
Chaque contact porte un identifiant stable préfixé par ctc_. Il référence sa company parente via company_id.
{
"object": "contact",
"id": "ctc_d12e3f4a5b6c7d8e",
"company_id": "cmp_3a8f1d9c2b4e7f6a",
"full_name": "Marie Dupont",
"first_name": "Marie",
"last_name": "Dupont",
"email": "marie.dupont@dupont-industries.fr",
"phone": "+33612345678",
"job_title": "Directrice financière",
"preferred_locale": "fr-FR",
"suspended": false,
"suspended_at": null,
"suspension_reason": null,
"source_reference": "RH-00421",
"metadata": {},
"created_at": "2026-01-12T10:00:00.000Z",
"updated_at": "2026-03-05T14:20:00.000Z"
}Champs
| Champ | Type | Requis | Description |
|---|---|---|---|
id | string | oui | Identifiant du contact (préfixe ctc_). |
object | string | oui | Toujours "contact". |
merchant_id | string | oui | Marchand auquel appartient le contact. |
company_id | string | oui | Identifiant de la company parente (cmp_…). |
full_name | string | oui | Nom complet canonique, conservé exactement comme fourni. |
first_name | string | non | Prénom structuré, lorsqu’il est connu sans déduction. |
last_name | string | non | Nom de famille structuré, lorsqu’il est connu sans déduction. |
email | string | non | Adresse e-mail. Utilisée comme clé de recherche par email. |
phone | string | non | Numéro de téléphone au format international E.164, par exemple +33123456789. |
job_title | string | non | Fonction professionnelle libre. |
preferred_locale | string | non | Locale BCP 47 préférée, par exemple fr-FR. |
suspended | boolean | oui | Indique si le contact est suspendu. Un contact suspendu conserve son historique mais n'est plus retenu pour les opérations futures. |
suspended_at | datetime | non | Date de la suspension en cours. |
suspension_reason | string | non | Motif libre de la suspension en cours. |
source_reference | string | non | Référence dans votre système (CRM, RH…). |
metadata | object | non | Map plate de scalaires `string | number | boolean`, selon la convention metadata de l’API. |
created_at | datetime | oui | Date de création. |
updated_at | datetime | oui | Date de dernière mise à jour. |
Identité et conformité
Les résultats réglementaires ne sont pas des propriétés intrinsèques du contact. Chaque vérification produit un compliance_check avec subject_type=contact, l'ID du contact dans subject_id, une nature dans check_type et un résultat normalisé dans result.
submit_draft. Les événements compliance_check.passed, compliance_check.failed, compliance_check.review_required et compliance_check.expired portent les transitions de conformité.Suspension
Une personne peut devoir cesser d'agir pour une company sans pour autant disparaître de la base : alerte sanctions, soupçon de fraude, accès compromis, départ des effectifs. Supprimer le contact ferait perdre l'historique de ses actes passés — commandes, factures, dossiers d'entrée en relation, contrôles de conformité. La suspension répond à ce besoin : elle neutralise le contact sans rien effacer.
POST /v1/contacts/ctc_d12e3f4a5b6c7d8e/suspend
Content-Type: application/json
{
"reason": "sanctions_match"
}Un contact suspendu :
- n'est plus retourné par
GET /v1/companies/:id/contacts/resolve, saufinclude_suspended=true— les nodes de résolution basculent donc sur la routenot_found; - ne peut plus recevoir de nouveau
contact_role: la création répond409; - reste lisible et modifiable, pour pouvoir corriger ses données et lever la suspension.
POST /v1/contacts/:id/reactivate lève la suspension et efface suspended_at et suspension_reason.
Les événements contact.suspended et contact.reactivated permettent de déclencher un processus, par exemple pour repartir en collecte d'un nouveau signataire quand un dossier en cours perd le sien.
Mode brouillon
Pendant un parcours d'entrée en relation, les données du contact sont collectées progressivement par l'utilisateur final avant qu'une company n'existe encore. La plateforme prend en charge ce cas via le mode brouillon : un contact en brouillon porte le même payload métier, sans identifiant, et n'est pas encore rattaché à une company définitive.
Dans les processus, le brouillon circule avec le type platform.contact (draft). Le node submit_contact le convertit en contact engagé dès qu'une company est disponible :
[Collecte contact (draft)] → [Créer company] → [Submit contact]
↓
contact (engagé, ctc_…)Les nodes KYC (vérification d'identité, liveness, SIRENE) acceptent également les drafts en entrée — la vérification peut donc démarrer avant la soumission finale.
Relations
| Objet lié | Lien | Accès |
|---|---|---|
company | Parent (1..1) | Champ company_id · Page company |
contact_role | 0..n rôles | GET /v1/companies/:id/roles · Page rôle de contact |
La résolution d'un contact par rôle et niveau de certification est documentée dans la section Dans les processus ci-dessous et dans la page company (endpoint GET /v1/companies/:id/contacts/resolve).
Dans les processus
| Node | Rôle | Entrées / sorties clés |
|---|---|---|
create_contact | Crée un contact directement rattaché à une company | Accepte : company · Produit : contact |
submit_contact | Convertit un draft collecté en contact et le rattache à une company | Accepte : company, contact (draft) · Produit : contact |
find_contact_by_email | Cherche un contact par email, route selon le résultat | Accepte : email, company (optionnel) · Route found / not_found · found produit : contact |
resolve_contact | Résout le meilleur contact via ses rôles actifs | Accepte : company, role_types, certification_levels, selection_strategy · Route found / not_found |
sirene.verify_sirene_company_director | Vérifie si le contact est un dirigeant déclaré dans SIRENE | Accepte : contact, company · Route verified / not_verified |
get_contact_compliance_checks | Récupère les contrôles de conformité du contact, du plus récent au plus ancien | Accepte : contact · Produit : compliance_checks, count |
Résolution par rôle
Le node resolve_contact identifie le meilleur contact d'une company parmi ses rôles actifs (non révoqués, dans la fenêtre valid_from / valid_until). La stratégie de sélection détermine lequel retenir quand plusieurs candidats correspondent :
| Stratégie | Comportement |
|---|---|
first | Premier rôle trouvé (ordre de création). |
latest | Rôle créé le plus récemment. |
most_certified | Rôle avec le niveau de certification le plus élevé (certified > verified > declarative). |
best_role_type_fit | Rôle dont le type correspond le mieux à l'ordre de priorité fourni dans role_types. |
En cas de succès, la route found produit selected_contact, selected_contact_role, selected_role_type et other_candidates.
Recherche par email
GET /v1/contacts/search ?merchant_id=mrc_1a2b &email=marie.dupont@dupont-industries.fr
{
"object": "contact_search_result",
"contact": {
"id": "ctc_d12e",
"email": "marie.dupont@dupont-industries.fr"
}
}Si deux contacts partagent le même email, la recherche retourne une erreur 409 duplicate_contact_match. L'ajout du paramètre company_id restreint la recherche à une company donnée et évite ce conflit.
Événements
Les changements du contact et les décisions de conformité utilisent des familles d'événements distinctes. Les décisions sont émises par compliance_check.*.
| Événement | Déclencheur |
|---|---|
contact.created | Le contact vient d'être créé. |
contact.updated | Le contact vient d’être mis à jour. |
contact.suspended | Le contact a été suspendu. |
contact.reactivated | La suspension du contact a été levée. |
Chaque événement inclut l'objet contact complet dans son payload. La configuration des webhooks est décrite dans Recevoir des webhooks.