How to Scrape the Czech Company Registry (ARES) in 2026
Extract Czech company data from the official ARES registry — IČO, VAT, legal form, CZ-NACE industry and address — filtered by name, city or vertical, no API key.
If you need a list of Czech companies — every software firm in Prague, every joint-stock company in a given vertical, or the official record behind a batch of IČO numbers — you have exactly one authoritative source: ARES, the Administrativní registr ekonomických subjektů, run by the Czech Ministry of Finance. The good news is that ARES exposes a fully open REST API with no key and no login. The friction is everything else: the JSON is deeply nested, the field names are Czech, each query hard-caps at 1,000 results, and you still have to flatten, de-duplicate and paginate it into something a spreadsheet or CRM can use. This guide covers how ARES actually works and how to turn it into clean B2B rows.
What’s worth extracting
ARES publishes the official registry fields for every economic subject in the country. Per company, the useful data breaks into four groups:
- Identity —
ico(the 8-digit Czech business ID, the stable join key),vat(DIČ, when the company is VAT-registered) andname(the registeredobchodní jméno). - Legal status —
legalFormCodeandlegalFormText(e.g.112= s.r.o.,121= a.s.,101= sole trader/OSVČ), plusestablishedDate(datum vzniku),terminatedDate(datum zániku) and anisActiveflag derived from whether a termination date exists. - Industry —
nacePrimary(the primary CZ-NACE code) andnaceCodes(all NACE codes,;-joined), so you can segment prospects by vertical. - Location — the full registered address broken into
street,city,cityPart,district(okres),region(kraj),zip(PSČ) andcountry, plus a single formattedaddressstring.
Each row also carries updatedDate (last change in ARES), a direct url to the company’s ARES detail page, and a scrapedAt timestamp. That’s 20+ fields per company — enough to build a segmented prospect list, run a KYC check or size a market without any enrichment step.
How the ARES API actually works
ARES is a genuine open-data REST API at ares.gov.cz, not an HTML page you have to parse. The relevant service is the ekonomické subjekty search endpoint:
POST https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/vyhledat
You send a JSON body describing the filters — company name, IČO, legal form, CZ-NACE code, municipality code, postcode — and ARES returns matching subjects as nested JSON with pagination metadata. The actor maps its input fields directly onto this query. A typical run to pull software companies in Prague looks like this:
{
"czNace": "6201",
"kodObce": 554782,
"maxResults": 1000
}
Here 6201 is the CZ-NACE code for computer programming and 554782 is the municipality code for Praha. CZ-NACE follows the standard NACE numbering (7311 advertising, 4711 retail, and so on), and common legal-form codes are 112 (s.r.o.), 121 (a.s.) and 101 (OSVČ). If you don’t know the codes, you can skip them entirely and run a free-text name search on obchodniJmeno instead, then read the nacePrimary and legalFormCode columns off the output:
{
"obchodniJmeno": "software"
}
For CRM enrichment you go the other way — feed a list of known IČO numbers and pull each official record back:
{
"ico": "45274649,27082440,00006947"
}
Because the endpoint returns JSON over plain HTTP, there’s no browser, no DOM walking and no GraphQL token to forge. Datacenter proxy is plenty; the actor defaults useProxy to true but you can turn it off and hit ARES directly since the API is open.
▶ Open the Czech Company Registry Scraper on Apify — one run returns up to ~1,000 Czech companies with IČO, VAT, legal form, NACE and full address as clean columns. No API key, no login. Export to JSON, CSV, Excel or XML.
The access reality
ARES is open, but it isn’t infinite. The single most important constraint is the per-query cap of ~1,000 results. If your filters match more subjects than that, ARES refuses the query rather than paginating endlessly — the actor detects this, logs a clear “narrow your filters” warning, and stops gracefully instead of silently truncating. This shapes how you should think about large pulls.
The right pattern for covering a big segment is to split the run along a dimension and combine the datasets afterward:
- By municipality (
kodObceornazevObce) — run Praha, Brno, Ostrava and the other major cities separately. - By legal form (
pravniForma) — s.r.o., a.s. and OSVČ as distinct runs. - By NACE code (
czNace) — one run per industry vertical. - By postcode (
psc) — useful for tightly geofenced territory lists.
Within a single query, the actor auto-paginates ARES’s response window for you and de-duplicates by IČO, so you never get the same company twice inside one run. Set maxResults to stop early (default 200), or 0 to pull the full query window up to the ARES ceiling.
One honest limitation: the ARES public search returns official registry fields only — it does not include company email or phone numbers. If you need contact enrichment, use the IČO/company list this actor produces as the input to a separate email-finding step.
Example output
A single trimmed row looks like this:
{
"ico": "27082440",
"vat": "CZ27082440",
"name": "Příklad technologie s.r.o.",
"legalFormCode": "112",
"legalFormText": "Společnost s ručením omezeným",
"establishedDate": "2004-03-15",
"terminatedDate": null,
"naceCodes": "6201;6202",
"nacePrimary": "6201",
"city": "Praha",
"district": "Praha-západ",
"region": "Hlavní město Praha",
"zip": "16000",
"isActive": "true",
"url": "https://ares.gov.cz/ekonomicke-subjekty/27082440"
}
Every row is one company; the array is your dataset, exportable straight to CSV, JSON, Excel or XML.
Typical use cases
- B2B lead generation — build a targeted Czech prospect list by combining a NACE vertical with a municipality, complete with IČO, VAT and registered address in a single run.
- Sales prospecting — filter for active firms by legal form and region so your SDRs only work live, correctly-classified companies.
- Market research — count and profile companies by CZ-NACE code, region and establishment date to size a vertical or a town before you enter it.
- KYC / AML & compliance — verify a counterparty’s IČO, VAT registration and active/terminated status against the official register during onboarding.
- Competitor mapping — pull every company in a given NACE code within a city and benchmark legal form, age and status.
- CRM enrichment — bulk-look-up your existing accounts by IČO and append authoritative registry fields, catching companies that have since been terminated.
Build-it-yourself vs. managed
The ARES API is open, so building your own client is genuinely feasible — this isn’t a Cloudflare-walled target. The work that remains is the unglamorous part:
- Nested-JSON flattening — ARES returns addresses and NACE lists as nested objects and arrays; you have to walk them into flat columns and decide on a
;-join convention. - The 1,000-cap logic — you need to detect the refusal, warn, and split the query by municipality/form/NACE, or you’ll silently miss companies.
- De-duplication by IČO and null-handling for optional fields like VAT and termination date.
- Field translation — mapping
obchodní jméno,právní forma,datum vznikuand the rest into English column names your team can read.
None of that is hard; it’s just a day or two of glue code plus the maintenance when ARES tweaks its response shape. The managed actor has that solved and runs on pay-per-result pricing, so a run costs a fraction of a cent per company — for a few thousand Czech companies you’re in single-digit dollars, and there’s no proxy bill because datacenter IPs work fine against an open .gov API.
Common pitfalls
A few things specific to ARES that will bite you if you’re not expecting them:
- The 1,000-result cap is a refusal, not a truncation. Broad filters (e.g. “all s.r.o. companies”) simply return an error. Always segment large pulls.
- VAT ≠ every company. Only VAT-registered firms have a
vat/DIČ value; the rest are legitimately empty. Don’t treat a blank VAT as a data error. isActiveis derived from the termination date. A company with noterminatedDateis flagged active — always cross-check the date fields for KYC rather than trusting the boolean alone.- Municipality code vs. name.
kodObce(e.g.554782for Praha) is exact;nazevObce(a name string) can be ambiguous across small towns that share a name. Prefer the code when you have it. - No contact data. Email and phone are not in the registry. Plan a separate enrichment pass if outreach needs them.
- NACE codes are strings, not one code per company. Read
nacePrimaryfor the main vertical andnaceCodesfor the full set — many firms carry several.
Wrapping up
ARES is one of the cleaner open registries in Europe: no key, no login, real JSON. If you only need it once and enjoy the plumbing, build a client against the search endpoint. If you want segmented, de-duplicated, English-labelled Czech company rows on a schedule — split correctly around the 1,000-cap and dropped straight into a spreadsheet or CRM — the managed actor does that today.
▶ Run the Czech Company Registry Scraper on Apify — filter by name, IČO, legal form, NACE, city or postcode and get up to ~1,000 official ARES company records per run. No API key, no login. Export to CSV, JSON, Excel or XML. Start on Apify’s free monthly credit.
Related guides
EU Company Registry Data Export — Germany, France, Netherlands
How to extract company-registry records from Handelsregister, INPI, and KvK in a unified schema — for KYC, B2B lead generation, and compliance workflows.
How to Scrape Allabolag.se Sweden Company Leads in 2026
Extract Swedish company data from allabolag.se — org number, revenue, CEO, phone and email — without an API key. A guide to bulk firmographics and B2B leads.
How to Scrape the Australia Business Register (ABN/ABR)
Bulk-export Australian business names, ABNs, status and registration dates from the official data.gov.au CKAN register — no API key, no browser, no captcha.