Skip to main content

Onboarding Service

Manages the business account onboarding lifecycle for the Kulpay Collection API. Businesses must complete onboarding — including providing bank details, tax information, business details, and a person of contact — before they can create collection requests and receive payments.

Get Account

GET /v1/account

Retrieves the current business account details, including onboarding status, validation errors, and all submitted information.

Response:

{
"object": "account",
"id": "acc_mz12345",
"name": "Pagamentos Rapidos Lda",
"status": "active",
"reason": "",
"details": {
"bank_details": {
"nuib": "000100002345678",
"nib": "000100000012345678910",
"account_number": "12345678910",
"bank_name": "BCI - Banco Comercial e de Investimentos",
"account_holder_name": "Pagamentos Rapidos Lda"
},
"person_of_contact": {
"first_name": "Carlos",
"last_name": "Mondlane",
"phone_number": "+258840000000",
"email": "carlos.mondlane@pagamentosrapidos.co.mz"
},
"tax_details": {
"tax_id": "400012345",
"vat_number": "MZ400012345"
},
"business_details": {
"legal_name": "Pagamentos Rapidos Lda",
"short_name": "PagRapidos",
"country": "MZ",
"state_province": "Maputo",
"city": "Maputo",
"line": "Av. 25 de Setembro, Nr. 1230, 3 Andar",
"registration_number": "REG-MZ-2024-00789",
"vat_number": "MZ400012345"
}
},
"errors": [],
"logo": {
"file_id": "file_logo_abc123",
"bucket": "account-logos"
}
}

When the account has validation issues, the errors array contains details:

{
"errors": [
{
"field": "bank_details.nib",
"message": "Invalid NIB format",
"code": "INVALID_FORMAT"
},
{
"field": "business_details.registration_number",
"message": "Registration number not found in registry",
"code": "NOT_FOUND"
}
]
}

Approve Account

POST /v1/accounts/{account_id}/approve

Approves a business account that is pending review. Once approved, the account status transitions to active and the business can begin creating collection requests.

Path Parameters:

ParameterTypeDescription
account_idstringThe unique account identifier

Response:

{
"object": "account",
"id": "acc_mz12345",
"name": "Pagamentos Rapidos Lda",
"status": "active",
"reason": "",
"details": {
"bank_details": {
"nuib": "000100002345678",
"nib": "000100000012345678910",
"account_number": "12345678910",
"bank_name": "BCI - Banco Comercial e de Investimentos",
"account_holder_name": "Pagamentos Rapidos Lda"
},
"person_of_contact": {
"first_name": "Carlos",
"last_name": "Mondlane",
"phone_number": "+258840000000",
"email": "carlos.mondlane@pagamentosrapidos.co.mz"
},
"tax_details": {
"tax_id": "400012345",
"vat_number": "MZ400012345"
},
"business_details": {
"legal_name": "Pagamentos Rapidos Lda",
"short_name": "PagRapidos",
"country": "MZ",
"state_province": "Maputo",
"city": "Maputo",
"line": "Av. 25 de Setembro, Nr. 1230, 3 Andar",
"registration_number": "REG-MZ-2024-00789",
"vat_number": "MZ400012345"
}
},
"errors": [],
"logo": {
"file_id": "file_logo_abc123",
"bucket": "account-logos"
}
}

Reject Account

POST /v1/accounts/{account_id}/reject

Rejects a business account. The reason field in the response will contain the rejection reason.

Path Parameters:

ParameterTypeDescription
account_idstringThe unique account identifier

Response:

{
"object": "account",
"id": "acc_mz67890",
"name": "Comercio Digital Mocambique Lda",
"status": "rejected",
"reason": "Bank details could not be verified with BCI. Please confirm your NIB and account number.",
"details": {
"bank_details": {
"nuib": "000200003456789",
"nib": "000200000098765432100",
"account_number": "98765432100",
"bank_name": "Standard Bank Mozambique",
"account_holder_name": "Comercio Digital Mocambique Lda"
},
"person_of_contact": {
"first_name": "Ana",
"last_name": "Machel",
"phone_number": "+258850000000",
"email": "ana.machel@comerciodigital.co.mz"
},
"tax_details": {
"tax_id": "400098765",
"vat_number": "MZ400098765"
},
"business_details": {
"legal_name": "Comercio Digital Mocambique Lda",
"short_name": "ComDigital",
"country": "MZ",
"state_province": "Maputo",
"city": "Matola",
"line": "Rua da Resistencia, Nr. 45",
"registration_number": "REG-MZ-2023-01456",
"vat_number": "MZ400098765"
}
},
"errors": [
{
"field": "bank_details.nib",
"message": "NIB could not be verified with the issuing bank",
"code": "VERIFICATION_FAILED"
}
],
"logo": {
"file_id": "file_logo_def456",
"bucket": "account-logos"
}
}

Suspend Account

POST /v1/accounts/{account_id}/suspend

Suspends an active business account. Suspended accounts cannot create new collection requests or receive payments until reactivated.

Path Parameters:

ParameterTypeDescription
account_idstringThe unique account identifier

Response:

