> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daya.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Onramps

> Collect Naira (NGN) from customers and send them stablecoins

## Overview

An **onramp** lets your customer pay Naira (NGN) into a Daya bank account. Daya records the incoming money as a deposit, then sends the value as stablecoins.

New integrations create onramps with [Funding Accounts](/concepts/funding-accounts). In the API, an onramp is a funding account with:

| Field      | Value                      |
| ---------- | -------------------------- |
| `rail`     | `NGN_VIRTUAL_ACCOUNT`      |
| `currency` | `NGN`                      |
| `type`     | `TEMPORARY` or `PERMANENT` |

<Info>
  The older `/v1/onramps` routes still exist for existing integrations. New integrations should create onramps with `/v1/funding-accounts`.
</Info>

## Customer

Every onramp belongs to a customer. Create the customer first with [`POST /v1/customers`](/api-reference/customers/create-customer), then pass `customer.customer_id` when creating the funding account.

Customers are scoped to your merchant account. The same customer can have more than one temporary onramp, but permanent onramps are reused when there is already a live one for that customer.

## Temporary Onramps

Use a temporary onramp for one payment.

| Behavior     | Details                                                 |
| ------------ | ------------------------------------------------------- |
| Purpose      | One-off, time-sensitive payment                         |
| Amount       | Required                                                |
| Reuse        | Never reused                                            |
| Customer KYC | Not required                                            |
| Expiry       | Yes. Funds must arrive before the payment window closes |
| Settlement   | `INTERNAL_BALANCE` or `ONCHAIN`                         |
| Rate         | Required only when settlement is `ONCHAIN`              |

For `ONCHAIN` settlement, get a BUY rate first with [`GET /v1/rates?side=BUY`](/api-reference/rates/get-rates). Pass the returned `rate_id` when creating the onramp. The rate must still be valid when the onramp is created.

After creation, display these values to the customer:

* Bank name
* Account number
* Account name
* Expected NGN amount
* Expiry time, when present

Tell the customer to send the exact amount before the payment window ends. Deposits that arrive after the window, or after a bound rate expires, are flagged for review instead of settling automatically.

```json Temporary onramp to onchain settlement theme={null}
{
  "type": "TEMPORARY",
  "rail": "NGN_VIRTUAL_ACCOUNT",
  "customer": {
    "customer_id": "650e8400-e29b-41d4-a716-446655440000"
  },
  "currency": "NGN",
  "amount": 50000,
  "settlement_destination": {
    "type": "ONCHAIN",
    "rate_id": "550e8400-e29b-41d4-a716-446655440000",
    "destination_asset": "USDC",
    "destination_chain": "BASE",
    "destination_address": "0x742d35cc6634c0532925a3b844bc9e7595f2bd18"
  }
}
```

## Permanent Onramps

Use a permanent onramp when the same customer should keep the same NGN bank details for repeat payments.

| Behavior     | Details                                                  |
| ------------ | -------------------------------------------------------- |
| Purpose      | Long-lived customer deposit account                      |
| Amount       | Do not send                                              |
| Reuse        | One live permanent NGN account per merchant and customer |
| Customer KYC | Tier 1 required                                          |
| Expiry       | No expiry while active                                   |
| Settlement   | `INTERNAL_BALANCE` or `ONCHAIN`                          |
| Rate         | Applied when each deposit settles                        |

If a live permanent onramp already exists for that customer, Daya returns the same account. Updating settlement does not change the bank account details shown to the customer.

```json Permanent onramp to Daya balance theme={null}
{
  "type": "PERMANENT",
  "rail": "NGN_VIRTUAL_ACCOUNT",
  "customer": {
    "customer_id": "650e8400-e29b-41d4-a716-446655440000"
  },
  "currency": "NGN",
  "settlement_destination": {
    "type": "INTERNAL_BALANCE"
  }
}
```

## Rate Behavior

| Onramp type | FX behavior                                                  |
| ----------- | ------------------------------------------------------------ |
| `TEMPORARY` | Rate is locked at creation when `ONCHAIN` settlement is used |
| `PERMANENT` | Rate is selected when each deposit settles                   |

For temporary onramps with a bound `rate_id`, the customer must pay during the valid payment window. Late deposits do not settle automatically.

## Settlement

Choose where the NGN value goes after Daya receives the bank transfer.

| Settlement destination | What happens                                         | Required fields                                                 |
| ---------------------- | ---------------------------------------------------- | --------------------------------------------------------------- |
| `INTERNAL_BALANCE`     | Funds are credited to your Daya balance              | None                                                            |
| `ONCHAIN`              | Funds are converted and sent to a stablecoin address | `destination_asset`, `destination_chain`, `destination_address` |

For `ONCHAIN`, use [Supported Chains](/concepts/supported-chains) to choose a supported network.

## Developer Fees

To keep a percentage of each onramp deposit, send `developer_fee.percentage` when creating the funding account. Use a decimal string from `0` to `50`. Deposit responses and deposit webhooks show the developer fee and the customer amount separately from Daya fees.

For onramps, the developer fee is deducted before the final customer amount is calculated. It is not added as an extra charge. Use `developer_fee.amount` and `developer_fee.currency` to track the fee, and use `customer_amount` to know what the customer should receive or be credited with.
`developer_fee.percentage` is a percentage value, not basis points. For example, `0.5` means `0.5%`, `2` means `2%`, and `50` means `50%`.

## Track Deposits

Use `/v1/deposits` to reconcile money received through onramps. Deposit responses include `funding_account_id`, so you can connect the payment back to the account shown to the customer.

Listen for:

| Event                     | Meaning                                    |
| ------------------------- | ------------------------------------------ |
| `funding_account.active`  | NGN account details are ready              |
| `deposit.received`        | Daya recorded the incoming NGN transfer    |
| `deposit.processing`      | Settlement has started                     |
| `deposit.completed`       | Settlement reached its destination         |
| `deposit.requires_review` | The deposit needs review before continuing |

## Limits

Funding account creation limits may apply to high-volume integrations. If you need a higher limit, contact Daya before launch.

## Next Steps

<CardGroup cols={3}>
  <Card title="Create Funding Account" icon="plus" href="/api-reference/funding-accounts/create-funding-account">
    Create an onramp with an NGN virtual account.
  </Card>

  <Card title="Rates and Settlement" icon="chart-line" href="/concepts/rates-and-settlement">
    Understand BUY rates and settlement destinations.
  </Card>

  <Card title="Deposits" icon="money-bill-transfer" href="/concepts/deposits">
    Reconcile money received through onramps.
  </Card>
</CardGroup>
