Use cases/Prediction & trading models

[UC 01]

How developers build prediction-market and trading models with Cito

Seen in our API traffic

The largest group of paying apps calling Cito, from Polymarket research recorders to live tennis and UFC models.

GET /cs2/matches/{matchId}/odds
{
  "success": true,
  "data": {
    "entity_type": "cs2_match_odds",
    "match_id": "cs2-match-2399653",
    "teams": { "team1_name": "VP.Future", "team2_name": "QUAZAR" },
    "odds": [
      {
        "provider": "polymarket",
        "market": "moneyline",
        "team1_odds": 2.41,
        "team2_odds": 1.71,
        "market_status": "open",
        "captured_at": "2026-10-17T14:30:05.010Z"
      }
    ]
  }
}

Challenge

A model needs clean history to train on, the same IDs live as in the archive, and prices to compare against. Stitching that from scrapers means broken joins, renamed teams and gaps right when a market moves.

Solution

One API for the archive, the live state and the market price. Stable IDs tie a 2024 result to tonight's match, odds come with their full line movement, and live updates arrive within a second of the public scoreboard.

What you get

  • Train on match, map, round and player stats with stable IDs
  • Compare model output to live Polymarket and sportsbook prices
  • React to live score changes in about 0.25 s on the stream
  • Backtest with odds line movement from opening to close

Start from the archive

Most models start with history. Every match, map and player row carries a stable ID, so the same team is the same entity across seasons, roster changes and renames.

Pull results and per-map stats for the period you want to train on, then join them to the odds history for the same matches.

const res = await fetch(
  "https://api.citoapi.com/api/v1/cs2/matches/upcoming?limit=50",
  { headers: { "x-api-key": process.env.CITO_API_KEY } }
);
const { data: matches } = await res.json();

Price it against the market

CS2 match and map odds come with their full line movement, and UFC fights carry Polymarket prices that keep trading during the fight. Each quote says whether its market is open, suspended or closed, so a model never trades on a stale price.

Go live

For in-play signals, open the live stream instead of polling. Score, round and player changes arrive as they happen, about a quarter of a second behind the public scoreboard in our measurements.

Endpoints used

GET/cs2/matches/upcomingWhat's coming up, with stable match IDs
GET/cs2/matches/{matchId}/odds/historyLine movement from opening to close
GET/cs2/live/streamPushed score, round and player changes
GET/ufc/events/{slug}/odds?bookmaker=polymarketLive in-fight Polymarket prices
GET/tennis/matches/completedResults archive for training

Build it on a free key

500 requests a month, every game, no card.

More use cases