UK New Company Monitor - incremental lead feed
Pricing
from $40.00 / 1,000 company records
UK New Company Monitor - incremental lead feed
Watches Companies House for newly incorporated UK companies matching your SIC codes and location; each scheduled run emits only what is new since the last run - deduplicated, with officers and addresses. Optional webhook POST to Slack, Zapier, Make or n8n.
Pricing
from $40.00 / 1,000 company records
Rating
0.0
(0)
Developer
FJ Banks
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
7 hours ago
Last modified
Categories
Share
UK New Company Monitor — incremental lead feed
Watches UK Companies House for newly incorporated companies matching your filter (SIC industry codes, registered-office location, name exclusions) and, on every scheduled run, emits only the companies that are new since the last run — deduplicated, flattened, and enriched with directors and addresses. Optionally POSTs each batch to a webhook (Slack, Zapier, Make, n8n, or your own endpoint).
Most Companies House actors are one-shot lookup tools: you give them a company number or name and they return details. This one is a stateful monitor. Point it at a niche, schedule it hourly or daily, and it maintains its own memory of what it has already seen so you get a clean, no-duplicates stream of fresh sales leads — the same thing lead-list vendors charge a subscription for.
Who it's for
| Buyer | Use |
|---|---|
| Accountants / bookkeepers | New incorporations in your city → onboarding outreach in week 1 |
| B2B vendors (banking, insurance, payroll, software, fulfilment, telecoms) | Every new Ltd in your target sector, the day it forms |
| Recruiters / staffing agencies | New entrants in a vertical, before they build a team |
| Commercial property / coworking | New companies with a residential registered office = likely to need space |
| Market researchers / journalists | Formation-rate signal for a sector or region |
| Anyone paying for a "new UK companies this week" list | Replace it with a $0.01/record feed you control |
Quick start (one-time, ~3 minutes)
-
Get a free Companies House API key. Go to https://developer.company-information.service.gov.uk/, create an account, then Your applications → Register an application (Environment: Live), open it and Create new key of type REST. Copy the key.
-
Configure the actor. Paste the key into
apiKey, setsicCodesand/orlocationQueryfor your niche (see recipes below). -
Run once to seed the state and sanity-check the output. Set
incorporatedInLastDayshigher (e.g. 7–14) for this first run if you want a backfill. -
Schedule it. Apify Console → Schedules → Create → this actor → save your inputs → run daily (or hourly for fast-moving niches). Leave
incorporatedInLastDaysat1— later runs are incremental regardless. -
(Optional) Set
webhookUrlto a Slack incoming webhook / Zapier catch hook / n8n webhook node to get the new companies pushed to you each run.
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
apiKey | string (secret) | — | Required. Companies House REST key (Live environment). Used for HTTP Basic auth. |
sicCodes | string[] | [] | 5-digit SIC codes. A company matches if it has any of them. Empty = every industry. |
locationQuery | string | — | Free-text registered-office filter: a town ("Manchester"), county ("Kent"), or postcode district ("EC1", "M1"). |
incorporatedInLastDays | integer 1–30 | 1 | First run only (no saved state): how far back to look. Ignored on later runs — those go from the previous run forward. |
nameExcludes | string[] | [] | Drop companies whose name contains any of these, case-insensitive (e.g. ["HOLDINGS","NOMINEES","PROPERTY"]). |
includeOfficers | boolean | false | Also fetch each company's appointed officers (name, role, appointment date, nationality, occupation). Costs 1 extra API call per company. |
webhookUrl | string | — | If set, POST a JSON body (see below) with this run's new companies. |
maxResults | integer 1–5000 | 500 | Hard cap on companies emitted per run. Protects against a huge first run or a mis-scoped filter. |
SIC code recipes
| Niche | sicCodes |
|---|---|
| Software / SaaS | ["62011","62012","62020","62090"] |
| Digital marketing / agencies | ["70210","73110","73120","74100"] |
| E-commerce / online retail | ["47910","47990"] |
| Construction & trades | ["41100","41201","41202","43999"] |
| Restaurants & food service | ["56101","56102","56103","56210","56290"] |
| Management consultancy | ["70221","70229"] |
| Property / real estate | ["68100","68201","68209","68310","68320"] |
| Financial services / fintech | ["64191","64301","64999","66190"] |
| Health & wellness | ["86210","86900","96040"] |
| Logistics / haulage | ["49410","52100","52290","53202"] |
| Recruitment | ["78100","78200","78300"] |
Full list: https://resources.companieshouse.gov.uk/sic/
Example inputs
Software companies formed in Greater Manchester, with directors, alerting Slack:
{"apiKey": "YOUR_KEY","sicCodes": ["62011", "62012", "62020", "62090"],"locationQuery": "Manchester","includeOfficers": true,"nameExcludes": ["HOLDINGS", "NOMINEES"],"webhookUrl": "https://hooks.slack.com/services/T000/B000/xxxx","maxResults": 300}
Every new company in a postcode area (any industry), daily digest to a webhook:
{"apiKey": "YOUR_KEY","locationQuery": "BS1","webhookUrl": "https://hook.eu2.make.com/xxxxxxxx"}
Output
Dataset — one item per new company
| Field | Example | Notes |
|---|---|---|
company_number | "14523901" / "SC512233" | Unique registration number |
company_name | "EXAMPLE SOFTWARE LTD" | As registered |
company_status | "active" | Usually active for fresh incorporations |
company_type | "ltd" | ltd, plc, llp, … |
date_of_creation | "2026-09-02" | Incorporation date |
sic_codes | ["62012"] | May be empty if not yet filed |
registered_office_address | "1 Example St, London, EC1A 1AA, England" | Single flattened string |
postal_code | "EC1A 1AA" | Split out for territory sorting |
locality | "London" | Split out for grouping |
link | https://find-and-update.company-information.service.gov.uk/company/14523901 | Public Companies House page |
scraped_at | "2026-09-03T09:00:00.000Z" | When this actor emitted it |
officers | [{ "name": "DOE, Jane", "role": "director", "appointed_on": "2026-09-02", "nationality": "British", "occupation": "Director", "country_of_residence": "England" }] | Only when includeOfficers: true |
Export from the Apify dataset as JSON, CSV, Excel, or via the dataset API into your CRM / Google Sheet / spreadsheet.
Webhook payload
If webhookUrl is set and the run found new companies, the actor sends:
POST <webhookUrl>Content-Type: application/json{"source": "uk-newco-monitor","window": { "from": "2026-09-02", "to": "2026-09-03" },"count": 12,"companies": [ /* the same objects as the dataset items */ ]}
A Slack incoming webhook will render the raw JSON; for a formatted message put a Zapier / Make / n8n step in between. Webhook failures are logged as a warning and do not fail the run (the data is still in the dataset).
RUN_SUMMARY (default key-value store)
{"window": { "from": "2026-09-02", "to": "2026-09-03" },"new_companies": 12,"seen_total": 843,"rate_limited": false,"finished_at": "2026-09-03T09:00:03.114Z"}
How incremental / dedup works
- State store. Cross-run state lives in a named key-value store,
uk-newco-monitor-state(the default store is wiped between runs on the Apify platform, so it can't be used for memory). State is namespaced by a hash of your filter — running the same actor from two schedules with different SIC codes or locations keeps two independent seen-sets. - First run (no state for that filter): searches incorporations in the last
incorporatedInLastDaysdays. - Every later run: searches from the day before the previous run up to
today (Companies House incorporation dates are day-granular), then drops every
company_numberalready in the seen-set. Overlapping date windows therefore never produce duplicates. - The seen-set is capped at 20,000 numbers (~10 days of all UK incorporations; far more headroom for any real filter).
maxResultscaps a single run. If a filter matches more new companies than that in one run, the rest come through on the next run — nothing is lost.
Rate limits & cost
- Companies House: 600 requests per 5 minutes across all endpoints. Each run
uses ~
ceil(matches / 100)search requests plus one per company whenincludeOfficersis on. A429ends the run early but still saves progress and pushes what it collected. - Apify compute: a typical daily run for a focused niche finishes in a few
seconds on the default memory.
includeOfficerson a broad filter is the main cost driver (one call per company) — narrow the filter or turn officers off if runs get long.
Scheduling guidance
| Niche size | Suggested schedule | maxResults |
|---|---|---|
| One city + tight SIC set | Daily | 200–500 |
| Whole region, any industry | Daily, or twice daily | 1000–2000 |
| National, single niche | Hourly if you need speed-to-lead, else daily | 500 |
Companies House posts new incorporations continuously through the working day, so an hourly schedule genuinely gets you same-day leads.
Local development
npm installnpm test # 14 unit tests, fully mocked — no network, no key needed# real run against the live API:mkdir -p storage/key_value_stores/defaultecho '{"apiKey":"YOUR_KEY","sicCodes":["62012"],"incorporatedInLastDays":3}' \> storage/key_value_stores/default/INPUT.jsonnpm start
Source layout:
| File | Responsibility |
|---|---|
src/companiesHouse.js | API client: auth, advanced-search pagination, officers, error mapping. Injectable fetch for tests. |
src/filter.js | Pure helpers: date-window logic, name-exclusion predicate. |
src/dedupe.js | State persistence: config namespace hash, seen-set + last-run load/save. |
src/main.js | Orchestration: read input → search → filter → dedup → dataset + webhook → save state. |
Deploy your own copy
npm i -g apify-cliapify loginapify push
Then in the Apify Console: Publication → Publish, set Monetization → Pay per result (suggested $0.01 / result), and add a Schedule.
Troubleshooting
| Symptom | Cause / fix |
|---|---|
Companies House rejected the API key (HTTP 401) | Wrong key, or you created a Test key instead of Live. Regenerate a Live REST key. |
| Run emits companies you've seen before | You changed the filter — a different filter = a different state namespace, so it re-seeds. Expected. |
| First run returns nothing | No incorporations matched in the look-back window. Widen sicCodes, drop locationQuery, or raise incorporatedInLastDays. |
rate_limited: true in the summary | Filter is too broad with includeOfficers on. Narrow it, turn officers off, or lower maxResults. |
sic_codes empty on some results | The company hasn't filed its SIC codes yet (common in the first days). It still matches a locationQuery-only filter. |
Data source & licensing
Data comes from the official Companies House Public Data API
(api.company-information.service.gov.uk). Companies House data is published
under the Open Government Licence v3.0
and is free to use, including commercially, with attribution. This actor only
reads public register data — no authentication beyond your own free API key, no
private data.
Related actors
Part of a small suite of UK public-register monitors, same publisher, same pattern (incremental, no duplicates, webhook-ready):
- UK Insolvency Notice Monitor — winding-up, administration, bankruptcy (The Gazette)
- UK Food Business Monitor — new food businesses + hygiene-rating changes (FSA)
- UK Public Tender Monitor — public-sector tenders by CPV / value (Contracts Finder)
- UK Company Change Monitor — watchlist diffing: status, charges, officers, filings
Changelog
- 0.1 — Initial release: advanced-search by SIC / location, incremental
dedup via namespaced state store, optional officer enrichment, optional
webhook,
RUN_SUMMARY.