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:
- Telegram — t.me/+6vaO1jARCZMwOWY5
- Discord — discord.gg/UtWbBec2tW
- Twitter / X — @ZanoX_io
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 datasports: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 windowX-RateLimit-Remaining— Requests left in windowX-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:readSports Betting
scope: sports:readError Codes
| Code | HTTP | Description |
|---|---|---|
| MISSING_API_KEY | 401 | No X-API-Key header provided |
| INVALID_API_KEY | 401 | Key not recognized |
| EXPIRED_API_KEY | 401 | Key past its expiration date |
| INACTIVE_API_KEY | 403 | Key has been deactivated |
| INSUFFICIENT_PERMISSIONS | 403 | Key lacks the required scope |
| RATE_LIMIT_EXCEEDED | 429 | Too many requests in the current window |
| NOT_FOUND | 404 | The requested resource does not exist |
| BAD_REQUEST | 400 | Invalid or missing parameters |
| INTERNAL_ERROR | 500 | An 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:
- A trade-scoped API key — Request one with
predictions:tradeand/orsports:tradepermissions (see Requesting an API Key above). - 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. - 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 - 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:
- Authenticate — Prove you own the wallet by signing a server-issued challenge. You get a 24-hour trading token.
- Place order — Submit order details (market, side, price, size). For buys, the API returns payment instructions (address, amount, asset ID, payment ID).
- Send payment — Transfer the exact amount from your wallet to the platform address using the provided payment details.
- Confirm — Submit the transaction hash. The order enters the orderbook and matching begins.
- 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-Keyheader — 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:
| Field | Type | Required | Description |
|---|---|---|---|
| market_type | string | yes | "prediction" or "sports" |
| market_id | uuid | yes | Market UUID |
| outcome_id | uuid | yes | Outcome UUID |
| side | string | yes | Predictions: "buy"/"sell". Sports: "yes"/"no" |
| order_type | string | no | "limit" (default) or "market". Limit orders sit in the orderbook at your price. Market orders fill at best available. |
| price | number | yes | Price per share, between 0 and 1 (exclusive). E.g. 0.65 = 65 cents. |
| size | number | yes | Number of shares. Minimum 0.1. |
| currency | string | no | Sports 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
| Method | Path | Description |
|---|---|---|
| POST | /api/v1/trade/auth/challenge | Request signing challenge |
| POST | /api/v1/trade/auth/verify | Submit signature, receive trading token |
| POST | /api/v1/trade/orders | Place order (returns payment instructions for buys) |
| GET | /api/v1/trade/orders | List your orders |
| PUT | /api/v1/trade/orders/:id/confirm | Confirm payment with tx_hash |
| DELETE | /api/v1/trade/orders/:id | Cancel an open order |
| GET | /api/v1/trade/positions | List your open positions |
| GET | /api/v1/trade/account | Account 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:
| Action | Minimum | Notes |
|---|---|---|
| Buy | 5 shares | Order value must also exceed ~$1 USDC equivalent |
| Sell | 5 shares | Same 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
