🚀 API change notice: Introducing new identity and account status
TL;DR:Bastion is replacing fragmented compliance fields with a unifiedstatus model for Identities and Accounts, effective immediately, with legacy fields deprecated on July 31, 2026.- New fields:
identity.status,identity.sub_status, andaccount.statusare now the single source of truth for lifecycle state. - New webhook:
identity_status_updatefires on every status transition (onboarding progress, suspensions, reinstatements, terminations) — replacing the oldcompliance_check_status_updateandaccount_freeze_status_update. - Deprecating July 31, 2026:
kyc_status,kyb_status,account.frozen,account.account_status, and the two legacy webhooks above. - Migration: Start consuming the new fields and webhook today. Remove legacy field reads before August 5th, 2026.
⚠️ 1. Deprecation notice
The below fields and webhooks are now marked as deprecated and will be fully sunset on August 5th, 2026.Webhooks:compliance_check_status_updateaccount_freeze_status_update
- Identity:
kyc_statuskyb_status
- Account:
frozenaccount_status
🌟 2. What’s new
Bastion’s new Identity and account status fields expose two capabilities:- Identity and Account statuses are now governed by the new
identity.statusandaccount.statusfields with clear values indicating the current state of the identity and account.- Additional onboarding-step visibility via
sub_status. Previously you had no field that told you which onboarding step was outstanding for an identity — you had to infer it from the absence or shape ofkyc_status/kyb_status. Nowsub_statusreports it directly:IDV_REQUESTED,IDV_IN_PROGRESS,IDV_EXPIRED,RFI_REQUIRED, etc. This is purely additive — there is nothing to migrate from, just a new field to start consuming.
- Additional onboarding-step visibility via
- Lifecycle events fire on every transition. The legacy
compliance_check_status_updatewebhook fired once at onboarding completion; suspensions and reinstatements were silent at the customer boundary. The newidentity_status_updateevent fires on every state and sub-status change, including onboarding progress, compliance suspensions, manual reinstatements, and terminations.
Relevant API guides and endpoints:
- Identities and accounts
- Onboard an individual customer
- Onboard a business customer
- Compliance notifications (v2)
3. Newly introduced fields
identity.status
identity.sub_status
account.status
4. Newly introduced webhooks
There will be a single type of event trigger for compliance notificationsidentity_status_updateEvents: These are sent whenever an identity (and its associated accounts) undergo a change in status. These can happen for various reasons:- During onboarding, compliance checks are initiated for an identity upon receipt of a Submit Compliance Data request. The event will return updates to the status, or if an RFI is required.
- Throughout the customer lifecycle post-onboarding, a change in identity status can occur. E.g., an identity could move from
ACTIVEtoSUSPENDED.
Identity status update events
An exampleidentity_status_update event payload of an identity that has completed onboarding is as follows:Example Event Payload
identity_status_update event payload of an approved identity that has been suspended is as followsExample Event Payload
5. Field-by-field mapping from legacy fields to new fields
On Identity (GET /v2/identities/{id})
On Account (GET /v2/accounts/{id})
Fields that are not going away (don’t migrate these)
6. API examples
GET /v2/identities/{id} — Individual (KYC) example
❌ Old shape
✅ New shape
✅ New shape — mid-onboarding, IDV outstanding
✅ New shape — suspended after compliance review
During the deprecation window, the legacykyc_status/kyb_statusblocks will continue to appear in responses; their*_failure_reasonfields will now be derived from the new identity state (e.g.,"identity is currently suspended") so they stay in sync. Treat them as read-only shadows — do not branch on them.
GET /v2/accounts/{id}
❌ Old shape
✅ New shape
Account.statusis the source of truth.Account.identity_status/Account.identity_sub_statusare convenience mirrors of the parent Identity — handy if you don’t want a second round-trip.
7. Migration guidance
- Today — Add handlers for
identity_status_update. You can keep your existingcompliance_check_status_update/account_freeze_status_updatehandlers in place during this deprecation period. - In your API reads — Switch your “is this identity allowed to transact?” check to:
Switch your “is this account usable?” check to:
- For onboarding UIs — Use
identity.sub_statusto drive your user-facing onboarding step indicator instead of inferring it fromkyc_statuspresence/absence. - For failure messaging — The canonical source will be
identity.status. The legacy*_failure_reasonwill still be supported during the deprecation window. - Before deprecation on August 5th, 2026 — Remove all reads of
kyc_status,kyb_status,frozen, andaccount_status. Stop subscribing tocompliance_check_status_updateandaccount_freeze_status_update.
Questions? Reach out to your Bastion integration contact for assistance.
🚀 Release summary - KYC schema updates
✨ What’s new
KYC schema updates:- New required fields have been added to
/v2/identities/{identity_id}/compliance - The
account_purposeenum values have also been updated - Action required:
- Collect additional required information from end users during onboarding
- Update any code that uses
/v2/identities/{identity_id}/complianceto always include the required fields and enum values
View Submit Compliance Data API →
🚀 Release summary – Account type rename, gas sponsorship, and deposit improvements
TL;DR: We’ve renamed two account type values:If you’re unsure whether a change affects you, we’re happy to walk through your integration with you.LEDGERis nowOMNIBUSandONCHAINis nowSEGREGATED. You’ll need to update your integration before June 24, 2026. On the new features side: gas fees on EVM transfers are now sponsored by Bastion, deposits have a redesigned webhook with Solana support, and we’ve added a Deposit History API. We also shipped a couple of reliability fixes to crypto transfers.
⚠️ Deprecation notice
Account type values renamed:LEDGER → OMNIBUS, ONCHAIN → SEGREGATEDWhat changedThe account_type enum values used when creating and reading accounts via the Accounts API (/v2/accounts) have been renamed to better reflect their meaning:LEDGERis nowOMNIBUS: for pooled, ledger-based custody accountsONCHAINis nowSEGREGATED: for individually isolated, on-chain wallet accounts
LEDGER, ONCHAIN) will be removed on June 24, 2026.Action requiredUpdate any code that sends or parses account_type to use the new values. If you use generated clients, regenerate from the latest schema.✨ What’s new
-
EVM gas sponsorship: Your users can now send on Ethereum, Polygon, Base, and Optimism without ever holding ETH or native gas tokens. Bastion sponsors gas fees automatically across all supported EVM chains, and for most integrations, it costs you nothing. Every API customer gets $100 in gas credits, and you’re only billed if you exceed that.
Already using the Crypto Transfers API on EVM chains? You’re basically done. If you’re calling
/v2/crypto/transfers, gas sponsorship is enabled automatically, no new integration work needed. Just set yourdestination_chainto any supported EVM chain (ETHEREUM_MAINNET,POLYGON_MAINNET,BASE_MAINNET,OPTIMISM_MAINNET) and we handle the rest. -
New
deposit_v2webhook event: We’ve redesigned the wallet deposit notification webhook with a cleaner payload structure, and it now supports Solana in addition to EVM chains. Key changes:- Solana support: Deposit webhooks now fire for SOL and SPL token deposits on Solana wallets. If you already handle deposit webhooks, you’ll automatically start receiving them for Solana.
- New
source_typefield:ON_CHAINfor external chain deposits,ACCOUNTfor internal P2P transfers received by the destination account - New
dedup_keyfield for idempotent event handling - Consistent
snake_casefield naming throughout View Webhooks reference →
deposit_v2 payload:- Deposit history API: Two new endpoints are available for querying deposit history:
GET /v2/crypto/deposits: paginated list of deposits, filterable by chain, currency, and time range.GET /v2/crypto/deposits/{deposit_id}: fetch a single deposit by ID. Deposits are persisted as they flow through the system going forward.
⚡ Improvements
- EVM gas estimation: Fixed gas estimation logic that was causing premature transaction cancellations on EVM chains.
-
Confirmation timeout extended from 1 min to 5 min: Applies to the Crypto Transfers API (
/v2/crypto/transfers). Provides a wider window for transactions to confirm before auto-cancellation. -
Gov ID upload removed from KYC flow: KYC submissions via the Submit Compliance Data API no longer require gov ID images, reducing the integration surface for identity verification.
gov_id_image_frontandgov_id_image_backhave been removed from the KYC submission payload.- KYB is not affected.
-
Crypto Transfers (v2): Structured destination format: The Crypto Transfers API (
/v2/crypto/transfers) now accepts a structuredaddress_destinationobject ({ "address", "chain" }) as an alternative to the existingdestination_address+destination_chainfields. Both formats remain supported; new integrations should preferaddress_destination.📘 Learn more
Find deeper documentation and technical details on each endpoint:
🚀 Release summary - Solana gas sponsorship
Your users can now send on Solana without ever touching SOL. Bastion sponsors gas fees automatically, and for most integrations, it costs you nothing. Every API customer gets $100 in gas credits, and you’re only billed if you exceed that. This is the first chain in our gas sponsorship rollout.Already using the Crypto Transfers API with Solana? You’re basically done. If you’re calling/v2/crypto/transfers, just set destination_chain: SOLANA_MAINNET — no new integration work needed.For deeper technical details, check out Submit Cryptocurrency Transfers.🚀 Release summary - API enhancements and reliability improvements
TL;DR: KYC/KYB ID requirement change, Faster identity-based queries, and more reliable webhook delivery.
⚠️ Breaking change
Back of ID requirement for KYC and KYB (effective immediately)
SummarySubmit Compliance Data API now conditionally requires the back of the ID depending on the document type.What changed- KYC (individuals) and KYB (Beneficial Owners) will now require back of the ID depending on the document type
Impact
- Requests that omit required fields now fail validation.
- Update payloads and mappings to always include the required fields.
- When Submitting Compliance Data with ID type = DOCUMENT_TYPE_DRIVER_LICENSE, DOCUMENT_TYPE_NATIONAL_ID or DOCUMENT_TYPE_RESIDENCE_PERMIT document type, include gov_id_image_back (same format as gov_id_image_front).
✨ What’s new
Identity-based transfer queries — The List Cryptocurrency Transfers API now supports querying byidentity_Id, returning all transfers across an identity’s accounts in a single call—no more iterating through each account separately.Identity filtering on ListAccounts — The List Accounts endpoint now accepts an optional identity_Id parameter to retrieve only accounts belonging to a specific identity.⚡ Improvements
- Webhook notification retries — Failed webhook deliveries are now automatically retried with persistent tracking, improving reliability for event-driven integrations.
-
Consistent error responses —
GET /v2/transaction-limits/policies/{id}now returns404when a policy isn’t found (previously500). Conversion lookups follow the same pattern. Unsupported HTTP methods now properly return405.
🧰 Fixes
- Corrected gRPC message size limits for document downloads, preventing failures when processing larger identity verification images.
🚀 Release summary – API and platform contract updates
TL;DR: This release includes several breaking changes that may require updates to your integration:- KYC/KYB schema enforcement (effective immediately)
- JSON fields standardized to
snake_case(transition period until March 6, 2026) - Banking payment instruction payload flattened
- Stablecoin endpoint renamed from
/stablecoins/transfersto/conversions(old path no longer supported)
⚠️ Breaking changes
1. KYC/KYB schema enforcement (effective immediately)
What changed- KYC/KYB submissions must now include a front image of government ID and region code on all addresses.
- Legacy
kycLevelandkybLevelfields have been removed from the schema.
- Requests that omit required fields or send removed fields now fail validation.
- Update payloads and mappings to always include the required fields.
- Stop referencing
kycLevelandkybLevelanywhere in your integration.
2. JSON field standardization to snake_case
What changed- All JSON field names are now standardized to
snake_case(for example,identity_type,request_id,account_type) to align with Protocol Buffers.
- Now – March 6, 2026: Both
camelCaseandsnake_casefield names are accepted. - After March 6, 2026: Only
snake_casefield names are accepted.
- Requests using
camelCasefield names (for example,identityType,requestId,kycStatus) after March 6, 2026 will fail validation. - Responses now return field names in
snake_case.
- Update all request and response handling to use
snake_case. - Common examples:
identityType→identity_typerequestId→request_idaccountType→account_typekycStatus→kyc_statusfiatOperationsEnabled→fiat_operations_enabled
- If you use generated clients, regenerate from the latest schema.
3. Banking payment instruction payload flattening
What changed- Banking payment instruction JSON has been flattened; fields previously nested under
payment_instructionsare now top-level.
- Code that builds or parses the old nested
payment_instructionsobject will break.
- Update request builders and response parsers to use the flattened structure.
- Regenerate clients from the latest schema if you use codegen.
4. On-/off-ramp endpoint rename (/stablecoins/transfers → /conversions)
What changed- The on-/off-ramp endpoint path has been renamed to
/conversionsto align with the unified Conversion lifecycle.
- Requests to
/stablecoins/transfersnow fail./conversionsis the required path going forward.
- Update all integrations to call
/conversions. - If relevant, rename any internal references from “stablecoin transfers” to “conversions”.
- We can help confirm that all traffic is on
/conversions.
✨ What’s new
1. Increased API key limits
- API key limit increased to 50 keys per workspace, making it easier to use per-service / per-environment keys, rotate keys more frequently, and separate vendor access. No changes are required for existing keys.
2. Enhanced CryptoTransfer lifecycle
What changed- Crypto transfers now expose a richer lifecycle with more detailed statuses and events.
ACCEPTED– Validated, awaiting submission.SUBMITTED– Submitted on-chain, waiting for confirmations.CONFIRMED– Confirmed on-chain (terminal success).FAILED– Failed (terminal; seefailure_details).DROPPED– Dropped (terminal).
submittedevent when a transfer is first accepted and submitted.- Additional reconciliation events during confirmation.
- Clearer
failedevents withfailure_details.
- Any code that maps statuses or consumes webhooks may see new values and events.
- Ensure status mappings and webhook handlers cover all enum values and new events.
⚡ Improvements
- HTTP semantics: Create operations now return
201 Createdinstead of200 OK. If you assert on exact status codes, update checks to accept201. - Read performance: Read queries now route to read replicas for better performance. For strict write-then-read flows, consider a small retry or delay to handle occasional replication lag.
📘 Learn more
Find deeper documentation and technical details on each endpoint:- Submit Compliance Data
- Create Payment Instructions
- Submit Stablecoin Conversion
- Submit Cryptocurrency Transfers
🚀 Release summary - v2 cryptocurrency transfers
TL;DR: Introducing an upgraded asynchronous cryptocurrency transfer API with parallel transaction support, built-in idempotency, and enhanced status tracking across supported blockchain networks.✨ What’s new
The V2 Cryptocurrency Transfers API delivers a non-blocking, asynchronous architecture that enables faster integrations and supports concurrent transaction submissions - a significant improvement over our previous sequential processing model.Asynchronous transfer submission
The new submit endpoint returns immediately after accepting your request, allowing your application to continue processing without waiting for blockchain confirmation. Transfers proceed through multiple stages - asset pricing checks, compliance verification, and blockchain confirmation - while you poll for status updates at your convenience via the GET endpoint. This separation makes GET the authoritative place to retrieve transfer status. And soon, we’ll be introducing webhook-based status notifications so you can receive updates automatically without polling.Submit Request:Parallel transaction support
For EVM-based chains, you can now submit multiple cryptocurrency transfers concurrently without worrying about transaction ordering. We handle EVM nonce serialization internally, ensuring all parallel submissions are processed correctly and confirmed on-chain in the proper sequence.Non-EVM chains already support parallel transaction submission by design, so this improvement primarily benefits EVM transfers.Built-in idempotency
Every request requires a uniquerequestId (UUID) that serves as an idempotency key. If you submit the same requestId multiple times (whether due to network retries or concurrent submission bugs), we return the existing transferId, guaranteeing that only one transfer is ever created. Otherwise, if the transfer was already processed, repeated submissions return a 409 Conflict - DUPLICATE_TRANSACTION error.📘 Learn more
Find deeper documentation and technical details on each endpoint:- Submit Cryptocurrency Transfer →
- Get Cryptocurrency Transfer →
- List Cryptocurrency Transfers →
- Supported Assets →
🚀 Release summary - Tx limits and request signing
TL;DR: Introducing secure request signing, compliance‑gated account creation, and new transaction limits to keep your platform interactions safe and reliable.✨ What’s new
Request signing, improved onboarding compliance, and new transaction limits deliver more secure and controlled API usage without disrupting existing integrations.- Request signing — You can now submit a public key to Bastion and use it to sign API requests. When an API key is paired with a public key, every call must include a signature to authenticate successfully. This feature is available in both Sandbox and Production environments.
- Account creation changes — New accounts can only be created after completing successful compliance checks. This ensures all new users meet our security and regulatory standards before onboarding.
-
Transaction limits — Cryptocurrency transfer transaction limits are now optionally configurable to enhance security and help mitigate fraud.

📘 Learn more
Find deeper documentation and technical details on each feature here:- Request Signing - Overview →
- Request Signing - JWT Example →
- Account Creation Flow →
- Transaction Limits Docs →
Released: October 8, 2025 Author: Bastion Platform Team