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 user are:
- Create identity
- Submit KYC
- Track status
- (Conditionally required) Identity verification check
- Create account
- 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
KYC is processed asynchronously. Bastion will update status over time and emit 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.
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
Capture the account_id. This account is used for:
- Checking balances
- On-ramp and off-ramp conversions
- Crypto transfers
Step 5 – verify setup
Confirm the customer is fully ready:
- Check identity status —
GET /v2/identities/{identity_id}
- Check account — Verify
account_ids includes the new account and account_status= ACTIVE
- 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