{
"object": "account",
"id": "acc_mz12345",
"name": "Pagamentos Rapidos Lda",
"status": "suspended",
"reason": "Account suspended due to compliance review. Please contact support.",
"details": {
"bank_details": {
"nuib": "000100002345678",
"nib": "000100000012345678910",
"account_number": "12345678910",
"bank_name": "BCI - Banco Comercial e de Investimentos",
"account_holder_name": "Pagamentos Rapidos Lda"
},
"person_of_contact": {
"first_name": "Carlos",
"last_name": "Mondlane",
"phone_number": "+258840000000",
"email": "carlos.mondlane@pagamentosrapidos.co.mz"
},
"tax_details": {
"tax_id": "400012345",
"vat_number": "MZ400012345"
},
"business_details": {
"legal_name": "Pagamentos Rapidos Lda",
"short_name": "PagRapidos",
"country": "MZ",
"state_province": "Maputo",
"city": "Maputo",
"line": "Av. 25 de Setembro, Nr. 1230, 3 Andar",
"registration_number": "REG-MZ-2024-00789",
"vat_number": "MZ400012345"
}
},
"errors": [],
"logo": {
"file_id": "file_logo_abc123",
"bucket": "account-logos"
}
}

Get Onboarding Status

GET /v1/account/onboarding

Retrieves the current onboarding status for the authenticated business account.

Response:

{
"status": "pending_review",
"reason": ""
}
FieldTypeDescription
statusstringCurrent onboarding status (see Account Status Values)
reasonstringExplanation when status is rejected or suspended; empty otherwise

Get Onboarding Details

GET /v1/account/onboarding/details

Retrieves the full onboarding details submitted by the business, including bank details, person of contact, and business information.

Response:

{
"object": "onboarding",
"bank_details": {
"nuib": "000100002345678",
"nib": "000100000012345678910",
"account_number": "12345678910",
"bank_name": "BCI - Banco Comercial e de Investimentos",
"account_holder_name": "Pagamentos Rapidos Lda"
},
"person_of_contact": {
"first_name": "Carlos",
"last_name": "Mondlane",
"phone_number": "+258840000000",
"email": "carlos.mondlane@pagamentosrapidos.co.mz"
},
"business_details": {
"legal_name": "Pagamentos Rapidos Lda",
"short_name": "PagRapidos",
"country": "MZ",
"state_province": "Maputo",
"city": "Maputo",
"line": "Av. 25 de Setembro, Nr. 1230, 3 Andar",
"registration_number": "REG-MZ-2024-00789",
"vat_number": "MZ400012345"
}
}

Update Onboarding Details

PUT /v1/account/onboarding/details

Updates the onboarding details for the business account. All sections (bank details, person of contact, and business details) must be provided in full.

Request Body:

{
"object": "account",
"bank_details": {
"nuib": "000300004567890",
"nib": "000300000056789012345",
"account_number": "56789012345",
"bank_name": "Millennium BIM",
"account_holder_name": "Solucoes Financeiras Lda"
},
"person_of_contact": {
"first_name": "Joana",
"last_name": "Tembe",
"phone_number": "+258860000000",
"email": "joana.tembe@solucoesfinanceiras.co.mz"
},
"business_details": {
"legal_name": "Solucoes Financeiras Lda",
"short_name": "SolFin",
"country": "MZ",
"state_province": "Maputo",
"city": "Maputo",
"line": "Av. Eduardo Mondlane, Nr. 567",
"registration_number": "REG-MZ-2024-02345",
"vat_number": "MZ400054321"
}
}
FieldTypeRequiredDescription
objectstringYesAlways "account"
bank_detailsobjectYesBank account information (see BankDetails)
person_of_contactobjectYesPrimary contact person (see Contacts)
business_detailsobjectYesBusiness registration and address (see BusinessDetails)

BankDetails Fields:

FieldTypeRequiredDescription
nuibstringYesNumero Unico de Identificacao Bancaria
nibstringYesNumero de Identificacao Bancaria
account_numberstringYesBank account number
bank_namestringYesName of the bank (e.g., BCI, Standard Bank, Millennium BIM)
account_holder_namestringYesLegal name on the bank account

Person of Contact Fields:

FieldTypeRequiredDescription
first_namestringYesContact's first name
last_namestringYesContact's last name
phone_numberstringNoContact phone number in E.164 format
emailstringNoContact email address

Business Details Fields:

FieldTypeRequiredDescription
legal_namestringYesRegistered legal name of the business
short_namestringNoShort or trading name
countrystringYesISO 3166-1 alpha-2 country code (e.g., MZ)
state_provincestringYesState or province (e.g., Maputo, Sofala, Nampula)
citystringNoCity name
linestringNoStreet address line
registration_numberstringYesBusiness registration number
vat_numberstringYesVAT registration number

Response:

