Environments
| Environment | Base URL |
|---|---|
| Production API | https://api.yativo.com/api/v1 |
| Sandbox API | https://smtp.yativo.com/api/v1 |
| KYC Platform | https://kyc.yativo.com |
KYC and KYB submissions are sent to
https://kyc.yativo.com, not the main API base URL. All other endpoints (status check, update) use the standard base URL. Include Authorization: Bearer {token} in every request.Integration approaches
| Approach | Best for | Effort |
|---|---|---|
| Hosted KYC/KYB link | Quick integration, iframe embed | Low |
| API submission | Programmatic flow, native UI | High |
- Individual:
https://kyc.yativo.com/individual/{customer_id} - Business:
https://kyc.yativo.com/business/{customer_id}
Verification flow
Upload documents (if using API)
Use
POST /storage/upload to upload files and receive back a hosted URL. Pass those URLs in the KYC payload. Alternatively, embed files as base64-encoded strings.Submit KYC or KYB
POST to
https://kyc.yativo.com/api/individual-kyc/submit or https://kyc.yativo.com/api/business-kyc/submit.Poll or receive webhook
Check
GET /customer/kyc/{customer_id} or listen for the kyc.status_updated webhook event.Upload documents
Before submitting KYC, upload any document files you will reference. Files must be PDF, JPG, JPEG, PNG, HEIC, or TIF and must not exceed 5 MB each.multipart/form-data with the field name document.
url value in the selfie_image, image_front_file, proof_of_address_file, and similar fields below.
Individual KYC
Submit
Step 1 — Personal details
| Field | Type | Required | Notes |
|---|---|---|---|
customer_id | string | ✓ | UUID from POST /customer |
first_name | string | ✓ | Max 1024 chars |
last_name | string | ✓ | Max 1024 chars |
middle_name | string | Optional | |
email | string | ✓ | Valid email address |
calling_code | string | ✓ | Dial code, e.g. "+1", "+234". Must match ^\+\d{1,4}$ |
phone | string | ✓ | Digits only, 8–15 characters |
birth_date | string | ✓ | YYYY-MM-DD, must be before today |
nationality | string | ✓ | ISO 3166-1 alpha-2, e.g. "US", "NG", "BR" |
gender | string | ✓ | "male" or "female" |
taxId | string | ✓ | Tax identification number, max 100 chars |
selfie_image | file URL or base64 | ✓ | Selfie photo. PDF/JPG/JPEG/PNG/HEIC/TIF, max 5 MB |
bvn | string | NG only | 11-digit Bank Verification Number. Required when nationality is "NG" |
nin | string | NG only | 11-digit National ID Number. Required when nationality is "NG" |
Step 2 — Residential address
| Field | Type | Required | Notes |
|---|---|---|---|
residential_address.street_line_1 | string | ✓ | Max 256 chars |
residential_address.street_line_2 | string | Optional | |
residential_address.city | string | ✓ | Max 256 chars |
residential_address.state | string | ✓ | Accepts "US-CA" or "CA" — both are valid |
residential_address.postal_code | string | ✓ | Validated per country |
residential_address.country | string | ✓ | ISO 3166-1 alpha-2 |
residential_address.proof_of_address_file | file URL or base64 | ✓ | Utility bill, bank statement, etc. PDF/JPG/JPEG/PNG/HEIC/TIF, max 5 MB |
Step 3 — Identifying information
At least one government-issued ID document is required.| Field | Type | Required | Notes |
|---|---|---|---|
identifying_information[*].type | string | ✓ | See ID types by country |
identifying_information[*].issuing_country | string | ✓ | ISO 3166-1 alpha-2 |
identifying_information[*].number | string | ✓ | Document number |
identifying_information[*].date_issued | string | ✓ | YYYY-MM-DD, must be before today |
identifying_information[*].expiration_date | string | ✓ | YYYY-MM-DD, must be after today |
identifying_information[*].image_front_file | file URL or base64 | ✓ | PDF/JPG/JPEG/PNG, max 5 MB |
identifying_information[*].image_back_file | file URL or base64 | Required for cards with a back side |
Step 4 — Risk and purpose
| Field | Type | Required | Notes |
|---|---|---|---|
employment_status | string | ✓ | See enum values |
most_recent_occupation_code | string | ✓ | 6-digit code from GET /auth/occupation-codes |
expected_monthly_payments_usd | string | ✓ | See enum values |
source_of_funds | string | ✓ | See enum values |
account_purpose | string | ✓ | See enum values |
account_purpose_other | string | If account_purpose is "other" | Description of the purpose |
acting_as_intermediary | boolean | Whether the customer acts as intermediary for third parties |
Step 5 — Supporting documents
| Field | Type | Required | Notes |
|---|---|---|---|
uploaded_documents[*].type | string | ✓ | Document type identifier |
uploaded_documents[*].file | file URL or base64 | ✓ | PDF/JPG/JPEG/PNG, max 5 MB |
KYC example request
Business KYB
Submit
Step 1 — Business basics
| Field | Type | Required | Notes |
|---|---|---|---|
customer_id | string | ✓ | UUID from POST /customer (must be customer_type: "business") |
business_legal_name | string | ✓ | Official registered legal name, max 255 chars |
business_trade_name | string | ✓ | Trade / DBA name, max 255 chars |
business_description | string | ✓ | What the business does, max 1000 chars |
email | string | ✓ | Business contact email |
business_type | string | ✓ | cooperative, corporation, llc, partnership, sole_prop, trust, or other |
registration_number | string | ✓ | Government registration / incorporation number, max 100 chars |
incorporation_date | string | ✓ | YYYY-MM-DD, must be before today |
tax_id | string | Business tax ID, max 100 chars | |
phone_calling_code | string | Must match ^\+[1-9]\d{0,3}$ | |
phone_number | string | Digits only, 7–15 characters | |
business_industry | string | Industry category | |
primary_website | string | Full URL | |
is_dao | boolean | Whether the business is a DAO | |
statement_descriptor | string | How the name appears on statements, max 22 chars |
Step 2 — Addresses
Bothregistered_address and physical_address use the same structure:
| Field | Type | Required | Notes |
|---|---|---|---|
street_line_1 | string | ✓ | Max 255 chars |
street_line_2 | string | Optional | |
city | string | ✓ | Max 100 chars |
state | string | ✓ | Accepts "US-CA" or "CA" |
postal_code | string | ✓ | Validated per country |
country | string | ✓ | ISO 3166-1 alpha-2 |
proof_of_address_file | file URL or base64 | Optional for registered, recommended for physical |
Step 3 — Associated persons
At least one person is required. Include all UBOs, directors, and authorized signers.| Field | Type | Required | Notes |
|---|---|---|---|
first_name | string | ✓ | Max 100 chars |
last_name | string | ✓ | Max 100 chars |
birth_date | string | ✓ | YYYY-MM-DD, before today |
nationality | string | ✓ | ISO 3166-1 alpha-2 |
email | string | ✓ | Personal email |
phone | string | Optional | |
title | string | E.g. "CEO", "Director" | |
ownership_percentage | number | ✓ | 0–100 |
relationship_established_at | string | YYYY-MM-DD, must not be in the future | |
residential_address | object | ✓ | Same structure as Step 2 |
identifying_information | array | ✓ | ID documents (same structure as individual KYC Step 3) |
has_ownership | boolean | Has ownership stake | |
has_control | boolean | Has operational control | |
is_signer | boolean | Authorized signer | |
is_director | boolean | Director |
Step 4 — Risk and purpose
| Field | Type | Required | Notes |
|---|---|---|---|
account_purpose | string | ✓ | See enum values |
account_purpose_other | string | If account_purpose is "other" | |
source_of_funds | string | ✓ | See enum values |
high_risk_activities | array | ✓ | See enum values. Use ["none_of_the_above"] if none apply |
high_risk_activities_explanation | string | If any high-risk activities listed | |
conducts_money_services | boolean | ||
conducts_money_services_description | string | If conducts_money_services is true | |
compliance_screening_explanation | string | If conducts_money_services is true | |
estimated_annual_revenue_usd | string | ||
expected_monthly_payments_usd | number | Expected monthly volume in USD | |
operates_in_prohibited_countries | string | "yes" or "no" | |
ownership_threshold | integer | UBO reporting threshold (5–25) | |
has_material_intermediary_ownership | boolean |
Step 5 — Regulated activity
| Field | Type | Notes |
|---|---|---|
regulated_activity.regulated_activities_description | string | Optional |
regulated_activity.primary_regulatory_authority_country | string | ISO 3166-1 alpha-2 |
regulated_activity.primary_regulatory_authority_name | string | |
regulated_activity.license_number | string |
Step 6 — Business documents
At least one document is required.| Field | Type | Required | Notes |
|---|---|---|---|
documents[*].purpose | string | ✓ | "business_registration", "tax_documents", "compliance_documents", or "financial_statements" |
documents[*].description | string | ✓ | Human-readable description |
documents[*].file | file URL or base64 | File attachment |
Step 7 — Business identifying information (optional)
Business-level ID documents (e.g. business licence).| Field | Type | Notes |
|---|---|---|
identifying_information[*].type | string | |
identifying_information[*].issuing_country | string | ISO 3166-1 alpha-2 |
identifying_information[*].number | string | |
identifying_information[*].description | string | |
identifying_information[*].expiration | string | YYYY-MM-DD, after today |
identifying_information[*].image_front | file URL or base64 | |
identifying_information[*].image_back | file URL or base64 |
KYB example request
Check KYC / KYB status
The customer UUID.
Status values
| Status | Description |
|---|---|
not_started | No submission has been made |
submitted | Received, awaiting review |
manual_review | Under manual compliance review |
approved | Customer is fully verified |
rejected | Rejected — see kyc_rejection_reasons |
under_review | Additional review in progress |
Check both
status === "approved" and is_va_approved === true before enabling payment features for a customer.Update a KYC submission
Use this endpoint to correct information or provide missing documents after a rejection.customer_id is always required.
Service endorsements
After approval, customers receive service endorsements that unlock specific payment rails.| Service | Description |
|---|---|
base | USD base payment access |
sepa | European SEPA transfers |
spei | Mexico SPEI transfers |
brazil | Brazilian payment rails |
eurde | EUR/DE virtual accounts |
usd_latam | USD Latin America transfers |
eur_latam | EUR Latin America transfers |
virtual_card | Virtual card issuance |
asian | Asian region payments |
native | Native payment rails |
cobo_pobo | Collection / payment-on-behalf-of |
Endorsement statuses
| Status | Description |
|---|---|
not_started | Not yet initiated |
pending | Awaiting review |
approved | Active for this customer |
rejected | Rejected |
declined | Customer declined |
under_review | Additional review in progress |
Regenerate an endorsement link
If an endorsement link has expired, regenerate it and share the new URL with the customer:Reference lookups
Occupation codes
Get the full list of valid occupation codes formost_recent_occupation_code:
Supported countries
Get the list of countries supported for customer registration and verification:Enum reference values
employment_status
| API value | Description |
|---|---|
employed | Employed |
exempt | Exempt |
homemaker | Homemaker |
retired | Retired |
self_employed | Self-Employed |
student | Student |
unemployed | Unemployed |
expected_monthly_payments_usd
| API value | Range |
|---|---|
0_4999 | Less than $5,000 |
5000_9999 | 9,999 |
10000_49999 | 49,999 |
50000_plus | $50,000 or more |
source_of_funds
| API value | Description |
|---|---|
business_income | Business Income |
company_funds | Company Funds |
ecommerce_reseller | Ecommerce Reseller |
gambling_proceeds | Gambling Proceeds |
gifts | Gifts |
government_benefits | Government Benefits |
inheritance | Inheritance |
investments_loans | Investments / Loans |
pension_retirement | Pension / Retirement |
salary | Salary |
sale_of_assets_real_estate | Sale of Assets or Real Estate |
savings | Savings |
someone_elses_funds | Someone Else’s Funds |
account_purpose
| API value | Description |
|---|---|
business_transactions | Business Transactions |
charitable_donations | Charitable Donations |
ecommerce_retail_payments | Ecommerce / Retail Payments |
investment_purposes | Investment Purposes |
operating_a_company | Operating a Company |
other | Other (requires account_purpose_other) |
payments_to_friends_or_family_abroad | Payments to Friends or Family Abroad |
personal_or_living_expenses | Personal / Living Expenses |
protect_wealth | Protect Wealth |
purchase_goods_and_services | Purchase Goods and Services |
receive_payment_for_freelancing | Receive Payment for Freelancing |
receive_salary | Receive Salary |
high_risk_activities (KYB)
| API value | Description |
|---|---|
adult_entertainment | Adult entertainment |
gambling | Gambling |
hold_client_funds | Holding client funds |
investment_services | Investment services |
lending_banking | Lending or banking |
marijuana_or_related_services | Marijuana-related services |
money_services | Money services |
operate_foreign_exchange_virtual_currencies_brokerage_otc | Foreign exchange / crypto brokerage / OTC |
pharmaceuticals | Pharmaceuticals |
precious_metals_precious_stones_jewelry | Precious metals / stones / jewelry |
safe_deposit_box_rentals | Safe deposit box rentals |
weapons_firearms_and_explosives | Weapons / firearms / explosives |
none_of_the_above | None of the above |
business_type (KYB)
cooperative, corporation, llc, partnership, sole_prop, trust, other
ID types by country
The acceptedtype values under identifying_information depend on the issuing country. Common types available globally:
| Type | Description |
|---|---|
passport | Passport |
national_id | National ID card |
other | Other government-issued ID |
| Country | Extra types available |
|---|---|
NG (Nigeria) | tin, nin, bvn |
US (United States) | ssn, itin |
BR (Brazil) | cpf |
GB (United Kingdom) | nino, utr |
IN (India) | pan |
MX (Mexico) | rfc, curp, ine |
DE (Germany) | steuer_id |
AE (UAE) | emirates_id |
GET /auth/verification-locations to check which countries are supported, and consult the full ID type reference in the API reference section.
Webhooks
Configure your webhook endpoint in the Yativo dashboard to receive status updates automatically.Events
| Event | Description |
|---|---|
kyc.status_updated | KYC/KYB verification status changed |
kyc.endorsement_updated | A specific service endorsement status changed |
Payload example
Error handling
Common errors and fixes
| Error | Fix |
|---|---|
customer_id does not exist | Create the customer first with POST /customer |
nationality must be 2 characters | Use ISO 3166-1 alpha-2 (e.g. "US", "NG") |
birth_date must be a date before today | Ensure the date is in the past |
expiration_date must be a date after today | ID document must not be expired |
bvn is required | Required for Nigerian nationals — exactly 11 digits |
nin is required | Required for Nigerian nationals — exactly 11 digits |
calling_code is invalid | Must be + followed by 1–4 digits, e.g. "+1", "+234" |
identifying_information is required | At least one ID document must be included |
documents is required | KYB requires at least one business document |
Implementation notes
- KYC review typically completes within 24 hours. Complex cases may take longer.
- Use
Idempotency-Keyon all POST and PUT requests to prevent duplicate submissions. - Files can be passed as hosted URLs (from
POST /storage/upload) or base64-encoded strings — both are accepted. - For Nigerian customers (
nationality: "NG"),bvnandninare mandatory regardless of which ID type is provided. - The
statefield accepts both"US-CA"and"CA"— the API normalizes both forms. - Access tokens expire in 600 seconds. Implement token refresh before making KYC submissions in long-running flows.

