Creating a Customer (Individual) via API
This endpoint enables you to create individual customers. Once a customer is created, we initiate the KYC verification process automatically. You can then either poll the customer object or listen for webhooks to track the status change from PENDING_AGREEMENTS
→ VERIFIED
or REJECTED
.
Important
- Ensure accurate personal data (name, DOB, nationality, address) is collected to facilitate a smooth KYC process.
- A successful response includes a unique customer reference for tracking verification status.
- Customer Due Diligence (CDD) data is required.
Early Access
Please note that this endpoint is currently in early access, and it may undergo changes as we continue to improve and refine the functionality.
Prerequisites
You will need to collect information about the customer before proceeding with the request to create one.
Idempotency supported endpoint
This means you can retry a request without worrying about it being processed multiple times.
To use this feature, add the
X-Idempotency-Key
header with a unique value (a UUID). This ensures the request is only processed once, even if it's sent multiple times.
Environment | Endpoint |
---|---|
Production | POST https://api.bvnk.com/platform/v1/customers |
Sandbox | POST https://api.sandbox.bvnk.com/platform/v1/customers |
Create Customer Request
curl --location 'https://api.sandbox.bvnk.com/platform/v1/customers' \
--header 'X-Idempotency-Key: 86b5f133-9ee8-4f67-8747-7c9d0894a68b' \
--header 'Content-Type: application/json' \
--header 'Authorization: Hawk id="YourHawkID", ts="1728655954", nonce="abc123", mac="..."' \
--data-raw '{
"type": "INDIVIDUAL",
"individual": {
"riskScore": "LOW",
"description": "Transfers to/from Own Wallet",
"firstName": "John",
"lastName": "Doe",
"dateOfBirth": "1990-05-12",
"nationality": "US",
"contactinfo": {
"email": "john.doe@example.com",
"phonenumber": "+1234567890"
},
"address": {
"addressLine1": "123 Main St",
"city": "New York",
"postCode": "10001",
"stateCode": "NY",
"countryCode": "US"
},
"taxidentification": {
"number": "123-45-6789",
"taxResidenceCountryCode": "US"
},
"cdd": {
"employmentStatus": "Salaried",
"sof": "Salary / Employment Income",
"pep": "Not a PEP",
"expectedMonthlyvolumes": "EUR 500 - EUR 5,000"
}
},
"signedAgreementSessionReference": "78eedde1-2402-4a59-8bbd-ccecb6d612d1"
}'
Request Body Parameters (Individual)
Attribute | Type | Required | Description |
---|---|---|---|
type | string | Yes | Must be INDIVIDUAL . |
individual | object | Yes | Individual customer details |
individual.riskScore | string | Yes | Customer risk rating (LOW , MEDIUM , HIGH ) |
individual.description | string | Yes | Purpose (e.g., Transfers, Investments, Donations) |
individual.firstName | string | Yes | First name |
individual.lastName | string | Yes | Last name |
individual.dateOfBirth | string | Yes | YYYY-MM-DD format |
individual.nationality | string | Optional | Nationality (ISO 2-letter code) |
individual.contactinfo | object | Yes | Contact information |
individual.contactinfo.email | string | Yes | Email address |
individual.contactinfo.phonenumber | string | Optional | Phone number (optional) |
individual.address | object | Yes | Customer Residence Address |
individual.address.addressLine1 | string | Yes | Street Name and Number |
individual.address.city | string | Yes | City |
individual.address.postCode | string | Yes | ZIP/postal code |
individual.address.stateCode | string | Optional | State. Required for US customers |
individual.address.countryCode | string | Yes | Country ISO 2-letter code |
individual.taxidentification | object | Optional | Mandatory for US Nationals |
individual.taxidentification.number | string | Conditional | SSN for US |
individual.taxidentification.taxResidenceCountryCode | string | Conditional | Tax residency country ISO code |
individual.cdd | object | Yes | Customer Due Diligence details |
individual.cdd.employmentStatus | string | Yes | Employment status (Salaried , Self-employed , etc.) |
individual.cdd.sof | string | Yes | Source of funds (Salary , Savings , etc.) |
individual.cdd.pep | string | Yes | Politically Exposed Person status |
individual.cdd.expectedMonthlyvolumes | string | Yes | Expected monthly volumes (EUR 500 - EUR 5,000 , etc.) |
signed_agreement_id | string | Yes | Agreement acceptance reference |
Response
Response Code | Description |
---|---|
202 | Successful operation. |
400 | Bad request. |
{
"reference": "f81a5b62-27b8-4b3b-b51e-eb10edeb1731",
"status": "PENDING"
}
Attribute | Type | Description |
---|---|---|
reference | string | A unique identifier for the customer. |
status | string | The current status of the customer. Possible values include: - PENDING_AGREEMENTS - pending customer agreement consent,- INFO_REQUIRED - customer information is needed for verification,- PENDING - pending customer verification,- VERIFIED - customer has been verified,- REJECTED - verification has been unsuccessful. |
Verification & Next Steps
-
Verification Process
Once created, the customer enters aPENDING_AGREEMENTS
(or similar) state while we wait for required agreements and checks. After that, verification may proceed in aPENDING
state until KYC/KYB is complete. The time to verify can vary from seconds to hours, depending on risk profiles and document completeness. -
Retrieving Customer Status
- GET
/platform/v1/customers/{reference}
to fetch the current status. - Or configure BVNK webhooks to receive updates when a verification result is determined.
- GET
-
Possible Statuses
PENDING_AGREEMENTS
: Awaiting agreement acceptance or further inputs.INFO_REQUIRED
: Customer information is needed for verification.PENDING
: Verification in progress.VERIFIED
: Customer has been verified.REJECTED
: Customer has been rejected during verification. seedetails
for more info.
Updated 1 day ago