Company Data Enrichment avatar

Company Data Enrichment

Pricing

from $0.60 / 1,000 company enricheds

Go to Apify Store
Company Data Enrichment

Company Data Enrichment

Domain in, company profile out. Reads a company's own website for the name, what it does, emails, phones, addresses, social profiles, the technology the site runs on and the registration number in its footer. Legal name, VAT, size and founding year follow where the site states them.

Pricing

from $0.60 / 1,000 company enricheds

Rating

0.0

(0)

Developer

丂卩ㄖㄖҜㄚ

丂卩ㄖㄖҜㄚ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Share

Give it a company domain and it returns a structured company profile built from the company's own website: the name, what it does, how to reach it, where it is, who it is on social media, what the site is built with, and the registration number in its footer. One row per company, one charge per company.

🔍 What does Company Data Enrichment do?

Company Data Enrichment reads a company's own website and turns it into a structured record. It reads the homepage, follows the contact, about, legal and team pages, and pulls the identity out of what the company publishes about itself: schema.org Organization markup first because it is machine readable and authoritative, then Open Graph tags, then the about and contact pages, then the footer legal text where the registration and VAT numbers live.

The fastest way to try it is to paste two domains into domains and press start. You get one row per company, ready to load into a CRM.

It charges once per company answered, decided by your input list rather than by the target's site map. A one page site and a two hundred page site cost the same, which is why maxPagesPerDomain is free to raise.

📊 What data can I extract?

One row per domain, with every one of these fields present on every row. A field the company does not publish comes back null or empty rather than guessed.

FieldTypeWhat it holds
domainstringThe domain that was enriched, lowercased, no protocol or www
websiteUrlstringThe homepage that answered, after any redirect
companyNamestringTrading name, from schema.org, then Open Graph, then the page title
legalNamestringRegistered legal name, only where the site declares one separately from the trading name
descriptionstringWhat the company says it does
taglinestringThe slogan, or the strapline beside the name in the page title
logoUrlstringAbsolute URL of the logo or site icon
industrystringSector, only where the site declares a specific schema.org business type such as ClothingStore or Dentist
foundedYearnumberYear founded, from a declared date or from founded and established wording
employeeRangestringSize band such as 11-50 or 51-200, only where the site states a headcount
addressesarrayPostal addresses, each with street, city, region, postalCode, country, raw and source
phonesarrayPhone numbers from tel links and visible text
emailsarrayEmail addresses on the company's own domain
contactPageUrlstringThe contact page that was read
socialsobjectOne profile per platform: linkedin, twitter, facebook, instagram, youtube, github, tiktok, crunchbase, bluesky, threads
technologiesarrayDetected software, each with name, category, categoryLabel, confidence and evidence
registrationNumbersarrayCompany registration numbers from footer legal text
vatNumbersarrayVAT numbers from footer legal text
languagesarrayLanguage codes the site declares
pagesReadarrayEvery page URL actually read for this company
statusstringenriched, partial or unreachable
confidencenumberShare of the eight identity signals found, 0 to 1
checkedAtstringWhen the company was enriched, ISO 8601
errorstringWhy a site could not be read, on an unreachable row only

How full a row comes back

Measured on 15 August 2026 across 30 real company domains, a mix of UK and international businesses from consumer brands to industrial suppliers. Of the 30, 25 came back enriched, 1 partial and 4 unreachable: one site would not accept the connection and three answered with an anti-bot challenge page instead of their own content.

The counts below are over the 26 domains whose site could be read, because a field is only missing in a way you can do anything about once the site has answered.

FieldFilled
companyName26 of 26
languages26 of 26
logoUrl26 of 26
description25 of 26
technologies24 of 26
socials23 of 26
tagline19 of 26
contactPageUrl18 of 26
emails17 of 26
phones13 of 26
registrationNumbers9 of 26
foundedYear7 of 26
addresses6 of 26
legalName4 of 26
employeeRange4 of 26
vatNumbers3 of 26
industry1 of 26

Thirty domains is a sample, not a population, so read the top of that table as "nearly always" and the bottom as "occasionally" rather than as a rate to forecast a bill against.

The bottom of the table measures what companies choose to publish, not how hard the Actor looks. industry needs a specific schema.org business type and the overwhelming majority of sites declare the generic Organization, which states no sector. legalName, employeeRange and vatNumbers need the site to say them outright, and most sites print the registration number without the VAT number beside it.

