Skip to main content
Yativo requires identity verification before customers can access payment services such as virtual accounts, send money, and payment rails. Individual users go through KYC (Know Your Customer) and businesses go through KYB (Know Your Business).

Environments

EnvironmentBase URL
Production APIhttps://api.yativo.com/api/v1
Sandbox APIhttps://smtp.yativo.com/api/v1
KYC Platformhttps://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

ApproachBest forEffort
Hosted KYC/KYB linkQuick integration, iframe embedLow
API submissionProgrammatic flow, native UIHigh
Hosted URLs:
  • Individual: https://kyc.yativo.com/individual/{customer_id}
  • Business: https://kyc.yativo.com/business/{customer_id}

Verification flow

1

Create a customer

Call POST /customer to create a customer record and receive a customer_id.
2

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.
3

Submit KYC or KYB

POST to https://kyc.yativo.com/api/individual-kyc/submit or https://kyc.yativo.com/api/business-kyc/submit.
4

Poll or receive webhook

Check GET /customer/kyc/{customer_id} or listen for the kyc.status_updated webhook event.
5

Customer approved

When status is "approved" and is_va_approved is true, service endorsements are activated and payment rails become available.

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.
POST /storage/upload
Send the file as multipart/form-data with the field name document.
curl -X POST 'https://api.yativo.com/api/v1/storage/upload' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  -F 'document=@/path/to/passport_front.jpg'
{
  "status": "success",
  "status_code": 200,
  "message": "Request successful",
  "data": {
    "url": "https://storage.yativo.com/documents/abc123/passport_front.jpg"
  }
}
Use the returned url value in the selfie_image, image_front_file, proof_of_address_file, and similar fields below.

Individual KYC

Submit

POST https://kyc.yativo.com/api/individual-kyc/submit
This is a five-step data model submitted in one payload. All required fields must be present in a single request.

Step 1 — Personal details

FieldTypeRequiredNotes
customer_idstringUUID from POST /customer
first_namestringMax 1024 chars
last_namestringMax 1024 chars
middle_namestringOptional
emailstringValid email address
calling_codestringDial code, e.g. "+1", "+234". Must match ^\+\d{1,4}$
phonestringDigits only, 8–15 characters
birth_datestringYYYY-MM-DD, must be before today
nationalitystringISO 3166-1 alpha-2, e.g. "US", "NG", "BR"
genderstring"male" or "female"
taxIdstringTax identification number, max 100 chars
selfie_imagefile URL or base64Selfie photo. PDF/JPG/JPEG/PNG/HEIC/TIF, max 5 MB
bvnstringNG only11-digit Bank Verification Number. Required when nationality is "NG"
ninstringNG only11-digit National ID Number. Required when nationality is "NG"

Step 2 — Residential address

FieldTypeRequiredNotes
residential_address.street_line_1stringMax 256 chars
residential_address.street_line_2stringOptional
residential_address.citystringMax 256 chars
residential_address.statestringAccepts "US-CA" or "CA" — both are valid
residential_address.postal_codestringValidated per country
residential_address.countrystringISO 3166-1 alpha-2
residential_address.proof_of_address_filefile URL or base64Utility 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.
FieldTypeRequiredNotes
identifying_information[*].typestringSee ID types by country
identifying_information[*].issuing_countrystringISO 3166-1 alpha-2
identifying_information[*].numberstringDocument number
identifying_information[*].date_issuedstringYYYY-MM-DD, must be before today
identifying_information[*].expiration_datestringYYYY-MM-DD, must be after today
identifying_information[*].image_front_filefile URL or base64PDF/JPG/JPEG/PNG, max 5 MB
identifying_information[*].image_back_filefile URL or base64Required for cards with a back side

Step 4 — Risk and purpose

FieldTypeRequiredNotes
employment_statusstringSee enum values
most_recent_occupation_codestring6-digit code from GET /auth/occupation-codes
expected_monthly_payments_usdstringSee enum values
source_of_fundsstringSee enum values
account_purposestringSee enum values
account_purpose_otherstringIf account_purpose is "other"Description of the purpose
acting_as_intermediarybooleanWhether the customer acts as intermediary for third parties

Step 5 — Supporting documents

FieldTypeRequiredNotes
uploaded_documents[*].typestringDocument type identifier
uploaded_documents[*].filefile URL or base64PDF/JPG/JPEG/PNG, max 5 MB

KYC example request

