inNovaAPI
Guides

5-Minute Quickstart

Place your first bet with the WinNova API in under 5 minutes

Prerequisites

  • An API key with scopes: markets:read, orders:write, orders:read
  • Your API secret for request signing

All requests go to:

https://api.winnova.pro/api/ext/v1

Every request must be signed. See the Authentication and Request Signing docs for full details.


Step 1: List Open Events

curl -X GET "https://api.winnova.pro/api/ext/v1/events?status=active&limit=5" \
  -H "X-API-KEY: your_api_key" \
  -H "X-API-TIMESTAMP: 1743760000000" \
  -H "X-API-NONCE: abc123" \
  -H "X-API-SIGNATURE: <hmac_sha256_signature>"
import requests, time, hmac, hashlib, uuid

BASE_URL = "https://api.winnova.pro/api/ext/v1"
API_KEY  = "your_api_key"
API_SECRET = "your_api_secret"

def sign(method, path, body=""):
    timestamp = str(int(time.time() * 1000))  # milliseconds
    nonce     = uuid.uuid4().hex
    body_hash = hashlib.sha256(body.encode()).hexdigest()
    payload   = f"{method}\n{path}\n{timestamp}\n{nonce}\n{body_hash}"
    sig = hmac.new(API_SECRET.encode(), payload.encode(), hashlib.sha256).hexdigest()
    return {"X-API-KEY": API_KEY, "X-API-TIMESTAMP": timestamp,
            "X-API-NONCE": nonce, "X-API-SIGNATURE": sig}

resp = requests.get(f"{BASE_URL}/events", params={"status": "active", "limit": 5},
                    headers=sign("GET", "/api/ext/v1/events"))
events = resp.json()["data"]
print(events[0]["id"], events[0]["title"])
// Using the makeRequest helper from the Authentication guide
const { data: events } = await makeRequest('GET', '/api/ext/v1/events', null, { status: 'active', limit: 5 });
console.log(events[0].id, events[0].title);

Sample response:

{
  "success": true,
  "data": [
    {
      "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
      "title": "NBA: Lakers vs Celtics",
      "status": "active",
      "sport": "basketball",
      "league": "NBA",
      "game_start_time": "2026-04-05T00:30:00Z"
    }
  ]
}

Step 2: Get Markets for an Event

curl "https://api.winnova.pro/api/ext/v1/events/7c9e6679-7425-40de-944b-e07fc1f90ae7/markets" \
  -H "X-API-KEY: ..." \
  -H "X-API-TIMESTAMP: ..." \
  -H "X-API-NONCE: ..." \
  -H "X-API-SIGNATURE: ..."
event_id = "7c9e6679-7425-40de-944b-e07fc1f90ae7"
path = f"/api/ext/v1/events/{event_id}/markets"
resp = requests.get(f"{BASE_URL}/events/{event_id}/markets", headers=sign("GET", path))
markets = resp.json()["data"]
market = markets[0]
print(market["id"], market["type"], market["outcomes"])

Sample response:

{
  "success": true,
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "type": "moneyline",
      "question": "Who will win?",
      "status": "active",
      "outcomes": [
        { "id": "out_a", "name": "Lakers", "token_id": "0xabc...", "price": 0.55 },
        { "id": "out_b", "name": "Celtics", "token_id": "0xdef...", "price": 0.45 }
      ],
      "volume": 125000.50
    }
  ]
}

Step 3: Place a Market Order (FOK)

A FOK (Fill or Kill) order executes immediately at the best available price.

curl -X POST "https://api.winnova.pro/api/ext/v1/orders" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: ..." \
  -H "X-API-TIMESTAMP: ..." \
  -H "X-API-NONCE: ..." \
  -H "X-API-SIGNATURE: ..." \
  -d '{"market_id":"550e8400-e29b-41d4-a716-446655440000","outcome":"a","amount":50}'
import json

body = json.dumps({
    "market_id": "550e8400-e29b-41d4-a716-446655440000",
    "outcome": "a",
    "amount": 50
})
resp = requests.post(f"{BASE_URL}/orders", data=body,
                     headers={**sign("POST", "/api/ext/v1/orders", body),
                               "Content-Type": "application/json"})
print(resp.json())
const order = await makeRequest('POST', '/api/ext/v1/orders', {
  market_id: '550e8400-e29b-41d4-a716-446655440000',
  outcome: 'a',
  amount: 50
});
console.log('Order ID:', order.data.order_id);

Response:

{
  "success": true,
  "data": {
    "order_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "notification_id": "notif_xyz"
  }
}

Step 4: Check Order Status

order_id = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
path = f"/api/ext/v1/orders/{order_id}"
resp = requests.get(f"{BASE_URL}/orders/{order_id}", headers=sign("GET", path))
print(resp.json()["data"]["status"])  # "matched"

Order status progresses: pendingsigningsubmittedlivematchedwon / lost


Next Steps