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

# API overview

> The relay's HTTP API: one base URL, JSON in and out, amounts as strings.

The relay serves every chain from one base URL. There are no API keys. Abuse controls are behavioural:
per-IP rate limits, a cap on in-flight RFQs per taker, and a signed proof that the taker controls the wallet
a quote names.

```
https://relay-production-f175.up.railway.app
```

## Conventions

* **Amounts are base-unit decimal strings.** `"10000000"` is 10 USDC or 10 cNGN, since both have 6 decimals. Never floats.
* **Addresses.** `0x` addresses on EVM chains, base58 public keys and mints on Solana. Transaction hashes are `0x` on EVM and base58 signatures on Solana.
* **Chains.** Every request that starts something takes a `chainId`. Without one, the relay uses its primary EVM chain (Base Sepolia, 84532). Solana devnet is 103.
* **Ids.** Quotes, RFQs, executions and limit orders are UUIDs.
* **Times.** ISO 8601 strings for timestamps; unix seconds for signed deadlines; unix milliseconds for the oracle band's `at`.
* **Errors.** A JSON body `{ "error": "<reason>", ... }` with a 4xx or 5xx status. See [Errors](/integrators/errors).

## Rate limits

| Budget                                                 | Default               |
| ------------------------------------------------------ | --------------------- |
| `POST /v1/quotes` and `POST /v1/limit-orders/prepare`  | 120 per minute per IP |
| `POST /v1/executions`, `POST /v1/limit-orders`, cancel | 30 per minute per IP  |
| `POST /v1/resolvers/register`                          | 10 per minute per IP  |
| In-flight RFQs per taker                               | 4                     |

Past a budget the relay answers `429 rate_limited`, or `429 too_many_outstanding_rfqs` for the RFQ cap.

## The swap flow

<Steps>
  <Step title="Read the configuration">
    [`GET /v1/config`](/integrators/api/config) lists every chain with its contracts, tokens and minimums, and whether taker proofs are required.
  </Step>

  <Step title="Ask for a quote">
    [`POST /v1/quotes`](/integrators/api/request-quote) with the pair, the size and the taker. The response carries the terms and the EIP-712 typed data to sign.
  </Step>

  <Step title="Sign">
    The taker signs `typedData` with `eth_signTypedData_v4`. On Solana the client rebuilds and checks the transaction, then signs it.
  </Step>

  <Step title="Submit">
    [`POST /v1/executions`](/integrators/api/submit-execution) with the quote id and the signature. The keeper submits and pays gas.
  </Step>

  <Step title="Follow it">
    [`GET /v1/quotes/:id`](/integrators/api/quote-lifecycle) until `status` is `settled` and `final` is true.
  </Step>
</Steps>

The [quickstart](/integrators/quickstart) does this with curl.

## Reading the network

`GET /v1/health`, `/v1/corridors`, `/v1/rates`, `/v1/stats`, `/v1/feed`, `/v1/nodes` and `/v1/resolvers`
are public and unauthenticated. They are what the web app's explorer reads.

## Node WebSocket

Resolver nodes speak a separate WebSocket protocol on `/ws/node`. It is documented under
[Node WebSocket](/protocol/node-websocket); integrators do not need it.