curl -X POST 'https://kyc.yativo.com/api/individual-kyc/submit' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: kyc-ind-2026-001' \
  -d '{
    "customer_id": "c586066b-0f29-468f-b775-15483871a202",
    "first_name": "Alex",
    "last_name": "Smith",
    "email": "alex.smith@example.com",
    "calling_code": "+1",
    "phone": "5551234567",
    "gender": "male",
    "birth_date": "1990-01-15",
    "nationality": "US",
    "taxId": "998-88-7766",
    "selfie_image": "https://storage.yativo.com/documents/abc/selfie.jpg",
    "residential_address": {
      "street_line_1": "123 Maple Street",
      "city": "Austin",
      "state": "TX",
      "postal_code": "78701",
      "country": "US",
      "proof_of_address_file": "https://storage.yativo.com/documents/abc/utility-bill.pdf"
    },
    "identifying_information": [
      {
        "type": "passport",
        "issuing_country": "US",
        "number": "P12345678",
        "date_issued": "2019-06-01",
        "expiration_date": "2029-06-01",
        "image_front_file": "https://storage.yativo.com/documents/abc/passport-front.jpg"
      }
    ],
    "employment_status": "employed",
    "most_recent_occupation_code": "151252",
    "expected_monthly_payments_usd": "0_4999",
    "source_of_funds": "salary",
    "account_purpose": "receive_salary",
    "acting_as_intermediary": false,
    "uploaded_documents": [
      {
        "type": "bank_statement",
        "file": "https://storage.yativo.com/documents/abc/bank-statement.pdf"
      }
    ]
  }'
{
  "success": true,
  "message": "KYC submission received successfully",
  "errors": {
    "submission": {
      "id": "sub_8f3b2a1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c",
      "type": "individual",
      "status": "submitted",
      "customer_id": "c586066b-0f29-468f-b775-15483871a202",
      "first_name": "Alex",
      "last_name": "Smith",
      "email": "alex.smith@example.com",
      "endorsements": [
        {
          "service": "base",
          "status": "pending",
          "link": "https://kyc.yativo.com/endorsement/base/c586066b-0f29-468f-b775-15483871a202"
        }
      ],
      "created_at": "2026-06-01T10:00:00.000000Z"
    }
  }
}

Business KYB

Submit

POST https://kyc.yativo.com/api/business-kyc/submit

Step 1 — Business basics

FieldTypeRequiredNotes
customer_idstringUUID from POST /customer (must be customer_type: "business")
business_legal_namestringOfficial registered legal name, max 255 chars
business_trade_namestringTrade / DBA name, max 255 chars
business_descriptionstringWhat the business does, max 1000 chars
emailstringBusiness contact email
business_typestringcooperative, corporation, llc, partnership, sole_prop, trust, or other
registration_numberstringGovernment registration / incorporation number, max 100 chars
incorporation_datestringYYYY-MM-DD, must be before today
tax_idstringBusiness tax ID, max 100 chars
phone_calling_codestringMust match ^\+[1-9]\d{0,3}$
phone_numberstringDigits only, 7–15 characters
business_industrystringIndustry category
primary_websitestringFull URL
is_daobooleanWhether the business is a DAO
statement_descriptorstringHow the name appears on statements, max 22 chars

Step 2 — Addresses

Both registered_address and physical_address use the same structure:
FieldTypeRequiredNotes
street_line_1stringMax 255 chars
street_line_2stringOptional
citystringMax 100 chars
statestringAccepts "US-CA" or "CA"
postal_codestringValidated per country
countrystringISO 3166-1 alpha-2
proof_of_address_filefile URL or base64Optional for registered, recommended for physical

Step 3 — Associated persons

At least one person is required. Include all UBOs, directors, and authorized signers.
FieldTypeRequiredNotes
first_namestringMax 100 chars
last_namestringMax 100 chars
birth_datestringYYYY-MM-DD, before today
nationalitystringISO 3166-1 alpha-2
emailstringPersonal email
phonestringOptional
titlestringE.g. "CEO", "Director"
ownership_percentagenumber0–100
relationship_established_atstringYYYY-MM-DD, must not be in the future
residential_addressobjectSame structure as Step 2
identifying_informationarrayID documents (same structure as individual KYC Step 3)
has_ownershipbooleanHas ownership stake
has_controlbooleanHas operational control
is_signerbooleanAuthorized signer
is_directorbooleanDirector

Step 4 — Risk and purpose