So build on the top of that table and treat the bottom as a bonus. If you need a legal name and a VAT number for every company on a list, a company register is the right source and this is not.

💡 Why enrich companies from their own website?

Filling a CRM from a list of domains. Domains from a form, a webinar or an import come back with a name, a description, a contact route and a technology stack, one row each and one price each.

Scoring and routing signups. A signup with a company domain becomes a record carrying an email, a phone number and a social profile before the first reply, so routing rules have something to read.

Building a company file. Registration numbers give you an identity to match against a company register. Addresses give you a location. The technology stack says what the site runs on, each detection carrying the evidence behind it.

Feeding an AI agent. The output schema means an agent can chain this Actor into a workflow and read the result without a parser. Domain in, structured company out, one predictable charge.

Supplier and counterparty checks. The registration number, the registered address and the legal name, where the site publishes them, are where a compliance check starts, and they sit on the company's own website rather than behind a paywall.

🚀 How do I use Company Data Enrichment?

  1. Click Try for free.
  2. Put your company domains into domains, one per line. Protocol and www are optional.
  3. Leave maxPagesPerDomain at 8, or raise it for large sites. It costs you nothing extra.
  4. Reorder pagePriority if you care most about a particular kind of page, for example put legal first when you are after registration numbers.
  5. Press Start, then download the results as JSON, CSV or Excel, or read them from the API.

⬇️ Input

{
"domains": ["monzo.com", "octopus.energy"],
"maxPagesPerDomain": 8,
"pagePriority": ["contact", "about", "legal", "team"],
"includeContacts": true,
"includeSocials": true,
"includeTechStack": true
}
FieldTypeDefaultWhat it does
domainsarray["monzo.com", "octopus.energy"]The companies to enrich. Required. Each one is charged once
maxPagesPerDomaininteger8Pages to read per company, homepage included, maximum 20
pagePriorityarraycontact, about, legal, teamThe order the page budget is spent in. Also accepts careers and pricing
includeContactsbooleantrueAddresses, phone numbers and email addresses
includeSocialsbooleantrueOne social profile per platform
includeTechStackbooleantrueCMS, framework, analytics, CRM, payments, hosting and server software

⬆️ Output

Table view

Results arrive as a Companies table you can sort and filter in the Console, lining up the domain, company name, description, emails, phones, addresses, socials, technologies, registration numbers, contact page, status and confidence for every company in the run. Every other field is still in the row and in the JSON, CSV and Excel exports.

JSON

A real row, produced by the run recorded in research/company-enrichment-coverage/:

{
"domain": "cambridgesatchel.com",
"websiteUrl": "https://www.cambridgesatchel.com/",
"companyName": "Cambridge Satchel",
"legalName": null,
"description": "Discover our collection of high-quality leather bags, handcrafted here in the UK. Keep up-to-date with the latest collaborations and designs here. 10% off when you sign up for our emails.",
"tagline": null,
"logoUrl": "https://cdn.shopify.com/s/files/1/2418/7055/files/SEO_Logo.jpg?v=1742989265",
"industry": "Retail",
"foundedYear": null,
"employeeRange": null,
"addresses": [
{
"street": "The Cambridge Satchel Company, 1A Avery Row",
"city": "London",
"region": "London",
"postalCode": "W1K 4AJ",
"country": "UK",
"raw": "The Cambridge Satchel Company, 1A Avery Row, London, London, W1K 4AJ, UK",
"source": "schema.org"
}
],
"phones": [
"0800 0855 811",
"+44(0)1223 499122",
"01223 833050"
],
"emails": [
"contactus@cambridgesatchel.com",
"press@cambridgesatchel.com",
"returns@cambridgesatchel.com",
"wholesale@cambridgesatchel.com"
],
"contactPageUrl": "https://www.cambridgesatchel.com/pages/contact-us",
"socials": {
"linkedin": "https://www.linkedin.com/company/cambridge-satchel",
"facebook": "https://www.facebook.com/CamSatchelCo",
"instagram": "https://www.instagram.com/cambridge_satchel",
"tiktok": "https://www.tiktok.com/@cambridge_satchel"
},
"technologies": [
{
"name": "Shopify",
"category": "ecommerce",
"categoryLabel": "Ecommerce",
"confidence": "high",
"evidence": [
{
"kind": "asset-host",
"detail": "cdn.shopify.com/"
},
{
"kind": "html",
"detail": "Shopify.theme"
}
]
},
{
"name": "Cloudflare",
"category": "hosting",
"categoryLabel": "Hosting and CDN",
"confidence": "high",
"evidence": [
{
"kind": "header",
"detail": "cf-ray: a2b9bac789d6779a-LHR"
},
{
"kind": "header",
"detail": "server: cloudflare"
}
]
},
{
"name": "Klaviyo",
"category": "marketing",
"categoryLabel": "Marketing",
"confidence": "medium",
"evidence": [
{
"kind": "asset-host",
"detail": "static.klaviyo.com/onsite/js/vteivc/klaviyo.js"
}
]
}
],
"registrationNumbers": [
"06763257"
],
"vatNumbers": [],
"languages": [
"en",
"en-gb",
"en-ie",
"en-us",
"ja-jp"
],
"pagesRead": [
"https://www.cambridgesatchel.com/",
"https://www.cambridgesatchel.com/pages/contact-us",
"https://www.cambridgesatchel.com/pages/privacy-policy",
"https://www.cambridgesatchel.com/pages/about-us"
],
"error": null,
"confidence": 1,
"status": "enriched",
"checkedAt": "2026-08-15T16:55:56.198Z"
}

