Skip to main content
POST
/
v1
/
offramps
Create an offramp
curl --request POST \
  --url https://api.daya.co/v1/offramps \
  --header 'Content-Type: application/json' \
  --header 'X-Api-Key: <x-api-key>' \
  --header 'X-Idempotency-Key: <x-idempotency-key>' \
  --data '
{
  "type": "<string>",
  "customer": {
    "customer.customer_id": "<string>",
    "customer.email": "<string>",
    "customer.first_name": "<string>",
    "customer.last_name": "<string>"
  },
  "chain": "<string>",
  "asset": "<string>",
  "settlement": {
    "settlement.mode": "<string>",
    "settlement.rate_id": "<string>",
    "settlement.destination_bank": {
      "settlement.destination_bank.account_name": "<string>",
      "settlement.destination_bank.account_number": "<string>",
      "settlement.destination_bank.bank_code": "<string>"
    }
  }
}
'
{
  "id": "a50e8400-e29b-41d4-a716-446655440000",
  "type": "TEMPORARY",
  "customer_id": "650e8400-e29b-41d4-a716-446655440000",
  "address": "0x1a2b3c4d5e6f7890abcdef1234567890abcdef12",
  "chain": "ETHEREUM",
  "asset": "USDC",
  "status": "ACTIVE",
  "settlement": {
    "mode": "INTERNAL_BALANCE",
    "rate_id": null,
    "destination_bank": null
  },
  "created_at": "2026-01-05T15:04:05Z",
  "updated_at": "2026-01-05T15:04:05Z"
}

Overview

Create an offramp that generates a crypto deposit address for receiving stablecoin deposits. Offramps can be temporary (short-lived, locked rate) or permanent (long-lived, floating rate). Deposits are settled to an internal balance or paid out as NGN.

Authentication

X-Api-Key
string
required
Your merchant API key
X-Idempotency-Key
string
required
Unique idempotency key to prevent duplicate offramp creation

Request Body

type
string
required
Offramp typeAllowed values: TEMPORARY, PERMANENT
  • TEMPORARY: Short-lived deposit address, locked to rate_id
  • PERMANENT: Long-lived deposit address, uses current rate at settlement
customer
object
required
Customer information. Either customer_id or email must be provided.
chain
string
required
Blockchain network for the deposit addressAllowed values: APTOS, BASE, CELO, ETHEREUM, POLYGON, SOLANA, TRONSee Supported Chains for details on which assets are available on each chain.
asset
string
required
Stablecoin asset to receiveAllowed values: USDC, USDT
settlement
object
required
Settlement configuration

Request Examples

{
  "type": "TEMPORARY",
  "customer": {
    "email": "user@example.com"
  },
  "chain": "ETHEREUM",
  "asset": "USDC",
  "settlement": {
    "mode": "INTERNAL_BALANCE"
  }
}

Response

id
string
required
Unique offramp identifier (UUID)
type
string
required
Offramp type: TEMPORARY or PERMANENT
customer_id
string
required
Associated customer ID (UUID)
address
string
required
Generated crypto deposit address
chain
string
required
Blockchain network: APTOS, BASE, CELO, ETHEREUM, POLYGON, SOLANA, or TRON
asset
string
required
Stablecoin asset: USDC or USDT
status
string
required
Current offramp status. New offramps start as ACTIVE.
settlement
object
required
Settlement configuration
created_at
string
required
When the offramp was created (ISO 8601 timestamp)
updated_at
string
required
When the offramp was last updated (ISO 8601 timestamp)

Success Responses

{
  "id": "a50e8400-e29b-41d4-a716-446655440000",
  "type": "TEMPORARY",
  "customer_id": "650e8400-e29b-41d4-a716-446655440000",
  "address": "0x1a2b3c4d5e6f7890abcdef1234567890abcdef12",
  "chain": "ETHEREUM",
  "asset": "USDC",
  "status": "ACTIVE",
  "settlement": {
    "mode": "INTERNAL_BALANCE",
    "rate_id": null,
    "destination_bank": null
  },
  "created_at": "2026-01-05T15:04:05Z",
  "updated_at": "2026-01-05T15:04:05Z"
}

Error Responses

{
  "error": {
    "code": "validation_error",
    "message": "either customer.customer_id or customer.email is required"
  }
}

Validation Rules

Either customer.customer_id or customer.email must be provided (not both optional, at least one required).
  • Generates a short-lived crypto deposit address
  • For NGN_PAYOUT: settlement.rate_id and settlement.destination_bank are required
  • For INTERNAL_BALANCE: settlement.rate_id and settlement.destination_bank must NOT be set
  • Generates a long-lived crypto deposit address
  • Uses the current rate at the time of deposit settlement
  • For NGN_PAYOUT: settlement.rate_id and settlement.destination_bank are required
  • For INTERNAL_BALANCE: settlement.rate_id and settlement.destination_bank must NOT be set
When settlement.mode is NGN_PAYOUT:
  • destination_bank.account_name is required
  • destination_bank.account_number must be 6-32 characters
  • destination_bank.bank_code must be 3-16 characters
Always resolve the bank account first using POST /v1/banks/resolve before creating the offramp. Invalid bank accounts will be rejected.

Best Practices

1

Resolve bank account before creation (NGN payout)

Always call POST /v1/banks/resolve to verify the account number and get the account holder’s name before creating an offramp with NGN_PAYOUT. Invalid accounts will be rejected.
2

Get fresh rate before creation (NGN payout)

Call GET /v1/rates?side=SELL immediately before creating an offramp with NGN_PAYOUT to ensure maximum validity window.
3

Use customer_id for returning customers

Create customers once via POST /v1/customers, then reference them by customer_id in subsequent offramp requests.
4

Use idempotency keys

Always include a unique X-Idempotency-Key header to prevent duplicate offramp creation on retries.
5

Choose the right chain

Consider transaction fees and confirmation times when selecting a chain. See Supported Chains for details.

Next Steps

List Offramps

Query offramps with filters

Get Rates

Fetch current exchange rates before creating an offramp

Customer API

Pre-create customers before offramp requests

Webhooks

Listen for deposit and settlement events