Customers

Understanding Customers

Customers are end users of your platform and can be either individuals or businesses. They represent the entity on whose behalf transactions are executed — the beneficial owner of wallets, balances, and payment activities within the platform.

Before making any transactions, all users must register as customers through UnblockPay's Customers API and undergo a KYC or KYB process to verify their identity. Once approved by UnblockPay, customers can seamlessly transfer stablecoins or fiat currencies between wallets and bank accounts.


Customers API endpoints

Here are the endpoints you'll need to create or manage a customer:

  • POST /v1/customers: Create a new customer

  • POST /v1/customers/{customerId}/documents: Upload a single verification document

  • POST /v1/customers/{customerId}/check: Trigger the verification process

  • GET /v1/customers: List all customers

  • GET /v1/customers/{id}: Get specific details for one customer

  • GET /v1/customers/{customerId}/verification-details: Return the current verification status of the customer


Required information and documents

KYC and KYB verification processes include collecting essential information such as:

Individual Customer

Business Customer

Full name

Legal name

Date of birth

Date of incorporation

Email

Email

Phone

Phone

TIN (Taxpayer Identification Number)

Tax ID

Country

Country

Address

Address

Identity document

Company formation documents + shareholder structure

Proof of address

Information and documents from Representative + UBOs + shareholders with more than 25%

KYC and KYB may not be available for Customers in specific jurisdictions, and some fiat ramps – such as USD and EUR – may require enhanced KYC and KYB documentation.


How does the KYC/B verification work?

After creating a customer, there are two ways to complete the verification:

The POST /v1/customers response includes a verification.verification_link. You can redirect your user to that URL and let Sumsub handle the document collection UI entirely. No further API calls are needed on your end — the customer completes everything on the hosted page.

  1. Create customer POST /v1/customers

  2. Redirect user → verification_link (Sumsub hosted flow)

  3. Wait for result webhook or GET /v1/customers/{customerId}/verification-details

Option B – Direct API upload

Upload documents yourself via the API, then trigger verification programmatically. This gives you full control over the UI and document collection experience.

  1. Create customer POST /v1/customers

  2. Upload documents POST /v1/customers/{customerId}/documents (one per call)

  3. Trigger verification POST /v1/customers/{customerId}/check

  4. Wait for result webhook or GET /v1/customers/{customerId}/verification-details

The required documents are fixed and listed below, so you can start uploading immediately. If you want to confirm exactly what's still pending — especially after a partially_rejected status — call GET /v1/customers/{customerId}/verification-details first.


Status lifecycle

Every customer starts with a pending status upon creation. From there, verification can follow two paths: the customer moves to under_review while documents are being analyzed, and is either approved or moves to partially_rejected if some items need correction — in which case they can resubmit and reach approved or be permanently rejected.

Successful verification flow:

pendingunder_reviewapproved

When submitted information is invalid, the customer can resubmit corrected documents:

pendingunder_reviewpartially_rejectedapproved

When a customer is permanently rejected:

  1. pendingunder_reviewpartially_rejectedrejected

  2. pendingunder_reviewrejected

Status

Meaning

pending

Awaiting document upload or under review

under_review

Documents submitted and currently being analyzed

approved

Verification passed — customer can transact

partially_rejected

One or more items were rejected; check verification details and resubmit

rejected

Customer permanently blocked — no further submissions accepted


How to create a Customer?

POST /v1/customers

This endpoint lets you create customer profiles that represent your end users. You must create a customer in UnblockPay before processing any pay-ins or payouts.

To create a new Customer, send a POST request to the Customer endpoint with the required fields in the request body, specifying either individual or business as the customer type.

Individual Customer

Here is a request example for creating an individual customer:

curl https://api.unblockpay.com/v1/customers \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: YOUR_SECRET_TOKEN' \
  --data '{
    "type": "individual",
    "first_name": "Satoshi",
    "last_name": "Nakamoto",
    "email": "satoshi@email.com",
    "phone_number": "1234567890",
    "date_of_birth": "1990-01-01",
    "tin": "12345678900",
    "country": "BRA",
    "address": {
      "street_line_1": "123 Main St",
      "street_line_2": "Apt 4B",
      "city": "New York",
      "state": "NY",
      "postal_code": "10001",
      "country": "USA"
    }
  }'

Here is a response example when creating an individual customer:

{
  "id": "0196c8cd-839a-7389-b5ce-0a0776023e55",
  "type": "individual",
  "status": "pending",
  "first_name": "Satoshi",
  "last_name": "Nakamoto",
  "email": "satoshi@email.com",
  "phone_number": "1234567890",
  "date_of_birth": "1990-01-01",
  "tin": "12345678900",
  "country": "BRA",
  "address": {
    "street_line_1": "123 Main St",
    "street_line_2": "Apt 4B",
    "city": "New York",
    "state": "NY",
    "postal_code": "10001",
    "country": "USA"
  },
  "partner_id": "partner_123",
  "verification": {
    "verification_link": "https://sumsub.com/...",
    "verification_type": "LIGHT"
  },
  "created_at": "2025-05-13T08:40:33.946Z",
  "updated_at": "2025-05-13T08:40:33.946Z"
}

Business Customer

Here is a request example for creating an business customer:

curl https://api.unblockpay.com/customers \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: YOUR_SECRET_TOKEN' \
  --data '{
    "type": "business",
    "business_legal_name": "Satoshi Company LLC",
    "date_of_incorporation": "2020-08-10",
    "email": "satoshi@email.com",
    "phone_number": "1234567890",
    "tax_id": "96585813000160",
    "country": "BRA",
    "address": {
      "street_line_1": "123 Main St",
      "street_line_2": "Apt 4B",
      "city": "São Paulo",
      "state": "SP",
      "postal_code": "04514-100",
      "country": "BRA"
    },
    "website": "https://www.techstartup.com",
    "no_ubos": false,
    "beneficiaries": [
      {
        "first_name": "string",
        "last_name": "string",
        "email": "string",
        "phone_number": "string",
        "date_of_birth": "YYYY-MM-DD",
        "tin": "string",
        "country": "string",
        "share_size": "25.5",
        "address": { }
      }
    ]
  }'

Here is a response example when creating a business customer:

{
  "id": "01932e60-1234-7890-bcde-f12345678901",
  "type": "business",
  "status": "pending",
  "business_legal_name": "Satoshi Company LLC",
  "date_of_incorporation": "2020-08-10",
  "email": "satoshi@email.com",
  "phone_number": "1234567890",
  "tax_id": "96585813000160",
  "country": "BRA",
  "website": "https://www.techstartup.com",
  "address": {
    "street_line_1": "123 Main St",
    "street_line_2": "Apt 4B",
    "city": "São Paulo",
    "state": "SP",
    "postal_code": "04514-100",
    "country": "BRA"
  },
  "partner_id": "partner_123",
  "verification": {
    "verification_link": "https://sumsub.com/...",
    "verification_type": "LIGHT"
  },
  "beneficiaries": [ ],
  "created_at": "2026-02-18T10:35:00Z",
  "updated_at": "2026-02-18T10:35:00Z"
}

How to upload a document?

POST /v1/customers/{customerId}/documents

Content-Type: multipart/form-data

This endpoint lets you upload a single verification document. Call this endpoint once per file — documents must be uploaded individually.

Request body

Field

Type

Required

Description

file

file

Yes

Document file — PDF, JPG, PNG, etc.

metadata

JSON string

Yes

Document metadata (see structure below)

Metadata structure

{
  "document_type": "NATIONAL_ID",
  "document_side": "FRONT",
  "country": "BRA",
  "beneficiary_id": "49ea431c-9c71-40a1-8e08-41503ed8eb5b"
}

Field description:

Field

Type

Required

Description

document_type

string

Yes

Type of document being uploaded. See allowed values below.

document_side

string

Conditional

Side of the document.

Allowed values: FRONT or BACK.

Required for NATIONAL_ID, PASSPORT, DRIVER_LICENSE.

country

string

No

3-letter ISO country code.

Example: BRA, USA, MEX.

beneficiary_id

string

No

UBO identifier — KYB only. Associates the document with a specific beneficial owner.

Allowed document_type values:

Value

Description

PASSPORT

Valid passport — must be within expiry date and show personal details page

NATIONAL_ID

Government-issued national identity card — front and back required

DRIVER_LICENSE

Valid driver's license — front and back required

PROOF_OF_ADDRESS

Recent utility bill, bank statement, or official letter — must be no older than 3 months and show full name and address

SELFIE

A clear photo of the customer holding their identity document

INCORPORATION_ARTICLES

Articles of incorporation or equivalent founding document

INCORPORATION_CERTIFICATE

Official certificate of incorporation issued by the relevant government authority

INCUMBENCY_CERTIFICATE

Certificate confirming current company officers and directors

SHAREHOLDER_REGISTRY

Official document listing all shareholders and their ownership stakes

STATE_COMPANY_REGISTRY

Company registration extract from the state or local business registry


How to check a KYC/KYB status?

GET /v1/customers/{customerId}/verification-details

This endpoint returns the current verification status of the customer, broken down by individual step or document. Use this endpoint to check what's still pending before uploading, or to understand what was rejected after a partially_rejected status.

Response — 200 OK:

{
  "customer_id": "49ea431c-9c71-40a1-8e08-41503ed8eb5b",
  "customer_status": "pending",
  "verification_steps": {
    "pending": [
      "SHAREHOLDER_REGISTRY"
    ],
    "under_review": [
      "CUSTOMER_BENEFICIARIES"
    ],
    "partially_rejected": [
      {
        "name": "CUSTOMER_DATA",
        "rejection_code": ["WRONG_ADDRESS"],
        "rejection_description": "Invalid customer data, please update customer info."
      }
    ],
    "approved": [
      "INCORPORATION_CERT"
    ],
    "rejected": [
      {
        "name": "INCORPORATION_ARTICLES",
        "rejection_code": ["EXPIRED", "FRAUDULENT"],
        "rejection_description": "Document has expired and appears to be fraudulent."
      }
    ]
  }
}

Field

Description

customer_status

Overall verification status: pending, under_review, approved, partially_rejected, or rejected

verification_steps.pending

Items awaiting upload

verification_steps.under_review

Items currently being analyzed

verification_steps.partially_rejected

Items rejected that can be resubmitted — includes rejection_code and rejection_description

verification_steps.approved

Items that passed

verification_steps.rejected

Items permanently rejected — includes rejection_code and rejection_description


How to run a KYC/KYB verification?

POST /v1/customers/{customerId}/check

Triggers the verification process. Must be called after the customer is created and all required documents have been uploaded.

The verification runs asynchronously. You'll receive the result via webhook, or you can poll GET /v1/customers/{customerId}/verification-details.

No response body. A 200 confirms the verification was successfully triggered.