Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.dakota.xyz/llms.txt

Use this file to discover all available pages before exploring further.

This page covers flows that branch off the core walkthrough in Common Flows. Read that page first — it introduces Customer, Recipient, Destination, and Account. Everything here assumes those are already in place. On this page:

One-off Offramp (Single USD Payout)

Use a one-off offramp when you need a single USD payout — a vendor invoice, a customer refund, a scheduled disbursement — and want to embed a human-readable reference on the bank wire. One-offs generate a single-use crypto deposit address that’s discarded after the transaction completes. What one-off offramps give you over a reusable offramp account:
  • payment_reference — text carried into the bank wire. Per-rail constraints:
    • ACH — up to 18 chars. Letters, digits, and spaces only (no hyphens or punctuation).
    • Wire — up to 140 chars. No character restrictions.
    • SEPA — 6 to 140 chars. Letters, digits, spaces, and & - . /.
    • SWIFT — up to 140 chars. Letters, digits, spaces, and , ..
    Your recipient sees this on their statement and uses it to reconcile against an invoice number.
  • destination_payment_rail — override the rail per transaction (e.g. force fedwire instead of the destination’s default ach).
  • developer_fee_bps — per-transaction developer fee override.

Create the One-off Transaction

Prerequisite: a bank Destination (destination_type: "fiat_us") already attached to a Recipient for this Customer — see Add a Bank Destination.
curl -X POST https://api.platform.dakota.xyz/transactions \
  -H "X-API-Key: $DAKOTA_API_KEY" \
  -H "X-Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "transaction_type": "one_off",
    "customer_id": "2LfTd6QQrUyPKwRR9qMMyk7CMHS",
    "amount": "1250.00",
    "source_network_id": "ethereum-mainnet",
    "source_asset": "USDC",
    "destination_id": "2LfYm5KMnRvLFtRP7nJJug4zBAN",
    "destination_asset": "USD",
    "destination_payment_rail": "ach",
    "payment_reference": "INV 2024 042"
  }'
Response:
{
  "id": "2LfZn6LNoSvMGuSQ0pLLof1OneA",
  "resource_type": "one_off",
  "status": "awaiting_funds",
  "crypto_address": "0xabc...",
  "source_network_id": "ethereum-mainnet",
  "source_asset": "USDC",
  "send_amount": "1250.00",
  "payment_reference": "INV 2024 042"
}
Send exactly send_amount to crypto_address. The address is single-use and discarded after the transaction completes. Dakota converts the stablecoin and wires USD to the bank Destination with INV 2024 042 included as the payment reference. Subscribe to transaction.one_off.created and transaction.one_off.updated to track status.

Simulate the Deposit (Sandbox)

Sandbox skips the on-chain send — trigger the full transaction lifecycle by simulating a crypto deposit to the crypto_address returned above. Pass that address as wallet_address:
curl -X POST https://api.platform.sandbox.dakota.xyz/sandbox/simulate/inbound \
  -H "X-API-Key: $DAKOTA_API_KEY" \
  -H "X-Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "simulation_id": "sim_oneoff_deposit_001",
    "type": "crypto_inbound",
    "wallet_address": "0xabc...",
    "amount": "1250.00",
    "currency": "USDC",
    "scenario": "success_immediate"
  }'
The simulate call is accepted synchronously and the provider then fires the same event sequence you’d see in production: one transaction.one_off.created (status pending), three transaction.one_off.updated as the transaction moves through the internal funds_received → funds_swept → outbound_staged states (all three emitted with status processing), and a final transaction.one_off.updated with status completed. The whole sequence runs in roughly 60 seconds. One-offs are single-use, so each temporary_address accepts exactly one simulated deposit — subsequent calls with a new simulation_id against the same address are no-ops. Two sandbox artifacts to be aware of. First, crypto_details.source_network_id in the webhooks is always base-sepolia because the mock Privy payload hardcodes Base Sepolia regardless of the one-off’s source_network_id. Second, deposit_tx_hash is synthetic rather than a real on-chain hash. Event shape, status transitions, and receipt breakdown all match production exactly.

One-off Swap (Single Cross-Chain Swap)

Use a one-off swap when the target network varies per swap (a reusable swap account pins destination_network_id) or you want to apply a different developer_fee_bps on this specific swap. payment_reference and destination_payment_rail are offramp-only and do not apply to swaps.

Create the One-off Swap

Prerequisite: a crypto Destination on the target network/asset already attached to a Recipient — see Add a Crypto Destination.
curl -X POST https://api.platform.dakota.xyz/transactions \
  -H "X-API-Key: $DAKOTA_API_KEY" \
  -H "X-Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "transaction_type": "one_off",
    "customer_id": "2LfTd6QQrUyPKwRR9qMMyk7CMHS",
    "amount": "500.00",
    "source_network_id": "ethereum-mainnet",
    "source_asset": "USDC",
    "destination_id": "2LfYm5KMnRvLFtRP7nJJug4zJEP",
    "destination_asset": "USDT",
    "destination_network_id": "polygon-mainnet",
    "developer_fee_bps": 25
  }'
Response:
{
  "id": "2LfZn6LNoSvMGuSQ0pLLswOffOn",
  "resource_type": "one_off",
  "status": "awaiting_funds",
  "crypto_address": "0xabc...",
  "source_network_id": "ethereum-mainnet",
  "source_asset": "USDC",
  "destination_asset": "USDT",
  "destination_network_id": "polygon-mainnet",
  "send_amount": "500.00"
}
Send exactly send_amount to crypto_address. Dakota converts and delivers the destination asset on the target network. Same transaction.one_off.* webhooks as one-off offramp.

Simulate the Deposit (Sandbox)

Use the same simulate call as the one-off offramp flow — pass the swap’s crypto_address as wallet_address. The event sequence and sandbox artifacts (hardcoded base-sepolia in crypto_details.source_network_id, synthetic deposit_tx_hash) are identical.