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
- ✓ 30 req / hodinu
- ✓ Max 100 výsledků / dotaz
- ✓ Plný PGN zápis partií
- ✗ Pokročilé filtry (rok, Elo, ECO, soupeř)
Standard
NEJPOPULÁRNĚJŠÍ- ✓ 120 req / hodinu
- ✓ Max 750 výsledků / dotaz
- ✓ Plný PGN zápis
- ✓ Všechny filtry (rok, Elo, ECO)
Pro
MAX VÝKON- ✓ 300 req / hodinu
- ✓ Max 1 000 výsledků / dotaz
- ✓ Plný PGN zápis
- ✓ Všechny filtry (rok, Elo, ECO)
- ✓ Prioritní podpora
| 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í:
Získejte API klíč
Zakupte si API přístup a klíč se vygeneruje automaticky po platbě. Vybrat tarif →
Přidejte Authorization hlavičku
Každý požadavek musí obsahovat hlavičku Authorization: Bearer {váš_klíč}.
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
/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
| Pole | Typ | Popis |
|---|---|---|
| id | integer | Unikátní ID partie. |
| white | string | Jméno hráče s bílými (formát „Příjmení, Jméno"). |
| black | string | Jméno hráče s černými. |
| result | string | 1-0 / 0-1 / 1/2-1/2 |
| eco | string | ECO kód zahájení (A–E + 2 číslice). |
| date | string|null | Datum partie ve formátu YYYY-MM-DD. |
| event | string|null | Název turnaje. |
| white_elo | integer|null | Elo bílého v době partie. |
| black_elo | integer|null | Elo černého v době partie. |
| pgn | string | Partie ve formátu PGN. |
/chessdb-api.php?resource=game&id={id}
Vrátí jednu konkrétní partii podle ID. Vhodné pro načtení detailu po vyhledání.
Parametry
| Parametr | Typ | Povinný | 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."
}
}
| HTTP | Kód chyby | Popis |
|---|---|---|
| 400 | missing_parameter | Chybí povinný parametr (nejčastěji q). |
| 400 | invalid_parameter | Hodnota parametru je v nepovoleném formátu. |
| 401 | missing_api_key | Chybí Authorization hlavička. |
| 401 | invalid_api_key | Klíč nebyl nalezen nebo je deaktivován. |
| 404 | not_found | Zdroj (resource nebo ID partie) neexistuje. |
| 404 | unknown_resource | Neznámá hodnota parametru resource. |
| 405 | method_not_allowed | Použita jiná HTTP metoda než GET. |
| 429 | rate_limit_exceeded | Překročen hodinový limit požadavků. Viz hlavička Retry-After. |
| 503 | service_unavailable | Doč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
- • Počáteční vydání veřejného API
- • Endpointy
gamesagame - • 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.