Skip to main content
Before processing payments, customers must complete KYB (Know Your Business) onboarding. This guide explains how to integrate Dakota Platform’s onboarding flow.
Looking for detailed onboarding guides? Check out our support articles for step-by-step walkthroughs:

Overview

The onboarding process involves:
  1. Creating a customer record (KYB automatically initiated)
  2. Redirecting customer to complete verification
  3. Monitoring KYB status via API or webhooks

Step 1: Create a Customer

First, create a customer record with basic business information.

Customer Creation Fields

Request Example

cURL
JavaScript
Python
Go
Rust
Java
Response:

Step 2: Application Process (Automatic)

An onboarding application is automatically created when you create a customer. The response includes an application_url that you can use to redirect your customer to Dakota’s hosted onboarding form.

Automatic Application Creation

When you create a customer, the system automatically:
  • Creates an onboarding application
  • Generates a secure application_url with an embedded token
  • Sets the initial application status to "pending"

Response Fields

The customer creation response includes:

Using the Application URL

From the customer creation response, extract the onboarding URL:
Re-fetching the application token. The application_url (and its embedded token) can be re-read any time with GET /customers/{customer_id} — you don’t need to store it, and nothing rotates the link while the application is still pending. The link remains valid for 90 days after creation. (An approved customer whose token has expired is a separate case — see Do not use re-engagement to resume a pending application.) The token may be used server-side (backend-to-backend); a browser handoff is not required, so you can drive the application entirely over the API with the X-Application-Token header, or redirect the customer to the hosted application_url — whichever suits your flow.

Step 3: Handle the Onboarding Flow

Direct your customer to the application_url to complete verification using Dakota’s hosted onboarding form. The customer will:
  1. Provide business information and documentation
  2. Add beneficial owners and control persons
  3. Upload required documents (ID, proof of address, etc.)
  4. Accept legal agreements (Terms of Service, Privacy Policy, etc.)
  5. Submit the application for review
  6. Receive approval or requests for additional information

Check readiness before submitting

Rather than parsing submission errors, read the machine-readable readiness state at any time with GET /applications/{application_id}?include=validation (or include=all). The validation object reports a top-level ready flag plus, per entity, details.missing_fields and documents.missing_documents. Submit once ready is true.

If the customer abandons the form

A customer who leaves the form part-way through resumes by reopening the original application_url. Store that URL when you create the customer, and hand the same URL back to the customer to resume. The link stays valid for 90 days from creation, and nothing in the flow consumes it early:
  • Closing the tab does not invalidate the link.
  • Submitting the application does not invalidate the link.
  • The customer can reopen the link as many times as they need until it expires.

Do not use re-engagement to resume a pending application

POST /customers/{customer_id}/re-engagement serves a different case: it mints a fresh token for an approved customer whose original token has expired — for example, to re-drive them through a new partner disclosure. It never changes the application’s compliance status or decision. Re-engagement returns 409 Conflict for a customer with no approved application, which includes every customer still in onboarding. This is deliberate: a pending customer already holds a valid link, so the endpoint refuses rather than silently rotate it.

Proof of Address for Individual Customers

For individual customer onboarding, Proof of Address (PoA) is not strictly required to complete onboarding. An individual can submit identity documents alone and reach application_status: submitted without uploading PoA. However, PoA is required for a customer to transact more than $3,000 in any rolling 7-day window. Customers who cross that threshold without an approved PoA on file are frozen — inbound transactions over the limit are held in compliance review until they provide one. Encourage customers to upload PoA at onboarding when possible; the field is presented with a note explaining the threshold rather than as a low-priority optional step.

PoA State

The application-level poa_status field on GET /applications/{id} exposes the current review state for individual customers:

Three Ways to Submit PoA After Onboarding

If a customer didn’t upload PoA at onboarding but later needs to:
  1. Client API call. Use the standard document-upload endpoint:
    Document type can be proof_of_address, bank_statement, or utility_bill — all three are accepted as PoA-equivalent.
  2. Customer self-serve via the original onboarding link. The link returned in application_url remains valid for 90 days after creation. When a previously-approved individual reopens it, the form locks every already-approved field and exposes only the PoA upload, so the customer can submit a PoA without re-attesting or re-entering personal data.
  3. Compliance manual upload. A reviewer with the compliance_documents:manage permission can upload PoA on the customer’s behalf from the compliance dashboard.
