onboarding
Customer KYB case: wizard data, persons (directors, UBOs), documents, submission, KYC provider SDK tokens, operator review queue and decisions (D-22).
Get KYB case (wizard state)
GET /v1/customers/{customerId}/kyb
- getKybCase
- API key scope onboarding:read
- Tenant any
API key scope: onboarding:read (operator-level keys only, X-Tenant-Id = the operator id).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
customerIdrequired | path | Uuid | Identifier (customerId). |
X-Tenant-Idrequired | header | Uuid | Tenant context: the operator tenant id (staff operations) or customer tenant id (customer operations). Validated against the caller's memberships; mismatch → |
X-Request-Id | header | string | Client-supplied correlation id. Generated by the server when absent; always echoed in the response and in problem details. |
If-None-Match | header | string | Conditional GET; |
Responses
200 OK
application/jsonP10-T03: for
sole_trader/individualthe wizard asks forpersonal, (sole traders) the businesscompany.tradingNameandcompany.incorporationCountry, expected activity and the clean documentskyb_person_id+kyb_proof_of_address;ownershipis always complete. The KYC applicant is an individual applicant (the operator's individual level) created frompersonal; its review drives the case like a company review, and approval needs it GREEN whenkyb.requireAllPersonsVerifiedis on (409 kyc_incomplete).idUuidrequiredread-onlyFields of id
customerIdUuidrequiredread-onlyFields of customerId
statusKybCaseStatusrequiredread-onlyFields of status
providerKycProviderIdrequiredapplicantIdstring | nullread-onlycompanyobjectFields of company
legalNamestringtradingNamestring | nullregistrationNumberstring | nullincorporationCountryCountryCodeincorporationDateDate | nulllegalFormstring | nullwebsitestring | null (uri)industryCodestring | nullSIC/NACE code.
taxIdstring | null
expectedActivityobjectFields of expectedActivity
monthlyVolumeMoney | nullmonthlyTransactionsinteger | nullcurrenciesarray of CurrencyCodecountriesarray of CountryCodepurposestring | nullsourceOfFundsstring | null
stepsobjectrequiredWizard completion flags.
Fields of steps
companybooleanaddressesbooleanownershipbooleanactivitybooleandocumentsbooleanpersonalbooleanSole traders and individuals only: the personal details are complete.
resultobject | nullKYC provider outcome (read-only; staff only for
details).Fields of result
reviewAnswerstring | nullscreeningHitsintegerdetailsKybProviderResult
infoRequestedstring | nullsubmittedAtTimestamp | nullreviewedAtTimestamp | nullcreatedAtTimestamprequiredread-onlyFields of createdAt
updatedAtTimestampread-onlyFields of updatedAt
customerTypeCustomerTyperead-onlyFields of customerType
personalKybPersonalmodeOnboardingModeread-onlyFields of mode
304 Not modified (`If-None-Match` matched).
401 Missing, expired or invalid credentials (`unauthenticated`, `session-expired` with `reason` `idle` / `revoked` / `expired`, `invalid-api-key`, `mfa-required`).
application/problem+json403 Authenticated but not allowed: missing capability or scope, tenant not in memberships, `step-up-required`, IP not allow-listed, impersonation restriction.
application/problem+json404 Resource does not exist in this tenant (cross-tenant ids also return 404), or feature disabled (`feature-disabled`).
application/problem+json429 Rate limit exceeded.
application/problem+jsondefault Unexpected error (`500 internal-error`, `501 not-implemented`, `502 provider-error`, `503 service-unavailable`, `504 provider-timeout`). Money operations that time out at the provider are never retried blindly; their state becomes `exception`/unknown and is reconciled.
application/problem+json
Code samples
curl -X GET "https://bank.wirebloom.com/v1/customers/{customerId}/kyb" \
-H "Authorization: Bearer $WIREBLOOM_API_KEY" \
-H "X-Tenant-Id: $WIREBLOOM_CUSTOMER_ID"const response = await fetch("https://bank.wirebloom.com/v1/customers/{customerId}/kyb", {
method: "GET",
headers: {
"Authorization": `Bearer ${process.env.WIREBLOOM_API_KEY}`,
"X-Tenant-Id": process.env.WIREBLOOM_CUSTOMER_ID!,
},
});
if (!response.ok) throw new Error(`${response.status} ${await response.text()}`);
const result = await response.json();import os
import requests
response = requests.request(
"GET",
"https://bank.wirebloom.com/v1/customers/{customerId}/kyb",
headers={
"Authorization": f"Bearer {os.environ['WIREBLOOM_API_KEY']}",
"X-Tenant-Id": os.environ["WIREBLOOM_CUSTOMER_ID"],
},
timeout=30,
)
response.raise_for_status()