Contact role ( contact_role )
A contact_role qualifies the function of a contact in relation to a company . It indicates what the contact is authorized to do — legally represent the company, authorize a payment, receive invoices — and how strongly that role has been attested.
Role
The same contact may hold several roles for the same company — for example both legal_representative and beneficial_owner. Each role is a separate object with its own lifecycle: progressive certification, validity window, revocation.
Roles are the key query entry point for resolving contacts in processes: the resolve_contact node and the
GET /v1/companies/:id/contacts/resolve endpoint filter active roles to identify the right person at the right time.
Identifier and structure
Each role has a stable identifier prefixed with ctr_. It references both the parent company and the contact holding the role.
{
"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"
}Example with a proxy role carrying bounded delegated authority:
{
"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"
}Fields
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | Role identifier (prefix `ctr_`). |
object | string | yes | Always "contact_role". |
merchant_id | string | yes | Merchant in which this role is defined. |
company_id | string | yes | Company to which this role is attached (`cmp_…`). |
contact_id | string | yes | Contact holding this role (`ctc_…`). |
role_type | enum | yes | Functional role type. |
certification_level | enum | yes | Attestation level: `declarative`, `verified`, or `certified`. |
max_power_amount | integer | no | Maximum amount in minor units that this role may authorize, primarily for `proxy`. |
currency | string | no | Currency of the authority cap when `max_power_amount` is populated. |
authorized_acts | array | no | Free-form list of acts authorized within the delegation. |
valid_from | date | no | Validity start date (ISO 8601). `null` = valid immediately. |
valid_until | date | no | Validity end date (ISO 8601). `null` = no expiration. |
revoked_at | datetime | no | Revocation timestamp. `null` while the role is active. |
source_reference | string | no | Reference in your system. |
metadata | object | no | Flat map of `string | number | boolean` scalars, following the API metadata convention. |
created_at | datetime | yes | Creation date. |
updated_at | datetime | yes | Last update date. |
Role types
The eleven role types split into two categories according to whether they can be attested by a third-party source.
Certifiable roles
These roles may reach the certified level through an official registry or legal document. They have priority in KYB and compliance processes.
| role_type | Label | Certification source | Description |
|---|---|---|---|
director | Director | Registre officiel | Member of the board of directors or supervisory board. Certifiable through Kbis, Companies House, Handelsregister, etc. |
legal_representative | Legal representative | Registre officiel | Corporate officer authorized to bind the company — president, manager, CEO. Distinct from `director` in supervisory-board structures. |
beneficial_owner | Beneficial owner (UBO) | RBE / equivalent registry | Beneficial owner under AMLD5/6: direct or indirect holder of more than 25% of capital or voting rights. Declaration is mandatory in the French RBE. |
shareholder | Shareholder | Registry or cap table | Shareholder above a significant threshold (>10% or >25% depending on context). Certifiable through a registry or audited cap table. |
proxy | Proxy | Legal document | Person with formal delegated authority (notarized power of attorney, signing delegation). May act within a scope bounded by `max_power_amount`. |
Operational roles
These roles qualify a contact's function for internal routing of notifications and access. They are not third-party certifiable and remain at the declarative.
| role_type | Label | Description |
|---|---|---|
main_contact | Main contact | Default primary contact when the exact function is not qualified. |
billing_contact | Billing contact | Recipient of invoices and credit notes. Used for automatic document sending. |
payment_authorizer | Payment authorizer | Person authorized to approve payments in the checkout process. |
account_manager | Account manager | Primary commercial contact. Receives reminders, credit-limit alerts, and status notifications. |
technical_contact | Technical contact | Technical contact for API/webhook integration. Receives configuration and incident alerts. |
employee | Employee | Membership in the company without a specific function. Allows limited portal access without delegated authority. |
Certification level
The field certification_level indicates how rigorously the role has been attested. It progresses from declarative to certified as checks advance and never regresses.
| Level | Meaning | Example |
|---|---|---|
declarative | Role declared by the company without independent verification. Default value at creation. | Self-declaration during onboarding. |
verified | Role verified by cross-checking against an official source (registry, public database). | SIRENE verification through the `sirene.verify_sirene_company_director` node. |
certified | Role certified by a qualified third party (legal document, KYB provider). Strongest level. Triggers the `contact_role.certified` event. | Signing of a KYB document by the provider, upload of a Kbis extract. |
Certification is written by your processes through
POST /v1/contact-roles/:id with
{ "certification_level": "certified" }. Transitioning to
certified triggers the event
contact_role.certified, allowing downstream processes to react — for example unlocking a credit limit or sending an acknowledgment.
The node resolve_contact accepts a parameter
certification_levels to retain only roles reaching a minimum level, and the strategy most_certified automatically selects the contact with the highest level among candidates.
Validity window
The fields valid_from and valid_until delimit the period during which a role is active. Both are optional and independent:
valid_from: null— the role is active from creation.valid_until: null— the role has no expiration date.valid_untilmust be greater than or equal tovalid_fromwhen both are supplied.
Contact resolution (node resolve_contact and endpoint
GET /v1/companies/:id/contacts/resolve) takes a parameter at
(reference date, defaulting to now) and includes only roles whose window covers that date. This makes it possible, for example, to ask who was
payment_authorizer at the date of a past transaction.
GET /v1/companies/cmp_3a8f/contacts/resolve ?role_types=payment_authorizer &at=2026-03-15T12:00:00Z
{
"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
}Revocation
A role is revoked by setting { "revoke": true } in the update. The platform timestamps revoked_at and immediately excludes the role from future resolution.
POST /v1/contact-roles/ctr_9b4c
{
"revoke": true
}{
"id": "ctr_9b4c",
"revoked_at": "2026-06-17T10:00:00.000Z"
}A revoked role can no longer be updated. If the same contact must regain an identical role, create a new contact_role.
Revocation emits the event contact_role.revoked that your processes can consume to react — for example removing portal access or notifying that a mandate ended.
In processes
| Node | Role | Key inputs / outputs |
|---|---|---|
create_contact_role | Creates a role for a contact on a company | Accepts: company, contact, role_type, certification_level, max_power_amount, valid_from, valid_until · Produces: contact_role |
resolve_contact | Resolves the best contact for a company through its active roles | Documented on the page Contact |
Events
| Event | Trigger |
|---|---|
contact_role.created | The role was just created. |
contact_role.certified | `certification_level` changed to `certified`. |
contact_role.revoked | The role was revoked. |
Unlike contact_role.created and
contact_role.revoked events emitted on every operation,
contact_role.certified is emitted only once — on the first transition to certified. Subsequent updates at this level do not trigger it again.
Every event includes the complete contact_role complete object. Webhook configuration is described in
Receive webhooks.