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.

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"
}

Example with a proxy role carrying bounded delegated authority:

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"
}

Fields

FieldTypeRequiredDescription
idstringyesRole identifier (prefix `ctr_`).
objectstringyesAlways "contact_role".
merchant_idstringyesMerchant in which this role is defined.
company_idstringyesCompany to which this role is attached (`cmp_…`).
contact_idstringyesContact holding this role (`ctc_…`).
role_typeenumyesFunctional role type.
certification_levelenumyesAttestation level: `declarative`, `verified`, or `certified`.
max_power_amountintegernoMaximum amount in minor units that this role may authorize, primarily for `proxy`.
currencystringnoCurrency of the authority cap when `max_power_amount` is populated.
authorized_actsarraynoFree-form list of acts authorized within the delegation.
valid_fromdatenoValidity start date (ISO 8601). `null` = valid immediately.
valid_untildatenoValidity end date (ISO 8601). `null` = no expiration.
revoked_atdatetimenoRevocation timestamp. `null` while the role is active.
source_referencestringnoReference in your system.
metadataobjectnoFlat map of `string | number | boolean` scalars, following the API metadata convention.
created_atdatetimeyesCreation date.
updated_atdatetimeyesLast 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_typeLabelCertification sourceDescription
directorDirectorRegistre officielMember of the board of directors or supervisory board. Certifiable through Kbis, Companies House, Handelsregister, etc.
legal_representativeLegal representativeRegistre officielCorporate officer authorized to bind the company — president, manager, CEO. Distinct from `director` in supervisory-board structures.
beneficial_ownerBeneficial owner (UBO)RBE / equivalent registryBeneficial owner under AMLD5/6: direct or indirect holder of more than 25% of capital or voting rights. Declaration is mandatory in the French RBE.
shareholderShareholderRegistry or cap tableShareholder above a significant threshold (>10% or >25% depending on context). Certifiable through a registry or audited cap table.
proxyProxyLegal documentPerson 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_typeLabelDescription
main_contactMain contactDefault primary contact when the exact function is not qualified.
billing_contactBilling contactRecipient of invoices and credit notes. Used for automatic document sending.
payment_authorizerPayment authorizerPerson authorized to approve payments in the checkout process.
account_managerAccount managerPrimary commercial contact. Receives reminders, credit-limit alerts, and status notifications.
technical_contactTechnical contactTechnical contact for API/webhook integration. Receives configuration and incident alerts.
employeeEmployeeMembership 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.

LevelMeaningExample
declarativeRole declared by the company without independent verification. Default value at creation.Self-declaration during onboarding.
verifiedRole verified by cross-checking against an official source (registry, public database).SIRENE verification through the `sirene.verify_sirene_company_director` node.
certifiedRole 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.
Progression through a process

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_until must be greater than or equal to valid_from when 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.

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
}

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.

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"
}

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

NodeRoleKey inputs / outputs
create_contact_roleCreates 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_contactResolves the best contact for a company through its active roles

Documented on the page Contact

Events

EventTrigger
contact_role.createdThe role was just created.
contact_role.certified`certification_level` changed to `certified`.
contact_role.revokedThe 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.