Company Lookup by Domain — Firmographics, Headcount, Tech Stack
Pricing
from $4.00 / 1,000 companies
Company Lookup by Domain — Firmographics, Headcount, Tech Stack
Company lookup from a domain, website or LinkedIn URL: one row with LinkedIn profile and real headcount, tech stack, domain age and open jobs. Run it again to see open-job and technology changes since the last run. No login.
Pricing
from $4.00 / 1,000 companies
Rating
0.0
(0)
Developer
Northbell
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
Company Lookup by Domain — Firmographics, Headcount & Tech Stack
Give it a list of company domains, website URLs, LinkedIn company URLs or names and get one clean row per company: the LinkedIn profile and today's headcount (industry, size band, HQ, founding year), the tech stack read from the homepage, the domain's age, expiry and registrar, and the number of open jobs on LinkedIn. Four public sources in one row, instead of four Actors and a join. $5 per 1,000 companies, no login, no cookies, no API key.
Run it again — or put it on a schedule — and every row also says what changed since the last run: open jobs up or down, and which technologies were added or removed from the site. Open jobs cannot be looked up for last month afterwards; the run is where they get recorded.
Need headcount over time or similar companies? This Actor is the one-row snapshot. For headcount growth per month and the 10 similar companies LinkedIn lists, use the LinkedIn Company Scraper with Headcount Growth ($4 per 1,000, takes the same domains); for lists of lookalikes, LinkedIn Lookalike Companies.
What you get
| Field | What it is |
|---|---|
type, status, input, matchedBy | type is company for every row about a company and error for an entry that is not a company at all (error rows have input, message, observedAt). status is matched (the LinkedIn page was found and verified), not-found (no LinkedIn page with that website), lookup-failed (LinkedIn could not be read this time) or not-requested (you switched LinkedIn off). matchedBy says how: website-link (the link on the company's own site, and the page lists your domain), website-link-name (the company's own site links to the handle that is exactly its name, although the page lists another website), linkedin-website (a guessed handle whose page lists your domain), linkedin-url or name. input is what you typed; for a work email only the domain after the @ is kept |
domain, name, linkedinUrl, website | the company and its LinkedIn page |
industry, companySize, employeeCount, headquarters, founded, companyType, specialties, description, followers | the LinkedIn profile. employeeCount is the number LinkedIn counts today; companySize is the band the company typed in (5,001-10,000 employees) |
technologies, technologyCategories | what the homepage runs on, e.g. ["Next.js", "nginx"], and the same grouped: {"Web server": ["nginx"]} |
domainCreatedAt, domainExpiresAt, domainAgeYears, registrar | from the domain's public registration record: the registrar is a company; no owner or contact data is read |
openJobsOnLinkedIn, openJobsIsMinimum | open roles LinkedIn lists for the company, worldwide. openJobsIsMinimum is true when LinkedIn only says "1,000+" |
previousOpenJobs, openJobsChange | open jobs at the previous run, and the difference |
technologiesAdded, technologiesRemoved, previousObservedAt | technologies that appeared or disappeared, and when the previous run was. All null on the first run |
missing | every part that could not be read, with the reason, e.g. {"domainAge": "No RDAP record for notion.so (…)"}. {} when everything worked |
observedAt | when the row was read |
Parts you leave out of Parts to include come back as null.
How a domain finds the right company
LinkedIn has no search by website, so the Actor checks instead of guessing:
- The link on the company's own site. Most homepages link their LinkedIn page; it is tried first (
anthropic.com→linkedin.com/company/anthropicresearch, which no name-guessing would find). - Likely handles (
stripe,stripe.com,stripehq,stripeinc,stripeapp…) when the site has no link. - Every candidate must pass one test: the website on the LinkedIn page is your domain — or the domain your homepage redirects to (
notion.solands onnotion.com, which is what Notion's LinkedIn page lists). That is whybooking.comreturns Booking.com (17,318 people) and not a café called "Booking". - One exception, flagged in
matchedBy: if the company's own site links to the handle that is exactly its name (figma.com→/company/figma) the page is taken even when LinkedIn lists a different website (Figma's page listsfigma.bot). The company vouches for its own link. The row sayswebsite-link-name; filter those out if you want only exact website matches.
If no page passes, you get a free not-found row — and it still carries the tech stack and domain age it could read. A page with a similar name but another website is never accepted by guessing, only mentioned in missing.linkedin. Names (Scale AI) and LinkedIn URLs skip the website test (a URL is taken as given; a name takes the first handle that exists), so check matchedBy when you feed names.
Use it for
- CRM and lead-list enrichment — a list of domains in, industry, size, HQ, tech and hiring signal out
- Account research and territory planning — who is growing, who is hiring, who runs the tool you replace
- Competitor and prospect monitoring — schedule it weekly and filter on
openJobsChangeortechnologiesAdded(for headcount growth, use the Headcount Actor linked above)
Input
{ "companies": ["stripe.com", "https://www.notion.so", "Scale AI", "https://www.linkedin.com/company/shopify"],"include": ["linkedin", "techStack", "domainAge", "openJobs"],"maxRequestsPerMinute": 20 }
- companies — domains, website URLs, work email addresses (only the domain after
@is used and kept), LinkedIn company URLs or names. Duplicates are merged. IP addresses and internal host names are skipped with an error row. - include — which parts to read (all four by default). Open jobs needs the LinkedIn page, so choosing it switches LinkedIn on too. A LinkedIn URL or a company name always reads its LinkedIn page, whatever you choose here, because that page is where its website comes from.
- maxRequestsPerMinute — LinkedIn requests per minute, 20 by default. A company costs about 2 LinkedIn requests (its page, then the open-jobs count) and a few more when its handle has to be found. Plan on roughly 6 to 25 seconds per company at the default. The budget is shared across your runs of this Actor.
History is kept in a named key-value store in your Apify account, so the second run of the same Actor already shows changes. Schedule it (Apify → Schedules) for a regular log. If a part could not be read at one run (say the jobs page refused), its last known value is kept, so the next change is measured against the last time it was read; previousObservedAt is always the time of the previous run.
Pricing
$5 per 1,000 companies, plus $0.01 per run.
Which rows are charged: a row is charged when the LinkedIn page was found and verified (status: "matched"). Rows with not-found or lookup-failed, and error rows, are free. A matched row is charged even if another part failed (for example the homepage blocked us); the reason is in missing. If you switch LinkedIn off in Parts to include, a row is charged when at least one of the parts you asked for returned data. The $0.01 run-start fee is the one charge every run pays, even one that returns nothing.
Notes
- Headcount counts LinkedIn profiles that list the company, not payroll. It is a consistent number to track over time even when the absolute figure is off. Some small pages carry no headcount:
employeeCountis thennull, never a guess. - Open jobs come from LinkedIn's public job search for the company, always asked for Worldwide so the number does not depend on where the Actor runs (LinkedIn shows a different number for one country than for the world: Figma 280 in the United States, 330 worldwide, 5 in Japan, measured on the same day). Checked on Booking.com: the header said 100 and listing the postings returned 100 distinct ones. LinkedIn stops counting at "1,000+": then
openJobsOnLinkedInis 1000,openJobsIsMinimumistrue, andopenJobsChangestaysnull(a change against "at least 1,000" would be invented). A company with no listed roles returns 0. If the count cannot be read, the first page of the job list is used instead andopenJobsIsMinimumistruewhen that page is full. - Tech stack is detected from one request to the homepage: HTML, script and stylesheet addresses, the generator tag, response headers and cookie names (never their values). 154 technologies in 34 categories. Things loaded only after a click, or only for signed-in users, are not seen. A site that answers with bot protection becomes
missing.techStack, and a bot-check page is never read as the site's stack.technologiesAddedandtechnologiesRemovedcompare with the previous run. - Domain age comes from RDAP, the registries' public registration record. Some endings publish none: in my test .io, .de, .jp, .co.jp, .us, .so and .gg had no record while .com, .net, .ai, .dev, .app and .co.uk worked. For those the dates and registrar are
nullandmissing.domainAgesays so — WHOIS Domain Lookup covers them. - Filled only in some cases:
specialties(many pages do not list any, e.g. Stripe),founded,headquartersandcompanyType(not on every page),description(shortened to 600 characters). A company whose LinkedIn page lists no website of its own, or only a social or link page, has nodomainwhen you gave a LinkedIn URL or a name, so its tech stack and domain age arenullwith a reason. - A different website on LinkedIn. If the company's LinkedIn page lists another website than your domain and the company's own site does not link to it under its exact name, the row is
not-foundandmissing.linkedinnames that page. Pass its LinkedIn URL instead. - No people, no contacts. The Actor reads company pages only: no employee names or profiles, no email addresses or phone numbers (removed from free text), no domain owner or WHOIS contacts.
- Measured on October 8, 2026: the three prefilled domains (stripe.com, notion.so, figma.com) plus four more inputs (a company name, a work email, example.com and an IP address) → 5 matched rows, 1 free
not-foundrow (example.com has no company page) and 1 free error row (the IP address). 19 LinkedIn requests took about 15 seconds on a fresh request budget; longer lists are paced by the 20 per minute default. A second run on the same account showedemployeeCountChangeandopenJobsChangeof 0 and emptytechnologiesAdded/technologiesRemovedlists, as expected a few minutes apart.
More from the same family: LinkedIn Company Scraper with Headcount Growth (headcount over time for companies you already know), Domain to LinkedIn Company URL (just the verified page), Tech Stack Detector (any site, with versions), WHOIS Domain Lookup (expiry, nameservers, renewals), LinkedIn Company Jobs Scraper (every open role, not just the count) and LinkedIn Lookalike Companies (companies like these).
For AI agents
{"companies": ["stripe.com"]} returns one row with name, employeeCount, technologies, domainAgeYears and openJobsOnLinkedIn. Rows have type: company or error; check status (matched is the verified one) and missing for parts that could not be read. Run again with the same account to get employeeCountChange, openJobsChange, technologiesAdded and technologiesRemoved.