OpenCorporates Real-Time Data | Leads & Contacts avatar

OpenCorporates Real-Time Data | Leads & Contacts

Pricing

from $2.00 / 1,000 results

Go to Apify Store
OpenCorporates Real-Time Data | Leads & Contacts

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

Emmanuel

Maintained by Community

Actor 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

  1. Prospect lists — find every active company in a sector, country, or legal type and export name, number, jurisdiction, status, address, and previous names.
  2. Decision-maker mapping — search a surname and get every director/officer appointment with the company it belongs to.
  3. Beneficial-ownership checks — who really controls a supplier or counterparty, with control mechanisms and percentages.
  4. Company monitoring — watch a target's filing history for new share issues, name changes, or strike-off notices.
  5. Lead enrichment — add website, email, phone, and social profiles to companies you already track.
  6. Refresh-by-link — keep a pipeline of company/person/ownership links warm with a single re-run.

Feature matrix

CheckboxWhat you getDefault
Company SearchOne row per discovered company, across 140+ jurisdictions✅ On
↳ Enrich with full company detailsMerges the full published profile into the same row (detailsFetched: true)Off
↳ Search filtersJurisdiction, company type, status, result orderEmpty
People & OfficersOne row per person/company appointment: role, company, datesOff
Company DetailsFull public profile for the companies you nameOff
FilingsOne row per filed document, newest first, capped per companyOff
Ownership & ControlOne row per control record: owner, mechanisms, percentages, UBO flagOff
Lead details enrichWebsite, email, phone, socials added to company rows (additive only)Off
Scrape By URLOne row per company, person, or ownership link you pasteOff
WebhookReal-time JSON or Slack push alongside the datasetOff
Proxy settingsApify residential, US default, changeable per runOn

Enrichment never removes anything: every discovered record is saved, and optional details are added to the row that already exists.


Input reference

FieldTypeDefaultExample
enableCompanySearchbooleantruetrue
searchKeywordsarray["monzo", "tesla"]["solar panels", "dental clinic"]
searchMaxResultsinteger (1–500)1010
searchFetchFullDetailsbooleanfalsetrue
searchJurisdictionstring""gb, us_de, ca_bc, de, br
searchCompanyTypestring""Private Limited Company
searchStatusall | active | inactiveallactive
searchSortname | oldest | newestnamenewest
enableOfficerSearchbooleanfalsetrue
officerKeywordsarray[]["Piracha", "Smith"]
officerMaxResultsinteger (1–500)1010
officerJurisdictionstring""gb
officerStatusall | active | inactiveallinactive
enableCompanyDetailsbooleanfalsetrue
companyRefsarray[]["https://opencorporates.com/companies/gb/00445790", "us_de/2655168"]
enableFilingsbooleanfalsetrue
filingsMaxPerCompanyinteger (1–500)1010
enableOwnershipbooleanfalsetrue
ownershipMaxPerCompanyinteger (1–500)1010
enableLeadDetailsbooleanfalsetrue
webhookUrlstring""https://hooks.slack.com/services/…
webhookFormatjson | slackjsonslack
enableScrapeByUrlbooleanfalsetrue
scrapeUrlsarray[]["https://opencorporates.com/companies/gb/00445790"]
proxyConfigurationobjectApify 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

featureTypeNotable fields
company_searchshared company fields + detailsFetched, search_keyword, position
company_detailsshared company fields
officersofficer_name, officer_url, officer_role, officer_status, appointed_on, resigned_on, company_name, search_keyword
filingsfiling_date, filing_title, filing_description, filing_url
ownershipowner_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_urlpageType (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 install
npm run typecheck # 0 errors
npm run build # compiles to dist/
npm run smoke # live checks against the public records
cp local.input.example.json local.input.json
cp .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.