LinkedIn Company Profile Scraper With Firmographic Filters avatar

LinkedIn Company Profile Scraper With Firmographic Filters

Pricing

from $4.99 / 1,000 results

Go to Apify Store
LinkedIn Company Profile Scraper With Firmographic Filters

LinkedIn Company Profile Scraper With Firmographic Filters

LinkedIn Company Profile Scraper extracts public company data including names, industries, employee counts, locations, websites, descriptions, and company URLs. Apply firmographic filters to build targeted datasets for B2B lead generation, prospecting, and market research.

Pricing

from $4.99 / 1,000 results

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

3 days ago

Last modified

Share

LinkedIn Company Scraper โ€” Extract Profiles, Offices & Firmographics

LinkedIn Company Profile Scraper With Firmographic Filters pulls structured company data straight from public LinkedIn company pages โ€” no login, no HTML, no CSS selectors to maintain. Each run returns a company profile, the full list of publicly listed office locations, and normalized firmographic fields (employee band, exact employee count, company age). Built-in filters skip companies outside a chosen employee range, industry, office count, or office country before a row is ever pushed, so the dataset you download already matches your target list. Read on to see every input and output field, and exactly how the filtering and proxy fallback work.

๐Ÿงญ What is LinkedIn Company Profile Scraper With Firmographic Filters?

It's an Apify Actor that fetches one or many public LinkedIn company pages and returns typed JSON: company profile data, the complete office/location network for that company, and normalized firmographic bands. No LinkedIn account or login is required โ€” the Actor requests the logged-out, publicly accessible version of each company page, and treats a redirect to LinkedIn's authwall as a failed attempt rather than something it logs in to bypass.

  • ๐Ÿข Scrape company profile fields โ€” name, industry, size, founded year, headquarters, specialties
  • ๐ŸŒ Scrape every publicly listed office โ€” address lines, city, postal code, country code, HQ flag
  • ๐Ÿ“Š Apply working firmographic filters server-side โ€” employee range, industry keywords, office count, office country
  • ๐Ÿ” Fall back to Apify Residential proxy automatically if LinkedIn blocks a request
  • ๐Ÿ“ค Export results as JSON, CSV, Excel, or any format an Apify dataset supports

๐Ÿ“ฆ What data does LinkedIn Company Profile Scraper With Firmographic Filters collect?

Four kinds of data come back in every pushed row: the company profile, its office network, normalized firmographic bands, and small samples of related employees and posts.

Data TypeKey FieldsJSON Field Names
Company profilename, industry, type, headquarters text, founded year, specialties, websitename, industry, type, headquarters, founded, specialties, website
Office locationsaddress lines, city, postal code, country code, HQ flag, map linkoffices[].addressLine1, offices[].city, offices[].postalCode, offices[].countryCode, offices[].isHeadquarters, offices[].mapUrl
Firmographic bandsexact employee count, parsed employee band, company age, multinational flag, country coverageemployeeCount, employeeCountRange, companyAgeYears, isMultinational, countryCount
Employee & post samplessampled employee name/title/link, sampled post text/dateemployees[].name, employees[].title, posts[].text, posts[].datePublished

Need more LinkedIn data?

If you need to build a list of company URLs before you can feed this Actor, API-Empire's LinkedIn Mass Company Profile Finder With Multi-Engine Search finds candidate company pages by search first. If your target is people rather than companies, LinkedIn Lead Scraper With Advanced Filters extracts individual lead and contact records instead of firmographic company data.

๐Ÿ› ๏ธ Why not build this yourself?

LinkedIn does not offer a public, self-serve API that returns a company's full office network or firmographic bands the way this Actor does โ€” building a scraper yourself means writing and maintaining your own HTML/JSON-LD parser, detecting and reacting to LinkedIn's authwall, and running your own proxy pool for when requests get blocked. This Actor already implements that: it scans every JSON-LD block on the page (not just the first, which is often a breadcrumb block instead of the company data), treats an authwall redirect as a block, and automatically escalates from a direct or user-selected proxy to Apify's Residential proxy group on a block status (403, 407, 429, 999) โ€” with exponential backoff between retries, capped at 10 seconds. Maintaining that pipeline yourself, and keeping it working every time LinkedIn's markup shifts, is the ongoing cost this Actor removes.

