The two paths, one shape
Every business customer travels the same journey: you submit an application, Conduit verifies the business and the people behind it, and the customer either becomes active or the application is rejected. Only one thing differs: how each control person proves their identity. A control person is a beneficial owner or controlling person of the business — the individuals you list inownership.persons[]; the discovery response’s individualRequirements[] tells you how many each country requires.
| Full KYC | KYC reliance | |
|---|---|---|
| Identity verification | Each control person completes a Conduit-hosted identity flow | You upload one verification report per control person |
| Where it attaches | Nothing extra on the person | ownership.persons[i].documentIds[] |
| Availability | Default | Must be enabled for your organization first |
| Detailed guide | Onboard a Customer | Onboard with KYC Reliance |
KYC reliance is not on by default. If it is not enabled for your
organization, attaching verification reports will not satisfy the identity
requirement — each person will still be expected to complete a hosted flow.
Contact your Conduit account manager to enable it.
The journey
Before you start — discover and collect
There is no customer and no application yet.Requirements are country-specific, so call
GET /v2/onboarding/requirements?country=... to learn which fields and documents to collect, then upload each document with POST /v2/documents and keep the returned doc_... ids. Never hardcode the requirements — they vary by country and change over time.Reliance branch: alongside the business documents, upload one identity verification report (a PDF exported from your own KYC provider) per control person, and hold each doc_... id to attach to that person.See Onboard a Customer → Discover requirements for the full field and document walkthrough, and Requirements by Country for the response schema.Submit the application
Submit everything you collected to
POST /v2/onboarding with a required Idempotency-Key. The endpoint returns 202 Accepted.State: processing. The application now exists and is in review. No customer exists yet — customerId is null until approval. Nothing else to do here. The next thing that happens is a webhook.Reliance branch: the request body differs in one way. Each person’s verification report id goes in ownership.persons[i].documentIds[]. The top-level documentIds[] still carries business-entity documents only.Verification runs (you wait)
State: still
processing. Conduit verifies the business and screens the people behind it. This is where the two paths physically differ:- Full KYC — each declared control person is taken through a Conduit-hosted identity flow.
- KYC reliance — Conduit reads the report you uploaded for each control person and matches it against the data you submitted, centering on name and date of birth. A clean match clears the identity requirement automatically. A mismatch, an unreadable report, or an unrecognized provider routes the application to a manual reviewer.
processing from your side. You do not poll and you do not act. Verification can take seconds to days depending on what review finds. Wait for the decision webhook in the next step.The decision arrives
Review completes and the application reaches a terminal state. Exactly one of two outcomes fires, and every payload echoes your
clientReferenceId.Approved — state: approved. The customer now exists. Two webhooks fire as a pair on first approval:application.approved— carries the populatedcustomerId.customer.created— the new customer, sameapplicationIdandcustomerId.
(applicationId, customerId) if your handler reacts to either. An idempotent re-approval of an already-approved application does not re-emit them.Rejected — state: rejected. No customer is created; customerId stays null.application.rejected— carries a human-readablereasonwhen one is available. The reason is delivered on the webhook only, so persist it when you receive it.
approved and rejected are terminal. See the rejection branch below for how to recover.The customer is active
State:
approved, customer exists. Fetch it with GET /v2/customers/{customerId} using the id from the webhook.The customer is active but has no features yet — it can’t receive or move money until you add one. The usual next step is to give them a place to receive funds. See Add Virtual Accounts.Checking state without a webhook
Webhooks are the intended signal, but if you miss one you can read the current state at any time. This reports thestatus but not the rejection reason — that lives on the webhook only.
GET /v2/applications. The full set of status values and their meanings lives in the application reference — treat that as authoritative rather than memorizing them here.
The rejection branch
A rejection does not block the business. Arejected application is terminal and creates no customer, but it no longer counts as active. Once you’ve corrected the data, submit a fresh POST /v2/onboarding:
- use a new
Idempotency-Key— reusing the rejected submission’s key replays its original response instead of creating a new application. - keep the same
clientReferenceId— so every attempt stays correlated to one record in your system.
To abandon an application that is still in review before any decision,
call
POST /v2/applications/{applicationId}/cancel. Approved, rejected, and
already-cancelled applications are terminal and cannot be cancelled — submit
a new application instead.When something goes wrong
| Symptom | Where to look |
|---|---|
Submission rejected with 409 ONBOARDING_ALREADY_SUBMITTED | An active application already exists for that tax ID or control person. Cancel or await the existing one. |
| A reliance report didn’t clear the identity requirement | Onboard with KYC Reliance — acceptance and rejection expectations |
| A required document is missing or has the wrong purpose | DOCUMENTATION_REQUIRED |
| An operation failed because the customer isn’t active yet | CUSTOMER_NOT_ONBOARDED |
Where to go next
- Onboard a Customer — the full-KYC path, end to end
- Onboard with KYC Reliance — the reliance path, end to end
- Add Virtual Accounts — the usual first step with a newly active customer
- Webhooks — subscribe to
application.approved,application.rejected, andcustomer.created