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 · Browse matches

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, the match browser 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-01' \
  --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.

Prediction access and results

Free model picks are public. Premium picks on upcoming or live matches require a session with an active 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 are null for non-admin viewers.

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":"[email protected]","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. Free model picks are public; premium upcoming/live picks 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. 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. 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