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

> ## Agent Instructions
> Spreader is a web service that tracks arbitrage spreads between crypto exchanges. This documentation covers only what a user of the service sees and does.
> Page paths starting with /en/ are English. Translations live under /ru/ and /uk/ with the same file names.
> Screenshots are illustrations. Every screenshot is accompanied by text that states the same facts, so you do not need to see the image.

# Spread page links

> Grammar of the spread page address /spread?long=exchange:type:NAME&short=exchange:type:NAME, the two forms of a market name, encoding, and what the server does with an inexact address.

Every spread page has a stable address you can build in your own software or a bot. The grammar below is also used by the Spreader bot and by every link the site writes.

## Format

```
/spread?long=<leg>&short=<leg>
leg = exchange:type:NAME
```

| Part | What it is | Examples |
| - | - | - |
| `exchange` | Exchange code from the [Exchanges](https://docs.spreader.sh/en/exchanges/overview.md) table | `binance`, `okx`, `bybit`, `gate`, `whitebit`, `hyperliquid`, `bybitfi`, `gatefi`, `binancedex` |
| `type` | Market type | `spot`, `perp` (perpetual contract), `margin` (short on margin, a spot market with margin trading) |
| `NAME` | Market name in one of two forms, see below | `BTC/USDT`, `xyz:GOLD` |

Case does not matter for the exchange, the type, the coin and the quote: `OKX:Perp:btc/usdt` and `okx:perp:BTC/USDT` are the same. The order of the two parameters does not matter. `long` is the leg you buy, `short` is the leg you sell.

## Readable form: `COIN/QUOTE`

This is how external software builds a link and how the site writes almost all of its own links. The coin and the quote are **as the exchange names them**, not as Spreader names the asset: the thousand PEPE contract on Binance is `1000PEPE/USDT`, not `PEPE/USDT`, gold on Bybit TradFi is `XAUUSD+/USD`.

```
/spread?long=okx:perp:BTC/USDT&short=whitebit:margin:BTC/USDT
/spread?long=binance:perp:1000PEPE/USDT&short=gate:perp:PEPE/USDT
/spread?long=gate:spot:NEAR/USDT&short=okx:perp:NEAR/USDT
```

The quote can be dropped (`okx:perp:ETH`) when the coin has one quote on that exchange and type. With several quotes the page shows a list to pick from.

## Exact form: the exchange symbol

The market name letter by letter as the exchange calls it: `BTC-USDT-SWAP` on OKX, `xyz:GOLD` on a Hyperliquid builder DEX, `PF_XBTUSD` on Kraken. It is needed when the readable form is not enough:

* **Twins**: the exchange has two markets of the same type for the same coin and quote, for example `xyz:AAOI` and `para:AAOI` on Hyperliquid, `AAPLx/USD` and `AAPLSPV/USD` on Kraken, two Binance Alpha tokens with one ticker. The site writes such markets by symbol so that a link always opens exactly the market you clicked.
* **Delisted markets**: only the exact form opens their page, with the delisting banner and the stored history.

```
/spread?long=kraken:perp:PF_XBTUSD&short=okx:perp:BTC/USDT
/spread?long=bybitfi:perp:AAOI/USD&short=hyperliquid:perp:xyz:AAOI
```

## Encoding

`:` and `/` are written as they are. Only characters forbidden in an address are encoded: `&` → `%26`, space → `%20`, `$` → `%24`, non Latin letters as UTF-8. `bybitfi:perp:AT&T/USD` becomes `bybitfi:perp:AT%26T/USD`. Browsers do this by themselves. In code, use the standard URL component encoder and put `:` and `/` back.

## What the server does with a typed address

The server does not guess. For each leg, within the exchange and type (for `margin`, among spot markets with margin trading):

1. **Exact name.** If `NAME` equals a market symbol, that is the market, in any status (this is how delisted markets open). If `NAME` contains `/` and the part before the last `/` equals a symbol while the part after it equals its quote, that is the market too (`hyperliquid:perp:xyz:GOLD/USDC`).
2. **By coin and quote** among traded and delisting markets: the part before the last `/` is the coin, after it the quote. Exactly one market: that one. Several: the page **Several markets match the long leg — pick one** with an exact link per candidate. None: **No market matches the long leg. This coin is quoted there in …** with the quotes the coin has on that exchange.
3. **Without a quote** (`okx:perp:ETH`): one quote, that market. Several: the list.

The pair as a whole must be two different markets of the same asset in an allowed kind: spot only as the long leg, margin only as the short leg, spot against spot only on different exchanges. Otherwise the page shows **The two legs belong to different assets**, **Both legs point to the same market** or **Cannot read the long leg**, never a blank screen. An address that cannot be read at all, including the old `/spread?p=…` form, opens the scanner.

## How the site writes its own links

Every market object the site sends to the browser carries a ready leg token: the readable form when the market has no twin among traded markets of the same type, coin and quote, the symbol otherwise. When you open a pair by a click without a link (search, Pair builder, arrow keys), the page replaces the address in the browser with the readable form, without a history entry, so a copied address is always the same.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.