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

  1. Create an account with accountType: "Business".
  2. Send its id in the AccountId header.
  3. Save the administrator’s personal information and complete or reuse their Sumsub KYC.
  4. Poll GetAccountStatusQueryV1 and follow the returned BusinessOnboarding* 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

QUERY /accounts/business-onboarding/v1 GetBusinessOnboardingQueryV1
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

PUT /accounts/business-onboarding/step/v1 SaveBusinessOnboardingStepCommandV1

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

StepMain data
AddressesRegistered office and physical operating address.
AccountDetailsLegal name, trade name, legal type, website, email, phone, and description.
TaxAndIndustryTax ids, industry codes, incorporation date, revenue range, and expected monthly payments.
AccountPurposeAccount purpose, source of funds, and customer types served.
AdministratorThe current person’s company role, nationality, birth data, personal tax id, ownership, control, signing authority, and attestation.
RiskAndComplianceDAO, foreign tax, ownership, countries, high-risk activities, money services, and intermediary answers.
DocumentsRequired 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.

QUERY /bridge/business-industry-codes/v1 GetBridgeBusinessIndustryCodeListQueryV1

Use the returned code and display name in a searchable selector.

QUERY /bridge/identification-types/v1 GetBridgeIdentificationTypeListQueryV1

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

POST /accounts/business-onboarding/documents/v1 UploadBusinessDocumentCommandV1
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:

  • BusinessFormation
  • EvidenceOfGoodStanding
  • OwnershipInformation
  • ProofOfAddress
  • FlowOfFunds when conductsMoneyServicesUsingBridge is 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

DELETE /accounts/business-onboarding/documents/v1 DeleteBusinessDocumentCommandV1
{
	"staticFileId": "123e4567-e89b-12d3-a456-426614174001"
}

Submit the business

POST /accounts/business-onboarding/submit/v1 SubmitBusinessOnboardingCommandV1

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 outcomeUnknown is 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.