OpenCorporates Real-Time Data | Leads & Contacts
Pricing
from $2.00 / 1,000 results
OpenCorporates Real-Time Data | Leads & Contacts
Stream live company data from 140+ registers to your dataset. Search by name, then pull full profiles, officers & directors, ownership and control records, filing history, and contact details. Enable only the features you need — rows land in real time, with webhooks. Free plan: 2 results per run.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Emmanuel
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
OpenCorporates Real-Time Data
Live company intelligence from the world's largest open register — 140+ jurisdictions, streamed straight into your dataset.
OpenCorporates Real-Time Data turns the public record into an always-fresh data feed: search companies by name across every jurisdiction, pull the full published profile, map the people and owners behind them, and add the contact details you need for outreach. Every row is written to your Apify dataset the moment it is collected, so a 10-row demo finishes in seconds and a 50,000-row campaign never has to wait for the run to end.
Free plan note: runs on the Apify free plan are capped at 2 results per run so you can try the Actor risk-free. Paid plans return the full requested volume — every extra row is only charged when it is delivered.
Who this is for
Agencies, sales and BD teams, local SEO specialists, recruiters, compliance and risk analysts, investigative journalists, and anyone building a CRM or lead pipeline from company records.
Typical use cases
- Prospect lists — find every active company in a sector, country, or legal type and export name, number, jurisdiction, status, address, and previous names.
- Decision-maker mapping — search a surname and get every director/officer appointment with the company it belongs to.
- Beneficial-ownership checks — who really controls a supplier or counterparty, with control mechanisms and percentages.
- Company monitoring — watch a target's filing history for new share issues, name changes, or strike-off notices.
- Lead enrichment — add website, email, phone, and social profiles to companies you already track.
- Refresh-by-link — keep a pipeline of company/person/ownership links warm with a single re-run.
Feature matrix
| Checkbox | What you get | Default |
|---|---|---|
| Company Search | One row per discovered company, across 140+ jurisdictions | ✅ On |
| ↳ Enrich with full company details | Merges the full published profile into the same row (detailsFetched: true) | Off |
| ↳ Search filters | Jurisdiction, company type, status, result order | Empty |
| People & Officers | One row per person/company appointment: role, company, dates | Off |
| Company Details | Full public profile for the companies you name | Off |
| Filings | One row per filed document, newest first, capped per company | Off |
| Ownership & Control | One row per control record: owner, mechanisms, percentages, UBO flag | Off |
| Lead details enrich | Website, email, phone, socials added to company rows (additive only) | Off |
| Scrape By URL | One row per company, person, or ownership link you paste | Off |
| Webhook | Real-time JSON or Slack push alongside the dataset | Off |
| Proxy settings | Apify residential, US default, changeable per run | On |
Enrichment never removes anything: every discovered record is saved, and optional details are added to the row that already exists.
Input reference
| Field | Type | Default | Example |
|---|---|---|---|
enableCompanySearch | boolean | true | true |
searchKeywords | array | ["monzo", "tesla"] | ["solar panels", "dental clinic"] |
searchMaxResults | integer (1–500) | 10 | 10 |
searchFetchFullDetails | boolean | false | true |
searchJurisdiction | string | "" | gb, us_de, ca_bc, de, br |
searchCompanyType | string | "" | Private Limited Company |
searchStatus | all | active | inactive | all | active |
searchSort | name | oldest | newest | name | newest |
enableOfficerSearch | boolean | false | true |
officerKeywords | array | [] | ["Piracha", "Smith"] |
officerMaxResults | integer (1–500) | 10 | 10 |
officerJurisdiction | string | "" | gb |
officerStatus | all | active | inactive | all | inactive |
enableCompanyDetails | boolean | false | true |
companyRefs | array | [] | ["https://opencorporates.com/companies/gb/00445790", "us_de/2655168"] |
enableFilings | boolean | false | true |
filingsMaxPerCompany | integer (1–500) | 10 | 10 |
enableOwnership | boolean | false | true |
ownershipMaxPerCompany | integer (1–500) | 10 | 10 |
enableLeadDetails | boolean | false | true |
webhookUrl | string | "" | https://hooks.slack.com/services/… |
webhookFormat | json | slack | json | slack |
enableScrapeByUrl | boolean | false | true |
scrapeUrls | array | [] | ["https://opencorporates.com/companies/gb/00445790"] |
proxyConfiguration | object | Apify residential, US | — |
Minimal run — click Start and results arrive in seconds:
{"enableCompanySearch": true,"searchKeywords": ["monzo", "tesla"],"searchMaxResults": 10}
Full example — a lead list with enrichment, ownership, and a Slack push:
{"enableCompanySearch": true,"searchKeywords": ["dental clinic", "solar installer"],"searchJurisdiction": "us_ca","searchStatus": "active","searchMaxResults": 10,"searchFetchFullDetails": true,"enableLeadDetails": true,"companyRefs": ["https://opencorporates.com/companies/gb/00445790"],"enableOwnership": true,"ownershipMaxPerCompany": 5,"webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ","webhookFormat": "slack"}
Output reference
Every row carries featureType, scrapedAt, and url (the public record it came from).
Shared company fields — company_name, company_number, company_url, jurisdiction_code, jurisdiction_name, company_status, company_type, registered_address, previous_names[], industry_codes[]{code,description,scheme}, branches[], officers_count, former_officers_count, ubo_count, filings_count, registry_attributes{} (register-specific public facts such as agent, latest accounts date, or other identifiers).
Lead fields (when Lead details enrich is on) — website, email, emails[], phone, phones[], socials{}.
By feature
featureType | Notable fields |
|---|---|
company_search | shared company fields + detailsFetched, search_keyword, position |
company_details | shared company fields |
officers | officer_name, officer_url, officer_role, officer_status, appointed_on, resigned_on, company_name, search_keyword |
filings | filing_date, filing_title, filing_description, filing_url |
ownership | owner_name, owner_type, owner_nationality, owner_country_of_residence, owner_date_of_birth, owner_address, control_level, control_mechanisms[], mechanism_details[], controlling_entities[], is_ultimate_beneficial_owner, notified_on, ceased_on, statement_url |
scrape_by_url | pageType (company | officer | ownership) plus that record's fields |
OUTPUT also reports totalPushed, spendingLimitReached, and a paywall block (detected, isPaying, pricingTier, limited, blocked, freeTierMaxItems).
Webhook guide
Point Webhook URL at any service that accepts a POST — Slack incoming webhook, Discord, Zapier, Make, n8n, a CRM, or a Google Sheet. Each new record is sent right after it is saved, in addition to the dataset. Delivery failures never stop the run.
JSON (webhookFormat: "json") — the full record:
{"featureType": "company_search","scrapedAt": "2026-09-29T12:00:00.000Z","url": "https://opencorporates.com/companies/gb/00445790","company_name": "TESCO PLC","company_number": "00445790","jurisdiction_name": "United Kingdom","company_status": "Active","search_keyword": "tesco","position": 1}
Slack (webhookFormat: "slack") — a compact message:
{"text": ":office: *TESCO PLC (00445790)*\n*Feature:* company_search • *Jurisdiction:* United Kingdom • *Status:* Active\n<https://opencorporates.com/companies/gb/00445790|Open public record>"}
MCP / AI-agent usage
Add this Actor to the Apify MCP server and your agent can run it for you.
Example prompt: "Find 10 active private limited companies in the UK matching 'dental clinic' from OpenCorporates, then send each one to my webhook."
Your agent reads the input schema above, calls the Actor with enableCompanySearch: true, searchKeywords: ["dental clinic"], searchJurisdiction: "gb", searchStatus: "active", searchCompanyType: "Private Limited Company", and searchMaxResults: 10, and returns the dataset items.
Contact coverage — what to expect
Lead details enrich adds website, email, phones[] and socials to every company row it can, and never removes a row when it can't. Two rules keep the output trustworthy for outreach:
- A discovered domain must actually carry the company's own name. Formation agents, company directories and registries are filtered out, so a row never points at a site that merely profiles the company.
- A site that yields nothing usable (no email, no phone, no social presence) is left out rather than reported as the company's website. An empty field is better than a wrong one.
Contacts come from the company's own public web presence. That means coverage tracks reality: operating companies with a real website return emails, phones and socials, while dissolved shells, one-person entities and holding-company subsidiaries that have no public site return empty fields.
To maximise coverage, search the legal name the register is likely to hold — monzo bank, tesla motors, greggs — rather than a bare brand word. A broad word like tesla returns 5,000+ entities, most of them unrelated one-person companies, and searchMaxResults cuts the list before the brand entity appears.
FAQ
Why do I need a proxy? Runs use Apify residential connections by default so results stay reliable at volume and from any country. You can pick a different egress country or supply your own proxy in Proxy settings — nothing else changes.
What do I get on the free plan? Two results per run, so you can verify output quality before committing budget. Every paid run returns the full volume you asked for.
How fresh is the data?
Every row carries scrapedAt, the moment it was written, and url, the public record it came from. Re-run the Actor whenever you need a refresh — scheduled runs and webhooks make that hands-free.
Which countries are covered?
140+ jurisdictions. Leave Jurisdiction empty to search all of them, or enter a code (gb, us_de, ca_bc, de, br, …) to stay in one register.
Some fields are empty. Why?
Registers publish different facts. Rather than guess, the Actor saves exactly what the register publishes for that company — registry_attributes shows anything register-specific. Enrichment only adds; it never removes.
Why is website or email empty on some rows?
The company has no public web presence of its own — common for dissolved shells, one-person entities and dormant subsidiaries. See Contact coverage. If you already know a company's site, paste it into Scrape By URL or switch Lead details enrich on for a Company Details run.
Why did my run stop early?
Check the run log for spending limit reached — that means your configured max-spend cap was hit and the run finished gracefully. Free-plan runs also stop after the 2-result trial cap.
Can I watch a company over time? Yes. Put its link in Companies, enable Filings, and schedule the Actor. New filings arrive as new rows with webhooks pushed in real time.
Local development
npm installnpm run typecheck # 0 errorsnpm run build # compiles to dist/npm run smoke # live checks against the public recordscp local.input.example.json local.input.jsoncp .env.example .env # add your proxy credentials (git-ignored)npm run start:local # writes output/local_results.jsonl
.env and local.input.json are git-ignored and are never committed. .env.example and local.input.example.json are the templates.