DarkRouteDarkRoute
Public API · v1No key · rate-limitedNon-custodial

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.

openapi.jsonGitHub · spec + exampleshttps://app.darkroute.exchange/api/v1
Endpoints

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.

Four calls

A swap, end to end.

01 · list assets
curl https://app.darkroute.exchange/api/v1/tokens

Pick two assetId values. Prices in the list are the mid-market feed the quote measures itself against.

02 · quote
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.

03 · order
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.

04 · status, deposit address, receipt
curl https://app.darkroute.exchange/api/v1/order/dr_4f2a9c31be07

Poll it. order.depositAddress and order.deadline are what your user needs; order.status walks PENDING_DEPOSIT, PROCESSING, SUCCESS, or REFUNDED, FAILED, INCOMPLETE_DEPOSIT.

Rules

What the API promises, and what it does not.

No key yet

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.

A quote is dry

It never creates an order and never touches the venue's order book. Quote as often as the limit allows.

An order is non-custodial

The venue issues a one-time deposit address; funds go from the sender into the route. DarkRoute never holds them and cannot reverse them.

The id is the credential

There is no account. Anyone with an order id can read its status and deposit address, so treat ids as secrets on your side.

The fee is printed

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.

Same rows as the app

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.