๐ŸŽฏ Why do developers and teams scrape LinkedIn company data?

For AI engineers and agent builders

Firmographic fields like employeeCountRange, industry, officeCount, and countriesPresent are exactly the kind of structured, typed inputs a B2B research or account-qualification agent needs โ€” no HTML to strip before it reaches a prompt. A common pattern: feed a list of prospect company URLs in companyUrls, apply employeeRangeMin/industryIncludeKeywords so the agent only reasons over qualified accounts, then pass the resulting JSON rows straight into a RAG index or an agent tool call for account scoring, without a parsing step in the loop.

For sales and go-to-market teams

employeeRangeMin/employeeRangeMax, industryIncludeKeywords/industryExcludeKeywords, minOfficeCount, and officeCountryFilter let a go-to-market team turn a broad list of company URLs into a filtered target account list before anyone opens LinkedIn manually โ€” for example, keeping only mid-market software companies (employeeRangeMin: 50, employeeRangeMax: 500, industryIncludeKeywords: ["software"]) that already have an office in a target expansion market via officeCountryFilter.

For researchers and analysts

countriesPresent, countryCount, and isMultinational turn a company's public office listing into a comparable footprint metric across a whole dataset of companies, useful for market-structure or industry-concentration research using only publicly accessible LinkedIn pages โ€” no login-gated or private data is touched.

For developers building data products

Because every row is typed JSON with a stable schema, the output plugs directly into a scheduled pipeline: run the Actor on a schedule against a maintained URL list, land the results in a warehouse or CRM enrichment table, and let downstream code rely on field names (employeeCount, officeCount, isMultinational) that don't change shape between runs.

