Zano
ZanoX
Zano
ZanoX Logo

ZanoX Public API

v1 — Read-only access to prediction markets and sports betting data.

Getting Started

All requests require an API key passed in the X-API-Key header.

curl -H "X-API-Key: zx_your_key_here" \
  "https://zanox.io/api/v1/predictions/markets"

Requesting an API Key

API keys are issued manually. To request access, reach out to the ZanoX team via one of the channels below with a brief description of your use case:

Include in your request:

  • Your name or project name
  • What you plan to build (bot, dashboard, integration, etc.)
  • Which scopes you need (predictions:read, sports:read, or both)

Once approved, you will receive a key prefixed with zx_. Store it securely — it is shown only once and cannot be retrieved later.

Authentication

Include your API key in every request via the X-API-Key header. Keys are scoped with permissions:

  • predictions:read — Access prediction market data
  • sports:read — Access sports betting data

Keys are prefixed with zx_ and are hashed at rest. The raw key is shown only once at creation time.

Rate Limits

Default: 60 requests per minute per API key.

Rate limit status is returned in response headers:

  • X-RateLimit-Limit — Max requests per window
  • X-RateLimit-Remaining — Requests left in window
  • X-RateLimit-Reset — Window reset timestamp (ISO 8601)

Response Format

All successful responses use a consistent envelope:

{
  "data": [ ... ],
  "meta": {
    "timestamp": "2026-03-31T12:00:00.000Z",
    "request_id": "a1b2c3d4-..."
  },
  "pagination": {
    "page": 1,
    "per_page": 20,
    "total": 142,
    "total_pages": 8,
    "has_more": true
  }
}

Error responses:

{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Too many requests. Please wait and try again.",
    "details": {
      "limit": 60,
      "reset_at": "2026-03-31T12:01:00.000Z"
    }
  },
  "meta": {
    "timestamp": "2026-03-31T12:00:30.000Z",
    "request_id": "e5f6g7h8-..."
  }
}

Prediction Markets

scope: predictions:read

Sports Betting

scope: sports:read

Error Codes

CodeHTTPDescription
MISSING_API_KEY401No X-API-Key header provided
INVALID_API_KEY401Key not recognized
EXPIRED_API_KEY401Key past its expiration date
INACTIVE_API_KEY403Key has been deactivated
INSUFFICIENT_PERMISSIONS403Key lacks the required scope
RATE_LIMIT_EXCEEDED429Too many requests in the current window
NOT_FOUND404The requested resource does not exist
BAD_REQUEST400Invalid or missing parameters
INTERNAL_ERROR500An unexpected server error occurred

JavaScript Example

const API_KEY = 'zx_your_key_here';
const BASE = 'https://zanox.io/api/v1';

async function getMarkets() {
  const res = await fetch(`${BASE}/predictions/markets?status=active&per_page=10`, {
    headers: { 'X-API-Key': API_KEY },
  });
  const json = await res.json();
  console.log(json.data);          // Array of markets
  console.log(json.pagination);    // { page, per_page, total, ... }
}

getMarkets();

Trading API

Place orders programmatically using your own Zano wallet. Supports both prediction markets (fUSD) and sports betting (ZANO or fUSD), with limit and market orders.

Prerequisites

You need the following before you can trade via API:

  1. A trade-scoped API key — Request one with predictions:trade and/or sports:trade permissions (see Requesting an API Key above).
  2. A Zano wallet with a registered alias — Your wallet must have an on-chain alias (e.g. @youralias). You can register one in the Zano desktop app.
  3. Zano simplewallet running in RPC mode — The trading API requires you to sign challenges with your wallet. Start simplewallet with:
    ./simplewallet --wallet-file your_wallet.wallet \
      --password YOUR_PASSWORD \
      --rpc-bind-ip 127.0.0.1 --rpc-bind-port 12233 \
      --daemon-address 127.0.0.1:11211

    On macOS with the Zano app installed, the binary is at /Applications/Zano.app/Contents/MacOS/simplewallet

  4. Funds in your wallet — fUSD for prediction markets, ZANO for sports betting. Both are Zano confidential assets on the same blockchain.

How It Works

Every trade follows this flow:

  1. Authenticate — Prove you own the wallet by signing a server-issued challenge. You get a 24-hour trading token.
  2. Place order — Submit order details (market, side, price, size). For buys, the API returns payment instructions (address, amount, asset ID, payment ID).
  3. Send payment — Transfer the exact amount from your wallet to the platform address using the provided payment details.
  4. Confirm — Submit the transaction hash. The order enters the orderbook and matching begins.
  5. Settlement — The platform verifies the on-chain payment amount (10 block confirmations). For Polymarket-linked markets, a mirror trade is placed automatically.

Sell orders skip steps 3–4 — they list immediately since you're selling shares you already own.

Authentication

Trading requires two credentials on every request:

  • X-API-Key header — your API key (identifies your app, enforces rate limits)
  • Authorization: Bearer <trading_token> header — your 24-hour wallet token (proves wallet ownership)

The trading token is obtained by signing a challenge with your wallet. The platform's daemon cryptographically verifies the signature matches your alias's public key. Tokens expire after 24 hours; request a new one by repeating the challenge/verify flow.

Step 1: Get a Trading Token

With your simplewallet running in RPC mode, complete the three-step auth handshake:

