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.
Les processus soumettent les drafts de contrôle via 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.
La suspension porte sur la personne et se lève. La révocation d'un rôle est un fait daté et définitif qui décrit la fin d'un mandat. Un départ de la société se traduit par la révocation des rôles ; un blocage décidé par le marchand se traduit par une suspension. Suspendre une company ne suspend pas ses contacts, et inversement.
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 |
|
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.