Onboarding a Customer with KYC Data
This guide explains how to onboard a customer into Breeze by providing KYC data directly through the Customer Onboarding API. This approach allows your platform to reuse identity information you have already collected, minimizing the amount of KYC data your customers need to enter when they access Breeze’s payout services.
By sending KYC attributes during customer creation or update, Breeze can:
- Perform KYC checks in the background without requiring additional input from the customer, if all required fields are provided.
- Pre-fill the hosted verification form for cases where only partial information is available, reducing friction and improving completion rates.
- Ensure a more seamless payout experience, especially for platforms that already maintain verified customer records.
This method is the recommended integration path for merchants who collect KYC information during their own onboarding flow and want to deliver a streamlined, low-friction experience to their users.
The sections below describe the required fields, request format, and how Breeze processes the data during KYC verification.
How It Works (Conceptual Overview)
sequenceDiagram
participant Merchant
participant Breeze
participant Persona
participant Customer
Note over Merchant: Step 1 – Create Customer with KYC attributes
Merchant->>Breeze: Create Customer via Onboarding API<br/>(includes merchant-collected Customer KYC data)
Breeze-->>Merchant: Return Breeze Customer ID
Note over Merchant: Step 2 – Payout initiation
Merchant->>Breeze: Request payout for the Customer
Breeze-->>Merchant: Return hosted payout page URL
Note over Customer, Breeze: Step 3 – Customer opens payout page
Merchant->>Customer: Redirect to hosted payout page
Customer->>Breeze: Open payout page / begin KYC step
Note over Breeze: Step 4 – Evaluate Customer KYC data from Merchant
alt Merchant provided sufficient Customer KYC data
Breeze->>Persona: Submit Customer's KYC data via API
Persona-->>Breeze: KYC validation result
else Merchant provided partial or incomplete Customer KYC data
Breeze->>Customer: Show hosted Persona KYC widget<br/>prefilled with Customer data from Onboarding API
Customer->>Persona: Provide remaining KYC details
Persona-->>Breeze: KYC validation result
end
Note over Breeze: Step 5 – Money movement
Breeze-->>Breeze: Proceed to payout once KYC is approved
Creating a Customer
To create a customer in Breeze, send a POST request to the Breeze API POST /v1/customers with the request payload detailed here.
curl --location --request POST 'https://api.breeze.cash/v1/customers' \
-u "YOUR_API_KEY:" \
--header 'Content-Type: application/json' \
--data-raw '{
"referenceId": "<your-unique-user-id>",
"email": "[email protected]",
"firstName": "John",
"middleName": "K",
"lastName": "Doe",
"dateOfBirth": "1990-01-01",
"address": {
"line1": "123 Main Street",
"line2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"postalCode": "94105",
"country": "US"
},
"phoneNumber": "+14155552671",
"signupAt": 1710000000000 // 2024-03-08T12:00:00.000Z, UTC+0 timestamp in milliseconds
}'Request payload
Fields | Type | Required | Description |
|---|---|---|---|
referenceId |
| ✅ | Your system's reference ID for this user. |
signupAt |
| ✅ | Epoch timestamp in milliseconds. |
| Email of the user | ||
supportedPaymentMethods |
| Immutable field. Indicates the payment methods this customer can use. Once set, this field cannot be updated. | |
firstName |
| Max length 100 | |
middleName |
| Max length 100 | |
lastName |
| Max length 100 | |
dateOfBirth |
| In | |
phoneNumber |
| Max length 20.
For United States, use either | |
address |
| See details on the nested fields in the rows below with prefix | |
address.line1 |
| Sub-field of | |
address.line2 |
| Sub-field of | |
address.city |
| Sub-field of | |
address.state |
| Sub-field of | |
address.postalCode |
| Sub-field of | |
address.country |
| Sub-field of |
Response
A successful response will look like:
{
"status": "SUCCEEDED",
"data": {
"id": "cus_123abc456", // The customer ID generated by Breeze
"referenceId": "<your-unique-user-id>",
"email": "[email protected]"
...
}
}The data fields are as follows:
Fields | Type | Required | Description |
|---|---|---|---|
id |
| ✅ | Breeze's generated ID for this user. |
referenceId |
| ✅ | Your system's reference ID for this user. |
signupAt |
| ✅ | Epoch timestamp in milliseconds. |
merchantId |
| ✅ | Breeze's merchant ID representing your business. |
livemode |
| ✅ | Breeze's flag to indicate whether your merchant is in live mode or sandbox mode.
|
| Email of the user, only present if provided. | ||
supportedPaymentMethods |
| Indicates the payment methods this customer can use, only present if provided. | |
supportedPayoutMethods |
| Indicates the payout methods this customer can use, only present if it has been set by admin. | |
firstName |
| Encrypted string containing the first name of the user, only present if provided. | |
middleName |
| Encrypted string containing the middle name of the user, only present if provided. | |
lastName |
| Encrypted string containing the last name of the user, only present if provided. | |
dateOfBirth |
| Encrypted string containing the date-of-birth of the user, only present if provided. | |
phoneNumber |
| Encrypted string containing the phone number of the user, only present if provided. | |
address |
| See details on the nested fields in the rows below with prefix | |
address.line1 |
| Encrypted string containing the first line of the user's address, only present if provided. | |
address.line2 |
| Encrypted string containing the second line of the user's address, only present if provided. | |
address.city |
| Encrypted string containing the city of the user's address, only present if provided. | |
address.state |
| Encrypted string containing the state of the user's address, only present if provided. | |
address.postalCode |
| Encrypted string containing the postal code of the user's address, only present if provided. | |
address.country |
| Encrypted string containing the country of the user's address, only present if provided. |
Updating a Customer
To update a customer in Breeze, send a POST request to the Breeze API POST /v1/customers/:customerId with the request payload detailed here.
These are the fields that we support updates for:
- Address
curl --location --request POST 'https://api.breeze.cash/v1/customers/cus_172e1e324a25e95a' \
--header 'Authorization: Basic <your token>' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "<updated value>",
"address": {
"line1": "<updated value>",
"line2": "<updated value>",
"city": "<updated value>",
"state": "<updated value>",
"postalCode": "<updated value>",
"country": "<updated value>"
}
}'Request payload
Fields | Type | Required | Description |
|---|---|---|---|
| Email of the user | ||
address |
| See details on the nested fields in the rows below with prefix | |
address.line1 |
| Sub-field of | |
address.line2 |
| Sub-field of | |
address.city |
| Sub-field of | |
address.state |
| Sub-field of | |
address.postalCode |
| Sub-field of | |
address.country |
| Sub-field of |
Response
A successful response will look like:
{
"status": "SUCCEEDED",
"data": {
"id": "cus_123abc456", // The customer ID generated by Breeze
"referenceId": "<your-unique-user-id>",
"email": "[email protected]"
...
}
}The data fields are as follows:
Fields | Type | Required | Description |
|---|---|---|---|
id |
| ✅ | Breeze's generated ID for this user. |
referenceId |
| ✅ | Your system's reference ID for this user. |
signupAt |
| ✅ | Epoch timestamp in milliseconds. |
merchantId |
| ✅ | Breeze's merchant ID representing your business. |
livemode |
| ✅ | Breeze's flag to indicate whether your merchant is in live mode or sandbox mode.
|
| Email of the user, only present if provided. | ||
supportedPaymentMethods |
| Indicates the payment methods this customer can use, only present if provided. | |
supportedPayoutMethods |
| Indicates the payout methods this customer can use, only present if it has been set by admin. | |
firstName |
| Encrypted string containing the first name of the user, only present if provided. | |
middleName |
| Encrypted string containing the middle name of the user, only present if provided. | |
lastName |
| Encrypted string containing the last name of the user, only present if provided. | |
dateOfBirth |
| Encrypted string containing the date-of-birth of the user, only present if provided. | |
phoneNumber |
| Encrypted string containing the phone number of the user, only present if provided. | |
address |
| See details on the nested fields in the rows below with prefix | |
address.line1 |
| Encrypted string containing the first line of the user's address, only present if provided. | |
address.line2 |
| Encrypted string containing the second line of the user's address, only present if provided. | |
address.city |
| Encrypted string containing the city of the user's address, only present if provided. | |
address.state |
| Encrypted string containing the state of the user's address, only present if provided. | |
address.postalCode |
| Encrypted string containing the postal code of the user's address, only present if provided. | |
address.country |
| Encrypted string containing the country of the user's address, only present if provided. |
Updated 14 days ago
