BetaRead the CS2 API docs

CS2 player props, with every line change.

Kills and headshot lines for CS2 players from Underdog and Sleeper, refreshed every 5 minutes, with the full history of each line from the moment it was posted to the moment it closed. Each line comes graded against the player's last 5 and 10 series, and the same key returns the stats that settle it.

  • 598 players, 173 matches
  • Every line change kept
  • L5/L10 hit rates
GET /cs2/props?status=all&include_history=true&limit=1200 OK
$ curl "https://api.citoapi.com/api/v1/cs2/props?status=all&include_history=true&limit=1" \ -H "x-api-key: $CITO_API_KEY"
{  "success": true,  "data": {    "entityType": "cs2_player_props",    "props": [      {        "provider": "sleeper",        "market": "kills_maps_1_2",        "line": 22.5,        "over": {          "multiplier": 1.78        },        "under": {          "multiplier": 1.78        },        "status": "closed",        "player": {          "ign": "AGT"        },        "team": {          "name": "BESTIA Academy"        },        "opponentName": "Underworld",        "grading": {          "l5Avg": 16.6,          "l10Avg": 18.3,          "l5OverRate": 0,          "l10OverRate": 0.1        },        "history": [          {            "line": 22.5,            "under": {              "multiplier": 1.78            },            "recordedAt": "2026-11-09T17:10:08.010Z"          },          {            "line": 22.5,            "under": {              "multiplier": 1.79            },            "recordedAt": "2026-11-09T17:40:09.283Z"          },          ...        ]      }    ]  }}

Seamless Integration with our MCP Server

Give Claude, Cursor, and ChatGPT the CS2 data. One command writes the MCP config; agents call live scoreboard, team map stat, opening duel, and transfer tools instead of inventing match IDs, and your key stays on your machine.

MCPInstall the Cito MCP server
Claude
Cursor
OpenAI
Python
Cito API
Next.js
Discord
Slack
GitHub

What CS2 prop data is in the API?

Every kills and headshot line posted for a pro CS2 player on Underdog and Sleeper since 26 October 2026: 14,082 recorded line states across 173 matches and 598 players, counted on 9 November 2026. Open lines refresh every 5 minutes, and closed lines keep their full history.

PrizePicks lines are not included.
MarketWhat it measures
kills_map_1Kills on map 1
kills_maps_1_2Kills on maps 1 and 2 combined
kills_maps_1_3Kills on maps 1 to 3 combined
headshots_maps_1_2Headshot kills on maps 1 and 2 combined

Why does line history matter?

A model needs the line it could actually have played, not just the last one. History records each change of line or price with its time, so you can measure how far lines move before a match, find the line at any moment, and backtest against the closing line.

How do I settle a prop?

With the player's stats from the same key. GET /cs2/matches/{matchId}/player-stats returns kills and headshots per map, so kills on maps 1 and 2 is the sum of the first two maps. Each line already carries the player's last 5 and 10 series averages and hit rates against it.

settle_props.py
import os, requests

API = "https://api.citoapi.com/api/v1"
H = {"x-api-key": os.environ["CITO_API_KEY"]}

props = requests.get(f"{API}/cs2/props", headers=H,
                     params={"status": "all", "include_history": "true", "market": "kills_maps_1_2", "limit": 100}).json()["data"]["props"]

for p in props:
    if p["status"] != "closed":
        continue
    lines = requests.get(f"{API}/cs2/matches/{p['matchId']}/player-stats", headers=H).json()["data"]
    mine = [l for l in lines if l["playerId"] == p["player"]["id"] and l["mapId"].endswith(("-map-1", "-map-2"))]
    if len(mine) == 2:
        kills = sum(l["kills"] for l in mine)
        opening_line = p["history"][0]["line"] if p.get("history") else p["line"]
        print(p["player"]["ign"], "opened", opening_line, "closed", p["line"], "got", kills, "OVER" if kills > p["line"] else "UNDER")

Which endpoints return props?

Four, all on Pro and above. Add status=all to include closed lines and include_history=true to attach every change.

EndpointReturns
GET /cs2/propsEvery line, filterable by market, provider, player and match
GET /cs2/props/upcomingOpen lines for matches that have not started
GET /cs2/matches/{matchId}/propsEvery line for one match
GET /cs2/players/{slug}/propsEvery line for one player, such as donk or zywoo

Endpoints you can ship with

Open the odds group: match and map prices, and the player prop lines next to them.

Odds & models

Match and map winner prices with implied probability, liquidity and spread, every price change since the market opened, and the team form, map stats and head-to-head a model needs next to them.

View docs
  • GET/api/v1/cs2/matches/upcoming?include=odds

    Upcoming matches with each one's current market prices attached.

  • GET/api/v1/cs2/matches/{matchId}/odds

    Match and map winner odds: decimal price, implied probability, liquidity, spread, status.

  • GET/api/v1/cs2/matches/{matchId}/odds/history

    Every captured price change for the match and each map, oldest first.

  • GET/api/v1/cs2/teams/{teamIdOrSlug}/form

    A team's recent results and win rate.

  • GET/api/v1/cs2/teams/{teamIdOrSlug}/map-stats

    Win rate and matches played on each map.

  • GET/api/v1/cs2/h2h/{teamIdOrSlug}/{opponentIdOrSlug}

    Head-to-head record and the meetings behind it.

FAQs

Markets, history, settlement and plans

Can't find what you're looking for? Contact our customer support team

Read the props docs

Build prop models

Create a free key, try the props for 3 days, and keep them on Pro.