๐Ÿš€ How to scrape LinkedIn company pages (step by step)

  1. Open the Actor's page on the Apify Console (search or a direct link to linkedin-company-profile-scraper-with-firmographic-filters).
  2. Provide companyUrls โ€” a list of public LinkedIn company page URLs (e.g. https://www.linkedin.com/company/microsoft). The run needs at least one URL here or in the legacy urls field; an empty input raises an error immediately.
  3. Set firmographic filters if you want a segmented result โ€” employeeRangeMin/employeeRangeMax, industryIncludeKeywords/industryExcludeKeywords, minOfficeCount, officeCountryFilter. Leave them at their defaults (0 / empty) to receive every company you submitted.
  4. Start the run.
  5. Download results as JSON, CSV, or Excel from the dataset โ€” use the "Overview" view for the core firmographic columns, or the "Full" view for every field including the complete office list.

What to do when LinkedIn changes its structure

The Actor is maintained, and its output field names and types stay stable โ€” the Actor already scans every JSON-LD block on a page rather than assuming the first one is the company record, which is the kind of markup drift that quietly breaks a hand-rolled parser. No specific fix turnaround is promised here; check the Actor's Apify Console page for build and issue status.

โฌ‡๏ธ Input

ParameterRequiredTypeDescriptionExample Value
companyUrlsNoarrayList of public LinkedIn company page URLs to process. Each is scraped independently and its row is pushed to the dataset as soon as it's ready. Add one or many; duplicates are skipped automatically.["https://www.linkedin.com/company/microsoft"]
urlsNoarrayLegacy alias of companyUrls, kept for backward compatibility with the base actor's original input format. Used only if companyUrls is empty.[]
employeeRangeMinNointegerSkip companies with fewer employees than this (matched against the exact employee count when known, otherwise the parsed size-band start). Default 0, minimum 0. 0 = no minimum.1000
employeeRangeMaxNointegerSkip companies with more employees than this. Default 0, minimum 0. 0 = no maximum.0
industryIncludeKeywordsNoarrayKeep only companies whose industry OR specialties text contains at least one of these keywords (case-insensitive). Leave empty to skip this filter.["software", "fintech"]
industryExcludeKeywordsNoarraySkip any company whose industry OR specialties text contains one of these keywords (case-insensitive). Leave empty to skip this filter.["staffing", "recruiting"]
minOfficeCountNointegerSkip companies with fewer publicly listed offices than this. Default 0, minimum 0. 0 = no minimum.5
officeCountryFilterNoarrayKeep only companies with at least one office in one of these ISO-2 country codes. Leave empty to skip this filter.["US", "DE", "SG"]
maxRetriesNointegerAttempts per company page before giving up and saving an error row. Default 3, minimum 1, maximum 10.3
requestTimeoutSecNointegerSeconds to wait for each company page to respond before treating the attempt as failed. Default 30, minimum 5, maximum 120.30
concurrencyNointegerCompany pages processed in parallel. Default 3, minimum 1, maximum 20.5
proxyConfigurationNoobjectStarting proxy for requests. If LinkedIn blocks or rejects a request, the Actor automatically switches to Apify Residential proxy for the rest of the run. Leave empty to start direct.{"useApifyProxy": true}
proxyNoobjectLegacy alias of proxyConfiguration, kept for backward compatibility with the base actor's original input format.{}

No parameter is marked required in the schema, but the run itself requires at least one URL: leaving both companyUrls and urls empty raises No URLs provided in input.companyUrls (or legacy input.urls) before any page is fetched โ€” that's the most common input mistake.

{
"companyUrls": [
"https://www.linkedin.com/company/microsoft",
"https://www.linkedin.com/company/stripe"
],
"employeeRangeMin": 1000,
"employeeRangeMax": 0,
"industryIncludeKeywords": ["software", "fintech"],
"industryExcludeKeywords": ["staffing"],
"minOfficeCount": 5,
"officeCountryFilter": ["US", "DE", "SG"],
"maxRetries": 3,
"requestTimeoutSec": 30,
"concurrency": 5,
"proxyConfiguration": { "useApifyProxy": true }
}

โฌ†๏ธ Output

Every pushed row is typed, normalized JSON with a fixed set of keys โ€” the schema does not shrink or grow between companies, only individual values become null or empty arrays when LinkedIn doesn't expose that piece of data for a given company. Rows are pushed to the dataset live, one per company, the moment each finishes; the same array is also written once, at the end of the run, to the key-value store under the key OUTPUT. Results are exportable as JSON, CSV, Excel, XML, or an HTML table from the dataset.

Scraped company profile

{
"inputUrl": "https://www.linkedin.com/company/microsoft",
"success": true,
"name": "Microsoft",
"description": "Every company has a mission...",
"location": { "city": "Redmond", "state": "Washington", "country": "US" },
"employeeCount": null,
"website": "https://www.microsoft.com",
"logo": "https://media.licdn.com/dms/image/example.png",
"slogan": "",
"industry": "Software Development",
"size": "10,001+ employees",
"founded": 1975,
"headquarters": "Redmond, Washington",
"type": "Public Company",
"specialties": ["Business Software", "Developer Tools", "Cloud Computing"],
"similarPages": [
{ "link": "https://www.linkedin.com/company/google", "name": "Google", "image": "https://media.licdn.com/example2.png" }
],
"employees": [
{ "link": "https://www.linkedin.com/in/example", "name": "Jane Doe", "title": "Program Manager", "image": "https://media.licdn.com/example3.png" }
],
"posts": [
{ "url": "https://www.linkedin.com/company/microsoft/posts/example", "datePublished": "2026-06-01", "text": "Excited to announce..." }
],
"offices": [
{
"addressLine1": "One Microsoft Way",
"addressLine2": null,
"city": "Redmond",
"postalCode": "98052",
"countryCode": "US",
"isHeadquarters": true,
"mapUrl": "https://www.bing.com/maps?where=One+Microsoft+Way+Redmond+98052+Washington+US"
},
{
"addressLine1": "Central Business District",
"addressLine2": null,
"city": "Central Business District",
"postalCode": "088894",
"countryCode": "SG",
"isHeadquarters": false,
"mapUrl": "https://www.bing.com/maps?where=Central+Business+District+Singapore+088894+SG"
}
],
"officeCount": 45,
"countriesPresent": ["DE", "SG", "US"],
"countryCount": 3,
"isMultinational": true,
"hqStreetAddress": "One Microsoft Way",
"hqPostalCode": "98052",
"employeeCountRange": { "start": 10001, "end": null },
"companyAgeYears": 51,
"error": ""
}

employeeCount is only populated when LinkedIn's own structured data exposes an exact numberOfEmployees value โ€” this is frequently absent, in which case it stays null and employeeCountRange (parsed from the "10,001+ employees" style text) is the only size signal available. employees, posts, and similarPages are small samples (up to 10 items) pulled from whatever LinkedIn renders on that page section, not exhaustive lists โ€” they can be empty arrays if the section isn't present for a given company. On a failed URL, success is false, every profile field falls back to its empty default, and error holds the failure reason (e.g. "HTTP 403").

Office locations

The headline field: every publicly listed office, not just the headquarters, each parsed into a structured address:

{
"addressLine1": "One Microsoft Way",
"addressLine2": null,
"city": "Redmond",
"postalCode": "98052",
"countryCode": "US",
"isHeadquarters": true,
"mapUrl": "https://www.bing.com/maps?where=One+Microsoft+Way+Redmond+98052+Washington+US"
}

A company with a single listed location correctly returns one office with isHeadquarters: true and officeCount: 1 โ€” offices are never fabricated to pad the array.

๐Ÿ” How does LinkedIn Company Profile Scraper With Firmographic Filters compare to other LinkedIn scrapers?

FeatureThis ActorGeneric alternative
Office network extractionโœ… Every listed office, with address, city, postal code, country, HQ flagโŒ Typically headquarters text only
Pre-charge firmographic filtersโœ… Employee range, industry keywords, office count, office country โ€” non-matching companies are skipped before a row is pushedโŒ Usually not available; you filter after downloading every row
Proxy escalationโœ… Starts direct or user-selected, auto-escalates to Apify Residential proxy on a block or authwall redirectโŒ Varies; many require you to pre-configure a paid proxy group yourself
Legacy input compatibilityโœ… Accepts both companyUrls/proxyConfiguration and the base actor's original urls/proxy keysโŒ Varies by actor
Output schemaโœ… Fixed set of keys on every row, null/empty rather than omitted fieldsโŒ Varies by actor

If you're building an AI agent or RAG pipeline, the output format row is the decision-maker โ€” parsing HTML inside an agent loop is a reliability failure mode, not a feature.

๐Ÿ“Š How many results can you scrape with LinkedIn Company Profile Scraper With Firmographic Filters?

There is no hard cap on the number of company URLs you can submit in companyUrls (or the legacy urls). Every URL is added to the Actor's Request Queue โ€” in batches of 500 for efficient insertion โ€” which automatically deduplicates by URL, so submitting the same company twice only processes it once. concurrency (default 3, hard-capped at 20) controls how many company pages are fetched in parallel, and maxRetries (default 3, maximum 10) controls how many attempts a single company gets before an error row is saved instead of a successful one. Companies that fail a firmographic filter are skipped and never counted against your result set at all. There is no measured throughput figure published for this Actor โ€” actual run time depends on concurrency, requestTimeoutSec, and how often LinkedIn requires a proxy escalation.

โš™๏ธ Integrate LinkedIn Company Profile Scraper With Firmographic Filters and automate your workflow

LinkedIn Company Profile Scraper With Firmographic Filters works with any language or tool that can send an HTTP request, through the Apify API.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("<YOUR_USERNAME>/linkedin-company-profile-scraper-with-firmographic-filters").call(
run_input={
"companyUrls": ["https://www.linkedin.com/company/microsoft"],
"employeeRangeMin": 1000,
"officeCountryFilter": ["US"],
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["name"], item["officeCount"], item["isMultinational"])

Works in Python, Node.js, Go, Ruby, cURL โ€” any client that can call the Apify API with your API token.

Automation platforms (n8n, Make)

Apify publishes an official node for n8n and a module for Make (formerly Integromat) that can call any Apify Actor by its ID. Point either at linkedin-company-profile-scraper-with-firmographic-filters, pass the same input fields shown above, and read the resulting dataset items in the next step of your workflow โ€” no custom HTTP node required.

Scraping publicly accessible LinkedIn company pages is generally lawful; this Actor returns only data LinkedIn already serves to a logged-out visitor and treats an authwall redirect as a failed request rather than something to bypass. Most of the output โ€” company name, industry, size band, office addresses โ€” is business/organizational data, governed by LinkedIn's own terms of service and database-rights considerations rather than personal-data law. The employees field is an exception: it's a small sample of named individuals and their job titles, which is personal data and can trigger GDPR/CCPA obligations if you store or reuse it. Consult legal counsel for commercial use cases involving bulk personal data.

โ“ Frequently asked questions

Does LinkedIn Company Profile Scraper With Firmographic Filters work without a LinkedIn account?

Yes. It requests the public, logged-out version of each company page โ€” no LinkedIn account, login, or session cookie is used or required.

How often is the scraped data updated?

Every run fetches the company page live at request time; nothing is served from a cache. Re-run the Actor whenever you need current data.

What happens if a company page can't be reached or LinkedIn blocks the request?

After maxRetries attempts (default 3) the Actor saves an error row instead of dropping the URL silently: success: false, profile fields at their empty defaults, and error holding the failure reason (e.g. an HTTP status or network error). This is different from a firmographic-filter skip, which is not pushed to the dataset at all.

Can I scrape login-gated or private LinkedIn company content?

No. The Actor only fetches the public, logged-out company page. If LinkedIn redirects a request to its authwall, that attempt is treated as a block โ€” the Actor retries and escalates proxy, it does not attempt to log in or bypass the wall.

Do I need to configure a proxy myself?

No โ€” proxy handling is optional. Leave proxyConfiguration empty and the Actor starts direct; if LinkedIn returns a block status (403, 407, 429, 999) or an authwall redirect, it automatically switches to Apify Residential proxy for the remainder of the run.

Does LinkedIn Company Profile Scraper With Firmographic Filters work for AI agent workflows and LLM pipelines?

Yes. It's callable as an Apify Actor run through the Apify API by any agent framework that can send an HTTP request; every response is typed JSON, so there's no parsing step before passing a result to an LLM.

How does it handle LinkedIn's anti-bot system?

It sends browser-like request headers, detects authwall redirects as blocks, and escalates from a direct or user-selected proxy to Apify's Residential proxy group on a block status (403, 407, 429, 999) or an authwall redirect โ€” with exponential backoff between retries (1s, 2s, 4s... capped at 10s) up to maxRetries attempts.

How does it compare to other LinkedIn company scrapers?

It extracts the complete office network (not just a headquarters line), applies firmographic filters before a row is ever charged or pushed, and automatically escalates proxy on a block rather than requiring you to pre-configure one. See the comparison table above for the full breakdown.

Does it return data in a format LLMs can use directly?

Yes. Every row is typed, normalized JSON with stable field names โ€” no HTML, no selectors, no parsing required before indexing into a vector store or passing to an LLM context window.

Can I use it without managing proxies?

Yes. The Actor starts direct by default and only engages a proxy (Apify Residential) automatically if LinkedIn blocks a request; you never have to pre-configure one.

What happens when LinkedIn changes its structure or blocks the scraper?

The Actor is maintained and its output schema stays stable โ€” field names and types don't change on your end even after an update to the parsing logic. No specific fix turnaround is promised.

๐Ÿ’ฌ Your feedback

Found a bug, or a field that's missing for your use case? We want to know โ€” use the Issues tab on this Actor's Apify Console page to report it. Active maintenance keeps the parsing logic (and this README) matched to what LinkedIn actually serves.