That row scored a confidence of 1 and still came back with legalName, tagline, foundedYear and employeeRange empty and no VAT number, because the site does not publish them. That is the normal shape of a good row.

One charge per company, however big the site

The charge is decided by your input list, not by the target's site map. Read one page or twenty, find everything or find nothing, hit a site that is down: it is one charge per domain, so a list of 500 domains costs the same as any other list of 500 domains and a job can be priced before it is run.

That is also why maxPagesPerDomain is free to raise. More pages means more detail at no extra cost, and the budget is spent on contact and legal pages first because those are the pages that carry company facts.

What status and confidence actually mean

statusMeaning
enrichedThe site answered and at least half the identity signals were found
partialThe site answered but published very little about itself
unreachableThe site's own content could not be read at all, and error says why

confidence is the share of eight signals that were found: a declared name, a description, an address, a contact route, a social profile, a logo, a size or sector or founding year, and a registration or VAT number. It is a completeness score, not a truth score, and it exists so you can filter a CRM import on one comparable number.

An unreachable row is a real answer, not a failure. A run where every domain was unreachable still finishes successfully with those rows in the dataset, because "we looked and could not get in" is information you asked for.

A site that answers with an anti-bot challenge page rather than its own content is unreachable too, and error says so. The alternative is reading the challenge page as though it were the company, which is how a CRM ends up with a company called Cloudflare.

How the technology detection stays honest

Every detection carries the evidence that produced it: a response header, an asset host, or a build artefact in the HTML. A confidence of high means a server header stated it or two independent signals agreed. medium means one build artefact implied it.

Nothing is inferred from a favicon, a logo in the footer, or the word appearing in page copy. A site that mentions Shopify in a blog post is not running Shopify, and a guess about a prospect's stack is worse than no guess when a rep opens with it.

Limits worth knowing

It reads public pages over plain HTTP. There is no browser, so a site that renders everything in JavaScript with nothing in the served HTML returns less, and a site sitting behind an anti-bot challenge page comes back unreachable with the challenge named in error rather than with the challenge page's contents dressed up as a company. On the 30 domain sample above that was 3 domains. There is no paid enrichment database behind it either, so it finds what a company chose to publish about itself and nothing more.

Revenue figures, funding rounds and employee lists are not here, because companies do not publish those on their own websites in any consistent form, and inventing them is the failure mode this Actor is built to avoid.

No API keys, no accounts, no proxies.

💰 How much does it cost?

Charged once per domain, whatever the size of the site. That one charge covers the crawl, the identity extraction, the contact details, the socials, the technology detection and the legal numbers.

Company enriched, per domain:

FreeBronzeSilverGoldPlatinumDiamond
$0.0199$0.016915$0.01393$0.01194$0.00995$0.00796

A list of 10,000 domains is $199.00 on the Free plan and $169.15 on Bronze. A list of 1,000 domains is $19.90 on Free.

Every domain on your list is charged once, including one that comes back unreachable, because the lookup was still performed and the row still tells you something you did not know. Nothing else is charged: not a page, not a retry, not a field.

Apify also charges its standard Actor start event of $0.00005 per run, once per gigabyte of memory. This Actor is capped at 1 GB, because it needs no browser. The per run spend cap cannot be set below $0.02, which is one start plus one company, so a cap can never be too small to return anything.

🔌 Integrations

