Skip to main content

Goal

Onboard an individual customer to Bastion so they can hold digital assets and use conversions and transfers.

Key entities


Flow overview

The steps needed to onboard and transact an individual customer are:
  1. Create identity
  2. Submit KYC
  3. Track status
    1. (Conditionally required) Identity verification check
  4. Create account
  5. Start transacting

Simulation for sandbox testing

Refer to sandbox testing and simulations for a guide on how to use simulation labels to simulate both the onboarding and IDV checks to facilitate testing.

Prerequisites

  • You have access to your dashboard
  • You’ve created an API key
  • You’ve registered a webhook

Step 1 – create an individual identity

Create an identity in Bastion as soon as your customer signs up or when they first try to use financial features. Request
Response
Store the returned identity_id alongside your internal customer ID for all future calls.
Tip: Use label for a stable, non-PII identifier (e.g., your internal customer ID). Do not include names, emails, or phone numbers.

Step 2 – submit KYC data

Submit KYC information for the identity. Your platform collects this data and sends it to Bastion. Request
Bastion processes KYC asynchronously. It updates the status over time and emits webhook events, or you can poll as described below.

Step 3 – track KYC status

Track KYC status via Typically, most KYC checks are approved within seconds once data is submitted.

Option A: webhooks

Configure a webhook endpoint in the Bastion Dashboard to react to KYC status changes in real time. Event: identity_status_update Example event
Use this event to:
  • Mark the customer as approved or failed in your system
  • Enable or block access to financial features

Option B: polling

Poll the identity endpoint as a fallback.
Response (approved)
Key fields
Only proceed to account creation after status = ACTIVE.

Terminal KYC statuses

A KYC attempt resolves to one of two terminal statuses: Any other status (for example PENDING_ONBOARDING) means the attempt is still in progress. Keep listening for identity_status_update events or continue polling. For the full list of identity statuses, see Identities and accounts.

Step 3a – identity verification

For a subset of identities undergoing KYC, Bastion may require you to run an additional identity verification (IDV) process. When required, Bastion emits the identity_status_update event.
When IDV is required, create a new IDV by using the endpoint /v2/identities/{identity_id}/id_verification. Request
Response
Provide the returned verification_url to the onboarding end user to undergo IDV. Continue polling (or listening to the webhook) for the identity status to turn ACTIVE as the signal for KYC completion.
  • The source of truth for identity status is the identity’s status field: data.identity.status on the identity_status_update webhook, or GET identity. Do not rely on the status of IDV checks.

Step 4 – create an account

Once status is ACTIVE, create an account linked to the identity. Use a unique request_id (UUID) as an idempotency key. Reuse the same request_id on retries to avoid duplicate accounts. Request
Response
Capture the account_id. Use this account for:
  • Checking balances
  • On-ramp and off-ramp conversions
  • Crypto transfers

Step 5 – verify setup

Confirm the customer is fully ready:
  1. Check identity status — GET /v2/identities/{identity_id}
  2. Check account — Verify account_ids includes the new account and account_status = ACTIVE
  3. Check balances (optional) — GET /v2/accounts/{account_id}/balances
Next actions:
  • Top up via on-ramp (USD → stablecoin)
  • Send crypto via /v2/crypto/transfers
  • Withdraw via off-ramp (stablecoin → USD)

Implementation notes