# Step 1: Request challenge
curl -X POST -H "X-API-Key: zx_your_key" \
  -H "Content-Type: application/json" \
  -d '{"address": "ZxYourAddress...", "alias": "youralias"}' \
  "https://zanox.io/api/v1/trade/auth/challenge"

# Response includes challenge_base64

# Step 2: Sign with your wallet RPC
curl -X POST http://127.0.0.1:11212/json_rpc \
  -d '{"jsonrpc":"2.0","id":0,"method":"sign_message","params":{"buff":"<challenge_base64>"}}'

# Response: { "result": { "pkey": "abc...", "sig": "def..." } }

# Step 3: Verify signature and get trading token
curl -X POST -H "X-API-Key: zx_your_key" \
  -H "Content-Type: application/json" \
  -d '{"address":"ZxYourAddress...","alias":"youralias","challenge":"<original_challenge>","signature":"<sig>","pkey":"<pkey>"}' \
  "https://zanox.io/api/v1/trade/auth/verify"

# Response: { "data": { "trading_token": "eyJ...", "expires_in": 86400 } }

Step 2: Place an Order

All trade endpoints require both X-API-Key and Authorization: Bearer <trading_token>.

POST /api/v1/trade/orders parameters:

FieldTypeRequiredDescription
market_typestringyes"prediction" or "sports"
market_iduuidyesMarket UUID
outcome_iduuidyesOutcome UUID
sidestringyesPredictions: "buy"/"sell". Sports: "yes"/"no"
order_typestringno"limit" (default) or "market". Limit orders sit in the orderbook at your price. Market orders fill at best available.
pricenumberyesPrice per share, between 0 and 1 (exclusive). E.g. 0.65 = 65 cents.
sizenumberyesNumber of shares. Minimum 0.1.
currencystringnoSports only: "ZANO" (default) or "FUSD". Predictions always use fUSD.
# Limit order: sits in orderbook at your price until filled or cancelled
curl -X POST -H "X-API-Key: zx_your_key" \
  -H "Authorization: Bearer <trading_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "market_type": "prediction",
    "market_id": "uuid-of-market",
    "outcome_id": "uuid-of-outcome",
    "side": "buy",
    "order_type": "limit",
    "price": 0.65,
    "size": 10
  }' \
  "https://zanox.io/api/v1/trade/orders"

# Market order: fills immediately at best available price
curl -X POST -H "X-API-Key: zx_your_key" \
  -H "Authorization: Bearer <trading_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "market_type": "sports",
    "market_id": "uuid-of-market",
    "outcome_id": "uuid-of-outcome",
    "side": "yes",
    "order_type": "market",
    "price": 0.70,
    "size": 5,
    "currency": "ZANO"
  }' \
  "https://zanox.io/api/v1/trade/orders"

# Response includes payment instructions for buy orders:
# { "data": { "order_id": "...", "status": "pending",
#   "payment": { "address": "Zx...", "amount": 7.15,
#     "payment_id": "01abc...", "asset_id": "86143..." } } }

Step 3: Send Payment and Confirm

# Send payment from your wallet
curl -X POST http://127.0.0.1:11212/json_rpc \
  -d '{"jsonrpc":"2.0","id":0,"method":"transfer","params":{
    "destinations":[{"address":"Zx...","amount":7150000000000,
      "asset_id":"86143388bd056a8f0bab669f78f14873fac8e2dd8d57898cdb725a2d5e2e4f8f",
      "payment_id":1234567890123456}],
    "fee":10000000000,"mixin":15}}'

# Confirm with tx_hash
curl -X PUT -H "X-API-Key: zx_your_key" \
  -H "Authorization: Bearer <trading_token>" \
  -H "Content-Type: application/json" \
  -d '{"tx_hash": "<64_char_hex_hash>"}' \
  "https://zanox.io/api/v1/trade/orders/<order_id>/confirm"

Trading Endpoints Reference

MethodPathDescription
POST/api/v1/trade/auth/challengeRequest signing challenge
POST/api/v1/trade/auth/verifySubmit signature, receive trading token
POST/api/v1/trade/ordersPlace order (returns payment instructions for buys)
GET/api/v1/trade/ordersList your orders
PUT/api/v1/trade/orders/:id/confirmConfirm payment with tx_hash
DELETE/api/v1/trade/orders/:idCancel an open order
GET/api/v1/trade/positionsList your open positions
GET/api/v1/trade/accountAccount summary

Order Types

Limit orders

Placed at a specific price. The order sits in the orderbook until another trader matches it at your price or better. Use for precise entry points and better prices.

Market orders

Fill immediately against the best available orders in the book. Use when you want instant execution and are willing to accept the current best price.

Polymarket Mirror Thresholds

Prediction markets linked to Polymarket will automatically mirror your orders on the Polymarket CLOB after payment confirmation (10 block confirmations). Polymarket enforces minimum order sizes:

ActionMinimumNotes
Buy5 sharesOrder value must also exceed ~$1 USDC equivalent
Sell5 sharesSame minimum applies to sell/close orders

Orders below these thresholds will still execute on ZanoX's P2P orderbook but will not be mirrored to Polymarket. The order response does not indicate whether a mirror will occur — check the market's polymarket_id field to know if mirroring is available.

Order Lifecycle

Buy orders: pending (awaiting payment) → open (paid, in orderbook) → partial → filled

Sell orders: open (listed immediately, no payment needed) → partial → filled

Market orders: fill immediately after payment confirmation; any unfilled remainder may stay open or cancel depending on liquidity

Cancellation: open or partial orders can be cancelled via DELETE