Any of these paths transitions the application from completed to compliance_review (or to submitted_pending_review at the PoA level if the app hasn’t yet been decided) and emits a customer.kyb_status.updated webhook with reason_code: pending_proof_of_address. Once compliance reviews, the customer receives a follow-up event with reason_code: proof_of_address_approved or proof_of_address_rejected. See State lifecycles → Proof of Address State for the full set of transitions, and Webhooks → Customer Events for the corresponding event payloads.
Compliance requirement: Before an application can be submitted, your customer must accept Dakota’s legal agreements. If you are building a custom onboarding flow using the API (rather than the hosted form), you are responsible for presenting these documents to your end users and collecting their consent before submitting attestations.
During onboarding, the following legal agreements must be presented and accepted:

Submitting Attestations via API

If you are using the API to build a custom onboarding experience, you must submit attestations using the Submit Attestation endpoint. The e_sign attestation must be submitted first — all other attestations will be rejected until e-sign consent is recorded.
cURL
JavaScript
Python
  • The timestamp is the Unix epoch time (in seconds) when the user accepted the agreement.
  • The applicant_id is the individual making the attestation. For business applications, this must be a control person. For individual applications, this must be the individual themselves.
  • Each attestation’s timestamp must be strictly after the e_sign attestation timestamp — equal timestamps will be rejected.
  • All 6 attestation types are required before an application can be submitted.

Checking Missing Attestations

You can check which attestations are still needed by retrieving the application with the validation include parameter:
The response validation.attestations field shows completed and missing attestations:
Using the hosted onboarding form? If you redirect customers to the application_url, Dakota’s hosted form handles presenting all legal agreements and collecting attestations automatically. You only need to manage attestations manually if you are building a custom onboarding UI.

Step 4: Monitor Application Status

Check onboarding status programmatically:
cURL
JavaScript
Python
Go
Rust
Java
Response:

KYB Status Values

The kyb_status field indicates the customer’s verification status: kyb_status is the authoritative gate for money movement. No recipients, destinations, accounts, or transactions can be created for a customer until kyb_status is active. The same GET /customers/{customer_id} response also carries two other status fields. Use each one for a different question: application_status and kyb_status update independently. When compliance moves an application to request_for_information, only application_status changes. kyb_status stays on its previous value and Dakota does not fire a webhook for that transition. To surface RFI state, poll GET /applications/{application_id} and read application_status. See Application status changes that do not emit a webhook. You can also check the application status directly via the Get Application endpoint for more detailed status information.

Best Practices

User Experience

  • Clearly communicate the onboarding requirements
  • Provide progress indicators
  • Set expectations for processing time
  • Offer support contact information

Error Handling

  • Handle rejection gracefully
  • Provide clear next steps
  • Allow customers to restart if needed
  • Log all onboarding events

Compliance

  • Present all required legal agreements (ToS, Privacy Policy, etc.) to end users before collecting attestations
  • Record the exact timestamp when each agreement was accepted
  • Store audit trails
  • Monitor for suspicious activity
  • Keep records for compliance reporting
  • Regular review of rejected applications

Required Documents

Typical documents required for business verification:
  • Certificate of Incorporation
  • Bank Statements
  • Director/Officer Identification
  • Beneficial Ownership Information

Troubleshooting

Common Issues

Onboarding Stuck in “Pending”
  • Check if customer has accessed the onboarding URL
Repeated Rejections
  • Ensure document quality meets requirements
  • Consider manual review process
Webhook Not Received
  • Verify webhook endpoint is responding with 200
  • Check webhook signature validation
  • Review webhook logs in dashboard
Any issues not covered here can be addressed by contacting Dakota Platform support.

Next Steps

After successful customer onboarding:
  1. Set up Recipients & Destinations - Configure payment targets
  2. Create Transactions - Process payments for approved customers
  3. Webhook Integration - Get real-time KYB status updates (see the full event list for all available events)
  4. Testing - Test your onboarding flow

API Reference

For detailed endpoint documentation, see: