0.1.18 — 2026-10-09 — a NACE code covers its whole branch, searches over ARES's 1,000 limit are read in slices, onlyActive works; README rewritten
- A NACE code now stands for its whole branch. ARES matches a code only when a company lists exactly that code, so
62 missed every company that lists 62200 and not 62. The Actor now searches every CZ-NACE 2025 code that starts with the one you give (62 → 11 codes, 47 → 82). Measured on 2026-10-08 for s.r.o. in Olomouc: code 62 alone 216 companies, the whole division 247. A code of the older 2008 classification (6201) still reads no company, but the status message now says so and names the codes of its division.
- A search that holds more than 1,000 companies no longer comes back empty. ARES lists at most 1,000 per search and answers a larger one with the count and no rows. The Actor now reads such a search in smaller ones — by legal form, then tax office, then NACE code, then city part — and its status message says how many of ARES's total it delivered and how many it could not list. The legal-form split uses ARES's complete list of forms; it used 17 hand-picked ones and lost the others without a word. A request ARES does not answer costs one of the smaller searches, not the run: what the others returned is delivered and the message says what is missing; after five unanswered requests in a row the run stops asking.
onlyActive now removes something. It keeps a company that exists, is not in liquidation and has no live entry in the insolvency register or in the older register of bankrupts. The earlier test was true on every row measured from the earlier build (1,008 of 1,008) and removed nothing. New fields inLiquidation, insolvencyRecord and endDate; isActive now means "exists": active in the register of persons and no end date.
citizenship is gone, addressCountry is new. The public register does not publish citizenship — the field the Actor read is absent from its answers on 2026-10-08, and ARES's API description lists it for the trade register only — so citizenship was empty in every row: all 1,047 entries (1,033 persons and 14 entities) in the measured runs of the earlier build. Each person in directors and supervisoryBoard now carries addressCountry, the country code of the registered address.
- Unknown is
null, not "none". When the public register does not answer for a company, directors, supervisoryBoard and their counts are null (they were empty lists, the same as a company with no board) and the status message counts those rows. Such a company is asked once more after the others first, so a blip of a few seconds leaves no gap. If it still has no answer, the run asks the register for a company known to have a record — the last one it returned a record for, or Škoda Auto and ČEZ. A record comes back: the register is alive and the row is delivered with null. None comes back: the register is down, and the run writes the rows that have their answer, nothing after them, and says so — whatever the number of companies waiting. It stops the same way once 25 companies have been left with null and they are more than half of those asked. When the register has returned no record at all and the dataset is empty, the run fails — before, every row came without directors and was charged. A "no record" answer never counts as proof that the register is alive, and an error the register answers for a company is no answer (null), not an empty board. (Measured on this build: 40 sole traders asked with includeDirectors came as 40 rows with empty boards, no null, and the run did not stop — the register answered "no record" for each. A register that is down was met in no measured run: that path was run against a simulated register only.) IČO numbers ARES does not know are named there too, and so is an entry that cannot be an IČO. Leading zeros lost in a spreadsheet are restored (177041 → 00177041), one entry may hold several numbers, and a list longer than maxResults is cut with a word about it. When ARES answers none of the lookups the run fails instead of ending as an empty result.
- Share capital with a decimal comma is read.
42700000,00 used to become null (2 of the 1,217 companies with a capital entry in the measured runs). Capital the register holds as free text (6 of those companies) is read as the number in front when nothing but a currency follows it, with the currency the text names as a word — otherwise null: read again on the previous test build and on this one, 110000,- Kč gave 110000 CZK, 2000000 gave 2000000 with the currency null, 100 Kč gave 100 CZK, one whose text was not saved gave 500000 CZK, and the two written in words (sto tisíc korun českých, jedna koruna česká) gave no amount and CZK. A text such as 2 mil. Kč gives no amount rather than 2. Two rules are newer than those runs and were run on the reading code alone: a number with a comma before exactly three digits is not read (100,000 Kč could be a hundred thousand or a hundred), and a text that names both currencies gets none. None of the five texts that are known is of either kind. The register's currency word EURA is delivered as EUR (3 companies: 120000, 100000 and 80000 EUR on the previous test build and on this one).
- Legal-form labels corrected. Code 141 is a public benefit company (it was labelled "Institution"), 145 a unit owners' association (it was "Branch"), 751 an interest association of legal entities (it was "Association"). Twelve codes that delivered the bare code now carry a label (102–108 sole traders and farmers, 117, 118, 161, 501, 736). "Sole trader" in the input now covers codes 100–108; it sent code 100, which holds almost nobody.
- The form described two searches wrongly. It said ARES refuses a search by city alone. ARES does not: it answers with the count, like any search over its limit (32,138 entities for
Olomouc in October 2026). The Actor still does not offer that search, for another reason — a city can hold far more than a run reads: a test version that read Olomouc alone in slices (one run from our own machine, not on the platform) delivered 11,189 of the 32,138, all of them natural persons in business and not one company. Such an input fails as before, now with a message that gives this reason and asks for a sector, a legal form or a name beside the city. The form also said a name search finds names that "contain" the text; ARES matches whole words (servis 97 companies in Olomouc, serv none) and, with several words, every one of them; the form now says so.
- Input that cannot be searched says so. A sector with no digit (
J) used to be dropped, and the run delivered the companies of the other filters alone; it now reads nothing and says why. A name, sector, form or city typed next to IČO numbers is not used, and the status message says so. A sector search needs ARES's CZ-NACE code list: when ARES does not return it the run fails instead of searching the one code as typed.
- Requests are spaced 143 ms apart — about seven a second, and a rate-limit answer makes the whole run wait. In ARES's operating conditions the Ministry of Finance reserves the right to restrict access for users who send more than 500 queries a minute; a run with
includeDirectors sent its register lookups as fast as they returned. Such a run now takes about twice as long: the same Olomouc search returned 216 companies in 18 seconds before and 219 in 35 now. A list of IČO numbers is paced the same way — it was looked up five numbers at a time with no pause — so 1,000 numbers are now about 2.4 minutes of lookups (computed from the pace; the longest list measured was 19 lookups). Rows are written while the run is still reading — every 200 companies, or after a minute when fewer are waiting — so a run that is aborted or reaches its time limit keeps what it has written and its last progress line (Delivered … so far; still reading.); every row used to be written at the very end, and such a run delivered nothing. It still ends without a closing message. A run with a maximum charge stops reading at the number of companies that charge covers; it used to read the whole search, and every company's public-register record, before writing a fraction. A list of IČO numbers is looked up only as far as the charge covers, and the numbers left are in the run's NOT_DELIVERED record. (Measured on the previous test build: a progress line after every 200 rows; a run cut off by a time limit of 90 seconds kept its 400 rows — charged — and its progress line; 120 numbers at a maximum charge of $0.06 ended after 19 lookups, with 101 numbers in NOT_DELIVERED. The write after a minute and an abort were run against a simulated register only.)
- A run that is started again writes and charges no row twice. Apify can move a running Actor to another server, and a run can be resurrected: it then starts from the top with the same input, dataset and charges. Now that rows are written while the run reads, such a start would write the rows of the earlier one a second time and charge them again. So every start first reads which rows its dataset already holds (by IČO; by name and address for the few entities without one), reads ARES again — a list of IČO numbers only for the numbers without a row — and writes just what is missing. The rows already there count as delivered:
maxResults, the maximum charge, the closing message, OUTPUT and NOT_DELIVERED are those of the whole run, and the log says that the run was started again and with how many rows. When the dataset already holds everything the run may deliver, the new start reads nothing and its message is shorter (for a list, NOT_DELIVERED then holds every number without a row). (Measured on the platform on this build, 2026-10-09: a sector search of 1,200 companies with directors, restarted at 400 rows, ended with 1,200 rows, none twice, 1,200 charged; the same search under a maximum charge covering 619 rows, restarted at 400, ended with 619, none twice; three finished runs resurrected kept their 19, 10 and 219 rows and charged no row again. Before that, 36 runs against a simulated register and five with the real Apify SDK and a local dataset ended the same way.)
- Smaller corrections.
addressQuery ignores accents as well as case. An error ARES answers part-way through a search is reported as an error, in ARES's words (the released build set no status message at all). When a budget ends a search that had no legal form, the status message names the legal forms it did not read. The run's OUTPUT record says why the run stopped (stopped — also maxResults for a list that was cut at it) and how many companies it read and did not write (notWritten); OVER_LIMIT names the smaller searches left unasked (notAsked, the first 300; slicesNotAsked counts them all) and those answered with an error (errors). An HTTP 404 from ARES's search address is a request without an answer — tried three times, then the run fails — where the run used to end as an empty result. An IČO lookup ARES answers with an error other than "not found" or "wrong input" is reported as unanswered (NO_ANSWER), not as a number ARES does not know. (The last two were run against a simulated register only; no measured run met such an answer.)
- The README's examples did not match this Actor. They used input keys it does not have (
queries, maxResultsPerQuery, with a literal undefined value) and the input table listed phantom fields (maxConcurrency, includeRaw). Every example now uses the real input and was run on the platform during the measurements of 2026-10-08, on test builds of this version; the output table says how often each field was filled in measured runs.
- The Python example works with the current Apify client. It read the results with
run['defaultDatasetId']; with apify-client 3 for Python call() returns a run object and that line raised TypeError: 'Run' object is not subscriptable after the run had finished. It now reads run.default_dataset_id; with client version 1 or 2, keep run['defaultDatasetId'].
- No pricing change. Output changes:
citizenship removed; addressCountry, inLiquidation, insolvencyRecord, endDate added; directors and supervisoryBoard can be null; legalForm has a label for twelve more codes and a corrected one for 141, 145 and 751; scrapedAt is the moment the entity's record was read from ARES (it was the moment the row was built); capital.currency is EUR where it was EURA, and CZK, EUR or null where it was TEXT; capital.amount is read from free text and from amounts with a decimal comma, where it was null. Behaviour changes for inputs that already exist: a NACE search returns more companies (the whole branch); a search over the limit returns rows; onlyActive removes companies; isActive is false for an entity the register of persons no longer lists as active, or that has an end date; in a search maxResults counts the companies left after onlyActive and addressQuery (the search was cut before the filters); a list of IČO numbers longer than maxResults is cut to its first maxResults numbers before the lookups, and the numbers beyond are named (the whole list was looked up, filtered and then cut, without a word); an IČO given twice is returned once; a NACE code outside the classification, or with no digit, reads nothing; addressQuery also keeps addresses that differ from the text only in accents; a run that is aborted or reaches its time limit keeps the rows it had written, and they are charged — it used to deliver none; with includeDirectors, a run stops when the public register stops answering and fails when it returns no record for any company — it used to deliver every row without directors; a run with includeDirectors takes about twice as long, and a list of IČO numbers takes longer too (its requests are spaced now).
- The README was regenerated from a template shared by many Actors; the entry of that day read "Enabled AI-agent payments (x402) + rebuilt the README to the full standard". The label is the generator's: the builds of that day were numbered like the others of this Actor. That README is the one the entry above corrects — its examples and parts of its text did not describe this Actor.
directors[] / supervisoryBoard[] return the entries in force. The earlier filter relied on end dates that ARES leaves blank on most historical rows, so departed officers were listed as current. The Actor now drops every entry the register has struck out.
- Appointments without a start date are no longer discarded; they appear with
from: null.
- New
directorsCount / supervisoryBoardCount (different people, not rows) and directorsTruncated / supervisoryBoardTruncated (the 30-entry cap reports when it bites).
- "Include directors & capital" is ticked in the Console form, so the pre-filled run on Škoda Auto and ČEZ returns the statutory body, the supervisory board and the registered capital. The API default is unchanged (
false).
- Initial release, 2026-07-09 (the Actor's first changelog called it 0.1): Czech companies from the ARES registry — IČO, tax ID (DIČ), legal form, NACE codes, registered address and founding date, with opt-in statutory body, supervisory board and registered capital.