Indeed Company API

An Indeed company API that returns the employer itself, not only its reviews. Look companies up by name, pass Indeed company URLs or bare slugs, browse one of Indeed's 140 industries across US states and metro areas, or crawl a browse-companies directory page. A full profile row carries the overall rating and five sub-ratings, ratings by year, CEO name and approval, founding year, employee and revenue bands, headquarters, the work happiness score, the open-job count with job locations and top titles, and Indeed's own review, salary and question totals. Turn on employee reviews, salaries by job title or Q&A and each comes back as its own billed row, joined to its company by companyId. Keyword and URL modes read 60 Indeed country sites; industry and directory browse are US only.

MEDIAN LAGon demand
FIELDS48
TOTAL USERS4
MONTHLY ACTIVE4
TOTAL RUNS84
SUCCESS (30D)87.3%
RATINGno ratings yet
LAST MODIFIED2026-10-04
PUBLISHED2026-08

Input parameters

PARAMETERTYPEREQDEFAULTDESCRIPTION
mode enum yes keyword How to find companies: keyword (look them up by name), url (exact company pages you already hold), industry (every company in one industry across the states you list) or directory (crawl an Indeed browse-companies page).
keywords string[] no — Company names to look up, for example Tesla or Allstate. Each name is its own search, and a name can match more than one employer. Keyword mode, up to 10 per run.
companyUrls string[] no — One company each: a profile URL such as https://www.indeed.com/cmp/Allstate-Insurance, a sub-page URL such as its /reviews page, or a bare slug. URL mode, up to 100 per run, one profile charge per company. — drives your bill
industry enum no All One of Indeed's own 140 industries, matched exactly. An unrecognised value stops the run with the closest matches. All browses every industry. Industry mode.
states string[] no — Where to browse, one search per entry: a US state name, United States, or a metro area such as Sacramento, CA. Industry mode, up to 10 per run.
directoryUrls string[] no — Indeed browse-companies pages, for example https://www.indeed.com/companies/browse-companies. Directory mode, up to 10 per run.
maxResultsPerInput integer no 25 Companies to return per name, state or directory page, 1 to 1,000. Nothing beyond it is fetched or billed. Ignored in URL mode. — drives your bill
country enum no US Which of 60 Indeed country sites to read in keyword and URL modes. Industry and directory browse are US only. A pasted company URL always wins over this setting.
profileDetail enum no full full fetches each company page for the complete profile; listing returns the lighter results card at the listing price. URL mode is always full.
resolveExact boolean no false Keyword mode: return only the single best match per name. When nothing matches closely, an uncharged error row names the closest companies found.
uniqueCompaniesOnly boolean no true Drop duplicate companies within a run, so one employer is never returned or charged twice.
includeReviews boolean no false Also return employee reviews as their own rows (result_type review). Full profiles only.
maxReviewsPerCompany integer no 20 Reviews per company, 1 to 1,000, read 20 per page with the newest available first.
reviewsSince string no — Only reviews submitted on or after this date, written YYYY-MM-DD.
reviewsAllCountries boolean no false Include reviews written on every Indeed country site, not only the site being read. Widens the pool for multinational employers.
includeSalaries boolean no false Also return reported salaries by job title as their own rows (result_type salary). Full profiles only.
includeQuestions boolean no false Also return questions from the company's Q&A section as their own rows (result_type question). Full profiles only.
maxQuestionsPerCompany integer no 10 Questions per company, 1 to 500, read 10 per page.
enrichBusinessEmail boolean no false Optional add-on: look for a contact email published on each company's own website and verify it. Company rows only; billed per verified email or per lookup that found none.
maxBusinessEmailsPerRun integer no 50 Caps the charged email attempts in a run, found or not, 1 to 500. Only used with enrichBusinessEmail.

Output schema

