capper.win logo capper

Developers

capper.win API

Find matches, read available predictions and manage a signed-in user’s favorites.

Download the OpenAPI 3.1 specification

Agent discovery: /llms.txt (site orientation for LLM agents) and /.well-known/api-catalog (RFC 9727 linkset naming this API description and guide). This page, the homepage and match pages return Markdown for Accept: text/markdown.

Read a day’s matches

Public reads need no account or API key (the interactive app at /app does need a verified account). Use Accept: application/json. The API groups fixtures by country, then league. Each fixture includes its internal id and a url for the HTML match page.

curl --get 'https://capper.win/api/v2/list' \
  --header 'Accept: application/json' \
  --data-urlencode 'date=2026-10-26' \
  --data-urlencode 'tz=Europe/Kyiv' \
  --data-urlencode 'market=total_goals'

A day includes its local midnight and excludes the next midnight. The response echoes the resolved date and market. Unknown markets and timezones fall back to their defaults; unparseable date strings fall back to today. Send valid scalar parameters rather than relying on these fallbacks.

Read fixtures at countries[].leagues[].fixtures[]. An empty countries array means no matching fixtures. Result markets omit fixtures with no predictions. These endpoints return the complete selected set without pagination. Use the internal fixture ID, not the upstream football provider’s ID, for favorites.

Every fixture names its sport and carries a short team name in home.short and away.short (null when unknown). For basketball, home.goals and away.goals hold the points including overtime, a live game names its quarter in period (Q1–Q4, OT, HT, BT), and periods lists the points per quarter and in overtime for each side. A basketball game never ends in a draw. For hockey, home.goals and away.goals hold the final goals including overtime and, after a shootout, the winner’s one shootout goal; a live game names its period in period (P1–P3, OT, PT, BT), periods lists the goals per period (three entries), in overtime and, after a shootout, each side’s shootout tally in so, and a hockey game never ends in a draw either.

Prediction access and results

Picks on upcoming or live matches require a session with an active premium entitlement. Finished matches expose their predictions publicly. Hidden providers are excluded; tipsters use public codenames for non-admin viewers.

A locked prediction contains locked: true, its provider and highlight flags. Its pick, line, label, odds and result are omitted. An unlocked prediction has locked: false and a readable label such as Over 2.5. Bookmaker odds (odd) are sent to signed-in viewers and are null for anonymous requests.

An empty predictions array means no pick is available for this market. predictions_eta, when present, is an estimate for a scheduled prediction, not a guarantee. Scores and results can lag the match; the daily API can trigger a guarded live refresh. Forecasts are informational only and no outcome is guaranteed.

Sessions and favorites

Account operations use the same cookie session as the website. There is no API-key or delegated OAuth-token flow. Use an existing account that you are authorized to access; registration is available on the sign-up page.

  1. Call GET /api/auth/csrf-cookie and retain all response cookies in a cookie jar.
  2. URL-decode the current XSRF-TOKEN cookie. Send it as X-XSRF-TOKEN with the cookies on every POST or DELETE request.
  3. Call POST /api/auth/login with JSON {"email":"you@example.com","password":"your-password"}. Retain the rotated cookies and refresh your CSRF header from the new cookie.
  4. Use GET /api/auth/user to confirm the session and user.premium to check access.
  5. Choose a fixture ID from the feed. Call POST /api/v2/favorites/{fixture} with cookies and CSRF header, without a body. Repeating this call is safe.
  6. Read GET /api/v2/favorites or GET /api/v2/favorites/feed. Remove a favorite with DELETE /api/v2/favorites/{fixture}, also with cookies and CSRF header.
  7. Call POST /api/auth/logout with cookies and CSRF header when finished.

Browser clients should use same-origin requests with credentials. Non-browser clients must maintain the cookie jar themselves. Login, logout and CSRF initialization can update cookies; always use their latest values.

Errors and request limits

API errors return JSON with a message. Validation errors also contain an errors object keyed by field. HTTP status codes indicate what to do next:

The public feed limit is 120 requests per minute per IP, shared by the daily feed, leagues, public prediction pages and other feed-throttled routes. X-RateLimit-Limit and X-RateLimit-Remaining report the allowance. Avoid polling unchanged historical data.

Consumer endpoints

This reference covers the fixture feed, leagues, favorites and existing-account sessions. Billing, registration, statistics and administrative interfaces are outside this OpenAPI contract.

GET /api/v2/list

List fixtures for a calendar day

Public. Existing session cookies personalize premium access. A day spans local midnight inclusive to the next midnight exclusive. No pagination. Reading may trigger a lock-protected live-score refresh. Upcoming/live picks without a premium entitlement omit pick, line, label, odd and result. Finished picks are public. Hidden providers are excluded. Tipster identities use public codenames for non-admins.

Response statuses: 200, 429, 422, 404. Request and response schemas

GET /api/v2/sports

List the sports with their markets

Public. Sports with at least one active league the viewer may see, each with its market tabs in tab order (public keys) and the number of its fixtures on the requested day (all fixtures of its active leagues, whether or not they carry a pick).

Response statuses: 200, 429, 422. Request and response schemas

GET /api/v2/favorites/feed

Read your favorite fixtures across all dates

Same prediction entitlement rules as the daily feed. No pagination.

Response statuses: 200, 401, 422, 404. Request and response schemas

POST /api/v2/favorites/{fixture}

Add a fixture to your favorites

Idempotent: adding an existing favorite still returns ok. Send no request body. Use an existing fixture ID from the feed.

Response statuses: 200, 401, 419. Request and response schemas

DELETE /api/v2/favorites/{fixture}

Remove a fixture from your favorites

Idempotent: removing an absent favorite still returns ok. Send no request body.

Response statuses: 200, 401, 419. Request and response schemas

GET /api/auth/csrf-cookie

Initialize the session and CSRF cookies

Retain all Set-Cookie values. Before POST/DELETE requests, URL-decode the current XSRF-TOKEN cookie and send it as X-XSRF-TOKEN. Cookies may rotate on login/logout; keep the cookie jar current.

Response statuses: 204. Request and response schemas

POST /api/auth/login

Sign in with an existing account

Bootstrap cookies first. Send JSON credentials. This endpoint is for guests. A successful login rotates session/CSRF cookies. Validation failures, invalid credentials and the limit of five failed attempts per email/IP per minute return 422.

Response statuses: 200, 419, 422. Request and response schemas