Send results straight to Google Sheets, Slack, Airtable, Zapier, Make, or your own webhook with Apify integrations. Schedule a run to re enrich a list weekly, or trigger one whenever a new domain lands in another tool. Every run also emits events you can hang a webhook on, so a finished enrichment can post itself into your CRM without anything in between.

🔗 Using Company Data Enrichment with the Apify API

curl -X POST "https://api.apify.com/v2/acts/spookyweb~company-enrichment/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains": ["monzo.com"], "maxPagesPerDomain": 8}'

Or with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('spookyweb/company-enrichment').call({
domains: ['monzo.com', 'octopus.energy'],
maxPagesPerDomain: 8,
pagePriority: ['contact', 'about', 'legal', 'team'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Full detail is in the Apify API reference, and the same run is callable from the Python and JavaScript clients.

❓ FAQ

Where does the company data come from?

The company's own website, and nowhere else. The order of preference is schema.org Organization markup, then Open Graph tags, then the about and contact pages, then the footer legal text. Structured markup wins because it is a statement the company makes about itself in machine readable form, rather than something inferred from prose.

How many pages does it read per company?

maxPagesPerDomain decides, default 8 and maximum 20. The homepage is always read, then the pages it links to in your pagePriority order, then the standard paths such as /contact and /about for anything the homepage did not link. Everything actually read comes back in pagesRead.

Does reading more pages cost more?

No. The charge is per company, so raising maxPagesPerDomain buys more detail for the same money.

Why is industry empty on most rows?

Because it is only returned when the site declares a specific schema.org business type, such as ClothingStore, FinancialService or Dentist. Most companies declare the generic Organization type, which states no sector, and guessing a sector from page copy would be inventing data. It filled on 1 of the 26 domains that answered when that was last measured, so treat it as a bonus rather than a field to plan around.

What happens if a website is down?

You get a row with status of unreachable and an error saying why, and the run finishes successfully. The same applies to a site that answers with an anti-bot challenge page instead of its own content, because that is a site we could not read rather than a company with nothing to say. The domain is still charged, because the lookup was still performed. Nothing is invented to fill the gap.

Can it find revenue, funding or employee lists?

No. Companies do not publish those on their own websites in any consistent form, so returning them would mean guessing. employeeRange is a size band from a declared employee count or a number stated on the site, and it is absent when neither exists, which is most of the time.

How accurate is the technology detection?

Every detection ships with the evidence that produced it, so you can check any of it. Response headers are the strongest signal because the server states them about itself. Asset hosts such as js.stripe.com are next. Nothing is guessed from a logo or a favicon, and a product mentioned only in page copy is never returned.

Can I turn parts of the output off?

Yes. includeContacts, includeSocials and includeTechStack each remove their section. The price is the same either way, so most people leave them on.

Does it work outside the UK?

Yes. The identity, contact, social and technology extraction is language independent because it reads structured markup and link targets. The registration and VAT patterns cover UK company numbers and EU VAT formats, so those two fields are strongest in the UK and Europe.

Company Data Enrichment reads pages a company has chosen to publish on its own website. Company names, registered addresses, registration numbers and switchboard numbers are business information rather than personal data, and public company registers publish most of it themselves.

Where a published address identifies a named person, UK GDPR and the EU GDPR apply and you become the data controller for whatever you do next. You need a lawful basis, usually legitimate interest for business to business contact, and you must honour opt outs. Apify's ethical web scraping guide covers the wider picture, and it is worth reading before an outreach campaign rather than after one.

👍 Your feedback

Found a site it reads badly, or want a field that is not here yet? Open an issue on the Actor's Issues tab with the domain that caused it. A bad extraction can be reproduced from the page that caused it, so a single URL is usually enough to get it fixed.

🔎 You might also like

Company Data Enrichment takes a domain, so Company Domain Finder is what turns a list of company names into the domains to feed it, and Company Jobs Scraper takes the same domain and returns what that company is hiring for. The three chain in that order.

ActorWhat it does
Company Domain FinderCompany name in, the official website out, with a confidence score and the signals behind it
Company Jobs ScraperOpen roles read straight from a company's own applicant tracking system, by domain
Company Email FinderContact addresses, the email naming convention behind them, and generated addresses for named people
Website Contact ScraperEmails, phones, socials and addresses from company websites, one record per domain
LinkedIn Jobs ScraperJob postings as LinkedIn carries them, searched by keyword and location rather than by company
Wayback Machine ScraperArchived versions of any page, for seeing what a site used to say