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.
{
"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/upcoming | What's coming up, with stable match IDs |
| GET/cs2/matches/{matchId}/odds/history | Line movement from opening to close |
| GET/cs2/live/stream | Pushed score, round and player changes |
| GET/ufc/events/{slug}/odds?bookmaker=polymarket | Live in-fight Polymarket prices |
| GET/tennis/matches/completed | Results archive for training |
Build it on a free key
500 requests a month, every game, no card.
More use cases