Create a Customer via API

The endpoint described here enable you to create company or individual customers.

Once a customer is created, we initiate verification. You can then retrieve the customer object or listen to webhooks to track the status change from PENDING_AGREEMENTS to VERIFIED or REJECTED.

How Embedded Partner Customer creation works

Embedded Wallets allow Embedded Partners (EP) to offer seamless payment and fund management capabilities directly within their platform while maintaining their branding. This guide provides a step-by-step process to create Embedded Partner Customer (EPC) accounts utilising Embedded Wallets via the BVNK Portal.

This product is available to businesses and individuals based in the US, EEA and other countries supported by BVNK outside of these regions.

EPC State transition diagram

The creation and verification lifecycle of an EPC follows a series of states—Pending Agreements, Info Required, Pending, Verified, and Rejected—which are illustrated and explained in this section.

Understanding these states (and how an EPC transitions between them) is key to a smooth onboarding process.

  1. Pending Agreements
    • The EPC has been created but must consent to BVNK’s Terms of Service.
    • An agreements link is generated and must be shared with the EPC to collect consent.
  2. Info Required
    • After Terms are signed, BVNK requires additional verification information (KYB/KYC).
    • A verification link is provided for the EP to provide their Customer's (EPC) data and documents.
  3. Pending
    • Once verification flow is submitted, BVNK performs compliance checks.
    • During this time, you can monitor the EPC’s status in the portal.
  4. Verified
    • The EPC has successfully passed the compliance review.
    • Wallets can now be created and used.
  5. Rejected
    • The EPC has failed compliance checks or provided invalid information.
    • The flow halts unless additional data is requested and submitted for reconsideration.

📘

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.


Prerequisites

  • Collect and validate customer data (IDs, address proofs, and so on) before creating the customer. This is crucial for a smooth KYC/KYB flow.
  • Remember to obtain the verified reference from the signed agreement session and include it in the request payload as the signedAgreementSessionReference field. This ensures the agreements are properly linked and recognized in your new customer creation and onboarding.

Create customer

Select a type of customer you want to create:

Use this endpoint to create a business or company EPC. You can associate multiple beneficial owners, controlling persons, and signers (often referred to collectively as “associates”).

To create a business EPC, send the POST /customers request with the following request body:

{
    "type": "COMPANY",
    "company": {
        "name": "The Walt company",
        "description": "Entertainment Business",
        "entityType": "CORPORATION",
        "taxResidenceCountryCode": "US",
        "registrationNumber": "123456789",
        "industryReference": "30ea5818-06d8-11ef-b6e1-027612b7f6b5",
        "monthlyExpectedVolumesReference": "ef779c41-547e-11ef-8b9c-027612b7f6b5",
        "address": {
            "addressLine1": "Waterloo Bridge 13",
            "city": "London",
            "postalCode": "12345",
            "countryCode": "US"
        },
        "associates": [
            {
                "person": {
                    "firstName": "Donald",
                    "lastName": "Duck",
                    "dateOfBirth": "1908-11-29",
                    "nationality": "US",
                    "address": {
                        "addressLine1": "1313 Webfoot Street",
                        "city": "Duckburg",
                        "postalCode": "12345",
                        "stateCode": "CA",
                        "countryCode": "US"
                    },
                    "contactInfo": {
                        "emailAddress": "[email protected]"
                    },
                    "taxIdentification": {
                        "number": "384-37-3429",
                        "taxResidenceCountryCode": "US"
                    }
                },
                "titles": [
                    "BUSINESS_OWNER",
                    "DIRECTOR"
                ]
            }
        ]
    },
    "riskScore": "LOW",
    "signedAgreementSessionReference": "f6541903-a0b4-4da3-99eb-f36608a6e857"
}

Request Body Parameters

AttributeRequiredDescription
typeYesThe type of customer. COMPANY indicates a business.
companyYesContains details of the company.
company.nameYesThe legal name of the company.
company.descriptionNoOptional description or short bio of the company.
company.entityTypeYesBusiness entity type. Possible values: LIMITED_LIABILITY_COMPANY, PUBLICLY_LISTED_COMPANY, SOLE_PROPRIETOR, PARTNERSHIP, CORPORATION, TRUST, PRIVATE_FOUNDATION, CHARITY, NON_PROFIT_ORGANIZATION, PUBLIC_AGENCIES_OR_AUTHORITIES
company.taxResidenceCountryCodeYesThe country code for the company’s tax residence.
company.registrationNumberYesThe official company registration or identifier.
company.industryReferenceYesIndustry reference. Get list here
company.monthlyExpectedVolumesReferenceYesMonthly expected volumes reference. Get the list here .
company.addressYesAddress details of the company.
company.address.addressLine1YesThe first line of the company’s street address.
company.address.addressLine2NoOptional second line.
company.address.postalCodeYesThe postal/ZIP code for the company’s address.
company.address.cityYesThe city for the company’s address.
company.address.stateCodeNoThe state of the company’s address (U.S. only).
company.address.countryCodeYesThe country for the company’s address.
company.associatesNoA list of individuals (UBOs, directors, signers) associated with the business.
company.associates.personYes (per associate)Personal details for the associate.
company.associates.person.firstNameYesThe given/first name.
company.associates.person.lastNameYesThe family/last name.
company.associates.person.dateOfBirthYesYYYY-MM-DD format.
company.associates.person.nationalityYesISO-2 country code.
company.associates.person.addressYesAddress details of the associate.
company.associates.person.address.addressLine1YesThe first line of the street address.
company.associates.person.address.addressLine2NoOptional second line
company.associates.person.address.cityYesThe city of the associate’s address.
company.associates.person.address.postalCodeYesThe postal/ZIP code.
company.associates.person.address.countryCodeYesISO-2 country code.
company.associates.person.contactInfoYesOptional contact info.
company.associates.person.contactInfo.emailAddressYesEmail address.
company.associates.person.taxIdentificationYesTax Identification details
company.associates.person.taxIdentification.numberYesSSN/ITIN for US, Tax number for Rest of the world
company.associates.person.taxIdentification.taxResidenceCountryCodeYesISO-2 code of the associate’s tax residence.
company.associates.titlesYesJob title or position. Possible values BUSINESS_OWNER, ACCOUNT_REPRESENTATIVE, DIRECTOR
signedAgreementSessionReferenceYesReference to an e-sign or terms acceptance session.
riskScoreYesOverall risk rating of the Company, e.g. LOW, MEDIUM, HIGH

In the successful response you receive a unique customer reference CustomerReference for tracking the verification status.

{
  "reference": "b0ef182b-202d-4365-b69d-98dcb225fd62",
  "status": "INFO_REQUIRED",
  "infoRequired": {
      "questionnaireCodes": ["financialServicesQuestionnaireFull"]
  }
}
{
  "code": "ACCOUNTS-2000",
  "status": "BAD_REQUEST",
  "message": "Invalid request",
  "details": {
    "errors": {
      "industryReference": [
        "Industry with reference: 56e65ebc-06fa-11ef-bbf8-02d3d923cf2b does not exist"
      ]
    }
  }
}
AttributeTypeDescription
referencestringA unique identifier for the customer.
statusstringThe current status of the customer. Possible values include:
PENDING_AGREEMENTS – pending customer agreement consent
INFO_REQUIRED – customer information is needed for verification. Note that in this case the code for a related questionnaire is sent. For more information, see Retrieve Compliance Data
PENDING – pending customer verification
VERIFIED – customer has been verified
REJECTED – verification has been unsuccessful.

What’s Next

After a Customer is created, make sure to upload their verification documents.