Exchange API
A crypto-to-crypto swap API you can call without an API key, an account, or a signup form. Quote a pair, create the order, poll its status. The same endpoints the SwapSS site itself runs on.
https://swapss.lol/api/v1
Endpoints
| Method | Path | What it returns |
|---|---|---|
| GET | /health | Liveness. Use it as the availability check before offering a swap. |
| GET | /assets | Every asset with its chain, decimals, whether it can be a source, a destination, or both, and a wide per-asset bound. That bound is not the trading minimum: the amount a swap accepts depends on the pair, and the authoritative range comes back with the quote. |
| GET | /networks?scope=live | Live networks with block time, required confirmations and explorer base URL — enough to show an honest wait estimate before a deposit. |
| GET | /pairs?from_chain=&from_asset= | Every destination reachable from one source asset. Ask this instead of assuming a pair exists. |
| GET | /indicative | Display-only rate for a pair, cached briefly. Carries no quote token and cannot create an order — use it to fill a rate field, never to settle one. |
| POST | /quote | A binding quote: amounts, fees, limits, the refund-address policy for that route, and an expiry. Returns a quoteId the order call must use. |
| POST | /orders | Creates the order from a live quoteId. The server never recomputes amounts from your fields — an expired or unknown quote is refused rather than re-priced. |
| GET | /orders/{publicId}?token= | Order status, timeline, confirmation progress and transaction links. The token is issued when the order is created. |
Quoting a pair
A quote is the only thing an order can be built from. It carries the amounts, the limits, the refund-address policy for that route, and an expiry — order creation binds the quoteId and refuses to re-price from client fields.
Request
curl -X POST https://swapss.lol/api/v1/quote \
-H 'content-type: application/json' \
-d '{
"fromChain": "bitcoin",
"fromAsset": "BTC",
"toChain": "monero",
"toAsset": "XMR",
"amount": "0.01",
"rateType": "float"
}' Response
{
"quoteId": "qt_Eq-_r6he8u5SLNur7yffJcc5ibP-9T0igoOyVcW1xl8",
"rateType": "float",
"from": { "chain": "bitcoin", "asset": "BTC", "amount": "0.01" },
"to": { "chain": "monero", "asset": "XMR", "amount": "1.72765483" },
"fees": {
"serviceFee": "0", "serviceFeeAsset": "BTC", "serviceFeeBps": 0,
"networkFee": "0", "networkFeeAsset": "BTC",
"exchangeFee": "0", "exchangeFeeAsset": "USD"
},
"limits": { "min": "0.0001", "max": "6.814" },
"expiresAt": "2026-07-24T19:44:28Z",
"warnings": ["Final amount is determined after deposit confirmations"],
"exchangePreview": { "label": "SwapSS", "priceImpactBps": 0, "etaSeconds": 1800 },
"startMethod": "deposit",
"requiresConnectedWallet": false,
"sourceAddressRequired": false,
"requiresRefundAddress": false,
"refundAddressPolicy": "optional",
"requiresRecipientMemo": false,
"requiresRefundMemo": false,
"supportsRecipientMemo": false,
"supportsRefundMemo": false
}Knowing the wait before the deposit
The network registry reports block time and required confirmations per chain, so an integration can state the real wait instead of a generic "a few minutes". Bitcoin below is 3 confirmations at a 600-second block time — about 30 minutes.
{
"id": "bitcoin",
"name": "Bitcoin",
"nativeCurrency": "BTC",
"blockTimeSeconds": 600,
"confirmationsRequired": 3,
"explorerUrl": "https://mempool.space",
"status": "active",
"chainType": "utxo"
}Rates and fees
Two rate types, and the current values are always readable from GET /fees rather than hardcoded:
- Floating — 0.5%. The final amount settles at the rate when the deposit confirms.
- Fixed — 1%. The amount is locked when the order is created; the order carries the deadline by which the deposit must arrive.
- The network fee is quoted before confirmation. Nothing is deducted that a quote did not show.
What the integration is responsible for
- Treat every amount as a decimal string. Amounts are integers in minor units internally and are never floats on any money path.
- Never assume a pair exists: read it from /pairs, and let a 422 disable that direction rather than retry it.
- A quote expires. Re-quote instead of holding one; order creation on an expired quote is refused, not silently re-priced.
- Show chain, asset and address together wherever a user can copy or confirm. A correct address on the wrong chain loses the funds.
Limits and failure
- Endpoints are rate limited per family; a 429 carries a retry hint and is not a reason to fail the swap.
- 503 means the pair cannot be served right now. Fail closed and hide the direction — an exchange that quotes what it cannot execute is worse than one that says no.
- Errors are JSON with a human-readable message and never leak internals.
Wallets and aggregators
If you are integrating SwapSS into a wallet, a rate comparison site, or a swap widget, get in touch before you start. We will confirm the pair coverage you need, raise the rate limits for your traffic, and answer route questions directly rather than through a form.
Integration questions: @swappsy
Questions integrators ask first
Do I need an API key or an account?
- No. Quoting and order creation are unauthenticated. Reading an order back requires the token issued when that order was created, so an order id alone never exposes someone else’s swap.
Is there a sandbox?
- Not for the exchange API. Every read endpoint — assets, networks, pairs, indicative rates — is free to call and safe to explore, and a quote costs nothing and creates nothing.
Which assets are supported?
- Read GET /assets rather than trusting a list on a page. As of this writing 20 networks are live, including Monero and Zcash in both directions.
What happens if a deposit arrives late or in the wrong amount?
- The order is not silently dropped. A late or partial deposit on a fixed rate moves to the floating rate at confirmation time, and anything genuinely ambiguous goes to human review with the funds preserved rather than to an automatic guess.
Can I list SwapSS rates in an aggregator?
- Yes. Indicative rates are display-only, cached briefly, and carry no quote token, which makes them the right feed for a comparison table. Message us before you build so we can size the rate limits for your traffic.