# Pay with cryptocurrency

> Add credit by sending cryptocurrency to your own deposit address, and follow each deposit until it is credited.

Source: https://docs.coritan.com/billing/crypto-payments/

You pay in cryptocurrency by adding it to your credit balance. Coritan gives you a deposit address of your own, tells you exactly how much to send for the credit you want, and credits your balance in US dollars once the transfer has enough confirmations. That credit then pays for orders, renewals and hourly charges like any other credit ([How Coritan spends credit](/billing/add-credit/#how-coritan-spends-credit)).

## Before you begin

- Sign in to the [dashboard](https://www.coritan.com/dashboard).
- Have a wallet or exchange account that can send the coin on the network you choose. For XRP, it must be able to send a destination tag.
- Decide how much credit you want. In the dashboard, one deposit is between $1.00 and $10,000.00.
- Make sure Coritan has issued you an address for the network. The dashboard shows an address only once Coritan has issued it, and it does not issue the first one. If you have never had an address for the network, issue it with the API ([Get your deposit address](#get-your-deposit-address)). One address serves six networks ([Networks and addresses](#networks-and-addresses)).

## Send a deposit

1. In the sidebar, select **Billing**. The **Add credit** card is on the **Overview** tab.
2. Under **Amount**, choose the credit you want, or choose **Other** and type an amount in US dollars.
3. Under **Pay with**, choose **Crypto**.
4. Under **Coin**, choose the coin and the network you will send it on, for example `USDC on Base`. The minimum for that coin shows under the list, for example `Minimum $0.50 for USDC.`
5. Select **Show where to send**. The card shows `Send USDC on Base`, the amount under **Send exactly**, your address, a QR code and a countdown such as `Send within 29:48`.
6. From your wallet, send exactly that amount to that address before the countdown ends. Use **Copy amount** and **Copy address**, or scan the QR code, which carries the amount as well. For XRP, also send the destination tag shown under **Include the destination tag** (**Copy destination tag**).
7. Select **I have sent it**. While the page is open, the card looks for your transfer every 15 seconds. Once the transfer appears, it shows its progress, for example `Seen on the network: 3 of 15 confirmations.`

You can close the page after step 7. Coritan also watches your address in the background and credits the deposit without the page open. To stop the card looking, select **Stop checking**.

## Result

When the transfer has all its confirmations, the card shows `Deposit credited to your balance.` and your balance goes up. The deposit appears on the **Transactions** tab as a credit with a description such as `25.05 USDC deposit on Base`, and `Crypto` under **Paid with** ([Transactions and payment attempts](/billing/transactions/)).

While a deposit is confirming, the **Overview** tab lists it under a notice such as `1 crypto deposit on the way`, with its confirmations so far.

The credit does not pay an open invoice by itself. Coritan takes it the next time it tries to collect a renewal, or you can pay the invoice with **Account credit** at once ([Pay an invoice](/billing/invoices/)). To have a deposit pay a particular invoice as soon as it arrives, quote it for that invoice with the API ([Get the amount to send](#get-the-amount-to-send)).

## How much you are credited

The amount under **Send exactly** is worked out from three parts, and the line under the address lists them:

The coin's rate
: The market price less a spread, both shown in the quote. By default USDT and USDC have no spread and count as $1.00 each while they trade within 2 cents of $1.00. ETH and SOL have a 1.5% spread by default, and other coins 2%.

The network fee
: What it costs to move your deposit on that network. It differs a lot from one network to another and changes with the network's own fees. Each quote shows it, so for a small amount, compare a few coins and choose one with a low fee.

A margin for price changes
: For coins other than USDT and USDC, the amount includes an extra 2%, so a drop in price while you send does not leave you short.

Coritan credits what arrives: its value at the rate, less the network fee. Nothing is kept back from the margin, so the credit shown in the quote (`Credits about $25.00`) is often a little more than the amount you asked for. If you send less than the quote, you receive less credit; if you send more, you receive more.

The countdown is how long Coritan holds the rate: 30 minutes. A transfer that first appears on the network before the countdown ends is credited at the quoted rate, however long its confirmations take. If the price has gone up by then, you get the higher rate. If it has gone down by more than about 2%, the credit is less than quoted, because Coritan raises the new rate by no more than 2%. A transfer that appears after the countdown ends is credited at the rate at that time.

A transfer below the coin's minimum is still credited, less the network fee. A transfer worth less than its own network fee credits nothing.

## Networks and addresses

Your addresses are permanent: each one stays yours and receives any number of deposits. One address serves every network of the same kind.

| Network | Your address | Confirmations by default |
| --- | --- | --- |
| Ethereum, BNB Smart Chain, Base, Polygon, Arbitrum One, OP Mainnet | One address for all six networks | Ethereum 6, BNB Smart Chain 7, Polygon 10, the others 15 |
| Solana | An address of its own | 1 |
| Tron | An address of its own | 10 |
| Dogecoin | An address of its own | 10 |
| XRP Ledger | Coritan's shared address, with a destination tag that is yours | 1 |

The **Coin** list shows which coins and networks Coritan accepts at the moment, such as `USDT on Tron` or `ETH on Arbitrum One`. Bitcoin is not accepted.

> [!WARNING]
> Send only a coin and network from the **Coin** list. Coritan credits a listed coin on any network your address serves, but it cannot recover a coin or network that is not in the list. On the XRP Ledger, a transfer without your destination tag cannot be matched to your account.

## Troubleshooting

**Crypto** is not under **Pay with**
: Coritan is not taking crypto deposits at the moment. Add credit another way ([Add credit to your balance](/billing/add-credit/)).

**Crypto deposits are not available right now**
: No coin can be credited at the moment. Pay by card or PayPal, or try again later.

**Could not load the coins you can send**
: The list did not load. Select **Try again**.

The address shows `—` and there is no countdown
: Coritan has not issued you an address for that network yet. Issue it with the API ([Get your deposit address](#get-your-deposit-address)), then select **Show where to send** again. Do not send anything until the address shows.

`Choose an amount first.`
: The amount is missing or outside $1.00 to $10,000.00. Choose another amount.

`Could not work out how much to send`
: Coritan could not quote the coin, often because it has no current price for it. The message under it gives the reason. Try again in a few minutes, or choose another coin.

`The network fee would use up this deposit. Choose another coin or a larger amount.`
: The amount is too small for that network's fee. Choose a network with a lower fee, or a larger amount.

**We no longer hold this rate**
: The countdown ended before you sent. Do not send the old amount: select **Get a new amount** and send the new one. If you already sent the old amount after the countdown ended, Coritan credits it at the current rate.

A deposit is on hold
: The **Overview** tab shows a notice such as `1 crypto deposit on hold`, with the reason beside each deposit. When the reason is a price Coritan cannot read, it credits the deposit on its own once the price is available again. For any other reason, or if nothing changes, select **Open a ticket**.

A deposit has all its confirmations but is not credited
: Wait a few minutes and check again. If it is still not credited, [contact support](/support/) with the transaction hash.

You sent XRP without the destination tag, or a coin that is not in the list
: Coritan cannot credit it automatically. [Contact support](/support/) with the transaction hash.

## Related

- [Add credit to your balance](/billing/add-credit/)
- [Pay an invoice](/billing/invoices/)
- [Transactions and payment attempts](/billing/transactions/)
- [Turn on automatic top-up](/billing/automatic-top-up/)

## With the API

Paying through the API takes the same steps as the dashboard: choose a coin, make sure you have an address, get a quote, send, then follow the deposit. Every amount is in US dollars.

### List the coins you can send

[`GET /billing/crypto/assets`](/api/reference/client/billing/#op-get-api-v1-billing-crypto-assets) lists every coin Coritan can credit right now, one entry per coin and network:

```bash
curl https://api.coritan.com/api/v1/billing/crypto/assets \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

```json
{
  "assets": [
    {
      "network": "base",
      "network_name": "Base",
      "asset": "USDC",
      "display_name": "USD Coin (BASE)",
      "chain_family": "evm",
      "decimals": 6,
      "is_stablecoin": true,
      "contract_address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "confirmations": 15,
      "min_deposit_usd": "0.5000",
      "spread_percent": "0",
      "market_rate_usd": "1.000000000000000000",
      "applied_rate_usd": "1.000000000000000000",
      "notes": null
    }
  ]
}
```

`network` and `asset` are the values the other calls take. `applied_rate_usd` is the market rate less the spread, and `chain_family` tells you which address a coin uses.

### Compare the ways to pay an amount

[`GET /billing/crypto/plan`](/api/reference/client/billing/#op-get-api-v1-billing-crypto-plan) quotes an amount on every coin at once, cheapest network fee first. `recommended` is the cheapest option that can pay the amount, and an option whose network fee would use up the deposit has `viable` `false`. Add `invoice_id` to plan for an invoice's unpaid balance instead: you still send `amount`, and Coritan uses the invoice's outstanding balance when it has one.

```bash
curl "https://api.coritan.com/api/v1/billing/crypto/plan?amount=25" \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

```json
{
  "usd_target": "25.00",
  "options": [
    {
      "network": "base",
      "network_name": "Base",
      "asset": "USDC",
      "send_amount": "25.05",
      "send_amount_raw": "25050000",
      "decimals": 6,
      "you_receive_usd": "25.0007",
      "network_fee_usd": "0.0493",
      "fee_share": "0.0020",
      "market_rate_usd": "1.000000000000000000",
      "spread_percent": "0",
      "headroom_percent": "0",
      "confirmations": 15,
      "viable": true,
      "good_value": true,
      "note": "Credited at 1:1, less approximately $0.05 in network fees."
    },
    {
      "network": "ethereum",
      "network_name": "Ethereum",
      "asset": "ETH",
      "send_amount": "0.010456",
      "send_amount_raw": "10456000000000000",
      "decimals": 18,
      "you_receive_usd": "25.5015",
      "network_fee_usd": "0.2463",
      "fee_share": "0.0099",
      "market_rate_usd": "2500.000000000000000000",
      "spread_percent": "1.5000",
      "headroom_percent": "2.0",
      "confirmations": 6,
      "viable": true,
      "good_value": true,
      "note": "Network fees of approximately $0.25 apply."
    }
  ],
  "recommended": {"network": "base", "asset": "USDC"},
  "note": "Send the exact amount shown. You are credited what arrives less the network fee, and the amount already allows for the price moving while the transfer confirms, so you will not end up short of the total."
}
```

`good_value` is `false` when the network fee is more than 5% of the amount. A plan holds no rate; get a quote before you send.

### Get your deposit address

[`GET /billing/crypto/address`](/api/reference/client/billing/#op-get-api-v1-billing-crypto-address) returns your permanent address for a network, and issues it the first time you ask. Asking again, or asking for another network of the same kind, returns the same address.

```bash
curl "https://api.coritan.com/api/v1/billing/crypto/address?network=base" \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

```json
{
  "account_id": 4127,
  "chain_family": "evm",
  "chain_family_name": "EVM",
  "address": "0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5",
  "destination_tag": null,
  "x_address": null,
  "requires_destination_tag": false,
  "networks": ["ethereum", "bsc", "base", "polygon", "arbitrum", "optimism"],
  "accepted": [
    {
      "network": "base",
      "network_name": "Base",
      "asset": "USDC",
      "min_deposit_usd": "0.5000",
      "confirmations": 15,
      "contract_address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
    }
  ],
  "explorer_url": "https://basescan.org/address/0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5",
  "payment_uri": "ethereum:0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5@8453",
  "qr_svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 45 45\">…</svg>",
  "is_permanent": true
}
```

`networks` lists every network the address receives on, and `accepted` every coin Coritan accepts at it. For the XRP Ledger, `requires_destination_tag` is `true`, `destination_tag` is your tag, and `x_address` holds the address and the tag in one string, so a wallet that accepts it cannot leave the tag off.

### Get the amount to send

[`GET /billing/crypto/quote`](/api/reference/client/billing/#op-get-api-v1-billing-crypto-quote) takes `network`, `asset` and `amount` (more than `0`, at most `100000`), and optionally `invoice_id`. The quote holds its rate for 30 minutes (`rate_lock_seconds`) until `rate_locked_until`. With `invoice_id`, Coritan puts your balance towards that invoice as soon as the deposit is credited; pass the invoice's unpaid balance as `amount`.

```bash
curl "https://api.coritan.com/api/v1/billing/crypto/quote?network=base&asset=USDC&amount=25" \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

```json
{
  "network": "base",
  "asset": "USDC",
  "decimals": 6,
  "usd_target": "25.0000",
  "market_rate_usd": "1.000000000000000000",
  "spread_percent": "0",
  "applied_rate_usd": "1.000000000000000000",
  "send_amount": "25.05",
  "send_amount_raw": "25050000",
  "network_fee_amount": "0.05",
  "network_fee_usd": "0.0493",
  "headroom_percent": "0",
  "credited_estimate_usd": "25.0007",
  "covers_fee": true,
  "minimum_usd": "0.5000",
  "confirmations": 15,
  "below_minimum": false,
  "address": "0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5",
  "destination_tag": null,
  "payment_uri": "ethereum:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913@8453/transfer?address=0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5&uint256=25050000",
  "qr_svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 45 45\">…</svg>",
  "intent_id": 918,
  "rate_locked_until": "2026-09-25T14:30:00.412233+00:00",
  "rate_lock_seconds": 1800,
  "invoice_id": null
}
```

Send `send_amount` (in whole coins; `send_amount_raw` is the same figure in the coin's smallest unit). `payment_uri` and `qr_svg` carry the amount, so a wallet that opens or scans them fills it in. `covers_fee` is `false` when the network fee would use up the deposit.

A quote carries `address`, `rate_locked_until` and the fields after them only when you already have an address for that network. Without one, it has none of them and holds no rate: get your address first. A new quote for the same invoice, or for a top-up, replaces the one before it, so send the amount from the latest quote.

### Follow a deposit

[`POST /billing/crypto/check`](/api/reference/client/billing/#op-post-api-v1-billing-crypto-check) asks Coritan to look for your transfer now, and answers with your deposits. Send `network` to look only at that network's address. Coritan reads the network for an address at most once every 20 seconds; in between, the call answers from what it already knows, with `chain_checked` `false` and `next_check_in_seconds` until the next read. The call answers `429` after 12 calls in a minute.

```bash
curl -X POST https://api.coritan.com/api/v1/billing/crypto/check \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"network": "base"}'
```

The answer has `chain_checked`, `next_check_in_seconds`, `found` (new transfers this read found), and `deposits` and `summary` as [`GET /billing/crypto/deposits`](/api/reference/client/billing/#op-get-api-v1-billing-crypto-deposits) returns them. That call lists your deposits newest first (`limit`, default `50`, at most `200`), and `summary.confirming` holds up to five deposits that are not credited yet:

```json
{
  "deposits": [
    {
      "id": 7731,
      "network": "base",
      "network_name": "Base",
      "asset": "USDC",
      "amount": "25.05",
      "amount_raw": "25050000",
      "decimals": 6,
      "tx_hash": "0xexampletransactionhash",
      "explorer_url": "https://basescan.org/tx/0xexampletransactionhash",
      "status": "detected",
      "confirmations": 9,
      "required_confirmations": 15,
      "confirmation_percent": 60,
      "credited_usd": null,
      "market_rate_usd": null,
      "spread_percent": null,
      "hold_reason": null,
      "first_seen_at": "2026-09-25T14:09:12",
      "credited_at": null
    }
  ],
  "summary": {
    "total": 1,
    "pending": 1,
    "held": 0,
    "confirming": [
      {
        "id": 7731,
        "network": "base",
        "network_name": "Base",
        "asset": "USDC",
        "amount": "25.05",
        "status": "detected",
        "confirmations": 9,
        "required_confirmations": 15,
        "confirmation_percent": 60,
        "hold_reason": null,
        "tx_hash": "0xexampletransactionhash",
        "explorer_url": "https://basescan.org/tx/0xexampletransactionhash"
      }
    ]
  }
}
```

[`GET /billing/crypto/deposits/{deposit_id}`](/api/reference/client/billing/#op-get-api-v1-billing-crypto-deposits-deposit-id) returns one deposit in the same shape. A deposit's `status` is one of these:

`detected`
: Seen on the network and waiting for confirmations.

`held`
: Confirmed, but not credited yet. `hold_reason` says why, for example `asset is not enabled for automatic credit`, or a price Coritan cannot read, such as `price for ETH is 12 minutes old`.

`credited`
: Added to your balance. `credited_usd` is the amount, and `0.0000` for a transfer worth less than its network fee.

| Status | `detail` | When |
| --- | --- | --- |
| `404` | `Invoice not found` | The `invoice_id` is not one of your invoices. |
| `404` | `Deposit not found` | The deposit is not one of yours. |
| `409` | `USDC on base is not accepted` | Coritan does not accept that coin on that network. |
| `409` | For example `price for ETH is 12 minutes old` | Coritan has no current price for the coin, so it cannot quote it. |
| `409` | `unknown network dogechain` or `deposit addresses for this network are temporarily unavailable` | Coritan cannot give you an address for that network. |
| `422` | A validation error | A parameter is missing, or `amount` is `0` or less or above `100000`. |
| `429` | `rate_limited`, with `retry_after_seconds` | More than 12 checks in a minute. Wait for the time in the `Retry-After` header. |

## API

- `GET /api/v1/billing/crypto/assets`: Assets we can accept right now (https://docs.coritan.com/api/reference/client/billing/#op-get-api-v1-billing-crypto-assets)
- `GET /api/v1/billing/crypto/plan`: Every way to pay this amount in crypto, cheapest first (https://docs.coritan.com/api/reference/client/billing/#op-get-api-v1-billing-crypto-plan)
- `GET /api/v1/billing/crypto/quote`: How much to send for a target USD credit, itemised (https://docs.coritan.com/api/reference/client/billing/#op-get-api-v1-billing-crypto-quote)
- `GET /api/v1/billing/crypto/address`: This user's permanent deposit address for the network's chain family (https://docs.coritan.com/api/reference/client/billing/#op-get-api-v1-billing-crypto-address)
- `POST /api/v1/billing/crypto/check`: Look for this customer's payment now, and say where it stands (https://docs.coritan.com/api/reference/client/billing/#op-post-api-v1-billing-crypto-check)
- `GET /api/v1/billing/crypto/deposits`: Deposit history, including transfers still confirming (https://docs.coritan.com/api/reference/client/billing/#op-get-api-v1-billing-crypto-deposits)
- `GET /api/v1/billing/crypto/deposits/{deposit_id}`: One deposit, for polling while it confirms (https://docs.coritan.com/api/reference/client/billing/#op-get-api-v1-billing-crypto-deposits-deposit-id)
