Account Onboarding

The Accreditation APIs let you open accounts for your end customers — individuals (PF) and companies (PJ) — programmatically, with identity verification through facial biometrics.

Enablement

The onboarding APIs are in controlled rollout. Ask our support team to enable them for your tenant before integrating.

How it works

The process has four major stages:

  1. Identity verification (facial biometrics) — every individual involved (the holder for PF; every partner for PJ) must have their identity verified through facial biometrics.
  2. Company documents (PJ only) — upload the PDFs required by company.legalForm via POST /v1/accreditations/{id}/documents (in parallel with biometrics). Details in PJ account opening.
  3. Review — depending on the flow, the opening is approved automatically or goes through prior review by an analyst.
  4. Account opening at the settlement partner — after approval, the account is opened and automatically bound to your tenant. You receive the final accountId and can start operating (PIX, boletos, statement, etc.).
CPF that already has an account

For PF, if the CPF is already an account holder there is no new account to open. For tenants with automatic portability enabled (contractual; not on by default), the accreditation starts as PENDING_CONSENT and returns a link for the holder to authorize you to operate the account they already have — with identity verification and balance disclosure before the authorization. Without it, the accreditation fails with existing_partner_account and portability is requested from support. See Holder who already has an account.

There are two biometrics flows:

FlowHow it worksApproval
CorpX biometrics (default)We generate a facial capture link (powered by Unico) for each person. You deliver the link to the end user, who completes the capture journey in the browser or on their phone.PF: automatic once the facial check is approved. PJ: prior review.
Recommended default

Deliver the link to the end user and wait for the webhooks. The rest of the journey — capture, validation, account opening — happens on our side.

State machine

Every accreditation goes through the following state machine:

Statuses

StatusMeaningExpected integrator action
PENDING_BIOMETRYWaiting for facial biometrics from one or more persons.Deliver the facial (or acceptance) link to each pending person. Resend if needed.
PENDING_CONSENTPF only, and only with automatic portability enabled: the CPF already has an account, so there is no new account to open — the holder must authorize you to operate the existing one.Deliver the consentLink to the holder. Details in Holder who already has an account.
BIOMETRY_APPROVEDAll biometrics approved. Transitional state.None — wait for the next webhook.
PENDING_REVIEWWaiting for prior review by an analyst.None — wait. Typical turnaround is 1 business day.
INTEGRATINGAccount being opened at the settlement partner. Transitional state.None — wait.
ACTIVEAccount opened and ready to operate.Store the accountId and start operating.
FAILEDProcess ended without opening an account.Check errorReason. Depending on the reason, retry the biometrics or open a new accreditation with corrected data.

Tracking progress

You have two complementary ways to track each accreditation:

  • Webhooks (recommended) — the accreditation.updated event is emitted on every state transition, plus specific events (facial link created, account active, failure). See Onboarding Webhooks.
  • PollingGET /v1/accreditations/pf and GET /v1/accreditations/pj return the aggregated status and per-person details (biometrics state, link, expiration).

The optional callbackUri field brings the holder back to your app when they finish their step, with the outcome in the URI — useful for the experience, but it does not replace either of the two ways above. See Returning to your app.

Tenant binding

The CPF/CNPJ is only bound to the tenant after biometry is confirmed. While PENDING_BIOMETRY, there is no accountId and POST does not deduplicate: repeating with the same document creates another accreditation (201). Cancel abandoned pendings with POST /v1/accreditations/{id}/cancel (FAILED / errorReason=cancelled).

After confirmation, the settlement account is automatically bound to the tenant that created the accreditation — no extra activation step. A further POST for a document already claimed by your own tenant returns 409 already_accredited.

Accounts shared between tenants

A PF account can be operated by more than one tenant, when the holder authorizes each of them through the consent flow (Holder who already has an account). In that case:

  • It is the same account — balance, statement and Pix keys are shared. Each tenant has its own accountId pointing to it.
  • Every authorized tenant receives the webhooks for each movement. Operations originated outside your API (by another authorized tenant or by the holder) arrive with external: true.
  • Previous authorizations are not revoked when a new tenant is authorized. If you already operated the account and receive account.shared_access.granted, another tenant started operating it too — if that does not make sense for your case, talk to support.
  • The holder can revoke any of these accesses through support; from then on the revoked tenant’s calls for that account return 403.

Evidence files

GET /v1/accreditations/{accreditationId}/artifacts returns the archived evidence of the process: the company PDFs you uploaded, the identity document captured during biometrics (unico_id_document, typically the ID card as PDF) and, when the provider allows it, the holder selfie (unico_selfie) and the signed evidence-set JWT (unico_evidence_set). Each item already carries a pre-signed downloadUrl, valid for about 10 minutes.

curl -H "Authorization: Bearer $TOKEN" -H "X-Tenant-Id: $TENANT" \
https://api.corpx.com/v1/accreditations/acr_891418ce2f67/artifacts
{
"accreditationId": "acr_891418ce2f67",
"count": 2,
"items": [
{
"artifactId": "art_7c1d90f2ab34",
"kind": "unico_evidence_set",
"cpf": "12345678901",
"fileName": "unico_evidence_set.jwt",
"contentType": "application/jwt",
"sizeBytes": 14203,
"createdAt": "2026-08-15T18:42:03Z",
"scanStatus": "APPROVED",
"metadata": { "unicoProcessId": "cst_3bd257e7201d441379256746" },
"downloadUrl": "https://..."
}
]
}

downloadUrl only shows up with scanStatus: "APPROVED": every upload goes through type checking, antivirus and sanitisation before being archived. While the file is PENDING, query again in a few seconds.

Enablement and scope

The endpoint delivers the holder’s biometrics, so it depends on two independent switches:

  • the kyc_artifacts feature must be enabled for your tenant (talk to support — it requires a contractual clause), otherwise the answer is 403 feature_disabled;
  • the credential must carry the kyc.read scope. The generic read scope is deliberately not accepted, so no existing credential starts downloading customer faces without an explicit decision.

The same files show up in the accreditation detail of your backoffice, for whoever holds the backoffice:accreditations permission (no scope involved there, only the feature).

Next steps