FieldTypeRequiredNotes
account_purposestringSee enum values
account_purpose_otherstringIf account_purpose is "other"
source_of_fundsstringSee enum values
high_risk_activitiesarraySee enum values. Use ["none_of_the_above"] if none apply
high_risk_activities_explanationstringIf any high-risk activities listed
conducts_money_servicesboolean
conducts_money_services_descriptionstringIf conducts_money_services is true
compliance_screening_explanationstringIf conducts_money_services is true
estimated_annual_revenue_usdstring
expected_monthly_payments_usdnumberExpected monthly volume in USD
operates_in_prohibited_countriesstring"yes" or "no"
ownership_thresholdintegerUBO reporting threshold (5–25)
has_material_intermediary_ownershipboolean

Step 5 — Regulated activity

FieldTypeNotes
regulated_activity.regulated_activities_descriptionstringOptional
regulated_activity.primary_regulatory_authority_countrystringISO 3166-1 alpha-2
regulated_activity.primary_regulatory_authority_namestring
regulated_activity.license_numberstring

Step 6 — Business documents

At least one document is required.
FieldTypeRequiredNotes
documents[*].purposestring"business_registration", "tax_documents", "compliance_documents", or "financial_statements"
documents[*].descriptionstringHuman-readable description
documents[*].filefile URL or base64File attachment

Step 7 — Business identifying information (optional)

Business-level ID documents (e.g. business licence).
FieldTypeNotes
identifying_information[*].typestring
identifying_information[*].issuing_countrystringISO 3166-1 alpha-2
identifying_information[*].numberstring
identifying_information[*].descriptionstring
identifying_information[*].expirationstringYYYY-MM-DD, after today
identifying_information[*].image_frontfile URL or base64
identifying_information[*].image_backfile URL or base64

KYB example request

curl -X POST 'https://kyc.yativo.com/api/business-kyc/submit' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: kyb-acme-2026-001' \
  -d '{
    "customer_id": "d47f8a2b-1c3e-4f5a-9b8c-7d6e5f4a3b2c",
    "business_legal_name": "Acme Payments LLC",
    "business_trade_name": "Acme Pay",
    "business_description": "International payment processing for SMEs",
    "email": "compliance@acmepay.com",
    "business_type": "llc",
    "registration_number": "LLC-2018-00987",
    "incorporation_date": "2018-03-12",
    "tax_id": "47-1234567",
    "phone_calling_code": "+1",
    "phone_number": "3055551234",
    "primary_website": "https://acmepay.com",
    "registered_address": {
      "street_line_1": "100 Brickell Ave",
      "city": "Miami",
      "state": "FL",
      "postal_code": "33131",
      "country": "US"
    },
    "physical_address": {
      "street_line_1": "100 Brickell Ave",
      "city": "Miami",
      "state": "FL",
      "postal_code": "33131",
      "country": "US",
      "proof_of_address_file": "https://storage.yativo.com/documents/abc/lease.pdf"
    },
    "associated_persons": [
      {
        "first_name": "Jane",
        "last_name": "Doe",
        "birth_date": "1978-07-22",
        "nationality": "US",
        "email": "jane.doe@acmepay.com",
        "title": "CEO",
        "ownership_percentage": 60,
        "relationship_established_at": "2018-03-12",
        "residential_address": {
          "street_line_1": "456 Coral Way",
          "city": "Miami",
          "state": "FL",
          "postal_code": "33133",
          "country": "US"
        },
        "identifying_information": [
          {
            "type": "passport",
            "issuing_country": "US",
            "number": "P87654321",
            "date_issued": "2020-01-10",
            "expiration_date": "2030-01-10",
            "image_front_file": "https://storage.yativo.com/documents/abc/jane-passport.jpg"
          }
        ],
        "has_ownership": true,
        "has_control": true,
        "is_signer": true,
        "is_director": true
      }
    ],
    "account_purpose": "business_transactions",
    "source_of_funds": "business_income",
    "high_risk_activities": ["none_of_the_above"],
    "conducts_money_services": false,
    "regulated_activity": {},
    "documents": [
      {
        "purpose": "business_registration",
        "description": "Certificate of Incorporation",
        "file": "https://storage.yativo.com/documents/abc/certificate.pdf"
      },
      {
        "purpose": "tax_documents",
        "description": "EIN confirmation letter",
        "file": "https://storage.yativo.com/documents/abc/ein.pdf"
      }
    ]
  }'
{
  "success": true,
  "message": "Business KYC submission received successfully",
  "business_data": {
    "customer_id": "d47f8a2b-1c3e-4f5a-9b8c-7d6e5f4a3b2c",
    "type": "business",
    "business_legal_name": "Acme Payments LLC",
    "status": "submitted",
    "created_at": "2026-06-01T10:00:00.000000Z"
  }
}

