Rôle de contact (contact_role)

Un contact_role qualifie la fonction d'un contact vis-à-vis d'une company. Il indique ce que le contact est habilité à faire — représenter légalement la société, autoriser un paiement, recevoir les factures — et à quel niveau son rôle a été attesté.

Rôle

Un même contact peut détenir plusieurs rôles sur une même company — par exemple être à la fois legal_representative et beneficial_owner. Chaque rôle est un objet distinct avec son propre cycle de vie : certification progressive, fenêtre de validité, révocation.

Les rôles sont l'entrée d'interrogation clé pour la résolution de contacts dans les processus : le node resolve_contact et l'endpoint GET /v1/companies/:id/contacts/resolve filtrent sur les rôles actifs pour identifier le bon interlocuteur au bon moment.

Identifiant et structure

Chaque rôle porte un identifiant stable préfixé par ctr_. Il référence à la fois la company parente et le contact détenteur.

JSON
"contact_role":{15 items
"object":"contact_role"
"id":"ctr_9b4c2a7e1f3d8c5b"
"company_id":"cmp_3a8f1d9c2b4e7f6a"
"contact_id":"ctc_d12e3f4a5b6c7d8e"
"role_type":"legal_representative"
"certification_level":"verified"
"max_power_amount":null
"authorized_acts":null
"valid_from":null
"valid_until":null
"revoked_at":null
"source_reference":null
"metadata":{}0 items
"created_at":"2026-01-12T10:30:00.000Z"
"updated_at":"2026-03-01T09:00:00.000Z"
}
{
  "object": "contact_role",
  "id": "ctr_9b4c2a7e1f3d8c5b",
  "company_id": "cmp_3a8f1d9c2b4e7f6a",
  "contact_id": "ctc_d12e3f4a5b6c7d8e",
  "role_type": "legal_representative",
  "certification_level": "verified",
  "max_power_amount": null,
  "authorized_acts": null,
  "valid_from": null,
  "valid_until": null,
  "revoked_at": null,
  "source_reference": null,
  "metadata": {},
  "created_at": "2026-01-12T10:30:00.000Z",
  "updated_at": "2026-03-01T09:00:00.000Z"
}

Exemple avec un rôle proxy portant une délégation de pouvoir bornée :

JSON
"contact_role":{15 items
"object":"contact_role"
"id":"ctr_1c2d3e4f5a6b7c8d"
"company_id":"cmp_3a8f1d9c2b4e7f6a"
"contact_id":"ctc_e5f6a7b8c9d0e1f2"
"role_type":"proxy"
"certification_level":"certified"
"max_power_amount":5000000
"authorized_acts":[2 items
0:"sign_invoices"
1:"approve_payments"
]
"valid_from":"2026-01-01"
"valid_until":"2026-12-31"
"revoked_at":null
"source_reference":"PROC-2026-001"
"metadata":{}0 items
"created_at":"2026-01-05T08:00:00.000Z"
"updated_at":"2026-01-05T08:00:00.000Z"
}
{
  "object": "contact_role",
  "id": "ctr_1c2d3e4f5a6b7c8d",
  "company_id": "cmp_3a8f1d9c2b4e7f6a",
  "contact_id": "ctc_e5f6a7b8c9d0e1f2",
  "role_type": "proxy",
  "certification_level": "certified",
  "max_power_amount": 5000000,
  "authorized_acts": ["sign_invoices", "approve_payments"],
  "valid_from": "2026-01-01",
  "valid_until": "2026-12-31",
  "revoked_at": null,
  "source_reference": "PROC-2026-001",
  "metadata": {},
  "created_at": "2026-01-05T08:00:00.000Z",
  "updated_at": "2026-01-05T08:00:00.000Z"
}

Champs

ChampTypeRequisDescription
idstringouiIdentifiant du rôle (préfixe ctr_).
objectstringouiToujours "contact_role".
merchant_idstringouiMarchand dans lequel ce rôle est défini.
company_idstringouiCompany à laquelle ce rôle est attaché (cmp_…).
contact_idstringouiContact qui détient ce rôle (ctc_…).
role_typeenumouiType fonctionnel du rôle.
certification_levelenumouiNiveau d'attestation : declarative, verified ou certified.
max_power_amountintegernonMontant maximum en unités mineures que ce rôle est habilité à autoriser (principalement pour proxy).
currencystringnonDevise du plafond de pouvoir lorsque max_power_amount est renseigné.
authorized_actsarraynonListe libre des actes autorisés dans le cadre de la délégation.
valid_fromdatenonDate de début de validité (ISO 8601). null = valide immédiatement.
valid_untildatenonDate de fin de validité (ISO 8601). null = pas d'expiration.
revoked_atdatetimenonHorodatage de la révocation. null si le rôle est actif.
source_referencestringnonRéférence dans votre système.
metadataobjectnonMap plate de scalaires `string | number | boolean`, selon la convention metadata de l’API.
created_atdatetimeouiDate de création.
updated_atdatetimeouiDate de dernière mise à jour.

Types de rôles

Les onze types de rôles se divisent en deux catégories selon qu'ils peuvent être attestés par une source tierce.

Rôles certifiables

Ces rôles peuvent atteindre le niveau certified via un registre officiel ou un document légal. Ils sont prioritaires dans les processus KYB et de conformité.

