The same router,
from your code.
Six routes, the ones the app, the extension and the Android shell already use. Quote a private route, create an order, read its status. The venue is named, the fee is printed, nothing is custodied.
Six routes. Limits printed.
- GET/tokens60/min
Assets the router can quote, popular first.
- POST/quote40/min
Dry quote for a pair and amount. Never creates an order.
- POST/order10/min
Create an order; returns the id. The deposit address is on the status call.
- GET/order/{id}per IP
Status, deposit address, deadline, fee, receipt data.
- GET/stats60/min
Orders, settled, volume, gross fee, burned. Cached 60 s.
- GET/burns60/min
Buybacks and burns with hashes, plus two live supply numbers.
- GET/supply60/min
Max, total and circulating supply with the basis for each, read from chain.
- GET/supply/total60/min
Total supply as one bare number, text/plain, the shape listing sites read.
- GET/supply/circulating60/min
Circulating supply as one bare number. Excludes the launchpad's permanently locked tokens.
- GET/openapi.jsoncached
The spec for all of the above.
A swap, end to end.
curl https://app.darkroute.exchange/api/v1/tokensPick two assetId values. Prices in the list are the mid-market feed the quote measures itself against.
curl -X POST https://app.darkroute.exchange/api/v1/quote \
-H "content-type: application/json" \
-d '{"originAsset":"nep141:eth.omft.near","destinationAsset":"nep141:base-0x833589fcd6edb6e08f4c7c32d4f71b54bda02913.omft.near","amount":"0.1"}'Read routes[0].out, fee.chargedPct and cost.allInPct. The last one is everything between mid-market and what lands, reported even when it is bad.
curl -X POST https://app.darkroute.exchange/api/v1/order \
-H "content-type: application/json" \
-d '{"originAsset":"<from /tokens>","destinationAsset":"<from /tokens>","amount":"0.1","recipient":"<address on the destination chain>","refundTo":"<address on the origin chain>"}'Addresses are validated against the chain's shape. Returns 201 with the order id.
curl https://app.darkroute.exchange/api/v1/order/dr_4f2a9c31be07Poll it. order.depositAddress and order.deadline are what your user needs; order.status walks PENDING_DEPOSIT, PROCESSING, SUCCESS, or REFUNDED, FAILED, INCOMPLETE_DEPOSIT.
What the API promises, and what it does not.
Every route is public and rate-limited per IP. Keys with limits per $DARK tier are queued on the roadmap; when they exist, keyless access stays.
It never creates an order and never touches the venue's order book. Quote as often as the limit allows.
The venue issues a one-time deposit address; funds go from the sender into the route. DarkRoute never holds them and cannot reverse them.
There is no account. Anyone with an order id can read its status and deposit address, so treat ids as secrets on your side.
0.3% of the input, on the quote, before any deposit. If your integration hides it from the user, that is on you, not on the number.
Every venue that quotes is named as is. Today that is one venue, NEAR Intents; more rows appear as integrations go live, each under its real name.
Something broken or unclear: [email protected]. Security issues: /security. The extension at github.com/darkrouteRH/extension is a complete client of this API, in plain JavaScript.