ChessDB API v1
API je aktivní

ChessDB API

Přímý přístup k databázi šachových partií přes REST API. Vyhledávejte partie dle hráče, zahájení, Elo ratingu nebo výsledku a integrujte je do svých aplikací.

Tarify a ceny

API přístup je samostatné předplatné – nezávislé na jiných plánech ChessDB. Platba kartou přes Stripe, zrušení kdykoli.

Starter

299 Kč / měs.
  • 30 req / hodinu
  • Max 100 výsledků / dotaz
  • Plný PGN zápis partií
  • Pokročilé filtry (rok, Elo, ECO, soupeř)
Zakoupit Starter

Standard

NEJPOPULÁRNĚJŠÍ
599 Kč / měs.
  • 120 req / hodinu
  • Max 750 výsledků / dotaz
  • Plný PGN zápis
  • Všechny filtry (rok, Elo, ECO)
Zakoupit Standard

Pro

MAX VÝKON
900 Kč / měs.
  • 300 req / hodinu
  • Max 1 000 výsledků / dotaz
  • Plný PGN zápis
  • Všechny filtry (rok, Elo, ECO)
  • Prioritní podpora
Zakoupit Pro
Funkce Starter Standard Pro
Požadavků / hodinu 30 120 300
Max výsledků / dotaz 100 750 1 000
PGN notace
Filtry: rok, Elo, ECO, soupeř
Prioritní podpora

Platba kartou přes Stripe · Zrušení kdykoli · Přejít na nákup →

Moje API klíče

Správa vašeho API přístupu a předplatného Stripe.

Přihlaste se pro správu klíčů

Po přihlášení uvidíte své aktivní klíče a budete moci spravovat předplatné.

Base URL

https://chessdb.cz/chessdb-api.php

Všechny požadavky musí být odesílány přes HTTPS. HTTP požadavky jsou odmítnuty.

Quickstart

Tři kroky pro první API volání:

01

Získejte API klíč

Zakupte si API přístup a klíč se vygeneruje automaticky po platbě. Vybrat tarif →

02

Přidejte Authorization hlavičku

Každý požadavek musí obsahovat hlavičku Authorization: Bearer {váš_klíč}.

03

Zavolejte endpoint

Vyhledejte partie libovolného hráče parametrem q.

# Vyhledání partií hráče Novak
curl -X GET "https://chessdb.cz/chessdb-api.php?resource=games&q=Novak&per_page=5" \
  -H "Authorization: Bearer váš_api_klíč_zde"
// Ukázková odpověď
{
  "data": [
    {
      "id":        12345,
      "white":     "Novak, Jan",
      "black":     "Kolar, Petr",
      "result":    "1-0",
      "eco":       "E60",
      "date":      "2023-11-04",
      "event":     "Mistrovství ČR 2023",
      "white_elo": 2210,
      "black_elo": 2180,
      "pgn":       "1. d4 Nf6 2. c4 g6 ..."
    }
  ],
  "meta": {
    "total":    142,
    "page":     1,
    "per_page": 5,
    "has_more": true,
    "max_page": 20
  }
}

Autentizace

API používá API klíče přenášené v HTTP hlavičce. Klíče jsou 64 hex znaků (256 bitů entropie).

Bearer token (doporučeno)

Authorization: Bearer váš_api_klíč_zde

Query parameter (pouze pro testování)

https://chessdb.cz/chessdb-api.php?resource=games&q=Novak&api_key=váš_api_klíč_zde

Neposílejte klíč v URL v produkci – URL se loguje na serverech a v browserové historii.

Bezpečnostní pravidla

  • Klíč uchovávejte v bezpečí – necommitujte ho do verzovacího systému.
  • Používejte proměnné prostředí nebo správce tajemství (Vault, Doppler, …).
  • Pokud máte podezření na únik klíče, okamžitě ho deaktivujte ve svém profilu.
  • Klíče jsou jednosměrně hashované (SHA-256) – zobrazit ho znovu nelze.

Rate limiting

Limity chrání databázi a zajišťují rovný přístup pro všechny uživatele.

Limit Starter Standard Pro
Požadavků / hodinu 30 120 300
Max výsledků / stránka 20 50 50
Max stránek (celkem výsledků) 5 (100) 15 (750) 20 (1 000)

Každá odpověď obsahuje hlavičky s aktuálním stavem limitu (ukázka pro Standard tarif):

