POST /api/v1/currencies

List active assets in the catalog with per-asset precision and capabilities.

POST/api/v1/currenciesAuth optional

Returns the active asset catalog: every currency/network combination the engine will receive or send right now. Aggregator integrations call this on startup and re-poll every 30–60 seconds to pick up operator-side asset toggles.

The body is served from a 30-second server-side cache. Calling more often returns the cached snapshot. The empty-body convention {} is honoured for forward compatibility. No filter fields are accepted today.

Request

Body
(empty body)object
Send {} as the request body. Unsigned callers may omit the auth headers entirely. Signed callers must still HMAC the empty object; the signature is computed over the literal two bytes {}.

Response

200 OK
{
  "code": 0,
  "msg": "",
  "data": [
    {
      "code": "btc",
      "coin": "BTC",
      "network": "Bitcoin",
      "name": "Bitcoin",
      "recv": true,
      "send": true,
      "tag": null,
      "logo": null,
      "color": null,
      "minAmount": null,
      "maxAmount": null,
      "precision": 8
    },
    {
      "code": "usdt_trc20",
      "coin": "USDT",
      "network": "Tron",
      "name": "Tether (Tron)",
      "recv": true,
      "send": true,
      "tag": null,
      "logo": null,
      "color": null,
      "minAmount": null,
      "maxAmount": null,
      "precision": 6
    }
  ]
}
Fields
data[].codestring
Canonical asset id used in every other endpoint (e.g. "btc", "usdt_trc20", "usdc_arb").
data[].coinstring
Trading symbol shown in human-facing surfaces (e.g. "BTC", "USDT").
data[].networkstring
Settlement network name (e.g. "Bitcoin", "Tron", "Arbitrum").
data[].namestring
Long display name for UI rendering.
data[].recvboolean
Always true for entries in this list (assets we accept as deposits).
data[].sendboolean
True when the operator has enabled payouts on the asset’s network. Greyed-out destinations should map to send = false.
data[].tagstring | null
Memo/destination-tag flag for networks that need it. Always null today (no such networks are supported).
data[].logostring | null
Reserved. Always null.
data[].colorstring | null
Reserved. Always null.
data[].minAmountstring | null
Always null. Per-asset minimums depend on a live USD price and would couple this catalog to the rates feed. Call /api/v1/price for current bounds.
data[].maxAmountstring | null
Always null. See minAmount.
data[].precisionnumber
Maximum number of decimal places accepted in amount fields for this asset.

Errors

codemsgHTTPDescription
11UPSTREAM_ERROR503A required upstream is temporarily unavailable. Retry with exponential backoff.

Code examples

# /api/v1/currencies accepts anonymous calls — no signing required.
BODY='{}'
curl -sS -X POST "https://0trace.io/api/v1/currencies" \
  -H "Content-Type: application/json" \
  --data "$BODY"

# Authenticated call (counts toward your rate-limit budget):
APIKEY="rWqZ...Rg"
APISECRET="G1JV...n4"
NONCE=$(openssl rand -hex 16)
SIGN=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$APISECRET" | sed 's/^.* //')
curl -sS -X POST "https://0trace.io/api/v1/currencies" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $APIKEY" \
  -H "X-API-SIGN: $SIGN" \
  -H "X-API-NONCE: $NONCE" \
  --data "$BODY"

Rate limit

Weight 1 per call. Unsigned calls bypass the per-partner bucket entirely; signed calls are charged 1 weight unit each.

Notes

The response always carries Cache-Control: no-store so HTTP intermediaries do not double-cache on top of our own server-side snapshot. Treat the 30-second cache window as the only freshness guarantee.

Partner API.
Same engine as 0trace.

A private partner integration surface. Signed quotes, server-side pricing, webhook delivery, multiple reference codes, and a self-serve cabinet — all backed by the production exchange engine.

Need help?

Questions? Answers.

A partner integration surface on top of the same exchange engine that powers 0trace.io. You connect with a signed REST contract, query quotes, open orders, and receive webhook notifications. Our liquidity, our pricing, our payouts. You focus on your product.
No. The API is private and invite-only, aligned with the privacy posture of 0trace itself. There is no KYC, no identity collection, and no source-of-funds reporting required of partners or their end users.
Submit a request through our partner application form at 0trace.io/api/contact-sales and we’ll reply within three business days.
Traffic is encrypted in transit (TLS). Every request is signed with HMAC-SHA256 over the exact request body bytes and gated by a nonce-based replay window. Pricing, fees, and payout amounts are computed server-side. Payouts run on an isolated service that re-verifies each transfer against the on-chain deposit before broadcasting.
A per-partner sliding-window weight budget, default 2500 wu/min (≈50 creates/minute). Endpoint weights: /api/v1/create is 50, /api/v1/qr is 5, every other endpoint is 1. XML feeds run on a separate public bucket. Exceeding the budget returns 429 with a Retry-After header. To raise your cap, send your projected per-endpoint call rate to your operator contact.
Two ways to earn. Revenue share: send us traffic with your referral link and earn a share of our service fee on every order — the visitor sees our live rate. Markup: integrate through the API and add your own margin on top of our rate, shown in your own interface. Use either, or both.
Yes. 0trace operates its own liquidity pool across every supported asset and network. Quotes are recomputed server-side at order creation against the live feed. Payouts are direct, with no third-party intermediary.
Bitcoin, Ethereum, BSC, Solana, Tron, Monero, and Arbitrum One — covering native coins plus the major stablecoins on each network (USDT, USDC, USDC.e).
Yes. We push signed events for order.status_changed and partner.paid_out; you subscribe to the ones you want in your cabinet.

Follow us on X for the latest updates.

Subscribe