# Authentication Source: https://docs.onboard.xyz/api-reference/authentication ## Overview Every request to the Onboard Business API must include your API key and an HMAC-SHA256 request signature — there is no unsigned tier. Send requests to the base URL for your environment — see [Base URLs](/api-reference/base-urls). ```http theme={null} x-api-key: ``` API keys used to call cash payment or crypto transfer endpoints must have IP whitelisting configured in the [Business Dashboard](https://business.onboard.xyz). Requests from an unlisted IP are rejected. See [Getting API Credentials](/guides/api-concepts/api-credentials). ## Signing a request Required headers for signed requests: | Header | Description | | ------------- | --------------------------------------------------------- | | `x-api-key` | Your API key, from the Business Dashboard | | `x-signature` | HMAC-SHA256 signature of the request | | `x-timestamp` | Unix timestamp (seconds) when the signature was generated | The signature is computed over the timestamp and the exact JSON body you send, joined with `&`: ```javascript theme={null} const crypto = require('crypto'); const timestamp = Math.ceil(Date.now() / 1000); const apiSecret = ''; // from the Business Dashboard const requestBody = { /* the exact JSON body of your request; {} for GET requests */ }; const signaturePayload = `t=${timestamp}&${JSON.stringify(requestBody)}`; const signature = crypto .createHmac('sha256', apiSecret) .update(signaturePayload) .digest('hex'); ``` Include the computed values in your request headers: ```http theme={null} x-api-key: x-signature: x-timestamp: ``` Your timestamp must be within **30 seconds** of the current time — if requests are unexpectedly rejected, check for clock drift on the machine generating the signature. **Unauthorized requests** return a `401` status, whether the cause is a missing/invalid `x-api-key` or an invalid/expired signature. For example, a skewed timestamp returns: ```json theme={null} { "code": "UNAUTHENTICATED", "message": "Request timestamp is skewed beyond 30 seconds" } ``` Check the `message` field for the specific error. # Base URLs Source: https://docs.onboard.xyz/api-reference/base-urls Sandbox and production endpoints for the Onboard Business API. The Onboard Business API is served over HTTPS. Pick the base URL for the environment you're targeting and append the endpoint path from the API reference. | Environment | Base URL | | ---------------------- | ------------------------------------ | | Production | `https://business-api.onboard.xyz` | | Production (alternate) | `https://api-3p.onboard.xyz` | | Sandbox | `https://external.dev.onboardpay.co` | For example, [Get API Info](/api-reference/endpoints/info/get-api-info) (`GET /exchange/api/info`) in production is: ```http theme={null} GET https://business-api.onboard.xyz/exchange/api/info ``` ## Production `https://business-api.onboard.xyz` is the primary production base URL — use it for new integrations. `https://api-3p.onboard.xyz` is an interchangeable alias that resolves to the same production gateway, so integrations already pointed at it keep working. Pick a single host per integration and use it consistently. ## Sandbox Build and test your integration against sandbox before going live. No real funds move on this environment. Every request is authenticated regardless of environment — the same API key and HMAC signature are required in sandbox and production. See [Authentication](/api-reference/authentication). # Create Cash Deposit Source: https://docs.onboard.xyz/api-reference/endpoints/cash-deposits/create-deposit POST /ledger/cash-deposits Create cash deposit, using the created quote. Returns the deposit transaction, including the payment details the customer must pay into. Creates a disposable cash deposit account for a single transaction. # Create Cash Deposit Quote Source: https://docs.onboard.xyz/api-reference/endpoints/cash-deposits/create-quote POST /ledger/cash-deposits/quotes Create quote for cash deposit Generates a rate-locked quote for a cash deposit. # Get Cash Deposit Source: https://docs.onboard.xyz/api-reference/endpoints/cash-deposits/get-by-reference GET /ledger/cash-deposits/{reference} Get specific cash deposit by reference Fetches a single cash deposit by reference. # Get Cash Deposit Currencies Source: https://docs.onboard.xyz/api-reference/endpoints/cash-deposits/get-currencies GET /ledger/cash-deposits/currencies Get supported pay-in currencies for cash deposit. Only whitelisted pay-in currencies are returned. Fetches currencies available for cash deposits. # Get Cash Deposit Rates Source: https://docs.onboard.xyz/api-reference/endpoints/cash-deposits/get-rates GET /ledger/cash-deposits/rates Get reference rate for cash deposits, from the pay-in currency to the account currency. Fetches current FX rates for cash deposits. # List Cash Deposits Source: https://docs.onboard.xyz/api-reference/endpoints/cash-deposits/list GET /ledger/cash-deposits Retrieve a list of cash deposits, can accept accountId, status Fetches all cash deposits. # Create Cash Payout Source: https://docs.onboard.xyz/api-reference/endpoints/cash-payouts/create-payout POST /ledger/cash-payments Create cash payment, using the created quote Initiates a cash payout to a fiat beneficiary. # Create Cash Payout Quote Source: https://docs.onboard.xyz/api-reference/endpoints/cash-payouts/create-quote POST /ledger/cash-payments/quotes Create quote for cash payment Generates a rate-locked quote for a cash payout. # Get Cash Payout Source: https://docs.onboard.xyz/api-reference/endpoints/cash-payouts/get-by-reference GET /ledger/cash-payments/{reference} Get specific cash payment by reference Fetches a single cash payout by reference. # Get Cash Payout Currencies Source: https://docs.onboard.xyz/api-reference/endpoints/cash-payouts/get-currencies GET /ledger/cash-payments/currencies Get supported payout currencies for cash payment. Fetches currencies available for cash payouts. # Get Cash Payout Rates Source: https://docs.onboard.xyz/api-reference/endpoints/cash-payouts/get-rates GET /ledger/cash-payments/rates Get reference rate for cash payments Fetches current FX rates for cash payouts. # List Cash Payouts Source: https://docs.onboard.xyz/api-reference/endpoints/cash-payouts/list GET /ledger/cash-payments Retrieve a list of cash payments, can accept accountId, status Fetches all cash payouts. # Create Crypto Beneficiary Source: https://docs.onboard.xyz/api-reference/endpoints/crypto-beneficiaries/create POST /ledger/crypto-beneficiaries This Operation allows crypto users to save beneficiary Adds a new crypto beneficiary (wallet address + network). # Delete Crypto Beneficiary Source: https://docs.onboard.xyz/api-reference/endpoints/crypto-beneficiaries/delete DELETE /ledger/crypto-beneficiaries/{beneficiaryId} This operation allows the client to delete a crypto beneficiary by its Id Deletes a crypto beneficiary. # Get Crypto Beneficiary Source: https://docs.onboard.xyz/api-reference/endpoints/crypto-beneficiaries/get-by-id GET /ledger/crypto-beneficiaries/{beneficiaryId} This operation allows the client to fetch a crypto beneficiary by its Id Fetches a single crypto beneficiary by ID. # List Crypto Beneficiaries Source: https://docs.onboard.xyz/api-reference/endpoints/crypto-beneficiaries/list GET /ledger/crypto-beneficiaries This operation allows the client to fetch all beneficiary by accounts Fetches all saved crypto beneficiaries. # Create Fiat Beneficiary Source: https://docs.onboard.xyz/api-reference/endpoints/fiat-beneficiaries/create POST /ledger/fiat-beneficiaries This Operation allows user to save beneficiary Adds a new fiat beneficiary for a payment channel/currency. # Delete Fiat Beneficiary Source: https://docs.onboard.xyz/api-reference/endpoints/fiat-beneficiaries/delete DELETE /ledger/fiat-beneficiaries/{beneficiaryId} This operation allows the client to delete a beneficiary by its Id Deletes a fiat beneficiary. # Get Fiat Beneficiary Source: https://docs.onboard.xyz/api-reference/endpoints/fiat-beneficiaries/get-by-id GET /ledger/fiat-beneficiaries/{beneficiaryId} This operation allows the client to fetch a beneficiary by its Id Fetches a single fiat beneficiary by ID. # List Fiat Beneficiaries Source: https://docs.onboard.xyz/api-reference/endpoints/fiat-beneficiaries/list GET /ledger/fiat-beneficiaries This operation allows the client to fetch all beneficiary by accounts and their transaction type Fetches all saved fiat (bank account) beneficiaries. # Get API Info Source: https://docs.onboard.xyz/api-reference/endpoints/info/get-api-info GET /exchange/api/info Returns general information about the API, including current status and version. # Get Currency Assets Source: https://docs.onboard.xyz/api-reference/endpoints/info/get-currency-assets GET /ledger/currency/assets This operation allows the client to get the Nestcoin supported Assets Returns the list of supported main-account and sub-account currencies. # Get Network Tokens Source: https://docs.onboard.xyz/api-reference/endpoints/info/get-network-tokens GET /ledger/assets/{assetCode}/network-tokens Get list of stablecoin tokens supported for account by asset code. The asset code is the currency code of the main account e.g USD Returns the stablecoin tokens and networks supported for a given asset code. # Create Offramp Account Source: https://docs.onboard.xyz/api-reference/endpoints/offramp-accounts/create POST /ledger/offramp-accounts Create offramp account with beneficiary id. Creates an offramp account linked to a fiat beneficiary. # Delete Offramp Account Source: https://docs.onboard.xyz/api-reference/endpoints/offramp-accounts/delete DELETE /ledger/offramp-accounts/{offrampAccountId} Delete offramp account and automatically disable address assigned. Deletes an offramp account. # Get Offramp Account Source: https://docs.onboard.xyz/api-reference/endpoints/offramp-accounts/get-by-id GET /ledger/offramp-accounts/{offrampAccountId} Get offramp account by offrampAccountId Fetches a single offramp account by ID. # Get Offramp Account Funding Address Source: https://docs.onboard.xyz/api-reference/endpoints/offramp-accounts/get-funding-address GET /ledger/offramp-accounts/{id}/funding-address Get address for offramp account, response should include the list of TokenAssetNetwork supported for the address. Fetches the crypto deposit address linked to an offramp account. # Get Offramp Account Transactions Source: https://docs.onboard.xyz/api-reference/endpoints/offramp-accounts/get-transactions GET /ledger/offramp-accounts/{id}/transactions Get a paginated list of transactions proccessed by offramp accounts Fetches deposit/payout transactions for an offramp account. # List Offramp Accounts Source: https://docs.onboard.xyz/api-reference/endpoints/offramp-accounts/list GET /ledger/offramp-accounts Get a list of offramp accounts, with pagination and payout currency Fetches all offramp accounts. # Initiate Crypto Transfer Source: https://docs.onboard.xyz/api-reference/endpoints/stablecoin/create-crypto-transfer POST /ledger/crypto-transfer This operation allow the client to perform crypto transfer to an external wallet. N.B. The amount field is the withdrawal amount only (fees are not included). The applicable fee, including any platform fee, is computed server-side and is not a client-supplied input. Initiates a crypto withdrawal to an external wallet or beneficiary. # Generate Sub-account Funding Address Source: https://docs.onboard.xyz/api-reference/endpoints/stablecoin/create-subaccount-funding-address POST /ledger/subaccounts/{subAccountIdRef}/funding-address This operation allows the client to create an address for the supported token and network for a sub-account. Generates a new crypto deposit address for a sub-account. # Get Crypto Transfer Source: https://docs.onboard.xyz/api-reference/endpoints/stablecoin/get-crypto-transfer GET /ledger/crypto-transfer/{transferReference} This operation allows the client to fetch a specific crypto transfer by its reference ID. Fetches the status of a crypto transfer by reference. # Get Sub-account Funding Address Source: https://docs.onboard.xyz/api-reference/endpoints/stablecoin/get-subaccount-funding-address GET /ledger/subaccounts/{subAccountIdRef}/funding-address This operation allows the client to get the address for the sub-account if it exists Fetches the crypto deposit address for a sub-account. # List Account Activities Source: https://docs.onboard.xyz/api-reference/endpoints/transaction-activities/account-activities GET /ledger/accounts/{accountId}/activities This operation allows the client to fetch a paginated, aggregated feed of all transaction activity for an account (cash deposits/payments, account-number deposits, crypto deposits/withdrawals, internal transfers, offramp deposits), each with type-specific details in activityData. Fetches all transaction activities for the main account. # Get Account Activity Source: https://docs.onboard.xyz/api-reference/endpoints/transaction-activities/account-activity-by-id GET /ledger/accounts/{accountId}/activities/{activityId} This operation allows the client to fetch a specific transaction activity by its ID. Fetches a single main-account activity by ID. # List All Transaction Activities Source: https://docs.onboard.xyz/api-reference/endpoints/transaction-activities/list-all GET /ledger/transaction-activities This operation allows the client to fetch a paginated, aggregated feed of all transaction activity for the authenticated business, optionally scoped to a single account, with the same type-specific activityData as the account-scoped activities endpoint. Unified endpoint to fetch all transaction activities across the account and its sub-accounts. # List Sub-account Activities Source: https://docs.onboard.xyz/api-reference/endpoints/transaction-activities/subaccount-activities GET /ledger/subaccounts/{subAccountIdRef}/activities This operation allows the client to fetch a paginated, aggregated feed of all transaction activities for a sub-account (cash deposits/payments, account-number deposits, crypto deposits/withdrawals, internal transfers, offramp deposits), each with type-specific details in activityData. Fetches all transaction activities for a sub-account. # Get Sub-account Activity Source: https://docs.onboard.xyz/api-reference/endpoints/transaction-activities/subaccount-activity-by-id GET /ledger/subaccounts/{subAccountIdRef}/activities/{activityId} This operation allows the client to fetch a specific transaction activity by its ID. Fetches a single sub-account activity by ID. # Generate Account Number Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account-number/create-account-details POST /ledger/accounts/{accountId}/account-details Generates a bank account number for this account in the given currency through the account-number provider. Returns the existing details if one was already generated. Generates a new virtual account number for the main account. # Generate Sub-account Number Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account-number/create-subaccount-details POST /ledger/subaccounts/{subAccountIdRef}/account-details Generates a bank account number for this sub-account in the given currency through the account-number provider. The account name must be supplied by the client. Generates a new virtual account number for a sub-account. # Get Account Number Details Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account-number/get-account-details GET /ledger/accounts/{accountId}/account-details Returns the bank account number (and bank details) generated for this account in the given currency, if one exists. Fetches virtual account number details for the main account. # Get Sub-account Number Details Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account-number/get-subaccount-details GET /ledger/subaccounts/{subAccountIdRef}/account-details Returns the bank account number (and bank details) generated for this sub-account in the given currency, if one exists. Fetches virtual account number details for a sub-account. # Create Sub-account Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account/create-subaccount POST /ledger/subaccounts This endpoint helps to create sub-accounts for a customer. The endpoint requires the main account ID to create a sub-account under it. Creates a new sub-account referenced by your internal identifier. # Delete Sub-account Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account/delete-subaccount DELETE /ledger/subaccounts/{subAccountIdRef} This endpoint deletes sub-account by sub-account ID. The sub-account must have zero balance before it can be deleted. The endpoint will return an error if the sub-account has a non-zero balance. The funds in the sub-account must be transferred to another account before deletion. Once an account is deleted, it cannot be recovered, and a new sub-account must be created if needed. The address associated with the sub-account will also be deleted upon successful deletion of the sub-account. Deletes a zero-balance sub-account. # Get Account by ID Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account/get-account-by-id GET /ledger/accounts/{accountId} This operation allows the client to fetch account details by account id. A client can fetch only their own account details. Fetches a single account by its ID. # List Accounts Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account/get-accounts GET /ledger/accounts This operation allows the client to fetch all customer's accounts Fetches all customer accounts. # Get Sub-account by Reference Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account/get-subaccount-by-ref GET /ledger/subaccounts/{subAccountIdRef} This endpoint returns sub-account details by sub-account ID. Fetches a single sub-account by its reference. # List Sub-accounts Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account/get-subaccounts GET /ledger/subaccounts This endpoint returns all sub-accounts Fetches all sub-accounts under the main account. # Update Sub-account Source: https://docs.onboard.xyz/api-reference/endpoints/virtual-account/update-subaccount PUT /ledger/subaccounts/{subAccountIdRef} This endpoint updates sub-account details by sub-account ID. Updates a sub-account's name or frozen status. # WebHook Events Source: https://docs.onboard.xyz/api-reference/webhook-events This is the complete catalogue of webhook events Onboard Business can deliver to your registered webhook URL. Each product guide links back to the subset relevant to it; this page is the authoritative reference for all of them. Every delivery uses the envelope described in [Webhook Verification](/api-reference/webhook-verification): ```json theme={null} { "event": "", "data": { /* event-specific payload */ }, "timestamp": 1732718962 } ``` ## Account activity events Fired when something changes about an account, sub-account, or a saved beneficiary/offramp account — not a movement of money. | Event | Trigger | | --------------------------------------------- | ------------------------------------------------------------------------ | | `account_activity.sub_account.created` | A sub-account is created | | `account_activity.sub_account.updated` | A sub-account's name or frozen status changes | | `account_activity.sub_account.deleted` | A zero-balance sub-account is deleted | | `account_activity.account_number.created` | A cash-deposit virtual account number is generated (main or sub-account) | | `account_activity.fiat_beneficiary.created` | A fiat beneficiary (bank account) is added | | `account_activity.fiat_beneficiary.deleted` | A fiat beneficiary is deleted | | `account_activity.crypto_beneficiary.created` | A crypto beneficiary (wallet + network) is added | | `account_activity.crypto_beneficiary.deleted` | A crypto beneficiary is deleted | | `account_activity.offramp_account.created` | An offramp account is created | | `account_activity.offramp_account.deleted` | An offramp account is deleted | ## Transaction activity events Fired for money movement. Each activity type emits **four** lifecycle events: `.created`, `.updated`, `.completed`, `.failed`. | Event prefix | Activity | | ----------------------------------------------- | ----------------------------------------------------------------------------------- | | `transaction_activity.cash_deposit.*` | Cash deposit | | `transaction_activity.cash_payment.*` | Cash payment (payout) | | `transaction_activity.crypto_withdrawal.*` | Crypto withdrawal | | `transaction_activity.crypto_deposit.*` | Crypto deposit | | `transaction_activity.offramp_deposit.*` | Offramp deposit | | `transaction_activity.internal_transfer.*` | Internal transfer (between main account and a sub-account, or between sub-accounts) | | `transaction_activity.account_number_deposit.*` | Account-number deposit | Lifecycle suffixes: * **`.created`** — the activity was created. `data.status` is typically `PENDING`. * **`.updated`** — a non-terminal status change. `data.status` is typically `IN_PROGRESS`. * **`.completed`** — reached a terminal success state. `data.status` is `SUCCESS`. * **`.failed`** — reached a terminal failure state. `data.status` is `FAILED`. The event name's suffix (`.completed`, `.failed`, ...) describes the lifecycle transition that triggered delivery. The payload's own `status` field is always one of the four `TransactionStatus` values above — there is no `COMPLETED` status value; the terminal success state is `SUCCESS`. A single underlying transaction can emit more than one event of the same name — for example, one for a sub-account's activity row and one for its parent main-account row. Treat deliveries as at-least-once and deduplicate on the payload's activity id, not on event name plus timestamp. ## Sample payloads Every sample below is constructed directly from the corresponding schema object in the [OpenAPI spec](/api-reference/openapi.yml) — the same shape you'd get back from the matching REST endpoint. ### Account activity samples All three sub-account lifecycle events share the `SubAccount` shape. `.updated` and `.deleted` deliveries reflect the sub-account's state at the time of the change (e.g. `frozen: true` for a freeze, or the balance at deletion). ```json theme={null} { "event": "account_activity.sub_account.created", "data": { "id": "6f9d3a2e-1b5c-4e88-9a2f-3c7d5e9b1a04", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "reference": "customer-8841", "displayName": "Customer 8841", "currency": "USD", "accountBalance": { "balance": 0, "availableBalance": 0 }, "frozen": false, "createdDate": "2026-07-19T15:30:00.000Z" }, "timestamp": 1784475000 } ``` The destination account details generated for a cash deposit virtual account number. The event fires on whichever account or sub-account requested the account number; the request itself (not the payload) tells you which. ```json theme={null} { "event": "account_activity.account_number.created", "data": { "details": { "accountInfoType": "CashLocalBankAccount", "accountName": "Onboard Business Ltd", "accountNumber": "0123456789", "bankName": "Providus Bank", "bankCode": "101", "reference": "PROV123456" }, "payinCurrency": "NGN" }, "timestamp": 1784535300 } ``` ```json theme={null} { "event": "account_activity.fiat_beneficiary.created", "data": { "id": "5a83377d-7c57-4725-992f-9c50349af917", "accountNumber": "0123456789", "accountName": "Jane Doe", "currency": "GHS", "beneficiaryType": "BeneficiaryLocalBankAccount", "bankName": "GCB Bank", "bankCode": "040", "isThirdParty": false, "accountHolderType": "INDIVIDUAL" }, "timestamp": 1784657062 } ``` ```json theme={null} { "event": "account_activity.crypto_beneficiary.created", "data": { "id": "e2a1c4b8-3d5f-4a2e-9b1c-7f8e6d5c4b3a", "address": "0x7BCc5bCBa19DE3C903F062D8fB5fF8d9f818173E", "network": "BASE", "name": "Treasury wallet", "memo": null }, "timestamp": 1784711523 } ``` ```json theme={null} { "event": "account_activity.offramp_account.created", "data": { "id": "60037f44-9094-4bd5-a316-21995e8985c9", "beneficiary": { "id": "5a83377d-7c57-4725-992f-9c50349af917", "accountNumber": "1234567890123", "accountName": "Jane Doe", "currency": "KES", "beneficiaryType": "BeneficiaryMobileWalletAccount", "isThirdParty": false, "accountHolderType": "INDIVIDUAL" }, "payoutCurrency": "KES", "status": "ACTIVE", "createdDate": "2026-07-23T11:22:00.000Z" }, "timestamp": 1784805720 } ``` ### Transaction activity samples Every `transaction_activity.*` payload is a `TransactionActivity` — a common envelope (`id`, `type`, `direction`, `amount`, `currency`, `status`, `accountId`, `accountType`, `activityAt`, ...) plus an `activityData` object whose shape depends on `activityType`, per the discriminator on the `TransactionActivity` schema. ```json theme={null} { "event": "transaction_activity.cash_deposit.completed", "data": { "id": "1b3e6c2a-9f41-4b8e-8a2d-5c7f9e1a3b04", "activityType": "CashDepositActivity", "type": "CASH_DEPOSIT", "direction": "CREDIT", "amount": 32.50, "currency": "USD", "status": "SUCCESS", "reference": "0173270620673048624933", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "SUB_ACCOUNT", "subAccountId": "6f9d3a2e-1b5c-4e88-9a2f-3c7d5e9b1a04", "activityAt": "2026-07-22T13:59:12.140Z", "activityData": { "id": "3c7f9e1a-3b04-4e88-9a2f-1b3e6c2a5c7d", "reference": "0173270620673048624933", "currency": "USD", "status": "SUCCESS", "payinCurrency": "NGN", "amount": 32.50, "rate": 1538.46, "payinAmount": 50000.00, "createdDate": "2026-07-22T13:57:56.970Z" } }, "timestamp": 1784728752 } ``` ```json theme={null} { "event": "transaction_activity.cash_payment.completed", "data": { "id": "9c4b1a2e-7d5f-4a2e-9b1c-3d5f8e6d5c4b", "activityType": "CashPaymentActivity", "type": "CASH_PAYMENT", "direction": "DEBIT", "amount": 1200.00, "currency": "USD", "status": "SUCCESS", "reference": "0173270620673048624933", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "MAIN", "activityAt": "2026-07-23T11:24:37.000Z", "activityData": { "id": "5c4b3a2e-9c4b-4a2e-9b1c-7d5f8e6d1a2e", "reference": "0173270620673048624933", "currency": "USD", "status": "SUCCESS", "payoutCurrency": "GHS", "amount": 1200.00, "rate": 15.20, "payoutAmount": 18240.00, "recipient": { "id": "5a83377d-7c57-4725-992f-9c50349af917", "accountName": "Jane Doe", "beneficiaryType": "BeneficiaryLocalBankAccount", "bankName": "GCB Bank", "accountIdentifier": "0123456789", "paymentChannelId": "BANK_TRANSFER_GHANA" }, "createdDate": "2026-07-23T11:22:00.000Z" } }, "timestamp": 1784805877 } ``` ```json theme={null} { "event": "transaction_activity.account_number_deposit.completed", "data": { "id": "2e1a4c8b-5d3f-4a2e-9b1c-8e6d5c4b3a7f", "activityType": "AccountNumberDepositActivity", "type": "ACCOUNT_NUMBER_DEPOSIT", "direction": "CREDIT", "amount": 100.00, "currency": "USD", "status": "SUCCESS", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "MAIN", "activityAt": "2026-07-20T08:16:45.000Z", "activityData": { "id": "4a2e9b1c-7f8e-4d5c-8b3a-2e1a4c8b5d3f", "amount": 145000.00, "fee": 500.00, "currency": "NGN", "accountCurrency": "USD", "status": "SUCCESS", "settlementAmount": 100.00, "settlementExchangeRate": 1450.00, "createdDate": "2026-07-20T08:15:00.000Z" } }, "timestamp": 1784535405 } ``` Both crypto event families share the `AccountTransaction` shape for `activityData`; only `direction` and `activityType` differ. ```json theme={null} { "event": "transaction_activity.crypto_withdrawal.completed", "data": { "id": "8e6d5c4b-3a7f-4a2e-9b1c-2e1a4c8b5d3f", "activityType": "CryptoWithdrawalActivity", "type": "CRYPTO_WITHDRAWAL", "direction": "DEBIT", "amount": 150.00, "currency": "USD", "status": "SUCCESS", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "SUB_ACCOUNT", "subAccountId": "6f9d3a2e-1b5c-4e88-9a2f-3c7d5e9b1a04", "activityAt": "2026-07-24T10:00:05.000Z", "activityData": { "id": "txn_9f41b3e6c2a", "reference": "REF9F41B3E6C2A", "type": "WITHDRAWAL", "amount": -150.00, "currency": "USD", "status": "SUCCESS", "categoryTag": "crypto-withdrawal", "notes": "Withdrawal to USDC on BASE", "createdDate": "2026-07-24T10:00:00.000Z" } }, "timestamp": 1784887205 } ``` ```json theme={null} { "event": "transaction_activity.internal_transfer.completed", "data": { "id": "3d5f8e6d-5c4b-4a2e-9b1c-9c4b1a2e7d5f", "activityType": "InternalTransferActivity", "type": "INTERNAL_TRANSFER", "direction": "DEBIT", "amount": 500.00, "currency": "USD", "status": "SUCCESS", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "MAIN", "groupId": "7c9f1a3b-04e8-4a2e-9b1c-1b3e6c2a9f41", "activityAt": "2026-07-21T18:05:10.000Z", "activityData": { "reference": "ITR9F41B3E6C2A", "sourceAccountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "destinationAccountId": "6f9d3a2e-1b5c-4e88-9a2f-3c7d5e9b1a04", "amount": 500.00, "currency": "USD", "status": "SUCCESS", "description": "Rebalance to Customer 8841", "createdDate": "2026-07-21T18:04:22.000Z" } }, "timestamp": 1784657110 } ``` `activityData` extends `CashPaymentTransaction` with `offrampAccountId` and `blockchainInfo`. ```json theme={null} { "event": "transaction_activity.offramp_deposit.completed", "data": { "id": "4a2e9b1c-8e6d-4a2e-9b1c-3d5f8e6d5c4b", "activityType": "OfframpDepositActivity", "type": "OFFRAMP_DEPOSIT", "direction": "CREDIT", "amount": 500.00, "currency": "USD", "status": "SUCCESS", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "OFFRAMP_ACCOUNT", "activityAt": "2026-07-23T11:24:37.000Z", "activityData": { "id": "5c4b3a2e-8e6d-4a2e-9b1c-7d5f8e6d1a2e", "reference": "0173270620673048624933", "currency": "USD", "status": "SUCCESS", "payoutCurrency": "NGN", "amount": 500.00, "rate": 1450.00, "payoutAmount": 725000.00, "recipient": { "id": "5a83377d-7c57-4725-992f-9c50349af917", "accountName": "Jane Doe", "beneficiaryType": "BeneficiaryMobileWalletAccount", "accountIdentifier": "2348012345678", "paymentChannelId": "MOBILE_MONEY_NIGERIA" }, "offrampAccountId": "60037f44-9094-4bd5-a316-21995e8985c9", "createdDate": "2026-07-23T11:22:00.000Z" } }, "timestamp": 1784805877 } ``` # Webhook Verification Source: https://docs.onboard.xyz/api-reference/webhook-verification ## Delivery Every webhook is a `POST` request with this envelope: ```json theme={null} { "event": "", "data": { /* event-specific payload */ }, "timestamp": 1732718962 } ``` Your endpoint must respond `200 OK` with an empty body. If it doesn't, delivery is retried with exponential backoff until it succeeds. Deliveries are idempotent per underlying event id, but a redelivery can still reach your endpoint more than once during a retry window. Deduplicate on the payload's activity/entity id, not on delivery count. ## Verifying the signature Each delivery carries the same `x-signature` / `x-timestamp` headers used for [request authentication](/api-reference/authentication), computed over the **entire request body** (not just `data`) using your webhook secret. ```javascript theme={null} const crypto = require('crypto'); function verifyOnboardWebhook(rawBody, signatureHeader, timestampHeader, webhookSecret) { const signaturePayload = `t=${timestampHeader}&${rawBody}`; const expectedSignature = crypto .createHmac('sha256', webhookSecret) .update(signaturePayload) .digest('hex'); return expectedSignature === signatureHeader; } ``` Use the **raw request body string** exactly as received, not a re-serialized version of the parsed JSON. Re-serializing with `JSON.stringify` can reorder or reformat keys differently than the sender did, which silently breaks verification. Your webhook secret is generated alongside your webhook URL in the [Business Dashboard](https://business.onboard.xyz) — see [Configuring and Verifying Webhooks](/guides/api-concepts/webhooks-setup). # Getting API Credentials Source: https://docs.onboard.xyz/guides/api-concepts/api-credentials API credentials authenticate your requests to the Onboard Business API. You create and manage them from the Business Dashboard. Sign in to the [Business Dashboard](https://business.onboard.xyz) and go to **Developer** in the sidebar. Click **Create key**. Your API key and API secret are shown once — store the secret securely, it cannot be retrieved again. Add the IP addresses your servers will call the API from. IP restriction is required for any key that will initiate withdrawals (cash payouts, crypto transfers); it's optional for read-only or deposit-only keys. Save your credentials, then make a test request against [`GET /exchange/api/info`](/api-reference/endpoints/info/get-api-info) to confirm they work. Create API key modal in the Onboard Business Dashboard, showing the optional label and allowed IP addresses fields Once you have your API key and secret, see [Authentication](/api-reference/authentication) for how to sign requests. The same **Developer** page is also where you register your webhook URL — see [Configuring and Verifying Webhooks](/guides/api-concepts/webhooks-setup). # Configuring and Verifying Webhooks Source: https://docs.onboard.xyz/guides/api-concepts/webhooks-setup Webhooks notify your systems in real time when account or transaction activity happens — a deposit lands, a payout completes, a beneficiary is added. Your webhook URL must be publicly reachable over HTTPS and return a `200 OK` with no response body. In the [Business Dashboard](https://business.onboard.xyz), go to **Developer** — the same page where you manage API keys, see [Getting API Credentials](/guides/api-concepts/api-credentials) — and save your endpoint URL. A webhook secret is generated for you at the same time. Every delivery is signed with `x-signature` and `x-timestamp` headers generated from your webhook secret. See [Webhook Verification](/api-reference/webhook-verification) for the exact algorithm and a code sample. Deliveries are retried with exponential backoff until your endpoint returns `200 OK`. Deduplicate on the payload's activity/event id, since a retried delivery is not distinguished from a first attempt at the application level. For the full list of events you can receive, see [WebHook Events](/api-reference/webhook-events). # Dashboard Source: https://docs.onboard.xyz/guides/getting-started/dashboard The [Onboard Business Dashboard](https://business.onboard.xyz) is where you manage everything that sits outside the API: account and sub-account oversight, API credential and IP-restriction management, webhook configuration, and a searchable view of every transaction activity. Onboard Business Dashboard home screen showing the Global USD Account balance and recent activity Use the dashboard to: * View balances and activity across your main account and all sub-accounts * Create and rotate API keys, and manage IP whitelisting * Configure your webhook URL and secret * Look up individual transactions, deposits, and payouts by reference # Overview Source: https://docs.onboard.xyz/guides/getting-started/overview An Onboard Business account is a stablecoin-backed USD account built for companies that move money across borders. Behind a single account, funds can move between stablecoins (USDC, USDT) and fiat currencies (USD, NGN, GBP, EUR) — so you can collect, hold, and pay out in whichever rail your customers or counterparties use, while everything settles through USD in your account. ## What you get * **Virtual Accounts** — a primary business account and unlimited sub-accounts, each with its own balance and activity feed. * **Cash Deposits** — collect local currency via disposable, single-use account numbers, converted to USD stablecoin on arrival. * **Cash Payouts** — send fiat payouts to bank accounts and mobile wallets across supported currencies and payment channels. * **Offramp Accounts** — generate stablecoin deposit addresses that auto-convert and settle as a cash payout to a linked bank account. * **Crypto Transfers** — send and receive stablecoins directly, with support for saved crypto beneficiaries. Continue to [Products](/guides/getting-started/products) for a closer look at each, or jump straight to [getting set up](/guides/getting-started/set-up). # Products Source: https://docs.onboard.xyz/guides/getting-started/products ## Virtual Accounts A primary USD business account with an unlimited number of sub-accounts, each independently addressable — useful for representing customers, products, or business units within your own system. [Learn more](/guides/product-features/virtual-account/introduction). ## Cash Deposits Disposable, single-use account numbers for onramping local currency. Each deposit gets its own account number with a guaranteed conversion rate, valid for one transaction only. [Learn more](/guides/product-features/cash-deposits/introduction). ## Cash Payouts Send fiat payouts to a bank account or mobile wallet in any supported currency, from your main account or a sub-account. [Learn more](/guides/product-features/cash-payouts/introduction). ## Offramp Accounts A reusable stablecoin deposit address linked directly to a beneficiary bank account — every deposit automatically converts and pays out. [Learn more](/guides/product-features/offramp-accounts/introduction). ## Crypto Transfers Send and receive stablecoins across supported networks, with saved crypto beneficiaries for repeatable withdrawals. [Learn more](/guides/product-features/stablecoin/deposits). # Getting Set Up with Onboard Business Source: https://docs.onboard.xyz/guides/getting-started/set-up To start integrating with the Onboard Business API, you first need an Onboard Business account. 1. Apply for an account at [business.onboard.xyz/apply](https://business.onboard.xyz/apply). 2. Once approved, sign in to the [Business Dashboard](https://business.onboard.xyz). 3. From the dashboard, [create your API credentials](/guides/api-concepts/api-credentials) and [configure a webhook URL](/guides/api-concepts/webhooks-setup). Once you have API credentials, you're ready to make your first authenticated request — see [Authentication](/api-reference/authentication). # Cash Deposit Flow Source: https://docs.onboard.xyz/guides/product-features/cash-deposits/flow [`GET /ledger/cash-deposits/currencies`](/api-reference/endpoints/cash-deposits/get-currencies) returns the currencies you can currently deposit in. [`POST /ledger/cash-deposits/quotes`](/api-reference/endpoints/cash-deposits/create-quote) locks in a conversion rate for the amount and currency you specify. Quotes expire after a short window, so create the deposit soon after. [`POST /ledger/cash-deposits`](/api-reference/endpoints/cash-deposits/create-deposit) using the quote reference. This returns a single-use account number for your customer to pay into. Poll [`GET /ledger/cash-deposits/{reference}`](/api-reference/endpoints/cash-deposits/get-by-reference), or subscribe to `transaction_activity.cash_deposit.*` — see [Webhooks for Cash Deposits](/guides/product-features/cash-deposits/webhooks). [`GET /ledger/cash-deposits`](/api-reference/endpoints/cash-deposits/list) lists all deposits. # Introduction Source: https://docs.onboard.xyz/guides/product-features/cash-deposits/introduction Cash deposits let you onramp local currency without a standing account number. Unlike a [virtual account number](/guides/product-features/virtual-account/account-number), which is a reusable, standing bank account number, a cash deposit generates a **single-use, disposable account number per transaction** — once the payment completes, that account number is no longer valid. The trade-off is precision: because each cash deposit is tied to exactly one transaction, the conversion rate is locked in ahead of time via a quote, rather than applied at the moment of an incoming transfer. A deposit to a bank account passes through the Onboard risk system and FX system before landing in the Virtual Account Continue to [Cash Deposit Flow](/guides/product-features/cash-deposits/flow) for the full request sequence. # Webhooks for Cash Deposits Source: https://docs.onboard.xyz/guides/product-features/cash-deposits/webhooks Full payload schemas are in [WebHook Events](/api-reference/webhook-events). | Event family | Fires when | | ------------------------------------- | ------------------------------------------------------------------------------------------------ | | `transaction_activity.cash_deposit.*` | A cash deposit is created, matched, or settled (`.created`, `.updated`, `.completed`, `.failed`) | ### Sample payload Full field-by-field schema is in [WebHook Events](/api-reference/webhook-events#transaction-activity-samples). `activityData` is a `CashDepositTransaction` — note the terminal success status is `SUCCESS`, not `COMPLETED`. ```json theme={null} { "event": "transaction_activity.cash_deposit.completed", "data": { "id": "1b3e6c2a-9f41-4b8e-8a2d-5c7f9e1a3b04", "activityType": "CashDepositActivity", "type": "CASH_DEPOSIT", "direction": "CREDIT", "amount": 32.50, "currency": "USD", "status": "SUCCESS", "reference": "0173270620673048624933", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "SUB_ACCOUNT", "subAccountId": "6f9d3a2e-1b5c-4e88-9a2f-3c7d5e9b1a04", "activityAt": "2026-07-22T13:59:12.140Z", "activityData": { "id": "3c7f9e1a-3b04-4e88-9a2f-1b3e6c2a5c7d", "reference": "0173270620673048624933", "currency": "USD", "status": "SUCCESS", "payinCurrency": "NGN", "amount": 32.50, "rate": 1538.46, "payinAmount": 50000.00, "createdDate": "2026-07-22T13:57:56.970Z" } }, "timestamp": 1784728752 } ``` # Beneficiaries Source: https://docs.onboard.xyz/guides/product-features/cash-payouts/beneficiaries A fiat beneficiary represents a specific payout destination — a bank account or mobile wallet — tied to a **currency** and a **payment channel**. The payment channel ID tells Onboard exactly how to route the payout (e.g. SEPA vs. local bank transfer for EUR), and determines which beneficiary fields are required. ## Currencies and payment channels Each currency supports one or more payment channels, and each channel maps to a specific beneficiary type: | Currency | Payment Channel | Channel ID | Beneficiary Type | | -------- | ------------------------- | ------------------------- | -------------------------------- | | EUR | SEPA - International | `BANK_TRANSFER_SEPA` | `BeneficiarySepaBankAccount` | | GBP | Fast Payment UK | `BANK_TRANSFER_UK` | `BeneficiaryLocalBankAccount` | | GHS | Vodafone Cash | `VODAFONE_CASH` | `BeneficiaryMobileWalletAccount` | | GHS | Telecel Ghana | `TELECEL_GHANA` | `BeneficiaryMobileWalletAccount` | | GHS | Bank Transfer - Ghana | `BANK_TRANSFER_GHANA` | `BeneficiaryLocalBankAccount` | | GHS | AirtelTigo Ghana | `AIRTEL_TIGO_GHANA` | `BeneficiaryMobileWalletAccount` | | GHS | Zeepay | `ZEEPAY` | `BeneficiaryMobileWalletAccount` | | GHS | MTN Mobile Money - Ghana | `MTN_MOBILE_MONEY_GH` | `BeneficiaryMobileWalletAccount` | | IDR | Gopay | `GOPAY_IN` | `BeneficiaryMobileWalletAccount` | | IDR | DANA | `DANA_IN` | `BeneficiaryMobileWalletAccount` | | IDR | Bank Transfer - Indonesia | `BANK_TRANSFER_INDONESIA` | `BeneficiaryLocalBankAccount` | | IDR | LinkAja | `LINK_AJA` | `BeneficiaryMobileWalletAccount` | | KES | M-PESA Kenya (Safaricom) | `M_PESA_KENYA_SAFARICOM` | `BeneficiaryMobileWalletAccount` | | KES | Bank Transfer - Kenya | `BANK_TRANSFER_KENYA` | `BeneficiaryLocalBankAccount` | | NGN | Bank Transfer - Nigeria | `BANK_TRANSFER_NIGERIA` | `BeneficiaryLocalBankAccount` | | USD | ACH - United States | `BANK_TRANSFER_ACH` | `BeneficiaryLocalBankAccount` | | USD | SWIFT - International | `BANK_TRANSFER_SWIFT` | `BeneficiaryLocalBankAccount` | | USD | Wire | `BANK_TRANSFER_WIRE` | `BeneficiaryLocalBankAccount` | Call [`GET /ledger/cash-payments/currencies`](/api-reference/endpoints/cash-payouts/get-currencies) to fetch this list live — new currencies and channels are added over time. ## Managing beneficiaries * [`GET /ledger/fiat-beneficiaries`](/api-reference/endpoints/fiat-beneficiaries/list) — list saved beneficiaries. * [`POST /ledger/fiat-beneficiaries`](/api-reference/endpoints/fiat-beneficiaries/create) — add a beneficiary for a given currency and payment channel. * [`GET /ledger/fiat-beneficiaries/{beneficiaryId}`](/api-reference/endpoints/fiat-beneficiaries/get-by-id) — fetch a single beneficiary. * [`DELETE /ledger/fiat-beneficiaries/{beneficiaryId}`](/api-reference/endpoints/fiat-beneficiaries/delete) — remove a beneficiary. # Cash Payout Flows Source: https://docs.onboard.xyz/guides/product-features/cash-payouts/flow API keys used to create cash payouts must have IP whitelisting configured — see [Getting API Credentials](/guides/api-concepts/api-credentials). [`GET /ledger/cash-payments/currencies`](/api-reference/endpoints/cash-payouts/get-currencies) — see [Beneficiaries](/guides/product-features/cash-payouts/beneficiaries) for the full currency/channel table. [`POST /ledger/cash-payments/quotes`](/api-reference/endpoints/cash-payouts/create-quote) locks in a conversion rate for the payout amount and currency. [`POST /ledger/cash-payments`](/api-reference/endpoints/cash-payouts/create-payout) using the quote reference and a saved beneficiary ID. Poll [`GET /ledger/cash-payments/{reference}`](/api-reference/endpoints/cash-payouts/get-by-reference), or subscribe to `transaction_activity.cash_payment.*` — see [Webhooks for Cash Payouts](/guides/product-features/cash-payouts/webhooks). [`GET /ledger/cash-payments`](/api-reference/endpoints/cash-payouts/list) returns all payouts. # Introduction Source: https://docs.onboard.xyz/guides/product-features/cash-payouts/introduction Cash payouts send money out of your Onboard Business account to a bank account or mobile wallet, in the recipient's local currency. Onboard handles the FX conversion from your USD-denominated account balance. Continue to [Beneficiaries](/guides/product-features/cash-payouts/beneficiaries) to learn how payout destinations are modeled, or jump to the [Cash Payout Flows](/guides/product-features/cash-payouts/flow). # Webhooks for Cash Payouts Source: https://docs.onboard.xyz/guides/product-features/cash-payouts/webhooks Full payload schemas are in [WebHook Events](/api-reference/webhook-events). | Event | Fires when | | ------------------------------------------- | -------------------------------------------------------------------------------------------------- | | `account_activity.fiat_beneficiary.created` | A fiat beneficiary is added | | `account_activity.fiat_beneficiary.deleted` | A fiat beneficiary is deleted | | `transaction_activity.cash_payment.*` | A cash payout is created, processing, or settled (`.created`, `.updated`, `.completed`, `.failed`) | ### Sample payloads Full field-by-field schemas for every event are in [WebHook Events](/api-reference/webhook-events). ```json theme={null} { "event": "account_activity.fiat_beneficiary.created", "data": { "id": "5a83377d-7c57-4725-992f-9c50349af917", "accountNumber": "0123456789", "accountName": "Jane Doe", "currency": "GHS", "beneficiaryType": "BeneficiaryLocalBankAccount", "bankName": "GCB Bank", "bankCode": "040", "isThirdParty": false, "accountHolderType": "INDIVIDUAL" }, "timestamp": 1784657062 } ``` `activityData` is a `CashPaymentTransaction` — note the terminal success status is `SUCCESS`, not `COMPLETED`. ```json theme={null} { "event": "transaction_activity.cash_payment.completed", "data": { "id": "9c4b1a2e-7d5f-4a2e-9b1c-3d5f8e6d5c4b", "activityType": "CashPaymentActivity", "type": "CASH_PAYMENT", "direction": "DEBIT", "amount": 1200.00, "currency": "USD", "status": "SUCCESS", "reference": "0173270620673048624933", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "MAIN", "activityAt": "2026-07-23T11:24:37.000Z", "activityData": { "id": "5c4b3a2e-9c4b-4a2e-9b1c-7d5f8e6d1a2e", "reference": "0173270620673048624933", "currency": "USD", "status": "SUCCESS", "payoutCurrency": "GHS", "amount": 1200.00, "rate": 15.20, "payoutAmount": 18240.00, "recipient": { "id": "5a83377d-7c57-4725-992f-9c50349af917", "accountName": "Jane Doe", "beneficiaryType": "BeneficiaryLocalBankAccount", "bankName": "GCB Bank", "accountIdentifier": "0123456789", "paymentChannelId": "BANK_TRANSFER_GHANA" }, "createdDate": "2026-07-23T11:22:00.000Z" } }, "timestamp": 1784805877 } ``` # Introduction Source: https://docs.onboard.xyz/guides/product-features/offramp-accounts/introduction An offramp account generates a stablecoin deposit address that's linked directly to a beneficiary's bank account. Every deposit to that address is automatically converted and paid out — there's no separate "initiate payout" step. A stablecoin deposit passes through the Onboard Payment System and results in a cash payout to the beneficiary If the payout fails after a deposit is received, the funds are refunded to your main account rather than lost or stuck: On payment failure, funds are refunded to the Main Account Continue to [Process for Offramp Accounts](/guides/product-features/offramp-accounts/process). # Process for Offramp Accounts Source: https://docs.onboard.xyz/guides/product-features/offramp-accounts/process [`POST /ledger/fiat-beneficiaries`](/api-reference/endpoints/fiat-beneficiaries/create) — see [Beneficiaries](/guides/product-features/cash-payouts/beneficiaries) for currency/channel details. [`POST /ledger/offramp-accounts`](/api-reference/endpoints/offramp-accounts/create), referencing the beneficiary from step 1. [`GET /ledger/offramp-accounts/{id}/funding-address`](/api-reference/endpoints/offramp-accounts/get-funding-address) returns the stablecoin address to deposit into. Subscribe to `transaction_activity.offramp_deposit.*` — see [Webhooks for Offramp Accounts](/guides/product-features/offramp-accounts/webhooks) — or query [`GET /ledger/offramp-accounts/{id}/transactions`](/api-reference/endpoints/offramp-accounts/get-transactions) directly. Manage existing offramp accounts with [`GET /ledger/offramp-accounts`](/api-reference/endpoints/offramp-accounts/list), [`GET /ledger/offramp-accounts/{offrampAccountId}`](/api-reference/endpoints/offramp-accounts/get-by-id), and [`DELETE /ledger/offramp-accounts/{offrampAccountId}`](/api-reference/endpoints/offramp-accounts/delete). # Webhooks for Offramp Accounts Source: https://docs.onboard.xyz/guides/product-features/offramp-accounts/webhooks Full payload schemas are in [WebHook Events](/api-reference/webhook-events). | Event | Fires when | | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | | `account_activity.offramp_account.created` | An offramp account is created | | `account_activity.offramp_account.deleted` | An offramp account is deleted | | `transaction_activity.offramp_deposit.*` | A stablecoin deposit into an offramp account is detected, converted, or paid out (`.created`, `.updated`, `.completed`, `.failed`) | ### Sample payloads Full field-by-field schemas for every event are in [WebHook Events](/api-reference/webhook-events). ```json theme={null} { "event": "account_activity.offramp_account.created", "data": { "id": "60037f44-9094-4bd5-a316-21995e8985c9", "beneficiary": { "id": "5a83377d-7c57-4725-992f-9c50349af917", "accountNumber": "1234567890123", "accountName": "Jane Doe", "currency": "KES", "beneficiaryType": "BeneficiaryMobileWalletAccount", "isThirdParty": false, "accountHolderType": "INDIVIDUAL" }, "payoutCurrency": "KES", "status": "ACTIVE", "createdDate": "2026-07-23T11:22:00.000Z" }, "timestamp": 1784805720 } ``` `activityData` extends `CashPaymentTransaction` with `offrampAccountId` and `blockchainInfo`. Terminal success status is `SUCCESS`, not `COMPLETED`. ```json theme={null} { "event": "transaction_activity.offramp_deposit.completed", "data": { "id": "4a2e9b1c-8e6d-4a2e-9b1c-3d5f8e6d5c4b", "activityType": "OfframpDepositActivity", "type": "OFFRAMP_DEPOSIT", "direction": "CREDIT", "amount": 500.00, "currency": "USD", "status": "SUCCESS", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "OFFRAMP_ACCOUNT", "activityAt": "2026-07-23T11:24:37.000Z", "activityData": { "id": "5c4b3a2e-8e6d-4a2e-9b1c-7d5f8e6d1a2e", "reference": "0173270620673048624933", "currency": "USD", "status": "SUCCESS", "payoutCurrency": "NGN", "amount": 500.00, "rate": 1450.00, "payoutAmount": 725000.00, "recipient": { "id": "5a83377d-7c57-4725-992f-9c50349af917", "accountName": "Jane Doe", "beneficiaryType": "BeneficiaryMobileWalletAccount", "accountIdentifier": "2348012345678", "paymentChannelId": "MOBILE_MONEY_NIGERIA" }, "offrampAccountId": "60037f44-9094-4bd5-a316-21995e8985c9", "createdDate": "2026-07-23T11:22:00.000Z" } }, "timestamp": 1784805877 } ``` # Crypto Beneficiary Management Source: https://docs.onboard.xyz/guides/product-features/stablecoin/beneficiaries Save frequently-used withdrawal destinations as crypto beneficiaries so you don't have to pass a raw wallet address and network on every withdrawal call. * [`GET /ledger/crypto-beneficiaries`](/api-reference/endpoints/crypto-beneficiaries/list) — list saved beneficiaries. * [`POST /ledger/crypto-beneficiaries`](/api-reference/endpoints/crypto-beneficiaries/create) — add a beneficiary (wallet address + network). * [`GET /ledger/crypto-beneficiaries/{beneficiaryId}`](/api-reference/endpoints/crypto-beneficiaries/get-by-id) — fetch a single beneficiary. * [`DELETE /ledger/crypto-beneficiaries/{beneficiaryId}`](/api-reference/endpoints/crypto-beneficiaries/delete) — remove a beneficiary. Adding or removing a beneficiary fires an `account_activity.crypto_beneficiary.*` webhook — see [Webhooks for Stablecoin Transactions](/guides/product-features/stablecoin/webhooks). # Deposits Source: https://docs.onboard.xyz/guides/product-features/stablecoin/deposits ## Getting a deposit address * [`POST /ledger/subaccounts/{subAccountIdRef}/funding-address`](/api-reference/endpoints/stablecoin/create-subaccount-funding-address) — generate a crypto deposit address for a sub-account. * [`GET /ledger/subaccounts/{subAccountIdRef}/funding-address`](/api-reference/endpoints/stablecoin/get-subaccount-funding-address) — fetch a sub-account's existing deposit address. ## Querying deposits Deposits appear as `transaction_activity.crypto_deposit.*` activities. Query them via [Transaction activities](/guides/product-features/transaction-activities/overview), filtered to the relevant account or sub-account. ## Listening to deposit webhooks Subscribe to `transaction_activity.crypto_deposit.*` to be notified the moment a deposit is detected, confirmed, and credited — see [Webhooks for Stablecoin Transactions](/guides/product-features/stablecoin/webhooks). # Getting Supported Tokens and Networks Source: https://docs.onboard.xyz/guides/product-features/stablecoin/supported-tokens Supported stablecoins and networks can change over time, so always confirm what's currently available via the API rather than hard-coding a list. Call [`GET /ledger/assets/{assetCode}/network-tokens`](/api-reference/endpoints/info/get-network-tokens) with an asset code (e.g. `USD`) to get every supported token/network combination, including minimum deposit amounts and withdrawal fees. See [Supported Stablecoins and Networks](/guides/product-features/supported-stablecoins) for a reference table of what's supported today. # Webhooks for Stablecoin Transactions Source: https://docs.onboard.xyz/guides/product-features/stablecoin/webhooks Full payload schemas are in [WebHook Events](/api-reference/webhook-events). | Event | Fires when | | --------------------------------------------- | --------------------------------------------------------------------------------------------------------- | | `account_activity.crypto_beneficiary.created` | A crypto beneficiary is added | | `account_activity.crypto_beneficiary.deleted` | A crypto beneficiary is deleted | | `transaction_activity.crypto_deposit.*` | A crypto deposit is detected, confirmed, or completed (`.created`, `.updated`, `.completed`, `.failed`) | | `transaction_activity.crypto_withdrawal.*` | A crypto withdrawal is created, broadcast, or completed (`.created`, `.updated`, `.completed`, `.failed`) | ### Sample payloads Full field-by-field schemas for every event are in [WebHook Events](/api-reference/webhook-events#transaction-activity-samples). Both crypto event families share the `AccountTransaction` shape for `activityData`; only `direction`, `activityType`, and `type` differ. ```json theme={null} { "event": "account_activity.crypto_beneficiary.created", "data": { "id": "e2a1c4b8-3d5f-4a2e-9b1c-7f8e6d5c4b3a", "address": "0x7BCc5bCBa19DE3C903F062D8fB5fF8d9f818173E", "network": "BASE", "name": "Treasury wallet" }, "timestamp": 1784711523 } ``` ```json theme={null} { "event": "transaction_activity.crypto_deposit.completed", "data": { "id": "8e6d5c4b-3a7f-4a2e-9b1c-2e1a4c8b5d3f", "activityType": "CryptoDepositActivity", "type": "CRYPTO_DEPOSIT", "direction": "CREDIT", "amount": 150.00, "currency": "USD", "status": "SUCCESS", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "SUB_ACCOUNT", "subAccountId": "6f9d3a2e-1b5c-4e88-9a2f-3c7d5e9b1a04", "activityAt": "2026-07-24T10:00:05.000Z", "activityData": { "id": "txn_9f41b3e6c2a", "reference": "REF9F41B3E6C2A", "type": "DEPOSIT", "amount": 150.00, "currency": "USD", "status": "SUCCESS", "categoryTag": "crypto-deposit", "notes": "Deposit of USDC on BASE", "createdDate": "2026-07-24T10:00:00.000Z" } }, "timestamp": 1784887205 } ``` ```json theme={null} { "event": "transaction_activity.crypto_withdrawal.completed", "data": { "id": "8e6d5c4b-3a7f-4a2e-9b1c-2e1a4c8b5d3f", "activityType": "CryptoWithdrawalActivity", "type": "CRYPTO_WITHDRAWAL", "direction": "DEBIT", "amount": 150.00, "currency": "USD", "status": "SUCCESS", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "SUB_ACCOUNT", "subAccountId": "6f9d3a2e-1b5c-4e88-9a2f-3c7d5e9b1a04", "activityAt": "2026-07-24T10:00:05.000Z", "activityData": { "id": "txn_9f41b3e6c2a", "reference": "REF9F41B3E6C2A", "type": "WITHDRAWAL", "amount": -150.00, "currency": "USD", "status": "SUCCESS", "categoryTag": "crypto-withdrawal", "notes": "Withdrawal to USDC on BASE", "createdDate": "2026-07-24T10:00:00.000Z" } }, "timestamp": 1784887205 } ``` # Withdrawals Source: https://docs.onboard.xyz/guides/product-features/stablecoin/withdrawals ## Getting withdrawal fees Withdrawal fees are per network and returned alongside each supported token in [`GET /ledger/assets/{assetCode}/network-tokens`](/api-reference/endpoints/info/get-network-tokens) — check this before initiating a withdrawal, since fees vary significantly by network (for example, Solana and Base withdrawals are typically far cheaper than Ethereum mainnet). ## Initiating a withdrawal Call [`POST /ledger/crypto-transfer`](/api-reference/endpoints/stablecoin/create-crypto-transfer) with either a raw destination address + network, or a saved [crypto beneficiary](/guides/product-features/stablecoin/beneficiaries) ID. ## Querying transfers and webhooks * [`GET /ledger/crypto-transfer/{transferReference}`](/api-reference/endpoints/stablecoin/get-crypto-transfer) — poll a transfer's status by reference. * Subscribe to `transaction_activity.crypto_withdrawal.*` to be notified as the withdrawal progresses — see [Webhooks for Stablecoin Transactions](/guides/product-features/stablecoin/webhooks). # Supported Currencies Source: https://docs.onboard.xyz/guides/product-features/supported-currencies ## Account currency Only **USD** is supported for main account and sub-account currencies today. Call [`GET /ledger/currency/assets`](/api-reference/endpoints/info/get-currency-assets) to get the current list of supported account assets. ## Feature support by currency | Currency | Virtual Account Number | Cash Deposits | Cash Payouts / Offramp | | -------- | ---------------------------------------------- | ------------------------------------------------------------------------ | ---------------------- | | USD | Main account only (may require additional KYC) | — | Main and sub-accounts | | NGN | Main and sub-accounts | Main and sub-accounts (third-party payments not allowed on sub-accounts) | Main and sub-accounts | | EUR | Main account only | — | Main and sub-accounts | | GBP | Main account only | — | Main and sub-accounts | | GHS | — | — | Main and sub-accounts | | IDR | — | — | Main and sub-accounts | | KES | — | — | Main and sub-accounts | All currencies listed under Cash Payouts / Offramp can be withdrawn from both main and sub-accounts. See [Beneficiaries](/guides/product-features/cash-payouts/beneficiaries) for the specific payment channels available per currency. # Supported Stablecoins and Networks Source: https://docs.onboard.xyz/guides/product-features/supported-stablecoins This list can change dynamically. The most reliable way to get available assets and networks is to call [`GET /ledger/assets/{assetCode}/network-tokens`](/api-reference/endpoints/info/get-network-tokens). | Currency | Coin Symbol | Network | Token Network Code | | -------- | ----------- | --------------- | ------------------ | | USD | USDT | Polygon | `USDT_MATIC` | | | | Arbitrum | `USDT_ARB` | | | | Optimism | `USDT_OP` | | | | BNB Smart Chain | `USDT_BSC` | | | | Ethereum | `USDT_ETH` | | | | TRON | `USDT_TRX` | | | | Solana | `USDT_SOL` | | USD | USDC | Polygon | `USDC_MATIC` | | | | Base | `USDC_BASE` | | | | Solana | `USDC_SOL` | | | | Ethereum | `USDC_ETH` | | | | Arbitrum | `USDC_ARB` | | | | BNB Smart Chain | `USDC_BSC` | | | | Optimism | `USDC_OP` | # Breakdown of Activity Types and Data Source: https://docs.onboard.xyz/guides/product-features/transaction-activities/activity-types Every transaction activity has a `type`, a `direction` (`CREDIT` or `DEBIT` relative to the account), and a `status` that progresses through `CREATED` → `UPDATED` → `COMPLETED`/`FAILED`. | Activity type | Direction | Source | | ---------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------- | | Cash deposit | Credit | [Cash Deposits](/guides/product-features/cash-deposits/introduction) | | Cash payment | Debit | [Cash Payouts](/guides/product-features/cash-payouts/introduction) | | Crypto deposit | Credit | [Stablecoin Transactions](/guides/product-features/stablecoin/deposits) | | Crypto withdrawal | Debit | [Stablecoin Transactions](/guides/product-features/stablecoin/withdrawals) | | Offramp deposit | Credit → Debit (auto-converted and paid out) | [Offramp Accounts](/guides/product-features/offramp-accounts/introduction) | | Internal transfer | Credit or Debit | [Virtual Account sub-accounts](/guides/product-features/virtual-account/sub-accounts) | | Account number deposit | Credit | [Virtual Account Number](/guides/product-features/virtual-account/account-number) | Each type's webhook events are documented alongside its product guide, and consolidated in [WebHook Events](/api-reference/webhook-events). # Overview Source: https://docs.onboard.xyz/guides/product-features/transaction-activities/overview Transaction activities give you one unified endpoint to fetch everything that has happened on your account and its sub-accounts — deposits, payouts, transfers, and withdrawals — instead of querying each product's endpoints separately. [`GET /ledger/transaction-activities`](/api-reference/endpoints/transaction-activities/list-all) returns activities across all types. Use [`GET /ledger/accounts/{accountId}/activities`](/api-reference/endpoints/transaction-activities/account-activities) or [`GET /ledger/subaccounts/{subAccountIdRef}/activities`](/api-reference/endpoints/transaction-activities/subaccount-activities) to scope to a single account or sub-account, and the corresponding `.../{activityId}` endpoint to fetch one activity by ID. Continue to [Breakdown of Activity Types and Data](/guides/product-features/transaction-activities/activity-types). # Virtual Account Number Source: https://docs.onboard.xyz/guides/product-features/virtual-account/account-number A virtual account number is a standing, reusable bank account number your customers or counterparties can pay into repeatedly — distinct from a [cash deposit](/guides/product-features/cash-deposits/introduction), which is single-use. A deposit to a bank account passes through the Onboard risk system and FX system before landing in the Virtual Account ## Generating an account number * [`POST /ledger/accounts/{accountId}/account-details`](/api-reference/endpoints/virtual-account-number/create-account-details) — generate a virtual account number for your primary account. * [`POST /ledger/subaccounts/{subAccountIdRef}/account-details`](/api-reference/endpoints/virtual-account-number/create-subaccount-details) — generate a virtual account number for a sub-account. ## Querying deposits Deposits made into a virtual account number appear as `transaction_activity.account_number_deposit.*` events — see [Transaction activities](/guides/product-features/transaction-activities/overview) to query them directly, or subscribe to the [webhook events](/guides/product-features/virtual-account/webhooks) below. See [Supported Currencies](/guides/product-features/supported-currencies) for which currencies support virtual account numbers on main vs. sub-accounts. # Introduction Source: https://docs.onboard.xyz/guides/product-features/virtual-account/introduction The Onboard Business account is a stablecoin-backed USD account. Money can enter or leave in any supported form — stablecoin or fiat — and is held in your account as USD. Stablecoins and fiat flow into and out of the Business Account, which holds funds as USD ## Primary account and sub-accounts Every business gets one **primary account**. Underneath it, you can create any number of **sub-accounts** — each with an independent balance, its own virtual account number, its own crypto deposit addresses, and its own activity feed. Sub-accounts are commonly used to represent your end customers or business units, while still settling through your one primary Onboard relationship. * [Primary account](/guides/product-features/virtual-account/primary-account) * [Sub-accounts](/guides/product-features/virtual-account/sub-accounts) * [Virtual account number](/guides/product-features/virtual-account/account-number) * [Webhooks for Virtual Accounts](/guides/product-features/virtual-account/webhooks) # Primary Account Source: https://docs.onboard.xyz/guides/product-features/virtual-account/primary-account Your primary account is created automatically when your Onboard Business account is approved. ## Retrieving primary account details * [`GET /ledger/accounts`](/api-reference/endpoints/virtual-account/get-accounts) — fetch all accounts your credentials have access to (typically just your primary account). * [`GET /ledger/accounts/{accountId}`](/api-reference/endpoints/virtual-account/get-account-by-id) — fetch a specific account's balance and details by ID. # Sub-accounts Source: https://docs.onboard.xyz/guides/product-features/virtual-account/sub-accounts Sub-accounts let you represent individual customers or business units under your primary account, each with an independent balance. ## Creating sub-accounts Create a sub-account with [`POST /ledger/subaccounts`](/api-reference/endpoints/virtual-account/create-subaccount), passing a `subAccountIdRef` — use your own internal customer or entity identifier here, since it's how you'll reference the sub-account in every subsequent call. ## Updating and deleting * [`PUT /ledger/subaccounts/{subAccountIdRef}`](/api-reference/endpoints/virtual-account/update-subaccount) — rename a sub-account or freeze/unfreeze it. * [`DELETE /ledger/subaccounts/{subAccountIdRef}`](/api-reference/endpoints/virtual-account/delete-subaccount) — delete a sub-account. The sub-account balance must be zero first. ## Inter-account transfers Move funds between your primary account and any sub-account, or between two sub-accounts, to rebalance or settle internally without touching an external rail. # Webhooks for Virtual Accounts Source: https://docs.onboard.xyz/guides/product-features/virtual-account/webhooks Subscribe to these events to react to virtual-account activity in real time. Full payload schemas are in [WebHook Events](/api-reference/webhook-events). ## Account activities | Event | Fires when | | ----------------------------------------- | --------------------------------------------------------------------------- | | `account_activity.sub_account.created` | A sub-account is created | | `account_activity.sub_account.updated` | A sub-account's name or frozen status changes | | `account_activity.sub_account.deleted` | A zero-balance sub-account is deleted | | `account_activity.account_number.created` | A virtual account number is generated for the main account or a sub-account | ## Transaction activities | Event family | Fires when | | ----------------------------------------------- | --------------------------------------------------------------------------------------------- | | `transaction_activity.account_number_deposit.*` | A deposit lands on a virtual account number (`.created`, `.updated`, `.completed`, `.failed`) | | `transaction_activity.internal_transfer.*` | A transfer completes between your main account and a sub-account, or between two sub-accounts | ### Sample payloads Full field-by-field schemas for every event are in [WebHook Events](/api-reference/webhook-events#account-activity-samples). ```json theme={null} { "event": "account_activity.sub_account.created", "data": { "id": "6f9d3a2e-1b5c-4e88-9a2f-3c7d5e9b1a04", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "reference": "customer-8841", "displayName": "Customer 8841", "currency": "USD", "accountBalance": { "balance": 0, "availableBalance": 0 }, "frozen": false, "createdDate": "2026-07-19T15:30:00.000Z" }, "timestamp": 1784475000 } ``` ```json theme={null} { "event": "transaction_activity.account_number_deposit.completed", "data": { "id": "2e1a4c8b-5d3f-4a2e-9b1c-8e6d5c4b3a7f", "activityType": "AccountNumberDepositActivity", "type": "ACCOUNT_NUMBER_DEPOSIT", "direction": "CREDIT", "amount": 100.00, "currency": "USD", "status": "SUCCESS", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "MAIN", "activityAt": "2026-07-20T08:16:45.000Z", "activityData": { "id": "4a2e9b1c-7f8e-4d5c-8b3a-2e1a4c8b5d3f", "amount": 145000.00, "currency": "NGN", "accountCurrency": "USD", "status": "SUCCESS", "settlementAmount": 100.00, "createdDate": "2026-07-20T08:15:00.000Z" } }, "timestamp": 1784535405 } ``` ```json theme={null} { "event": "transaction_activity.internal_transfer.completed", "data": { "id": "3d5f8e6d-5c4b-4a2e-9b1c-9c4b1a2e7d5f", "activityType": "InternalTransferActivity", "type": "INTERNAL_TRANSFER", "direction": "DEBIT", "amount": 500.00, "currency": "USD", "status": "SUCCESS", "accountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "accountType": "MAIN", "activityAt": "2026-07-21T18:05:10.000Z", "activityData": { "reference": "ITR9F41B3E6C2A", "sourceAccountId": "d9e9f9c1-6a3b-4b2e-8b3a-2f1e4d5c6b7a", "destinationAccountId": "6f9d3a2e-1b5c-4e88-9a2f-3c7d5e9b1a04", "amount": 500.00, "currency": "USD", "status": "SUCCESS", "createdDate": "2026-07-21T18:04:22.000Z" } }, "timestamp": 1784657110 } ``` # Collections from Local Currency Source: https://docs.onboard.xyz/guides/use-cases/collections-local-currency Collect local currency from customers and receive it as USD stablecoin in your main account — with the option to segment collections by product or business line using sub-accounts. A local currency cash deposit flows into the Onboard account Use the [cash deposit flow](/guides/product-features/cash-deposits/flow) to collect payments, and create a [sub-account](/guides/product-features/virtual-account/sub-accounts) per product line if you want segmented balances and activity feeds. # Cross-border Payment Source: https://docs.onboard.xyz/guides/use-cases/cross-border-payment Receive funds in one country's local currency and pay out in another's, settling through your USD-denominated Onboard account in between. A local currency cash deposit settles through the Onboard Account, then pays out as a cash payment in another local currency Use the [cash deposit flow](/guides/product-features/cash-deposits/flow) to collect funds in the sender's local currency. Use the [cash payout flow](/guides/product-features/cash-payouts/flow) to send funds out in the recipient's local currency, from the same account. # Crypto Payouts Source: https://docs.onboard.xyz/guides/use-cases/crypto-payouts The Onboard account supports a number of blockchain networks — initiate multiple crypto payouts using the crypto transfers endpoint. The Onboard account initiates crypto transfers Call [`POST /ledger/crypto-transfer`](/api-reference/endpoints/stablecoin/create-crypto-transfer) per payout, optionally against a saved [crypto beneficiary](/guides/product-features/stablecoin/beneficiaries), and track each with [`GET /ledger/crypto-transfer/{transferReference}`](/api-reference/endpoints/stablecoin/get-crypto-transfer) or the `transaction_activity.crypto_withdrawal.*` webhook. # Stablecoin Account Source: https://docs.onboard.xyz/guides/use-cases/stablecoin-account As a fintech, you can use Onboard to provide stablecoin-powered accounts to your customers while Onboard handles the heavy lifting of dealing with the blockchain, security, and compliance. Depending on your needs, choose one of the following approaches. ## Approach 1: Use Onboard's ledger Use Onboard's ledger directly to manage a stablecoin-backed virtual account per customer. [`POST /ledger/subaccounts`](/api-reference/endpoints/virtual-account/create-subaccount), using your internal customer identifier as the `subAccountIdRef`. Generate a crypto deposit address for the sub-account with [`POST /ledger/subaccounts/{subAccountIdRef}/funding-address`](/api-reference/endpoints/stablecoin/create-subaccount-funding-address), then listen for `transaction_activity.crypto_deposit.*` webhooks to notify your customer when funds arrive. Initiate withdrawals directly from the sub-account with [`POST /ledger/crypto-transfer`](/api-reference/endpoints/stablecoin/create-crypto-transfer), and listen for `transaction_activity.crypto_withdrawal.*` webhooks. For onramp, generate a [virtual account number](/guides/product-features/virtual-account/account-number) or a one-off [cash deposit](/guides/product-features/cash-deposits/introduction) per sub-account. For offramp, initiate a [cash payout](/guides/product-features/cash-payouts/introduction) directly from the sub-account. ## Approach 2: Use your own ledger If you already run your own USD/account ledger and only want Onboard's stablecoin rail for receiving deposits per customer, this approach fits best. Same as Approach 1 — [`POST /ledger/subaccounts`](/api-reference/endpoints/virtual-account/create-subaccount) with your internal customer identifier. Generate a deposit address, listen for `transaction_activity.crypto_deposit.*`, and on a successful deposit: debit the Onboard sub-account (transfer to your main account), then credit the customer's balance in your own ledger. Debit or hold the customer's balance in your own system for the withdrawal amount plus fees, initiate the withdrawal from your Onboard main account, and listen for `transaction_activity.crypto_withdrawal.*` (or poll [`GET /ledger/crypto-transfer/{transferReference}`](/api-reference/endpoints/stablecoin/get-crypto-transfer)) before releasing the hold. # Stablecoin Offramp Source: https://docs.onboard.xyz/guides/use-cases/stablecoin-offramp Onboard's offramp accounts give you a system for stablecoin offramp: a generated address connected to a bank account or mobile wallet, with automatic conversion to fiat. A blockchain deposit lands in the Offramp account and auto-converts into a cash payment See [Offramp Accounts](/guides/product-features/offramp-accounts/introduction) for the full setup process. # Stablecoin Onramp Source: https://docs.onboard.xyz/guides/use-cases/stablecoin-onramp Combine cash deposits with a crypto withdrawal to onramp cash into a target stablecoin address. Onboard supports a number of EVM chains as well as Solana and Tron. A local currency cash deposit lands in the Onboard account and withdraws out as a stablecoin crypto transfer Run the [cash deposit flow](/guides/product-features/cash-deposits/flow) to bring local currency into your account. Once the deposit completes, call [`POST /ledger/crypto-transfer`](/api-reference/endpoints/stablecoin/create-crypto-transfer) to send the equivalent value out to the target address. # Cross-border payment rails Source: https://docs.onboard.xyz/index Build cross-border payments into your product with the Onboard API: stablecoin wallets, local-currency payouts, and account issuance for fintechs and platforms.
Onboard Business

Move money without borders

Onboard for Business gives you the tools you need to automate your business payment needs, with support for stablecoins and cash money. With our APIs you can move money across stablecoin and traditional banking rails, create your own stablecoin-powered banking solution, receive payments in cash and stablecoins, and make payouts — all from one platform.

Learn about Onboard Business accounts and how to get set up. Step-by-step guides for authentication, webhooks, and every product. Full reference for every supported API endpoint. See how fintechs use Onboard to build stablecoin accounts, cross-border payments, and more.

What you can build

Stablecoin-backed USD accounts with a sub-account system for your customers. Collect local currency and receive it in your account, converted to USD stablecoin. Send fiat payouts to bank accounts and mobile wallets across supported currencies. Generate stablecoin deposit addresses that auto-convert and settle to a bank account. Send and receive stablecoins across supported EVM chains, Solana, and Tron. Manage fiat and crypto beneficiaries for repeatable payouts.