FIELDTYPEDESCRIPTIONNULLABLE
result_type string What this row is: company (a full profile or a listing row), review, salary, question or error. Every kind lands in one dataset, so filter on this first. no
companyName string Company name as shown on Indeed. yes
companyId string Indeed's company slug, for example Walmart. URL mode accepts it back as input, and review, salary and question rows carry it as the join key. yes
employerId string Indeed's employer key, stable across country sites. yes
companyUrl string The Indeed company profile URL. yes
website string The company's own website, when the profile lists one. yes
description string The About text from the profile, or the highlight blurb on a listing row. yes
industry string Industry in Indeed's own taxonomy. yes
companySize string Employee band as shown, for example 10,000+ or 51 to 200. yes
employeesMin integer Low end of the employee band. yes
employeesMax integer High end of the employee band. Absent when the band is open-ended. yes
revenue string Revenue band as the source reports it, for example more than $10B. yes
headquarters string Headquarters location. yes
countryCode string Two-letter country code. yes
foundedYear integer Year founded, when listed. yes
ceoName string The chief executive named on the profile. yes
ceoApproval integer CEO approval as a percentage. yes
overallRating number Overall employer rating out of 5. On a review row, that reviewer's own rating. yes
ratingWorkLifeBalance number Work-life balance sub-rating out of 5. ratingCompensationBenefits, ratingJobSecurityAdvancement, ratingManagement and ratingCulture follow the same pattern, on company and review rows. yes
ratingsByYear array The overall rating for each recent year, each {year, rating}. yes
happinessScore integer Work happiness composite out of 100, with happinessGrade and happinessResponses alongside. yes
reviewsCount integer Indeed's published review total as of scrapedAt, not the number of review rows this run returned. yes
salariesCount integer Indeed's published count of reported salaries. yes
questionsCount integer Questions in the company's Q&A section. yes
jobsCount integer Open jobs the company currently lists on Indeed. yes
jobLocations array Locations with open jobs, each {name, jobsCount, url}. yes
topJobTitles array The most common job titles, each {title, jobsCount, rating, url}. yes
similarCompanies array Companies Indeed shows as similar, with their ratings and review counts. yes
profileDetail string full for a fetched profile, listing for the lighter results row. yes
matchConfidence number How closely a keyword matched this company, from 0 to 1. yes
summary string One plain-language line about the company, for agents reading rows as prose. yes
reviewTitle string Review title. Review rows also carry reviewId, reviewUrl, reviewText, pros, cons and the five sub-ratings. yes
jobTitle string The reviewer's job title on a review row, or the title a salary row describes. yes
location string The reviewer's coarse location, for example a city and state. yes
isCurrentEmployee boolean Whether the reviewer still works at the company. yes
submittedAt string Review submission date, YYYY-MM-DD. yes
employerResponses array Employer replies to the review, each {text, respondedAt, isOfficial}. yes
salaryMedian number Median reported pay for the job title as a number. salaryMedianText keeps the formatted value. yes
salaryPeriod string Pay period, for example HOURLY or YEARLY. yes
salaryCurrency string Currency code for the country site. yes
salaryReportsCount integer How many salary reports back the median. yes
questionText string The Q&A question, with questionId, questionUrl and askedAt alongside. yes
answersCount integer Number of answers on the question. yes
business_email string With enrichBusinessEmail on: the contact email published on the company's website, after verification. yes
business_email_status string Outcome of the email lookup, for example valid, not_found or no_website. yes
sourceInput string The input from your run that produced this row. yes
scrapedAt string UTC timestamp when the page was read. Present on every company, review, salary and question row. yes
error_message string Why an input returned nothing. Error rows are never charged. yes

Worked examples

Look up companies by name — resolveExact keeps one best-match profile per name
{"mode": "keyword", "keywords": ["Tesla", "Allstate"], "resolveExact": true}
Healthcare employers in two states, listing rows only — the cheaper listing price; send the companyId values you want back through URL mode for full profiles
{"mode": "industry", "industry": "Healthcare", "states": ["California", "Texas"], "profileDetail": "listing", "maxResultsPerInput": 100}
Employee reviews since a date — one company row plus up to 100 review rows
{"mode": "url", "companyUrls": ["Allstate-Insurance"], "includeReviews": true, "maxReviewsPerCompany": 100, "reviewsSince": "2026-01-01"}
Salaries by job title and Q&A — salary and question rows join back on companyId
{"mode": "url", "companyUrls": ["https://www.indeed.com/cmp/Walmart"], "includeSalaries": true, "includeQuestions": true, "maxQuestionsPerCompany": 20}
Crawl the company directory — every company the browse page lists, up to the limit
{"mode": "directory", "directoryUrls": ["https://www.indeed.com/companies/browse-companies"], "profileDetail": "listing", "maxResultsPerInput": 200}
POWER-USER TIP
Profile counts are Indeed's totals, not your rows — reviewsCount, salariesCount, questionsCount and jobsCount are the totals Indeed publishes as of scrapedAt. Ask for 50 reviews of an employer with 280,000 and reviewsCount still reads 280,000. When reviews were fetched, reviewsFoundCount says how many matched your filters.
POWER-USER TIP
List cheaply, then fetch the profiles you want — A listing row is priced at under a seventh of a full profile and carries the name, companyId, rating, review count, sector and size band. Browse an industry with profileDetail set to listing, pick the companies worth a closer look, and send their companyId values to URL mode, which accepts a bare slug. Reviews, salaries and Q&A need full profiles.
POWER-USER TIP
A name can match several employers — Keyword mode returns every candidate with a matchConfidence from 0 to 1. Set resolveExact to keep only the best match per name; when nothing matches closely you get an uncharged error row naming the closest companies instead.
POWER-USER TIP
Filter on result_type — Company, review, salary, question and error rows all land in one dataset. The saved dataset views group columns but do not filter rows, so split on result_type in code. Child rows carry companyId, companyName, employerId and sourceInput for the join.
POWER-USER TIP
Interviews, photos and benefits are always empty — Indeed removed those company sub-pages. interviewsCount, interviewsUrl, photosCount, photosUrl, benefits and jobCategories stay in the output schema for backward compatibility but are never filled, so do not build on them.
POWER-USER TIP
Cap the spend before the run — Set maxTotalChargeUsd and the run reads its budget first, fetching only what it can pay for. Very large runs are also trimmed to finish inside the run timeout, review and question caps first. Error rows are never charged.

