Business onboarding
Business onboarding collects company data in Kunga and submits it through the API. The company administrator completes normal Sumsub KYC as a physical person. Sumsub KYB and provider-hosted KYC are not part of this flow.
Save every section separately. This lets the user continue on another device and lets the API return them to one specific section when information must be corrected.
Before starting
- Create an account with
accountType: "Business". - Send its id in the
AccountIdheader. - Save the administrator’s personal information and complete or reuse their Sumsub KYC.
- Poll
GetAccountStatusQueryV1and follow the returnedBusinessOnboarding*status.
The administrator is the current physical person opening the account. Company names, tax ids, and company addresses belong in the business onboarding object, not in the person’s legal-name fields.
Load the saved draft
/accounts/business-onboarding/v1 curl https://api-preview.bridflow.com/accounts/business-onboarding/v1 --request QUERY --header 'Content-Type: application/json' --header 'Authorization: Basic <BASE64(uuid:password)>' --header 'AccountId: 123e4567-e89b-12d3-a456-426614174000' --data '{}' The response returns:
business: the complete saved draft.completedSteps: sections that already passed backend validation.documents: uploaded documents and their purposes.requiredDocumentPurposes: the documents still required for this submission or correction.hasRequiredDocuments: whether all current requirements are satisfied.isSubmitted: whether the business has been submitted.administratorFullName: the verified person responsible for the account.
Always load this draft before editing. It is the server copy and may contain progress saved from another device.
Save one section
/accounts/business-onboarding/step/v1 Send the full business draft together with the section being completed. The API validates that section and preserves the complete draft.
{
"step": "AccountDetails",
"business": {
"businessLegalName": "Example Company S.L.",
"businessTradeName": "Example Company",
"businessDescription": "Software services for European businesses.",
"businessEmail": "[email protected]",
"businessPhone": "+34910000000",
"businessType": "Llc",
"primaryWebsite": "https://example.com",
"registeredAddress": {
"streetLine1": "Example Street 10",
"streetLine2": null,
"city": "Madrid",
"stateName": "Madrid",
"stateCode": "MD",
"countryName": "Spain",
"countryCode": "ESP",
"postalCode": "28001"
},
"physicalAddress": {
"streetLine1": "Example Street 10",
"streetLine2": null,
"city": "Madrid",
"stateName": "Madrid",
"stateCode": "MD",
"countryName": "Spain",
"countryCode": "ESP",
"postalCode": "28001"
},
"taxIdentifications": [
{
"type": "cif",
"number": "B12345678",
"issuingCountry": "ESP",
"description": null
}
],
"businessIndustryCodes": ["541511"],
"incorporationDate": "2021-04-12",
"estimatedAnnualRevenueUsd": "From100000To999999",
"expectedMonthlyPaymentsUsd": 25000,
"accountPurpose": "ReceivePaymentsForGoodsAndServices",
"sourceOfFunds": "SalesOfGoodsAndServices",
"sourceOfFundsDescription": "Revenue from software subscriptions.",
"customerTypesServed": "Businesses",
"isDao": false,
"hasForeignTaxRegistration": false,
"hasMaterialIntermediaryOwnership": false,
"operatesInProhibitedCountries": false,
"highRiskActivities": ["NoneOfTheAbove"],
"conductsMoneyServices": false,
"conductsMoneyServicesUsingBridge": false,
"actingAsIntermediary": false,
"administrator": {
"title": "Chief Executive Officer",
"nationalities": ["ESP"],
"countryOfBirth": "ESP",
"cityOfBirth": "Madrid",
"personalTaxIdentification": {
"type": "dni",
"number": "12345678Z",
"issuingCountry": "ESP",
"description": null
},
"hasOwnership": true,
"ownershipPercentage": 50,
"hasControl": true,
"isSigner": true,
"isDirector": true,
"relationshipEstablishedAt": "2021-04-12",
"attestsOwnershipStructure": true
}
}
} The example shows the complete object shape, but catalogue values such as cif, dni, and 541511 are only examples. Use the current values returned by the catalogue endpoints. Start from the business object returned by the query instead of constructing an empty object.
Expected response:
{
"updatedAt": "2026-08-06T10:00:00Z",
"completedStep": "AccountDetails",
"nextStep": "Addresses",
"isComplete": false,
"accountCreationStatus": "BusinessOnboardingTaxAndIndustry"
} Section order
| Step | Main data |
|---|---|
Addresses | Registered office and physical operating address. |
AccountDetails | Legal name, trade name, legal type, website, email, phone, and description. |
TaxAndIndustry | Tax ids, industry codes, incorporation date, revenue range, and expected monthly payments. |
AccountPurpose | Account purpose, source of funds, and customer types served. |
Administrator | The current person’s company role, nationality, birth data, personal tax id, ownership, control, signing authority, and attestation. |
RiskAndCompliance | DAO, foreign tax, ownership, countries, high-risk activities, money services, and intermediary answers. |
Documents | Required company documents. |
The response nextStep is authoritative. Do not infer the next screen only from the enum order.
Use the dynamic catalogs
Do not hardcode industry codes or identification types.
/bridge/business-industry-codes/v1 Use the returned code and display name in a searchable selector.
/bridge/identification-types/v1 Filter identification types by:
{
"ownerType": "Business",
"issuingCountry": "ESP",
"businessType": "Llc"
} For the administrator’s personal tax id, use ownerType: "Individual". Honor requiresDescription when the selected type asks for extra detail. Country and nationality values use ISO 3166-1 alpha-3 codes.
Upload documents by purpose
/accounts/business-onboarding/documents/v1 curl 'https://api-preview.bridflow.com/accounts/business-onboarding/documents/v1?purpose=BusinessFormation' --request POST --header 'Authorization: Basic <BASE64(uuid:password)>' --header 'AccountId: 123e4567-e89b-12d3-a456-426614174000' --form '[email protected]' Accepted files are PDF, PNG, and JPEG, with a maximum API size of 24 MB. A 22 MB client limit is recommended. Uploading a new file for the same purpose replaces the previous file.
The base requirements are:
BusinessFormationEvidenceOfGoodStandingOwnershipInformationProofOfAddressFlowOfFundswhenconductsMoneyServicesUsingBridgeis true
The API may later request a more specific purpose, including ProofOfNatureOfBusiness, ProofOfSignatoryAuthority, ProofOfSourceOfFunds, ProofOfTaxIdentification, DirectorsRegistry, or ShareholderRegister.
When a correction is requested, read requiredDocumentPurposes again and upload only the missing or rejected purposes. Keep documents that were already accepted.
Delete a document
/accounts/business-onboarding/documents/v1 {
"staticFileId": "123e4567-e89b-12d3-a456-426614174001"
} Submit the business
/accounts/business-onboarding/submit/v1 The endpoint has no body. It validates the saved draft and documents, then submits the business.
{
"bridgeCustomerId": "21478384-b81f-4118-965a-9a6e08380606",
"outcomeUnknown": false,
"bridgeStatus": "under_review"
} After submission, poll GetAccountStatusQueryV1.
- If the status is under review, wait. Do not create another customer.
- If
outcomeUnknownis true, the request timed out after submission and the result is not known. Keep polling rather than resubmitting with a new identity. - If the account returns to a business step, load the draft and
requiredDocumentPurposes, then ask only for the section or documents that need correction.