kyc.completed webhook.
KYC results are informational. They never block company creation or updates—the merchant resource is created or updated regardless of the outcome. Your organization decides how to act on the findings (for example, pausing onboarding or requesting corrected data).
When KYC runs
Checks are triggered automatically for merchant companies—you never start a check yourself:- On creation: every new merchant is checked.
- On update: a new check runs only when a KYC-relevant field changes—the tax document type, the legal/full name, or the contact information. Other updates do not trigger a re-check.
kyc.completed webhook.
Check types
The set of rules evaluated depends on the merchant’s document type, reported askyc_type in the webhook:
NATURAL_PERSON_COMPANY: the merchant is an individual (CPF).LEGAL_PERSON_COMPANY: the merchant is a legal entity (CNPJ). Rules also cover the registered contact person and the company’s ownership structure.
Rule results
Each rule execution reports astatus:
Every rule execution includes the
expected values required to pass and, unless the underlying data was unavailable, the received values actually observed. A human-readable description is included whenever the rule does not pass.
A systemic failure at the data source (for example, a malformed provider response) does not produce a
kyc.completed webhook with all-FAILED rules. Rinne aborts the check, retries the message, and only delivers kyc.completed once the check runs against a valid response.If you do not see a kyc.completed webhook within your usual window after a merchant is created or updated, either the check is still being retried or it completed and its webhook delivery is delayed or failed. To tell them apart, list the merchant’s checks with GET /v1/merchants/{merchantId}/kyc-checks, which returns only checks that have run, newest first. The history also holds the merchant’s earlier checks, so look for a check whose created_at is later than the create or update you are waiting on:- Such a check is listed: the check completed and the webhook delivery is delayed or failed. Look up its
kyc.completedevent in the delivery history of your webhook dashboard, where you can replay it, and see Retry behavior for the delivery schedule. - No such check is listed: the check has not completed yet and is still being retried, even if older checks appear. Its
kyc.completedwebhook arrives once it runs.
Rules for natural persons
Rules for legal entities
For legal entities, the registered contact person (CPF) is also verified with contact-scoped counterparts of the natural-person rules:
CONTACT_DOCUMENT_NUMBER_VALID, CONTACT_DOCUMENT_STATUS_VALID, CONTACT_FULL_NAME_CORRECT, CONTACT_DATE_OF_BIRTH_CORRECT, CONTACT_IS_ALIVE, and CONTACT_HAS_SANCTIONS.
The exact set of rules executed comes from the KYC policy applied to the check, identified by
policy_id and policy_name in the webhook payload. Handle the rule_executions array dynamically rather than expecting a fixed list.The kyc.completed webhook
The webhook is delivered to the parent organization using the same envelope, Svix signatures, and retry behavior as every other Rinne event (see Webhooks). In the envelope, company_id is the merchant that was checked and correlation_id equals the kyc_check_id.
Payload fields
kyc_check_id: Unique ID of this check runcompany_id: The merchant company that was checkedpolicy_id/policy_name: The KYC policy that defined the ruleskyc_type:NATURAL_PERSON_COMPANYorLEGAL_PERSON_COMPANYrule_executions: One entry per rule in the policy—rule_name,status,expected, andreceived(omitted only if the underlying data was unavailable);descriptionis included when the rule does not pass
Retrieve past checks
Read a merchant’s KYC history from your organization account withGET /v1/merchants/{merchantId}/kyc-checks. Results are paginated and returned newest first. Each entry mirrors the rule outcomes delivered by the kyc.completed webhook, so you can rebuild a merchant’s KYC state without persisting webhook payloads.
This endpoint is for organization callers only. Merchant-scoped credentials receive
403. Requests scoped to a merchant that belongs to another organization return 404.Permission
The endpoint requires themerchant.kyc.list permission. It is also matched by the merchant.kyc.* and merchant.* wildcards on any credential, and by the *.* wildcard on API keys only. Organization JWT roles reject *.* with 400 at role creation, so a JWT role must list merchant.kyc.list, merchant.kyc.*, or merchant.*.
Historical policy pinning
The policy applied to a check is captured at execution time. Historical checks keep their original rule set and outcomes even after the KYC policy changes, so reconcile results using thepolicy_id and policy_name recorded on each check rather than the current policy.
Empty history
A merchant with no recorded checks returns200 with an empty data array and pagination reporting total: 0 and totalPages: 0. New merchants are checked on creation, so this case normally appears only when a check has not finished writing yet.
What the response includes
What the response includes
Row identifiers (
id), timestamps (created_at), the merchant company_id, the policy that was in effect (policy_id, policy_name), the merchant type (kyc_type), and the rule_executions array with per-rule status, expected, received, and description.What the response excludes
What the response excludes
The merchant snapshot captured at check time, the idempotency key used to deduplicate provider calls, and raw data returned by the external verification provider. These fields never leave the API.
Next steps
Webhooks
Endpoint setup, Svix signature verification, and retries
Organizations and merchants
How merchants relate to your organization
Affiliations
Provider onboarding and document requirements
API reference
Full kyc.completed event schema under Webhooks → Events

