A company name in, its open roles and their pay bands out
The Glassdoor API returns company profiles, ratings, reviews, interview reports, salary bands and job listings as clean JSON.
10 active endpoints. Every call is 1 credit.
- POST/glassdoor/v1/employer/search
- POST/glassdoor/v1/employer/detail
- POST/glassdoor/v1/employer/reviews
- POST/glassdoor/v1/employer/reviews-harvest
- POST/glassdoor/v1/employer/interviews
- POST/glassdoor/v1/employer/interviews-harvest
- POST/glassdoor/v1/employer/jobs
- +3 more
What Glassdoor endpoints does ReefAPI ship?
10 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Glassdoor API
3 of 10 endpoints, ready to run
A company name resolved to Glassdoor employer ids — every candidate with its id, name and logo. This is the first call for anything else here, because the rest of the engine is addressed by id and never by name.
{ "ok": true, "meta": { "api": "glassdoor", "endpoint": "employer/search", "mode": "live", "latency_ms": 668.6, "record_count": 6, "cache_hit": false }, "data": { "results": [ { "employer_id": 2763, "name": "Deloitte", "category": "company", "logo_url": "https://media.glassdoor.com/sqlm/2763/deloitte-squareLogo-1674210308378.png" }, { "employer_id": 2763, "name": "Deloitte Tax Consultant", "category": "multicat", "logo_url": "https://media.glassdoor.com/sqlm/2763/deloitte-squareLogo-1674210308378.png" }, { "employer_id": 2763, "name": "Deloitte Consultant", "category": "multicat", "logo_url": "https://media.glassdoor.com/sqlm/2763/deloitte-squareLogo-1674210308378.png" } ] } }
How the Glassdoor API works
Glassdoor is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 440 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
From a company name to a pay band you can quote
Nothing here takes a company name except the first call. Everything after it takes the employer id that call returns, which is also what makes the results stable when a company renames itself.
{"query": "Deloitte"}Candidates with their ids. Check the name on the row before you take the id — a common word matches a lot of small companies.
{"employer_id": 6036, "page_size": 50, "max_pages": 2}Roles with their advertised bands, plus a harvest block telling you how much of the company's total you actually collected.
A company's live openings with pay ranges, currencies and posting ages — the pieces a compensation benchmark or a hiring-signal feed is built from.
curl -X POST https://api.reefapi.com/glassdoor/v1/employer/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"Google"}'{
"ok": true,
"data": { … },
"meta": {
"api": "glassdoor",
"endpoint": "employer/search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What each Glassdoor action returned on 2026-09-24, and how deep the public surface goes
Every action needs an employer_id and only employer/search hands one out. Glassdoor serves different amounts of each surface to a signed-out visitor, so what is published here is what live calls actually returned rather than what the schema promises. Measured on 2026-09-24 against three employers - Google (9079), Stripe (671932) and Apple (1651) - with twelve runs per single-page action and six per harvest.
| Action | Result on 2026-09-24 | What the live calls returned |
|---|---|---|
| employer/search | 12/12 | Twelve distinct company names returned 37 rows in total, every one carrying employer_id and name. "Google" returned 1 row (9079), "Nvidia" returned 9. |
| employer/detail | 12/12 | Every advertised field arrived on all 12 calls: website, headquarters, size, industry, sector, description, review_count, salary_count, overall_rating, the nine sub-ratings, ceo, the star distribution, industry_benchmark_ratings, revenue, company_type and year_founded. |
| employer/reviews | 12/12 | 36 reviews, all carrying review_id, date, headline, pros, cons, overall_rating, employment_status and is_current_job. job_title was present on 32 of 36 - some reviewers do not give one. This is one page per sort order; see the FAQ below. |
| employer/reviews-harvest | 6/6 | 65 unique reviews across six runs, 9 to 12 per employer, against 3 from a single employer/reviews call. Slower than the other actions: 8s to 45s per call. |
| employer/interviews | 12/12 | 60 reports across four pages per employer, zero overlap between pages. interview_id, date, job_title, difficulty, experience, outcome and process_description on all 60. source on 24 of 60 and questions on 5 of 60 - both are optional for the person filing the report. |
| employer/salaries | 12/12 | 120 job titles across four pages per employer. job_title, job_title_id, salary_count, currency, most_recent, median_base_pay, median_total_pay and the full P10-P90 base_pay and total_pay bands on all 120 rows. |
| employer/jobs | 8/12, plus 4 honest empties | 10 rows each for Google and Apple with title, location, salary_min, salary_max, company_rating and job_url. Stripe returned zero rows with total_jobs_count 0 - Glassdoor's own US board has no Stripe listings, which is an answer rather than an error. |
employer_id is a plain integer with no prefix and no fixed width: 4 digits for long-established profiles (Google 9079, Apple 1651), 6 or 7 for newer ones (Stripe 671932). The same number appears twice more in a response, in the logo_url path (media.glassdoor.com/sqlm/9079/...) and as company_id on every job row.
Which surfaces answer, which do not, and how much of a company a harvest really holds
Measured across several large employers and one that has no listings at all, and by calling every action the engine publishes rather than only the ones that work.
This is the honest headline and you should read it before you build on this engine. Company reviews, interview reports and Glassdoor's own salary estimates all return a clear, non-retryable error naming exactly what is still available, rather than a timeout, an empty list, or a retry loop that burns your credits discovering the same thing. What works is the company lookup and the job board, and the pay data you can get here is the range advertised on the posting itself — which is the employer's own number, not Glassdoor's model of it.
Searching a well-known one-word company returned ten employers, of which one was the company and the rest merely began with the same word — a decorating firm, a consultancy, a clothing label. The rows carry the name and the logo so the check is cheap, and the id you pick is what every later call is bound to. Taking result zero without looking is the single easiest way to build a report about the wrong business.
Across a hundred harvested roles at one large employer, the great majority carried both a floor and a ceiling, and the rest carried neither. The currency and the period are separate explicit fields rather than something to infer from the number, so an hourly rate is never mistaken for an annual one. A row with no band is a posting the employer chose not to advertise a range on.
One well-known technology company resolved to a valid employer id and then returned no jobs at all, while three other large employers returned full pages from the same call in the same minute. Empty here means the job board has nothing live for that company, not that the request failed — so treat an empty result as an answer and do not retry it.
Two pages against one very large employer returned a hundred unique roles out of a reported ten thousand, and the response says all of it: pages fetched, unique roles kept, the company's total, the completeness as a percentage and the reason it stopped. Completeness being a field rather than something you infer is the difference between a benchmark you can defend and one you cannot.
What people build with Glassdoor
The jobs this data is most often used for.
endpoints
credit per call
Employer-branding teams call employer/detail to track their overall rating, every sub-rating and how they score against the industry benchmark.
Recruiting tools use employer/salaries and employer/interviews to prep candidates with real pay bands and a real account of the process.
Labor-market researchers use employer/detail across a company list to benchmark employer reputation, headcount and revenue in one call.
What Glassdoor data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 440 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/glassdoor/v1/employer/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"Google"}'import requests
r = requests.post(
"https://api.reefapi.com/glassdoor/v1/employer/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "Google"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Glassdoor.
Get a free key →Why does employer/reviews return so few reviews for a company with tens of thousands?▾
Because that is all Glassdoor shows without an account. Review page 2 redirects to a sign-in wall - we measured it on an ordinary desktop Chrome as well as through the API, and on all eight Glassdoor country domains, so it is the site's rule rather than a limit of this API. Each sort order does return a different first page, so employer/reviews-harvest collects the most recent, most helpful, highest-rated and lowest-rated reviews and de-duplicates them: that took 3 reviews up to 9-12 per employer across six measured runs. The aggregate numbers are not limited this way - aggregate_ratings, rating_distribution and all_reviews_count describe the whole review base, and all_reviews_count was 71,197 for Google.
Is there a page or page_size parameter on reviews?▾
No, and that is deliberate. Glassdoor's public reviews page renders a fixed number of reviews and ignores any size hint, and page 2 is behind sign-in, so a page_size parameter here would have been a control that quietly did nothing. It was removed rather than left in the schema. Passing page=2 returns a typed NOT_AVAILABLE that explains the sign-in wall instead of failing silently. Interviews and salaries do paginate - pass page there and you get genuinely different rows, with zero overlap measured across pages 1 to 4.
Which actions are answering today?▾
All ten. Between August and 2026-09-24, employer/detail, employer/reviews, employer/interviews and employer/salaries returned TARGET_BLOCKED because they read an internal Glassdoor endpoint that the site itself stopped calling. They were rebuilt on the public pages on 2026-09-24 and now measure 12/12. If you cached the old behaviour or coded around those errors, you can drop the workaround.
Can I filter salaries to one job title?▾
Not through this action. Glassdoor's salaries page accepts a job-title query parameter and ignores it - we sent ?search=Software%20Engineer and got back the byte-identical unfiltered page - so the job_title parameter was removed rather than shipped as a no-op. Filter client-side on the job_title field, or page through: titles come back most-reported-first, so the roles you want are usually on the first page or two. pay_period is real and does work - switching to HOURLY moved Google's Software Engineer median from 184,722.83 to 87.97.
Which salary components come back?▾
base_pay and total_pay, each as a P10/P25/P50/P75/P90 band plus a median, with median_base_pay and median_total_pay as the headline numbers. The separate cash-bonus, stock, profit-sharing, sales-commission and tips bands are no longer in Glassdoor's payload on any row we saw across three employers and three pages each, so they were removed from the schema. median_additional_pay follows the same rule and comes back null.
employer/search returned results for a company that does not exist. Why?▾
It is a fuzzy name matcher and it does not return an empty list. The query "zzqqxx not a real company 8888" came back ok:true with 10 rows, led by Dunton Commercial Real Estate Company and Real Estate Service Solutions Company, because it matched the word "company". Compare results[0].name against what you asked for before feeding its employer_id into another call. Every row we saw carried category "company".
employer/jobs returned zero jobs. Is that a block?▾
Check total_jobs_count first. Stripe (671932) returned ok:true, zero rows and total_jobs_count 0 on four separate calls, and Glassdoor's own US board agrees - it carries no Stripe listings. A block arrives as an explicit error code, never as a quiet empty list. Note too that this action reads the US board, so it is not the way to size a non-US company's hiring.
What currency and pay period do job salaries use?▾
Across 15 job rows from two employers, salary_currency was "USD" and salary_period was "ANNUAL" on every single row. salary_min and salary_max are plain integers with no separators and no decimals, for example 224000 and 311000. Both were populated on all 15 rows, but treat them as a band rather than a posted figure.
Is job_id stable between calls?▾
No, and this bites anyone using it as a primary key. Two identical calls seconds apart returned the same three jobs as 5-yul1-0-1k1048kv622rs000-c6f51a806240dca6 and 5-yul1-0-1k1048lungmsj800-c6f51a806240dca6: same leading segment, same trailing hash, different middle segment. Only the last dash-separated hash identifies the job. Dedupe on that segment, or on the jobListingId query parameter inside job_url.
How fast are these calls?▾
Median latency measured on 2026-09-24: employer/search about 0.9s, employer/jobs about 1.0s, employer/interviews about 1.5s, employer/salaries about 1.6s, employer/reviews about 1.7s and employer/detail about 2.6s. Harvests fetch several pages, so they are slower - interviews-harvest and salaries-harvest came in under 2s, reviews-harvest ran 8s to 45s. Give harvest calls a generous deadline_ms; they return what they collected rather than failing if they run long.
What is the Glassdoor API?▾
Glassdoor API is a ReefAPI endpoint group for company reviews, ratings and salary insights. It returns live JSON through POST requests under /glassdoor/v1.
Is the Glassdoor API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Glassdoor calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Glassdoor login or account?▾
No login to Glassdoor is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Glassdoor data?▾
The page example is captured from a live employer/search call, and production requests fetch live data through ReefAPI rather than a static sample.
17 Jobs & Hiring APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Glassdoor, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 439 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.