REST API

Public API for Czech Legislation

Access laws, court decisions, EU law and parliamentary data programmatically. Free. No registration limits.

22 808
laws
310 142
decisions
1 271
EU regulations
1 209
bills

Quick Start in 60 Seconds

1

Register

Create a free account — just an email address.

2

Generate your API token in your profile

Name your token and copy it.

3

Make your first request

Bearer token in the header — and you have data.

Example request
curl -H "Authorization: Bearer YOUR_TOKEN" \
     https://ceskezakony.cz/api/v1/laws/89/2012
Example response
{
    "data": {
        "id": 12345,
        "number": 89,
        "year": 2012,
        "title": "Občanský zákoník",
        "collection_code": "sb",
        "effective_from": "2014-01-01",
        "status": "effective",
        "stale_url": "/sb/2012/89"
    }
}

Why Use Our API

Free Forever

No paid plans, no registration limits

Complete Coverage

Collection of Laws, Supreme and Constitutional Court decisions, EU law, parliamentary bills

Daily Updates

Automatic sync from official sources

All Data in JSON

Standard REST, cursor pagination

OpenAPI 3.1 Specification

Swagger UI and client generators

High Rate Limits

5,000 requests per day for registered users

What Is in the API

Laws

Czech Collection of Laws — statutes, decrees, government regulations. Current text, version history, text fragments and cross-references.

  • GET /api/v1/laws
  • GET /api/v1/laws/{číslo}/{rok}
  • GET /api/v1/laws/{číslo}/{rok}/fragments
  • GET /api/v1/laws/{číslo}/{rok}/amendments
View all endpoints

Case Law

Court decisions from the Supreme Court, Administrative Court, Constitutional Court and others from Justice.cz. Full-text search, filtering by court and keywords.

  • GET /api/v1/decisions
  • GET /api/v1/decisions/{id}
  • GET /api/v1/courts
  • GET /api/v1/decision-keywords
View all endpoints

EU Law

EU regulations and directives from EUR-Lex. Overview of transpositions into Czech law and implementation status.

  • GET /api/v1/eu-laws
  • GET /api/v1/eu-laws/{celex}
  • GET /api/v1/eu-laws/{celex}/transpositions
View all endpoints

Parliament

Parliamentary bills, deputies, votes and sessions from PSP.cz. Track the legislative process in real time.

  • GET /api/v1/parliament/bills
  • GET /api/v1/parliament/deputies
  • GET /api/v1/parliament/votes
  • GET /api/v1/parliament/sessions
View all endpoints

Your Account & API Management

User Info & Rate Limits, statistiky využití, správa API tokenů and webhook subscriptions.

  • GET /api/v1/me — User Info & Rate Limits
  • GET /api/v1/me/usage — Usage Statistics
  • GET /api/v1/me/tokens — API Token Management
  • GET /api/v1/me/webhooks — Webhook Subscription Management
View all endpoints

Bulk Export

Download entire datasets at once — laws, case law, EU legislation, parliamentary bills. Daily-generated JSON.gz archives.

  • GET /api/v1/bulk/laws — All Laws (JSON.gz)
  • GET /api/v1/bulk/decisions — All Decisions
  • GET /api/v1/bulk/eu-laws — EU Legislation
  • GET /api/v1/bulk/parliament-bills — Parliamentary Bills
View all endpoints

Code Examples

Fetching a law by number and year
curl -s \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  https://ceskezakony.cz/api/v1/laws/89/2012
$response = Http::withToken('YOUR_TOKEN')
    ->acceptJson()
    ->get('https://ceskezakony.cz/api/v1/laws/89/2012');

$law = $response->json('data');
import requests