Check KYC / KYB status

GET /customer/kyc/{customer_id}
customer_id
string
required
The customer UUID.

Status values

StatusDescription
not_startedNo submission has been made
submittedReceived, awaiting review
manual_reviewUnder manual compliance review
approvedCustomer is fully verified
rejectedRejected — see kyc_rejection_reasons
under_reviewAdditional review in progress
Check both status === "approved" and is_va_approved === true before enabling payment features for a customer.
curl -X GET 'https://api.yativo.com/api/v1/customer/kyc/c586066b-0f29-468f-b775-15483871a202' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
{
  "status": "success",
  "status_code": 200,
  "data": {
    "first_name": "Alex",
    "last_name": "Smith",
    "status": "approved",
    "kyc_rejection_reasons": [],
    "kyc_requirements_due": [],
    "bio_data": {
      "customer_kyc_status": "approved",
      "kyc_verified_date": "2026-06-01T12:00:00.000000Z"
    },
    "kyc_link": "https://kyc.yativo.com/individual/c586066b-0f29-468f-b775-15483871a202",
    "is_va_approved": true
  }
}

Update a KYC submission

Use this endpoint to correct information or provide missing documents after a rejection.
PUT /customer/kyc/update
Send only the fields you need to correct. customer_id is always required.
curl -X PUT 'https://api.yativo.com/api/v1/customer/kyc/update' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: kyc-update-2026-002' \
  -d '{
    "customer_id": "c586066b-0f29-468f-b775-15483871a202",
    "selfie_image": "https://storage.yativo.com/documents/abc/selfie-v2.jpg",
    "identifying_information": [
      {
        "type": "passport",
        "issuing_country": "US",
        "number": "P12345678",
        "date_issued": "2019-06-01",
        "expiration_date": "2029-06-01",
        "image_front_file": "https://storage.yativo.com/documents/abc/passport-front-hd.jpg"
      }
    ]
  }'

Service endorsements

After approval, customers receive service endorsements that unlock specific payment rails.
ServiceDescription
baseUSD base payment access
sepaEuropean SEPA transfers
speiMexico SPEI transfers
brazilBrazilian payment rails
eurdeEUR/DE virtual accounts
usd_latamUSD Latin America transfers
eur_latamEUR Latin America transfers
virtual_cardVirtual card issuance
asianAsian region payments
nativeNative payment rails
cobo_poboCollection / payment-on-behalf-of

Endorsement statuses

StatusDescription
not_startedNot yet initiated
pendingAwaiting review
approvedActive for this customer
rejectedRejected
declinedCustomer declined
under_reviewAdditional review in progress
If an endorsement link has expired, regenerate it and share the new URL with the customer:
GET https://kyc.yativo.com/api/kyc/regenerate/{customer_id}/{service}
curl -X GET 'https://kyc.yativo.com/api/kyc/regenerate/c586066b-0f29-468f-b775-15483871a202/sepa' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
{
  "success": true,
  "message": "Endorsement link regenerated successfully",
  "data": {
    "service": "sepa",
    "customer_id": "c586066b-0f29-468f-b775-15483871a202",
    "link": "https://kyc.yativo.com/endorsement/sepa/c586066b-0f29-468f-b775-15483871a202?token=abc123"
  }
}

Reference lookups

Occupation codes

Get the full list of valid occupation codes for most_recent_occupation_code:
GET /auth/occupation-codes
curl -X GET 'https://api.yativo.com/api/v1/auth/occupation-codes' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
{
  "status": "success",
  "status_code": 200,
  "data": [
    { "display_name": "Software developer", "code": "151252" },
    { "display_name": "Accountant and auditor", "code": "132011" },
    { "display_name": "Financial manager", "code": "113031" },
    { "display_name": "Registered nurse", "code": "291141" }
  ]
}

Supported countries