{
"object": "onboarding",
"bank_details": {
"nuib": "000300004567890",
"nib": "000300000056789012345",
"account_number": "56789012345",
"bank_name": "Millennium BIM",
"account_holder_name": "Solucoes Financeiras Lda"
},
"person_of_contact": {
"first_name": "Joana",
"last_name": "Tembe",
"phone_number": "+258860000000",
"email": "joana.tembe@solucoesfinanceiras.co.mz"
},
"business_details": {
"legal_name": "Solucoes Financeiras Lda",
"short_name": "SolFin",
"country": "MZ",
"state_province": "Maputo",
"city": "Maputo",
"line": "Av. Eduardo Mondlane, Nr. 567",
"registration_number": "REG-MZ-2024-02345",
"vat_number": "MZ400054321"
}
}

Initialize Onboarding

POST /v1/account/onboarding/initialize

Initializes the onboarding process for a new business account. This must be called before submitting any onboarding details. No request body is required.

Response:

Returns an empty response with HTTP status 200 OK.


Finish Onboarding

POST /v1/account/onboarding/finish

Submits the completed onboarding for review. All required details (bank details, person of contact, and business details) must be provided before calling this endpoint. The account status transitions to pending_review. No request body is required.

Response:

{
"object": "account",
"id": "acc_mz12345",
"name": "Pagamentos Rapidos Lda",
"status": "pending_review",
"reason": "",
"details": {
"bank_details": {
"nuib": "000100002345678",
"nib": "000100000012345678910",
"account_number": "12345678910",
"bank_name": "BCI - Banco Comercial e de Investimentos",
"account_holder_name": "Pagamentos Rapidos Lda"
},
"person_of_contact": {
"first_name": "Carlos",
"last_name": "Mondlane",
"phone_number": "+258840000000",
"email": "carlos.mondlane@pagamentosrapidos.co.mz"
},
"tax_details": {
"tax_id": "400012345",
"vat_number": "MZ400012345"
},
"business_details": {
"legal_name": "Pagamentos Rapidos Lda",
"short_name": "PagRapidos",
"country": "MZ",
"state_province": "Maputo",
"city": "Maputo",
"line": "Av. 25 de Setembro, Nr. 1230, 3 Andar",
"registration_number": "REG-MZ-2024-00789",
"vat_number": "MZ400012345"
}
},
"errors": [],
"logo": {
"file_id": "file_logo_abc123",
"bucket": "account-logos"
}
}

Upload File

POST /v1/files

Uploads a file to the system. Used for uploading account logos, supporting documents, and other files associated with the onboarding process.

Request Body:

FieldTypeRequiredDescription
filebytesYesThe file content to upload
file_typestringYesFile extension (e.g., png, jpg, pdf)

Response:

{
"object": "uploaded_file",
"id": "file_abc12345",
"file_type": "png",
"file_size": 245760,
"file": {
"file_id": "file_abc12345",
"bucket": "account-logos"
}
}
FieldTypeDescription
objectstringAlways "uploaded_file"
idstringUnique file identifier
file_typestringFile extension
file_sizeintegerFile size in bytes
file.file_idstringFile identifier for referencing in other API calls
file.bucketstringStorage bucket where the file is stored

Data Models

Account Status Values

StatusDescription
pendingAccount created, awaiting onboarding completion
pending_reviewOnboarding submitted, awaiting approval
activeAccount approved and operational
rejectedAccount rejected (reason provided in the reason field)
suspendedAccount suspended (reason provided in the reason field)

Validation Errors

When an account has issues that need to be resolved, the errors array in the AccountResponse contains one or more ValidationError objects:

FieldTypeDescription
fieldstringDot-notation path to the invalid field (e.g., bank_details.nib)
messagestringHuman-readable description of the error
codestringMachine-readable error code (e.g., INVALID_FORMAT, NOT_FOUND, VERIFICATION_FAILED)
{
"field": "bank_details.nib",
"message": "Invalid NIB format",
"code": "INVALID_FORMAT"
}

BankDetails

FieldTypeRequiredDescription
nuibstringYesNumero Unico de Identificacao Bancaria
nibstringYesNumero de Identificacao Bancaria
account_numberstringYesBank account number
bank_namestringYesName of the issuing bank (e.g., BCI - Banco Comercial e de Investimentos, Standard Bank Mozambique, Millennium BIM, Absa Mozambique)
account_holder_namestringYesLegal name registered on the bank account

Contacts (Person of Contact)

FieldTypeRequiredDescription
first_namestringYesContact's first name
last_namestringYesContact's last name
phone_numberstringNoPhone number in E.164 format (e.g., +258840000000)
emailstringNoContact email address

TaxDetails

FieldTypeRequiredDescription
tax_idstringYesTax identification number (NUIT)
vat_numberstringYesVAT registration number (e.g., MZ400012345)

BusinessDetails

FieldTypeRequiredDescription
legal_namestringYesRegistered legal name of the business
short_namestringNoShort or trading name
countrystringYesISO 3166-1 alpha-2 country code (e.g., MZ)
state_provincestringYesState or province (e.g., Maputo, Gaza, Sofala, Nampula)
citystringNoCity name (e.g., Maputo, Matola, Beira, Nampula)
linestringNoStreet address line (e.g., Av. 25 de Setembro, Nr. 1230, 3 Andar)
registration_numberstringYesBusiness registration number issued by the registry
vat_numberstringYesVAT registration number