Coverage

60
Indeed country sites — keyword and URL modes; industry and directory browse are US only
140
industries to browse — Indeed's own list, matched exactly
1,000
companies per name, state or directory page — maxResultsPerInput, 25 by default
10
inputs per run — names, states or directory pages; URL mode takes up to 100 company URLs
1,000
reviews per company — read 20 per page; questions go up to 500 per company

Code

Look up a company in one call

curl -X POST "https://api.apify.com/v2/acts/johnvc~indeed-company-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "keyword", "keywords": ["Allstate"], "resolveExact": true}'

Python

from apify_client import ApifyClient

client = ApifyClient("APIFY_TOKEN")
run = client.actor("johnvc/indeed-company-api").call(
    run_input={"mode": "url", "companyUrls": ["Allstate-Insurance"], "includeReviews": True, "maxReviewsPerCompany": 40}
)
for row in client.dataset(run.default_dataset_id).iterate_items():
    kind = row.get("result_type")
    if kind == "company":
        print(row.get("companyName"), "|", row.get("overallRating"), "|", row.get("reviewsCount"), "reviews |", row.get("jobsCount"), "open jobs")
    elif kind == "review":
        print("  ", row.get("overallRating"), "|", row.get("jobTitle"), "|", row.get("reviewTitle"))
    elif kind == "error":
        print("error:", row.get("error_message"))

MCP

claude mcp add --transport http indeed-company-api \
  "https://mcp.apify.com/?tools=actors,docs,johnvc/indeed-company-api"

Sample company row (synthetic)

{
  "result_type": "company",
  "companyName": "Example Logistics",
  "companyId": "Example-Logistics",
  "companyUrl": "https://www.indeed.com/cmp/Example-Logistics",
  "employerId": "0f1e2d3c4b5a",
  "website": "https://www.example.com",
  "industry": "Transportation & Logistics",
  "companySize": "1,001 to 5,000",
  "employeesMin": 1001,
  "employeesMax": 5000,
  "revenue": "$100M to $500M",
  "headquarters": "Columbus, OH",
  "countryCode": "US",
  "foundedYear": 1998,
  "overallRating": 3.7,
  "ratingWorkLifeBalance": 3.5,
  "ratingCompensationBenefits": 3.6,
  "ratingsByYear": [{"year": 2026, "rating": 3.7}, {"year": 2025, "rating": 3.6}],
  "happinessScore": 66,
  "reviewsCount": 1240,
  "salariesCount": 3180,
  "questionsCount": 85,
  "jobsCount": 142,
  "profileDetail": "full",
  "summary": "Example Logistics, a Transportation & Logistics company based in Columbus, OH. Founded 1998. Rated 3.7 from 1,240 reviews. 142 open jobs.",
  "sourceInput": "Example-Logistics",
  "scrapedAt": "2026-10-03T09:15:00Z"
}

What people use it for

  • Building employer lists by industry and state
  • Sales prospecting on open-job counts per employer
  • Salary benchmarking by job title across employers
  • Employer-brand monitoring from employee reviews
  • Comparing employer ratings across a competitor set
  • Feeding an AI agent employer reviews and salaries over MCP

More sources for Lead sourcing and CRM enrichment, Hiring signals and talent intelligence, Reviews and reputation monitoring, Competitor and market monitoring, Grounding AI agents and MCP tools →

Alternatives