curl --request POST \
--url https://api.platform.dakota.xyz/accounts \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"account_type": "onramp",
"capabilities": [
"us_bank_account"
],
"crypto_destination_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"destination_network_id": "ethereum-mainnet",
"source_asset": "USD",
"destination_asset": "USDC",
"developer_fee_bps": 50
}
'{
"id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"account_type": "onramp",
"bank_account": {
"id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"capabilities": [
"ach",
"fedwire"
],
"aba_routing_number": "123456789",
"aba_wire_routing_number": "123456789",
"account_number": "123456789",
"account_type": "checking",
"bic": "DEUTDEFFXXX",
"iban": "DE89370400440532013000",
"account_holder_name": "John Doe",
"account_holder_address": {
"street1": "123 Main St",
"street2": "Apt 4B",
"street3": "Building C",
"city": "San Francisco",
"region": "California",
"postal_code": "94105",
"country": "US"
},
"account_holder_phone": "1234567890",
"bank_name": "Bank of America",
"bank_address": {
"street1": "123 Main St",
"street2": "Apt 4B",
"street3": "Building C",
"city": "San Francisco",
"region": "California",
"postal_code": "94105",
"country": "US"
},
"bank_phone": "+12345678900"
},
"destination": {
"destination_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"destination_type": "crypto",
"name": "My Ethereum Wallet",
"crypto_address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"family": "evm",
"network_id": "ethereum-mainnet"
},
"source_crypto_address": "0x1234",
"source_family": "evm",
"source_network_id": "ethereum-mainnet",
"source_asset": "USDC",
"destination_asset": "USDC",
"rail": "ach",
"destination_rail": "ach"
}Create an account
Create a new onramp, offramp, or swap account.
curl --request POST \
--url https://api.platform.dakota.xyz/accounts \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"account_type": "onramp",
"capabilities": [
"us_bank_account"
],
"crypto_destination_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"destination_network_id": "ethereum-mainnet",
"source_asset": "USD",
"destination_asset": "USDC",
"developer_fee_bps": 50
}
'{
"id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"account_type": "onramp",
"bank_account": {
"id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"capabilities": [
"ach",
"fedwire"
],
"aba_routing_number": "123456789",
"aba_wire_routing_number": "123456789",
"account_number": "123456789",
"account_type": "checking",
"bic": "DEUTDEFFXXX",
"iban": "DE89370400440532013000",
"account_holder_name": "John Doe",
"account_holder_address": {
"street1": "123 Main St",
"street2": "Apt 4B",
"street3": "Building C",
"city": "San Francisco",
"region": "California",
"postal_code": "94105",
"country": "US"
},
"account_holder_phone": "1234567890",
"bank_name": "Bank of America",
"bank_address": {
"street1": "123 Main St",
"street2": "Apt 4B",
"street3": "Building C",
"city": "San Francisco",
"region": "California",
"postal_code": "94105",
"country": "US"
},
"bank_phone": "+12345678900"
},
"destination": {
"destination_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"destination_type": "crypto",
"name": "My Ethereum Wallet",
"crypto_address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"family": "evm",
"network_id": "ethereum-mainnet"
},
"source_crypto_address": "0x1234",
"source_family": "evm",
"source_network_id": "ethereum-mainnet",
"source_asset": "USDC",
"destination_asset": "USDC",
"rail": "ach",
"destination_rail": "ach"
}Authorizations
Headers
Unique key to ensure request idempotency. If the same key is used within a certain time window, the original response will be returned instead of executing the request again.
Sandbox-only. Applies a preset failure or behavior mode for the request, selecting a coherent combination of error step, status, and message. The full set of scenarios is also exposed dynamically via GET /sandbox/scenarios along with descriptions and per-rail applicability.
Effective only on https://api.platform.sandbox.dakota.xyz. Ignored in production.
happy_path, delayed_settlement, insufficient_funds, compliance_block, invalid_account, provider_maintenance, network_congestion, kyb_manual_review, kyb_rejected, kyb_expired, network_timeout, intermittent_errors, account_frozen, document_expired, invalid_swift "insufficient_funds"
Sandbox-only. Names the pipeline step at which the injected error fires. Pair with X-Sandbox-Error-Status and (optionally) X-Sandbox-Error-Message to drive a deterministic failure mode at a known point in the request lifecycle. Values longer than 100 characters are ignored.
Effective only on https://api.platform.sandbox.dakota.xyz. Ignored in production.
transaction_processing, compliance_check, account_validation, provider_call, kyb_submission, kyb_approval, network_call 100"provider_call"
Sandbox-only. Sets the HTTP status code returned when the sandbox injects an error at the configured step (see X-Sandbox-Error-Step). Must be a valid HTTP status code in the range 100-599; values outside that range are ignored. Status codes >= 400 cause the request to short-circuit immediately with a structured error response.
Effective only on https://api.platform.sandbox.dakota.xyz. Ignored in production.
100 <= x <= 599503
Sandbox-only. Sets the human-readable message field of the injected sandbox error response. Truncated values longer than 500 characters are ignored.
Effective only on https://api.platform.sandbox.dakota.xyz. Ignored in production.
500"Provider temporarily unavailable for maintenance."
Body
Unified account create request for onramp/offramp/swap.
One schema serves all three account types, so its properties are the
UNION of the three shapes: account_type decides which of them are
read. account_type is therefore the only field this schema can mark
required ā everything else is required per type, and that contract is
this table:
| Field | onramp | offramp | swap |
|---|---|---|---|
capabilities | required | ignored | ignored |
rail | optional | required | ignored |
crypto_destination_id | required | ignored | required |
fiat_destination_id | ignored | required | ignored |
destination_network_id | required | ignored | required |
source_network_id | ignored | required | required |
source_asset | required | required | required |
destination_asset | required | required | required |
payment_reference | rejected | optional | rejected |
return_address | ignored | optional | ignored |
return_crypto_address | ignored | ignored | optional |
"Ignored" means the field is accepted and has no effect ā sending it
does not create the routing it names, so do not rely on it. The one
exception is payment_reference, which is REJECTED rather than ignored
on the types that cannot deliver it (see that field).
rail on an onramp is optional because the account's inbound rails
come from capabilities. swift and sepa must appear in
capabilities and narrow the account to that rail. ach, fedwire
and fednow must also appear in capabilities, but all resolve to
us_bank_account ā the same result as omitting rail when the
capabilities include a US rail. us_bank_account itself is accepted
as rail regardless of the capabilities list.
A required field that you omit returns 400 (invalid-request or
invalid-identifier, depending on the field), with a detail that
identifies the problem.
Unified account family for account resources.
onramp, offramp, swap "onramp"
List of payment capabilities supported by a rail. Multiple values may
be supplied; the list is not limited to one entry. Which values are
valid depends on the resource: on-ramp accounts accept any rail and
expand us_bank_account to ach and fedwire; IBAN destinations
accept swift and sepa only.
1Type of payment rail capability supported. For onramp accounts, us_bank_account indicates the account accepts ACH, Wire (Fedwire), and FedNow deposits interchangeably. fednow is the FedNow instant US-domestic USD rail for payouts and deposits ā $500k per-transaction cap on payouts; a payout destination whose bank cannot receive FedNow is rejected at account creation with problem type https://docs.dakota.xyz/api-reference/errors#fednow-destination-unreachable ā route that destination over ach instead. swift is the international USD wire rail: gated on the customer's international_wire capability, USD only, payouts target fiat_iban destinations, and deposit instructions carry the BIC and the beneficiary address. Intermediary banks may deduct fees en route, so the amount received can be lower than the amount sent. sepa is not currently offered.
ach, fedwire, swift, us_bank_account, fednow ["ach", "fedwire"]
Type of payment rail capability supported. For onramp accounts, us_bank_account indicates the account accepts ACH, Wire (Fedwire), and FedNow deposits interchangeably. fednow is the FedNow instant US-domestic USD rail for payouts and deposits ā $500k per-transaction cap on payouts; a payout destination whose bank cannot receive FedNow is rejected at account creation with problem type https://docs.dakota.xyz/api-reference/errors#fednow-destination-unreachable ā route that destination over ach instead. swift is the international USD wire rail: gated on the customer's international_wire capability, USD only, payouts target fiat_iban destinations, and deposit instructions carry the BIC and the beneficiary address. Intermediary banks may deduct fees en route, so the amount received can be lower than the amount sent. sepa is not currently offered.
ach, fedwire, swift, us_bank_account, fednow "ach"
KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.
27^[0-9A-Za-z]{27}$"1NFHrqBHb3cTfLVkFSGmHZqdDPi"
KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.
27^[0-9A-Za-z]{27}$"1NFHrqBHb3cTfLVkFSGmHZqdDPi"
Identifier for a blockchain network
ethereum-mainnet, ethereum-sepolia, ethereum-goerli, ethereum-holesky, solana-mainnet, solana-devnet, solana-testnet, base-mainnet, base-sepolia, arbitrum-mainnet, arbitrum-sepolia, optimism-mainnet, optimism-sepolia, polygon-mainnet, polygon-amoy 1 - 30"ethereum-mainnet"
Source network ID or wildcard network for crypto input.
"ethereum-mainnet"
Asset to send into the account.
1"USDC"
Asset to receive at the destination.
1"USDC"
A unique identifier for a specific account on a specific blockchain. When rendered as a string, it has the syntax: :// (e.g., ethereum-mainnet://0x165cd37b4c644c2921454429e7f9358d18a45e14)
Show child attributes
Show child attributes
A unique identifier for a specific account on a specific blockchain. When rendered as a string, it has the syntax: :// (e.g., ethereum-mainnet://0x165cd37b4c644c2921454429e7f9358d18a45e14)
Show child attributes
Show child attributes
Developer fee in basis points (1 bp = 0.01%).
0 <= x <= 1000050
Hard cap on how many transactions this account may ever create. A
transaction is one convert-and-forward of funds received at the
account through to its destination, so 1 makes the account a
one-off and N lets one account serve N payments.
Omit for the default, which is unchanged: the account is uncapped and keeps sweeping every deposit indefinitely (a durable, standing account).
Reaching the cap refuses further deposits; it does not turn the deposit details off. Once the cap is used up:
- Deposits sent to the account are refused. They are not returned to the sender ā the funds still arrive and are then held pending manual intervention. Nothing is converted, nothing is forwarded, and no transaction appears on the account for them. Stop sending to the deposit details once the cap is reached.
- The account is closed and stops serving new payments.
- This is not recoverable through this API.
max_transactionsis immutable ā it cannot be raised, and a closed account cannot be reopened ā so a capped-out account is finished. Create a new account (with new deposit details) to keep receiving.
A slot is consumed by any transaction in flight or delivered, not only a successful one. A slot is released only when a transaction ends with the value not staying with the recipient: canceled, rejected, reversed, or refunded. A failed or returned transaction keeps its slot, because its funds are still held and it can still be retried, until it is refunded. Size the cap against the number of deposits you expect, not the number of successes you need. Releasing a slot does not reopen a closed account.
The cap is checked as each deposit arrives, so deposits that race
each other can briefly overshoot N; the account closes on the next
one.
x >= 11
Reference carried on the outbound fiat transfers this account makes. It is passed through to the bank as the payment's reference ā the wire message to the creditor, or the ACH addenda ā so it is what the payee sees against the credit. Some payees and rails require one to reconcile an incoming payment at all.
This is ACCOUNT-LEVEL, unlike the payment_reference on a one-off
transaction, which is per payment: EVERY sweep out of this account
carries the SAME reference. If each payment needs its own
reference, use a one-off transaction, or one account per reference.
Only an outbound FIAT leg carries it, so this applies to offramp
accounts. Setting it on an onramp or swap account is REJECTED
with a 400: those sweep to a crypto address, where no reference is
delivered, so accepting it would store a value the payee can never
see. On SWIFT the reference is carried as the wire's remittance
information; whether the payee sees it depends on the receiving
bank and any intermediaries, so do not rely on it for payee-side
reconciliation. ACH and wire (fedwire, us_bank_account)
deliver it as the addenda / wire message.
Validated against the account's rail with the same per-rail rules
as a one-off's payment_reference ā ACH at most 18 characters and
letters/numbers/spaces only, wire (fedwire, us_bank_account) at
most 140 characters 6-140, SWIFT 5-140 across at most 4
lines of 35 characters (letters, numbers, spaces, commas, and
periods only).
Omit for the default, which is unchanged: no reference is attached. An empty string means the same thing and is accepted ā a client that always sends the field should not have to omit it to say "none", and an empty value must never be the thing that rejects an otherwise valid crypto account.
140"Invoice 12345"
Response
Account created successfully.
Unified account response for onramp/offramp/swap.
KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.
27^[0-9A-Za-z]{27}$"1NFHrqBHb3cTfLVkFSGmHZqdDPi"
Unified account family for account resources.
onramp, offramp, swap "onramp"
Unified schema for bank accounts.
Show child attributes
Show child attributes
Response for a crypto destination.
- Crypto Destination Response
- Crypto Destination Response
- Crypto Destination Response
- US Fiat Destination Response
- IBAN Fiat Destination Response
Show child attributes
Show child attributes
Source crypto address for offramp/swap accounts.
"0x1234"
Blockchain family for the crypto account.
evm, solana "evm"
Identifier for a blockchain network
ethereum-mainnet, ethereum-sepolia, ethereum-goerli, ethereum-holesky, solana-mainnet, solana-devnet, solana-testnet, base-mainnet, base-sepolia, arbitrum-mainnet, arbitrum-sepolia, optimism-mainnet, optimism-sepolia, polygon-mainnet, polygon-amoy 1 - 30"ethereum-mainnet"
Asset sent into the account.
"USDC"
Asset received at the destination.
"USDC"
Type of payment rail capability supported. For onramp accounts, us_bank_account indicates the account accepts ACH, Wire (Fedwire), and FedNow deposits interchangeably. fednow is the FedNow instant US-domestic USD rail for payouts and deposits ā $500k per-transaction cap on payouts; a payout destination whose bank cannot receive FedNow is rejected at account creation with problem type https://docs.dakota.xyz/api-reference/errors#fednow-destination-unreachable ā route that destination over ach instead. swift is the international USD wire rail: gated on the customer's international_wire capability, USD only, payouts target fiat_iban destinations, and deposit instructions carry the BIC and the beneficiary address. Intermediary banks may deduct fees en route, so the amount received can be lower than the amount sent. sepa is not currently offered.
ach, fedwire, swift, us_bank_account, fednow "ach"
Type of payment rail capability supported. For onramp accounts, us_bank_account indicates the account accepts ACH, Wire (Fedwire), and FedNow deposits interchangeably. fednow is the FedNow instant US-domestic USD rail for payouts and deposits ā $500k per-transaction cap on payouts; a payout destination whose bank cannot receive FedNow is rejected at account creation with problem type https://docs.dakota.xyz/api-reference/errors#fednow-destination-unreachable ā route that destination over ach instead. swift is the international USD wire rail: gated on the customer's international_wire capability, USD only, payouts target fiat_iban destinations, and deposit instructions carry the BIC and the beneficiary address. Intermediary banks may deduct fees en route, so the amount received can be lower than the amount sent. sepa is not currently offered.
ach, fedwire, swift, us_bank_account, fednow "ach"
Was this page helpful?

