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

# Rheon API

> One integration for stablecoin and bank rails - quotes, payment methods, statuses, limits, and errors.

The API is the same set of rails the widget runs on, called from your backend, with
your own UI on top. It covers both directions money comes in - stablecoin from a
wallet, fiat from a card or a bank - behind one key and one error format.

## What you can call

| Surface                                 | What it does                                                                                                               |
| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| **Deposits**                            | Quote a cross-chain stablecoin deposit, get an unsigned transaction for the user's wallet to sign, track it to delivery.   |
| **Cards**                               | Price a card payment, start it, follow it to settlement. Look up card currencies, countries, limits, and rates.            |
| **Bank transfers and virtual accounts** | Verify a user, open an account with bank details, poll until the money lands. Create and manage virtual accounts directly. |
| **Reference**                           | Read the supported countries, currencies, limits, rates, and statuses instead of hard-coding them.                         |

Full request and response shapes are in the
[API reference](/api-reference/introduction).

## Authentication

Server-to-server calls use an API key against the `/v1` prefix. Keep the key on your
server. Browser access is separate: a publishable key tied to an origin allowlist, so
a key lifted from your page does not work from anywhere else. What a key is allowed
to settle - which chains and tokens as a destination - is part of your account setup,
not something you pass per request. See
[Authentication](/api-reference/authentication).

## Quotes

A quote prices the route and reserves liquidity, so it is valid for a short window.
Two things follow: show the user how long is left and let them ask for a fresh quote,
and never build a transaction from a quote you have been holding.

Quotes work in both directions. Fix what the payer spends and whatever arrives
arrives, or fix what has to land and let the payer's side flex to cover it - the
second is what you want when collecting a set price.

## Payment methods

What a user can pay with, per product:

* **Stablecoins** from a connected wallet, on any supported network - see
  [Coverage](/coverage).
* **Cards**, priced before the user commits to anything.
* **Bank transfers** into a virtual account: local rails and international wires,
  depending on the currency. The per-currency list is on [Coverage](/coverage) and
  served by [`GET /v1/currencies`](/api-reference/reference/currencies).

## Statuses

Each product has its own small status set: deposits report `pending`, `done`,
`failed`, or `expired`; cards report `pending`, `processing`, `completed`, `failed`,
or `unknown`; bank transfers report `awaiting_deposit` or `funded`. In every set
there is exactly one state that means "credit the user" - `done`, `completed`,
`funded` - and you credit on that state only. A partner state we do not recognise is
reported as unknown and flagged, never quietly shown as "in progress". See
[Transaction statuses](/transactions/statuses).

## Limits

* **Rate limit:** your API key carries a request ceiling, agreed when it is
  issued. Handle `429` by backing off rather than retrying immediately.
* **Amount limits** are per rail and per provider. The stablecoin path is bounded by
  live liquidity on the route, which is why a quote can come back as no route
  available - that is a normal, temporary answer, not an error to retry in a loop.
  Fiat minimums and maximums are per currency and rail - read them from
  [`GET /v1/limits`](/api-reference/reference/limits).

## Errors

Every error comes back in the same envelope:

```json theme={null}
{
  "error": {
    "code": "chain_not_allowed",
    "message": "Human-readable explanation",
    "fields": { "destination.chain": "not enabled for this key" }
  }
}
```

`code` is what you branch on; `message` is for your logs, not your users; `fields` is
present when the problem is a specific input. Three worth handling explicitly:

* `403 chain_not_allowed` - the corridor was never enabled for your key. Retrying
  will not help; ask us to enable it.
* `429` - rate limited. Back off.
* `no_route` - no liquidity for that route right now. Re-quote later.
