---
title: "Create Onramp"
method: POST
path: "/v1/onramps"
tags: ["public.onramps"]
---

# Create Onramp

`POST /v1/onramps`

Creates either a temporary or permanent onramp configuration. Include developer_fee.percentage to keep 0% to 50% of each received deposit; deposit responses and webhooks show the developer fee and customer amount separately from Daya fees. Requires an idempotency key in the X-Idempotency-Key header.

## Headers

- `X-Idempotency-Key` string, required

## Request body

- CreateOnrampRequest
  - `amount` integer
  - `customer` OnrampCustomerRequest, required
    - `customer_id` string
    - `email` string
    - `first_name` string
    - `last_name` string
    - `verification` CustomerVerificationRequest
      - `bank_account` BankAccountRequest
        - `account_number` string
        - `bank_code` string
      - `bvn` string
      - `image_url` string — ImageURL supports either an HTTPS URL or a base64 data URL up to 1 MiB decoded, such as data:image/jpeg;base64,...
      - `phone_number` string, required
  - `developer_fee` DeveloperFeeRequest
    - `percentage` string, required — Percentage of each received deposit that the merchant keeps. Use a decimal string from 0 to 50.
  - `rate_id` string
  - `settlement` SettlementRequest, required
    - `asset` 'USDC' | 'USDT', required
    - `chain` 'APTOS' | 'BASE' | 'CELO' | 'ETHEREUM' | 'POLYGON' | 'SOLANA' | 'TRON'
    - `destination_address` string
    - `mode` 'ONCHAIN' | 'INTERNAL_BALANCE', required
  - `type` 'TEMPORARY' | 'PERMANENT', required

## Response `201`

Created

- CreateOnrampResponse
  - `amount` string
  - `currency` string
  - `customer_id` string
  - `developer_fee` DeveloperFeeConfigResponse
    - `percentage` string — Percentage configured for deposits received through this account or receive address.
  - `onramp_id` string
  - `rate_expires_at` string
  - `rate_id` string
  - `settlement` SettlementDetails
    - `asset` 'USDC' | 'USDT'
    - `chain` 'APTOS' | 'BASE' | 'CELO' | 'ETHEREUM' | 'POLYGON' | 'SOLANA' | 'TRON'
    - `destination_address` string
    - `mode` 'ONCHAIN' | 'INTERNAL_BALANCE'
  - `type` 'TEMPORARY' | 'PERMANENT'
  - `virtual_account` VirtualAccountDetails
    - `account_name` string
    - `account_number` string
    - `bank_name` string
    - `expires_at` string

## Other responses

- `400` — Invalid request
- `401` — Unauthorized
- `409` — Idempotency conflict
- `429` — Identical customer verification was recently attempted
- `500` — Internal server error
- `502` — Verification or virtual account provisioning failed

---

[API](https://skmtc.dev/daya/apis/daya-external-api-public-api.md) · [All operations](https://skmtc.dev/daya/apis/daya-external-api-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/daya/daya-external-api-public-api/revisions/5fc72bf91a48/schema)