response = requests.get(
    'https://ceskezakony.cz/api/v1/laws/89/2012',
    headers={
        'Authorization': 'Bearer YOUR_TOKEN',
        'Accept': 'application/json',
    }
)
law = response.json()['data']
const response = await fetch(
  'https://ceskezakony.cz/api/v1/laws/89/2012',
  {
    headers: {
      'Authorization': 'Bearer YOUR_TOKEN',
      'Accept': 'application/json',
    }
  }
);
const { data: law } = await response.json();
Searching court decisions
curl -s \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  "https://ceskezakony.cz/api/v1/decisions?q=bezdůvodné+obohacení&court=NS"
$response = Http::withToken('YOUR_TOKEN')
    ->acceptJson()
    ->get('https://ceskezakony.cz/api/v1/decisions', [
        'q'      => 'bezdůvodné obohacení',
        'court'  => 'NS',
    ]);

$decisions = $response->json('data');
response = requests.get(
    'https://ceskezakony.cz/api/v1/decisions',
    params={'q': 'bezdůvodné obohacení', 'court': 'NS'},
    headers={'Authorization': 'Bearer YOUR_TOKEN', 'Accept': 'application/json'},
)
decisions = response.json()['data']
const params = new URLSearchParams({ q: 'bezdůvodné obohacení', court: 'NS' });
const response = await fetch(
  `https://ceskezakony.cz/api/v1/decisions?${params}`,
  { headers: { 'Authorization': 'Bearer YOUR_TOKEN', 'Accept': 'application/json' } }
);
const { data: decisions } = await response.json();
Tracking the legislative process
curl -s \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Accept: application/json" \
  "https://ceskezakony.cz/api/v1/parliament/bills?period=10&status=active"
$response = Http::withToken('YOUR_TOKEN')
    ->acceptJson()
    ->get('https://ceskezakony.cz/api/v1/parliament/bills', [
        'period' => 10,
        'status' => 'active',
    ]);

$bills = $response->json('data');
response = requests.get(
    'https://ceskezakony.cz/api/v1/parliament/bills',
    params={'period': 10, 'status': 'active'},
    headers={'Authorization': 'Bearer YOUR_TOKEN', 'Accept': 'application/json'},
)
bills = response.json()['data']
const params = new URLSearchParams({ period: 10, status: 'active' });
const response = await fetch(
  `https://ceskezakony.cz/api/v1/parliament/bills?${params}`,
  { headers: { 'Authorization': 'Bearer YOUR_TOKEN', 'Accept': 'application/json' } }
);
const { data: bills } = await response.json();

Authentication

The API uses Bearer token authentication:

Authorization: Bearer YOUR_API_TOKEN
  • Generate your token in your profile after logging in: Profile → API
  • Never share your API token — treat it like a password.
  • All requests must go through HTTPS.
Tokens can be revoked or regenerated at any time in your profile settings. We recommend using separate tokens for different projects.

Rate Limits and Fair Use

Access type Daily limit Burst limit
Registered users 5 000 / den 5 req/s

Response Format

  • All responses are in JSON format
  • Field names use snake_case
  • Dates are in ISO 8601 format (např. 2024-01-01T00:00:00Z)
  • Large collections use cursor pagination
  • Send the header Accept-Language for translated content.

Error response structure

{
    "error": {
        "code": "RATE_LIMIT_EXCEEDED",
        "message": "Too many requests. Retry after 60s.",
        "retry_after": 60
    }
}

Cursor pagination

{
    "data": [ ... ],
    "meta": {
        "cursor": "eyJpZCI6MTIzNH0",
        "per_page": 25,
        "has_more": true
    }
}

Advanced Features

Webhook Notifications

Subscribe to real-time events: law amendments, new decisions, bill progress through the legislative process. HMAC-SHA256 signed payloads.

Bulk Export

Download entire datasets at once — laws, case law, EU legislation, parliamentary bills. Daily-generated JSON.gz archives.

HTTP Caching (ETag)

Efficient caching via ETag and Cache-Control headers. Immutable data (specific law versions, decisions) can be cached for 24 hours.

Per-user Rate Limits

Need higher limits for academic research or a public service? Contact us and we will set a custom quota for you at no charge.

Full API Reference

Complete reference documentation for all endpoints in Swagger UI — interactive testing directly in the browser, client generation in dozens of languages.

Start Building — It's Free

Registration takes 30 seconds. No credit card required.

Favorites
Browsing History