Get the list of countries supported for customer registration and verification:
GET /auth/verification-locations
curl -X GET 'https://api.yativo.com/api/v1/auth/verification-locations' \
  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
{
  "status": "success",
  "status_code": 200,
  "data": [
    { "country": "United States", "code": "US" },
    { "country": "Brazil", "code": "BR" },
    { "country": "Nigeria", "code": "NG" },
    { "country": "Mexico", "code": "MX" },
    { "country": "Colombia", "code": "CO" }
  ]
}

Enum reference values

employment_status

API valueDescription
employedEmployed
exemptExempt
homemakerHomemaker
retiredRetired
self_employedSelf-Employed
studentStudent
unemployedUnemployed

expected_monthly_payments_usd

API valueRange
0_4999Less than $5,000
5000_99995,0005,000 – 9,999
10000_4999910,00010,000 – 49,999
50000_plus$50,000 or more

source_of_funds

API valueDescription
business_incomeBusiness Income
company_fundsCompany Funds
ecommerce_resellerEcommerce Reseller
gambling_proceedsGambling Proceeds
giftsGifts
government_benefitsGovernment Benefits
inheritanceInheritance
investments_loansInvestments / Loans
pension_retirementPension / Retirement
salarySalary
sale_of_assets_real_estateSale of Assets or Real Estate
savingsSavings
someone_elses_fundsSomeone Else’s Funds

account_purpose

API valueDescription
business_transactionsBusiness Transactions
charitable_donationsCharitable Donations
ecommerce_retail_paymentsEcommerce / Retail Payments
investment_purposesInvestment Purposes
operating_a_companyOperating a Company
otherOther (requires account_purpose_other)
payments_to_friends_or_family_abroadPayments to Friends or Family Abroad
personal_or_living_expensesPersonal / Living Expenses
protect_wealthProtect Wealth
purchase_goods_and_servicesPurchase Goods and Services
receive_payment_for_freelancingReceive Payment for Freelancing
receive_salaryReceive Salary

high_risk_activities (KYB)

API valueDescription
adult_entertainmentAdult entertainment
gamblingGambling
hold_client_fundsHolding client funds
investment_servicesInvestment services
lending_bankingLending or banking
marijuana_or_related_servicesMarijuana-related services
money_servicesMoney services
operate_foreign_exchange_virtual_currencies_brokerage_otcForeign exchange / crypto brokerage / OTC
pharmaceuticalsPharmaceuticals
precious_metals_precious_stones_jewelryPrecious metals / stones / jewelry
safe_deposit_box_rentalsSafe deposit box rentals
weapons_firearms_and_explosivesWeapons / firearms / explosives
none_of_the_aboveNone of the above

business_type (KYB)

cooperative, corporation, llc, partnership, sole_prop, trust, other

ID types by country

The accepted type values under identifying_information depend on the issuing country. Common types available globally:
TypeDescription
passportPassport
national_idNational ID card
otherOther government-issued ID
Countries also accept country-specific types, for example:
CountryExtra 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
Use 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

EventDescription
kyc.status_updatedKYC/KYB verification status changed
kyc.endorsement_updatedA specific service endorsement status changed

Payload example

{
  "event": "kyc.status_updated",
  "data": {
    "customer_id": "c586066b-0f29-468f-b775-15483871a202",
    "status": "approved",
    "type": "individual",
    "endorsements": ["base", "sepa"],
    "rejection_reasons": [],
    "updated_at": "2026-06-01T15:00:00.000000Z"
  }
}

Error handling

{
  "status": "failed",
  "status_code": 422,
  "message": "Request failed",
  "data": {
    "email": ["The email field is required."],
    "nationality": ["The nationality must be 2 characters."],
    "identifying_information": ["The identifying information field is required."]
  }
}

Common errors and fixes

ErrorFix
customer_id does not existCreate the customer first with POST /customer
nationality must be 2 charactersUse ISO 3166-1 alpha-2 (e.g. "US", "NG")
birth_date must be a date before todayEnsure the date is in the past
expiration_date must be a date after todayID document must not be expired
bvn is requiredRequired for Nigerian nationals — exactly 11 digits
nin is requiredRequired for Nigerian nationals — exactly 11 digits
calling_code is invalidMust be + followed by 1–4 digits, e.g. "+1", "+234"
identifying_information is requiredAt least one ID document must be included
documents is requiredKYB requires at least one business document

Implementation notes

  • KYC review typically completes within 24 hours. Complex cases may take longer.
  • Use Idempotency-Key on 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"), bvn and nin are mandatory regardless of which ID type is provided.
  • The state field 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.