Company Lookup by Domain — Firmographics, Headcount, Tech Stack avatar

Company Lookup by Domain — Firmographics, Headcount, Tech Stack

Pricing

from $4.00 / 1,000 companies

Go to Apify Store
Company Lookup by Domain — Firmographics, Headcount, Tech Stack

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

Northbell

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 hours ago

Last modified

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

FieldWhat it is
type, status, input, matchedBytype 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, websitethe company and its LinkedIn page
industry, companySize, employeeCount, headquarters, founded, companyType, specialties, description, followersthe LinkedIn profile. employeeCount is the number LinkedIn counts today; companySize is the band the company typed in (5,001-10,000 employees)
technologies, technologyCategorieswhat the homepage runs on, e.g. ["Next.js", "nginx"], and the same grouped: {"Web server": ["nginx"]}
domainCreatedAt, domainExpiresAt, domainAgeYears, registrarfrom the domain's public registration record: the registrar is a company; no owner or contact data is read
openJobsOnLinkedIn, openJobsIsMinimumopen roles LinkedIn lists for the company, worldwide. openJobsIsMinimum is true when LinkedIn only says "1,000+"
previousOpenJobs, openJobsChangeopen jobs at the previous run, and the difference
technologiesAdded, technologiesRemoved, previousObservedAttechnologies that appeared or disappeared, and when the previous run was. All null on the first run
missingevery part that could not be read, with the reason, e.g. {"domainAge": "No RDAP record for notion.so (…)"}. {} when everything worked
observedAtwhen 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:

  1. 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).
  2. Likely handles (stripe, stripe.com, stripehq, stripeinc, stripeapp…) when the site has no link.
  3. Every candidate must pass one test: the website on the LinkedIn page is your domain — or the domain your homepage redirects to (notion.so lands on notion.com, which is what Notion's LinkedIn page lists). That is why booking.com returns Booking.com (17,318 people) and not a café called "Booking".
  4. 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 lists figma.bot). The company vouches for its own link. The row says website-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 openJobsChange or technologiesAdded (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: employeeCount is then null, 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 openJobsOnLinkedIn is 1000, openJobsIsMinimum is true, and openJobsChange stays null (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 and openJobsIsMinimum is true when 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. technologiesAdded and technologiesRemoved compare 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 null and missing.domainAge says so — WHOIS Domain Lookup covers them.
  • Filled only in some cases: specialties (many pages do not list any, e.g. Stripe), founded, headquarters and companyType (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 no domain when you gave a LinkedIn URL or a name, so its tech stack and domain age are null with 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-found and missing.linkedin names 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-found row (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 showed employeeCountChange and openJobsChange of 0 and empty technologiesAdded / technologiesRemoved lists, 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.

**Something broke or looks wrong?** Open an issue on this Actor's Issues tab and I'll look at it. **Found it useful?** A short review on the Store page helps other people find it.