role_typeLabelSource de certificationDescription
directorDirectorRegistre officielMembre du conseil d'administration ou de surveillance. Certifiable via Kbis, Companies House, Handelsregister…
legal_representativeLegal representativeRegistre officielMandataire social habilité à engager la société (président, gérant, DG). Se distingue de director dans les structures à conseil de surveillance.
beneficial_ownerBeneficial owner (UBO)RBE / registre équivalentBénéficiaire effectif au sens AMLD5/6 : détenteur direct ou indirect de plus de 25 % du capital ou des droits de vote. Déclaration obligatoire au RBE en France.
shareholderShareholderRegistre ou cap tableActionnaire au-delà d'un seuil significatif (>10 % ou >25 % selon le contexte). Certifiable via registre ou cap table audité.
proxyProxyDocument légalPersonne disposant d'une délégation de pouvoir formalisée (procuration notariée, délégation de signature). Peut agir dans un périmètre défini par max_power_amount.

Rôles opérationnels

Ces rôles qualifient la fonction d'un contact pour le routing interne des notifications et des accès. Ils ne sont pas certifiables par un tiers et restent au niveau declarative.

role_typeLabelDescription
main_contactMain contactContact principal par défaut lorsque la fonction exacte n'est pas qualifiée.
billing_contactBilling contactDestinataire des factures et avoirs. Utilisé pour l'envoi automatique des documents.
payment_authorizerPayment authorizerPersonne habilitée à approuver les paiements dans le processus de checkout.
account_managerAccount managerInterlocuteur commercial principal. Reçoit les relances, alertes de limite de crédit et notifications de statut.
technical_contactTechnical contactRéférent technique pour l'intégration API/webhook. Reçoit les alertes de configuration et d'incident.
employeeEmployeeAppartenance à l'entreprise sans fonction spécifique. Permet un accès portail limité sans délégation de pouvoir.

Niveau de certification

Le champ certification_level indique avec quelle rigueur le rôle a été attesté. Il progresse de declarative vers certified à mesure que les vérifications avancent ; il ne régresse pas.

NiveauSignificationExemple
declarativeRôle déclaré par la company sans vérification indépendante. Valeur par défaut à la création.Auto-déclaration lors de l'onboarding.
verifiedRôle vérifié par croisement avec une source officielle (registre, base publique).Vérification SIRENE via le node sirene.verify_sirene_company_director.
certifiedRôle certifié par un tiers qualifié (document légal, provider KYB). Niveau le plus fort. Déclenche l'événement contact_role.certified.Signature d'un document KYB par le provider, upload d'un Kbis.
Progression via processus La certification est écrite par vos processus via POST /v1/contact-roles/:id avec { "certification_level": "certified" }. Le passage à certified déclenche l'événement contact_role.certified, ce qui permet aux processus aval de réagir (déblocage d'une limite de crédit, envoi d'un accusé de réception…).

Le node resolve_contact accepte un paramètre certification_levels pour ne retenir que les rôles atteignant un niveau minimum, et la stratégie most_certified sélectionne automatiquement le contact au niveau le plus élevé parmi les candidats.

Fenêtre de validité

Les champs valid_from et valid_until délimitent la période pendant laquelle un rôle est actif. Les deux sont optionnels et indépendants :

  • valid_from: null — le rôle est actif dès sa création.
  • valid_until: null — le rôle n'a pas de date d'expiration.
  • valid_until doit être supérieure ou égale à valid_from si les deux sont renseignées.

La résolution de contacts (node resolve_contact et endpointGET /v1/companies/:id/contacts/resolve) prend un paramètre at (date de référence, par défaut maintenant) et n'inclut que les rôles dont la fenêtre couvre cette date. Cela permet par exemple d'interroger qui était payment_authorizer à la date d'une transaction passée.

HTTP
GET /v1/companies/cmp_3a8f/contacts/resolve
  ?role_types=payment_authorizer
  &at=2026-03-15T12:00:00Z
"list":{3 items
"object":"list"
"data":[1 item
0:{...}3 items
]
"has_more":false
}
{
  "object": "list",
  "data": [
    {
      "contact": {
        "id": "ctc_d12e",
        "email": "marie.dupont@example.com"
      },
      "contact_role": {
        "id": "ctr_9b4c",
        "role_type": "payment_authorizer",
        "certification_level": "declarative",
        "valid_from": "2026-01-01",
        "valid_until": "2026-12-31"
      },
      "matched_role_type": "payment_authorizer"
    }
  ],
  "has_more": false
}

Révocation

Un rôle se révoque en passant { "revoke": true } dans la mise à jour. La plateforme horodate revoked_at et exclut immédiatement le rôle de toute résolution future.

HTTP
POST /v1/contact-roles/ctr_9b4c
{1 item
"revoke":true
}
{
  "revoke": true
}
JSON
{2 items
"id":"ctr_9b4c"
"revoked_at":"2026-06-17T10:00:00.000Z"
}
{
  "id": "ctr_9b4c",
  "revoked_at": "2026-06-17T10:00:00.000Z"
}

Un rôle révoqué ne peut plus être mis à jour. Si le même contact doit retrouver un rôle identique, il faut créer un nouveau contact_role.

La révocation émet l'événement contact_role.revoked que vos processus peuvent écouter pour réagir (retrait d'accès portail, notification de fin de mandat…).

Dans les processus

NodeRôleEntrées / sorties clés
create_contact_roleCrée un rôle pour un contact sur une companyAccepte : company, contact, role_type, certification_level, max_power_amount, valid_from, valid_until · Produit : contact_role
resolve_contactRésout le meilleur contact d'une company via ses rôles actifsDocumenté dans la page Contact

Événements

ÉvénementDéclencheur
contact_role.createdLe rôle vient d'être créé.
contact_role.certifiedcertification_level est passé à "certified".
contact_role.revokedLe rôle a été révoqué.

Contrairement à contact_role.created et contact_role.revoked qui se déclenchent à chaque opération, contact_role.certified n'est émis qu'une seule fois — lors du premier passage à certified. Les mises à jour ultérieures à ce niveau ne le redéclenchent pas.

Chaque événement inclut l'objet contact_role complet. La configuration des webhooks est décrite dans Recevoir des webhooks.