X-RateLimit-Limit:     120
X-RateLimit-Remaining: 118
X-RateLimit-Reset:     1711483200   # Unix timestamp resetu (začátek příští hodiny)
X-API-Tier:            standard      # Váš aktuální tarif
Retry-After:          1823          # Pouze při HTTP 429 – sekundy do resetu

Okno se resetuje vždy na začátku každé celé hodiny (UTC). Pro enterprise limity nás kontaktujte.

Endpointy

GET /chessdb-api.php?resource=games

Vyhledávání partií v databázi. Parametr q je povinný – hromadné stahování bez filtrů není povoleno.

Parametry

Parametr Typ Povinný Popis
q string required Jméno hráče. Podporuje diakritiku i bez ní. Max 120 znaků.
side string optional any (výchozí) · white · black
opponent string optional Jméno soupeře (funguje v kombinaci s side).
year_from integer optional Rok od (včetně). Rozsah 1800–2100.
year_to integer optional Rok do (včetně). Rozsah 1800–2100.
elo_from integer optional Minimální Elo rating. Rozsah 0–4000.
elo_to integer optional Maximální Elo rating. Rozsah 0–4000.
eco string optional ECO kód zahájení. Přesný (E60) nebo prefix (E).
result string optional Výsledek. Hodnoty: 1-0, 0-1, 1/2-1/2. Lze kombinovat čárkou.
page integer optional Číslo stránky. Výchozí: 1. Max: 20.
per_page integer optional Výsledků na stránku. Výchozí: 20. Max: 50.

Odpověď – pole data

