UK company data for all 5.7M live companies from Companies House's free monthly Basic Company Data. Look up by number or name, search by SIC code, postcode and status, or get a monthly change feed. No director or PSC personal data.
README only: new "Input examples" section (copy-paste JSON inputs) and "Output sample" section (JSON trimmed from a real run); search phrases in the intro and FAQ. No change to code, input, output rows or charging.
0.1.9 (30 Oct 2026)
Changelog wording only: earlier entries describe the dataset join without naming another Actor. No change to code, output rows or charging.
0.1.8 (30 Oct 2026), private build
Go-live tidy: the Output tab view for the dataset join is now called "Dataset join matches" and its status messages refer to "dataset". No change to rows or charging.
0.1.7 (30 Oct 2026), private build
Input schema: the description of the advanced 'Dataset ID with company numbers' field no longer names an internal output field; it now says what happens in plain words. No change to code, output rows or charging.
README: removed the "sample dataset will be linked here at launch" line (no external sample links).
0.1.5 (22 Oct 2026), private build
Company-name index: each month now also gets n-<date> shards (one line per company: normalised name, number, registered name, status), keyed by the first significant word of the normalised name. A companyNames lookup reads only the shards its names need (14 shards, about 5 MB, for 8 names) instead of the whole snapshot. Exact and normalised matching and the free not_found row with up to 3 candidates are unchanged. Candidates now come from companies whose name starts with one of the query's words (the full pass also found names where the shared word came later).
The monthly refresh (refreshData) builds the index with each new month; for a month that is already built without one, the refresh adds the index only. Months without an index fall back to the old full pass.
Local check, 2026-10-01 snapshot, 8 names (6 matches, 2 not_found): index 1.9 s vs full pass 33.7 s, identical rows, candidates and charges (6 company events). Index: 5,704,711 entries, 102 MB gzip, largest shard 0.78 MB; built in 56 s locally.
0.1.4 (22 Oct 2026), private build
Fix: maxResults could be overshot by a few rows when several shards were read in parallel (a platform changes run with maxResults 100 returned and charged 102). Slots are now reserved before each push. Re-run returned and charged exactly 100.
Platform runs on 0.1.4 (512 MB): dataset join + 4 numbers: 15 company rows, 15 company events, 1 free not_found (ChpBxZcZKGeB5PmT0, 7 s). Changes feed (new_on_register + status_changed, SIC 62, postcode area M, max 100): 100 change rows, 100 change events (0DBzUCYFRfB4zzGpR, 6 s).
0.1.0 (22 Oct 2026), private build
First build. Source: Companies House Free Company Data Product (monthly Basic Company Data snapshot) only. No Companies House API key, no Developer Hub account, no HTML scraping.
Data build: the 2026-10-01 snapshot is 7 zip parts (about 70 MB each, 471 MB in total; about 419 MB of CSV and 850,000 rows per part). It is streamed one part at a time into 256 gzip shards in the named key-value store uk-companies-house-data (about 322 MB), with a month-over-month change feed. Local build: about 4 minutes, under 100 MB RSS. 2026-09-01: 5,689,367 companies; 2026-10-01: 5,704,711.
Platform data build: 2 GB memory (0.5 CPU) takes about 4.5 minutes per part, about 35 minutes a month, CPU-bound; peak memory under 600 MB.
Acceptance tests (local runs against the locally built Sep and Oct 2026 store, simulated pay-per-event, 22 Oct 2026; ALL PASS, full results in test/results/acceptance.json; 10 unit tests pass):
Default input (Tesco PLC 00445790, J Sainsbury PLC 00185647, Rolls-Royce Holdings PLC 07524813): 3 company rows with status, SIC, accounts and confirmation dates and sourceUrl; charged 3 company events.
No personal data: 775 dataset-join rows compared with their raw CSV street lines, care-of names and PO boxes, none present; no officer/PSC/birth/address-line/contact field names across 5,128 rows; no email addresses.
Name match: "Tesco PLC" gives 00445790 (exact); "j sainsbury public limited company" gives 00185647 (normalised); an invented name gives a free not_found row with 3 candidates; charged 2.
SIC search (62012, incorporated on or after 2026-09-01, Active): 4,353 rows, all matching, charged 4,353. An independent count over the raw 2026-10-01 CSV gives the same 4,353 (5,704,712 rows, 1 short row padded). The Companies House advanced search isn't used (it's the website; out of scope for v1).
Rate limit: not applicable. There are no API calls; the 7 files are downloaded one at a time, once a month.
Monitor: run 1 free baseline; run 2 (same snapshot) free no_new_snapshot; run 3 after editing one stored name: exactly 1 name_changed charged 1. Real Sep to Oct monitor of 783 companies from a dataset join: 203 change rows, charged 203.
Snapshot labels and changes feed: every row has dataSource monthly-snapshot and dataAsOf; status_changed, removed_from_register and new_on_register in postcode area M with SIC 62 gave 484 rows, all matching, charged 484; 98 removed_from_register rows carry both snapshot dates.
Dataset join: 775 of 783 supplier company numbers from a test dataset resolved (99.0%); 8 free not_found rows.