Glassdoor API & Scraper
The Glassdoor API returns company reviews, interview reports and salary data as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary employer/search endpoint returns employers with id, name, category and logo, and you can pull an employer/detail, employer/reviews, employer/interviews, employer/jobs and employer/salaries — each with a harvest variant for bulk collection. It is built for employer-intelligence, recruiting and labor-market research that need Glassdoor data without a login or a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
Which Glassdoor surfaces answered on 2026-08-27, and what employer_id looks like
Every action on this engine needs an employer_id, and only employer/search hands one out. Glassdoor defends its surfaces unevenly, so the honest thing to publish is what a live call actually returned per action rather than what the schema promises. This table was recorded on 2026-08-27 against two employers, Google (9079) and Siemens (3510), with a repeat attempt on every failure.
| Action | Result on 2026-08-27 | What the live call returned |
|---|---|---|
| employer/search | answered | "Google" returned 1 row, employer_id 9079. "Siemens" returned 7 rows: Siemens 3510, Siemens Healthineers 1317005, Siemens Energy 4393689 and four more. "Trendyol" returned 1 row, 722443. |
| employer/jobs | answered | 10 job rows for 9079 carrying title, location, salary_min, salary_max, salary_currency, salary_period, posted_age_days, easy_apply, company_rating, goc and job_url. |
| employer/detail | TARGET_BLOCKED | "Glassdoor returned anti-bot block" on employer_id 9079 and again on 3510, on two attempts each. Live verification failed: TARGET_BLOCKED. |
| employer/reviews | TARGET_BLOCKED | Same error on both employers and both attempts. Live verification failed: TARGET_BLOCKED. |
| employer/interviews | TARGET_BLOCKED | Same error on both attempts. Live verification failed: TARGET_BLOCKED. |
| employer/salaries | TARGET_BLOCKED | Same error with pay_period ANNUAL and with HOURLY, on both employers. Live verification failed: TARGET_BLOCKED. |
employer_id is a plain integer with no prefix and no fixed width: 4 digits for long-established profiles (Siemens 3510, Google 9079), 7 digits for newer ones (Siemens Energy 4393689). 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.
Real request and response JSON
Captured from the indexed primary action, employer/search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/glassdoor/v1/employer/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "Google"
}
}{
"ok": true,
"meta": {
"api": "glassdoor",
"endpoint": "employer/search",
"mode": "live",
"latency_ms": 637.4,
"record_count": 7,
"bytes": 0,
"cache_hit": false,
"count": 7
},
"data": {
"results": [
{
"employer_id": 9079,
"name": "Google",
"category": "company",
"logo_url": "https://media.glassdoor.com/sqlm/9079/google-squarelogo-[redacted-phone].png"
},
{
"employer_id": 3162960,
"name": "[redacted-name]",
"category": "company",
"logo_url": "https://media.glassdoor.com/sqlm/3162960/google-cloud-squarelogo-[redacted-phone].png"
},
{
"employer_id": 9079,
"name": "[redacted-name]",
"category": "multicat",
"logo_url": "https://media.glassdoor.com/sqlm/9079/google-squarelogo-[redacted-phone].png"
}
]
}
}What the Glassdoor API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| employer/search | Resolve a company name to its Glassdoor employer_id + basic profile. Start here — every other action needs the employer_id. | Recruiting teams call employer/search to resolve a company name to its Glassdoor employer_id + basic profile. | query |
| employer/detail | Employer profile + ratings. | Labor-market analysts call employer/detail to get employer profile + ratings.. | employer_id, dynamic_profile_id |
| employer/reviews | One page of employer reviews (rating, pros/cons, role). | Job boards call employer/reviews to get one page of employer reviews (rating, pros/cons, role).. | employer_id, page, cursor, page_size, dynamic_profile_id |
| employer/reviews-harvest | Fetch all available Glassdoor reviews across multiple pages — returns every unique review with rating, pros/cons and role. | Sales intelligence teams call employer/reviews-harvest to fetch all available Glassdoor reviews across multiple pages. | employer_id, dynamic_profile_id, page_size, max_pages |
| employer/interviews | One page of interview reports (questions, difficulty, outcome). | Recruiting teams call employer/interviews to get one page of interview reports (questions, difficulty, outcome).. | employer_id, page, cursor, items_per_page, dynamic_profile_id |
| employer/interviews-harvest | Fetch all available Glassdoor interview reports across multiple pages. | Labor-market analysts call employer/interviews-harvest to fetch all available Glassdoor interview reports across multiple pages.. | employer_id, dynamic_profile_id, items_per_page, max_pages |
| employer/jobs | Employer job listings (one page; cursor pagination). | Job boards call employer/jobs to get employer job listings (one page; cursor pagination).. | employer_id, page, cursor, page_size, page_cursor |
| employer/jobs-harvest | Fetch all available Glassdoor job listings across multiple pages. | Sales intelligence teams call employer/jobs-harvest to fetch all available Glassdoor job listings across multiple pages.. | employer_id, dynamic_profile_id, page_size, max_pages |
| employer/salaries | Glassdoor salary estimates for this employer, broken down by job title. Each title returns the full pay distribution — base pay and total pay percentiles (P10/P25/P50/P75/P90), median base/total/additional pay, plus cash bonus, stock, profit sharing, sales commission and tips bands. Titles are ordered by number of reported salaries (most-reported first). | Recruiting teams call employer/salaries to get glassdoor salary estimates for this employer, broken down by job title. | employer_id, job_title, page, cursor, page_size, ... |
| employer/salaries-harvest | Fetch salary estimates for all job titles at this employer across multiple pages — every title with its full pay distribution. | Labor-market analysts call employer/salaries-harvest to fetch salary estimates for all job titles at this employer across multiple pages. | employer_id, job_title, page_size, pay_period, max_pages |
Call employer/search from your stack
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"])const res = await fetch("https://api.reefapi.com/glassdoor/v1/employer/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "Google"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.glassdoor.employer/search with {"query":"Google"}.Who uses this API and why
- Employer-branding teams call employer/reviews to monitor their company's Glassdoor rating and feedback.
- Recruiting tools use employer/salaries and employer/interviews to prep candidates with real pay and process data.
- Labor-market researchers use employer/detail across a company list to benchmark employer reputation.
Questions developers ask before integrating
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".
Which actions are actually answering today?
employer/search and employer/jobs returned data. employer/detail, employer/reviews, employer/interviews and employer/salaries all returned error code TARGET_BLOCKED with the message "Glassdoor returned anti-bot block", on two different employers and on repeat attempts in the same session. TARGET_BLOCKED is a statement about the upstream site, not about your request, so retrying later is the right move; changing your parameters will not help.
Can I get an employer rating without employer/detail?
Yes. Every job row carries company_rating on a 0-5 scale with one decimal, and it is identical across all rows for the same employer: 4.4 on all ten Google (9079) rows and 4.1 on all five Siemens (3510) rows. That gives you the headline number while the detail surface is unavailable. It does not give you the sub-ratings breakdown.
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.
What is the goc field on a job row?
A normalized lowercase occupation label that the schema does not list but every row carries. Measured values from one page: "support specialist", "employment specialist", "policy analyst", "communications coordinator", "business operations specialist", "data center technician", "customer service representative", "team member" and "other". It is much coarser than title, which is what makes it useful for bucketing, and "other" is a real value rather than a null.
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.
Why do jobs for a German company all sit in the United States?
Because employer/jobs reads the US board. All five Siemens (3510) rows were Raleigh NC, Grand Prairie TX, Peachtree Corners GA, Buffalo Grove IL and San Antonio TX, and all of them were priced in USD per year. Do not use this action to size a company's hiring outside the US.
What do posted_age_days and easy_apply mean in practice?
posted_age_days is an integer count of days since the listing appeared, with measured values from 4 to 29 across the two employers. It is a relative age rather than a date, so it shifts every day you call and it is not a stable field to store. easy_apply is a real boolean and came back false on all 15 rows we saw, meaning those listings route to the employer's own application flow.
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.
How many credits does the Glassdoor API use?
Glassdoor actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Glassdoor from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call glassdoor actions with the same key, credit pool and JSON envelope used by normal REST requests.