PoleTypPopis
idintegerUnikátní ID partie.
whitestringJméno hráče s bílými (formát „Příjmení, Jméno").
blackstringJméno hráče s černými.
resultstring1-0 / 0-1 / 1/2-1/2
ecostringECO kód zahájení (A–E + 2 číslice).
datestring|nullDatum partie ve formátu YYYY-MM-DD.
eventstring|nullNázev turnaje.
white_elointeger|nullElo bílého v době partie.
black_elointeger|nullElo černého v době partie.
pgnstringPartie ve formátu PGN.
GET /chessdb-api.php?resource=game&id={id}

Vrátí jednu konkrétní partii podle ID. Vhodné pro načtení detailu po vyhledání.

Parametry

ParametrTypPovinnýPopis
id integer required ID partie (z pole id výsledku /games).

Chybové kódy

Všechny chyby vracejí JSON s polem error:

{
  "error": {
    "code":    "rate_limit_exceeded",
    "message": "Rate limit exceeded: 60 requests per hour allowed. Reset in 1823 seconds."
  }
}
HTTPKód chybyPopis
400missing_parameterChybí povinný parametr (nejčastěji q).
400invalid_parameterHodnota parametru je v nepovoleném formátu.
401missing_api_keyChybí Authorization hlavička.
401invalid_api_keyKlíč nebyl nalezen nebo je deaktivován.
404not_foundZdroj (resource nebo ID partie) neexistuje.
404unknown_resourceNeznámá hodnota parametru resource.
405method_not_allowedPoužita jiná HTTP metoda než GET.
429rate_limit_exceededPřekročen hodinový limit požadavků. Viz hlavička Retry-After.
503service_unavailableDočasný problém na serveru. Zkuste znovu za chvíli.

Příklady kódu

# Vyhledání partií – bílý hráč, od roku 2020, první stránka
curl -X GET \
  "https://chessdb.cz/chessdb-api.php?resource=games&q=Novak&side=white&year_from=2020&per_page=20" \
  -H "Authorization: Bearer váš_api_klíč"

# Načtení konkrétní partie
curl -X GET \
  "https://chessdb.cz/chessdb-api.php?resource=game&id=12345" \
  -H "Authorization: Bearer váš_api_klíč"

# Filtr dle výsledku a ECO
curl -X GET \
  "https://chessdb.cz/chessdb-api.php?resource=games&q=Kolar&result=1-0,1%2F2-1%2F2&eco=E" \
  -H "Authorization: Bearer váš_api_klíč"
// ChessDB API client (vanilla JS / Node.js)

const API_KEY  = 'váš_api_klíč';
const BASE_URL = 'https://chessdb.cz/chessdb-api.php';

async function searchGames(params) {
  const url = new URL(BASE_URL);
  url.searchParams.set('resource', 'games');
  for (const [key, value] of Object.entries(params)) {
    url.searchParams.set(key, value);
  }

  const response = await fetch(url, {
    headers: { 'Authorization': `Bearer ${API_KEY}` },
  });

  if (!response.ok) {
    const err = await response.json();
    throw new Error(err.error?.message ?? 'Unknown error');
  }

  return response.json();
}

// Příklad použití
const result = await searchGames({
  q:         'Novak',
  side:      'white',
  year_from: 2020,
  per_page:  20,
});

console.log(`Nalezeno ${result.meta.total} partií`);
result.data.forEach(g => console.log(g.white, 'vs', g.black, g.result));

// Stránkování přes všechny výsledky
async function fetchAllPages(params) {
  const games = [];
  let page = 1;
  let hasMore = true;

  while (hasMore) {
    const res = await searchGames({ ...params, page });
    games.push(...res.data);
    hasMore = res.meta.has_more;
    page++;
  }
  return games;
}
import requests
from typing import Any, Iterator

API_KEY  = "váš_api_klíč"
BASE_URL = "https://chessdb.cz/chessdb-api.php"

class ChessDBClient:
    def __init__(self, api_key: str):
        self.session = requests.Session()
        self.session.headers.update({
            "Authorization": f"Bearer {api_key}"
        })

    def search_games(self, q: str, **kwargs) -> dict[str, Any]:
        resp = self.session.get(BASE_URL, params={
            "resource": "games",
            "q": q,
            **kwargs
        })
        resp.raise_for_status()
        return resp.json()

    def get_game(self, game_id: int) -> dict[str, Any]:
        resp = self.session.get(BASE_URL, params={
            "resource": "game",
            "id": game_id
        })
        resp.raise_for_status()
        return resp.json()["data"]

    def iter_pages(self, q: str, **kwargs) -> Iterator[list]:
        """Iterátor přes všechny stránky výsledků."""
        page = 1
        while True:
            result = self.search_games(q, page=page, per_page=50, **kwargs)
            yield result["data"]
            if not result["meta"]["has_more"]:
                break
            page += 1


# Příklad použití
client = ChessDBClient(API_KEY)

result = client.search_games(
    q="Novak",
    side="white",
    year_from=2020,
    eco="E60"
)
print(f"Nalezeno {result['meta']['total']} partií")

# Uložení PGN souborů
for page_games in client.iter_pages("Novak"):
    for game in page_games:
        filename = f"game_{game['id']}.pgn"
        with open(filename, "w") as f:
            f.write(game["pgn"])


class ChessDBClient {
    private string $apiKey;
    private string $baseUrl = 'https://chessdb.cz/chessdb-api.php';

    public function __construct(string $apiKey) {
        $this->apiKey = $apiKey;
    }

    /** @param array<string,mixed> $params */
    public function searchGames(string $q, array $params = []): array {
        return $this->request(array_merge(
            ['resource' => 'games', 'q' => $q],
            $params
        ));
    }

    public function getGame(int $id): array {
        return $this->request(['resource' => 'game', 'id' => $id])['data'];
    }

    private function request(array $params): array {
        $url = $this->baseUrl . '?' . http_build_query($params);
        $ctx = stream_context_create([
            'http' => [
                'method' => 'GET',
                'header' => "Authorization: Bearer {$this->apiKey}\r\n",
                'ignore_errors' => true,
            ],
        ]);

        $body = file_get_contents($url, false, $ctx);
        if ($body === false) {
            throw new RuntimeException('HTTP request failed');
        }

        $data = json_decode($body, true);
        if (isset($data['error'])) {
            throw new RuntimeException($data['error']['message']);
        }
        return $data;
    }
}

// Použití
$client = new ChessDBClient('váš_api_klíč');

$result = $client->searchGames('Novak', [
    'side'      => 'white',
    'year_from' => 2022,
    'per_page'  => 50,
]);

echo "Nalezeno: {$result['meta']['total']} partií\n";
foreach ($result['data'] as $game) {
    echo "{$game['white']} vs {$game['black']} – {$game['result']}\n";
}

Changelog

v1.0.0 2025
  • • Počáteční vydání veřejného API
  • • Endpointy games a game
  • • Autentizace přes Bearer token (API klíč)
  • • Rate limiting dle tarifu: 30 / 120 / 300 req/h (Starter / Standard / Pro)
  • • Stránkování: max 5–20 stránek podle tarifu
  • • Tři platební tarify přes Stripe Checkout

Připraveni stavět?

Vyberte tarif a začněte integrovat databázi českých šachových partií do své aplikace ještě dnes.