Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Glassdoor API page →
Jobs & Hiring

Glassdoor API & Scraper

The Glassdoor API returns company reviews, interview reports and salary data as clean JSON.

10 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 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.

Reference

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.

ActionResult on 2026-08-27What the live call returned
employer/searchanswered"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/jobsanswered10 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/detailTARGET_BLOCKED"Glassdoor returned anti-bot block" on employer_id 9079 and again on 3510, on two attempts each. Live verification failed: TARGET_BLOCKED.
employer/reviewsTARGET_BLOCKEDSame error on both employers and both attempts. Live verification failed: TARGET_BLOCKED.
employer/interviewsTARGET_BLOCKEDSame error on both attempts. Live verification failed: TARGET_BLOCKED.
employer/salariesTARGET_BLOCKEDSame 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.

Live example

Real request and response JSON

Captured from the indexed primary action, employer/search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/glassdoor/v1/employer/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "Google"
  }
}
Captured response
{
  "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"
      }
    ]
  }
}
Actions

What the Glassdoor API does

ActionDescriptionConcrete use caseKey params
employer/searchResolve 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/detailEmployer profile + ratings.Labor-market analysts call employer/detail to get employer profile + ratings..employer_id, dynamic_profile_id
employer/reviewsOne 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-harvestFetch 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/interviewsOne 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-harvestFetch 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/jobsEmployer 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-harvestFetch 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/salariesGlassdoor 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-harvestFetch 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
Code samples

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"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.glassdoor.employer/search with {"query":"Google"}.
Use cases

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.
FAQ

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.

docs / glassdoor

Glassdoor

Company reviews, ratings and salary insights.

base /glassdoor/v110 endpoints
post/glassdoor/v1/employer/search1 credit

Resolve a company name to its Glassdoor employer_id + basic profile. Start here — every other action needs the employer_id.

ParameterAllowed / rangeDescription
queryrequiredCompany name to look up.
Try in playground →
post/glassdoor/v1/employer/detail1 credit

Employer profile + ratings.

ParameterAllowed / rangeDescription
employer_idrequiredGlassdoor employer ID. Don't know it? Call employer/search with the company name first — it returns employer_id.
dynamic_profile_idoptionalAdvanced: Glassdoor dynamic profile ID (defaults to employer_id; only needed for employers with a separate profile).
Try in playground →
post/glassdoor/v1/employer/reviews1 credit

One page of employer reviews (rating, pros/cons, role).

ParameterAllowed / rangeDescription
employer_idrequiredGlassdoor employer ID. Don't know it? Call employer/search with the company name first — it returns employer_id.
page = 1optional1–Page number (easy paging: 1, 2, 3…).
cursoroptionalNext page: pass the previous response's meta.pagination.next_cursor (the 'Next' button does this automatically).
page_size = 10optional1–100Results per page (1–100). Above 100 Glassdoor returns an empty page.
dynamic_profile_idoptionalAdvanced: Glassdoor dynamic profile ID (defaults to employer_id; only needed for employers with a separate profile).
Try in playground →
post/glassdoor/v1/employer/reviews-harvest1 credit

Fetch all available Glassdoor reviews across multiple pages — returns every unique review with rating, pros/cons and role.

ParameterAllowed / rangeDescription
employer_idrequiredGlassdoor employer ID. Don't know it? Call employer/search with the company name first — it returns employer_id.
page_size = 10optional1–100Results per page (1–100). Above 100 Glassdoor returns an empty page.
max_pagesoptional1–Stop the harvest after this many pages (default: run until complete).
dynamic_profile_idoptionalAdvanced: Glassdoor dynamic profile ID (defaults to employer_id; only needed for employers with a separate profile).
Try in playground →
post/glassdoor/v1/employer/interviews1 credit

One page of interview reports (questions, difficulty, outcome).

ParameterAllowed / rangeDescription
employer_idrequiredGlassdoor employer ID. Don't know it? Call employer/search with the company name first — it returns employer_id.
page = 1optional1–Page number (easy paging: 1, 2, 3…).
cursoroptionalNext page: pass the previous response's meta.pagination.next_cursor (the 'Next' button does this automatically).
items_per_page = 10optional1–100Interview reports per page (1–100).
dynamic_profile_idoptionalAdvanced: Glassdoor dynamic profile ID (defaults to employer_id; only needed for employers with a separate profile).
Try in playground →
post/glassdoor/v1/employer/interviews-harvest1 credit

Fetch all available Glassdoor interview reports across multiple pages.

ParameterAllowed / rangeDescription
employer_idrequiredGlassdoor employer ID. Don't know it? Call employer/search with the company name first — it returns employer_id.
items_per_page = 10optional1–100Interview reports per page (1–100).
max_pagesoptional1–Stop the harvest after this many pages (default: run until complete).
dynamic_profile_idoptionalAdvanced: Glassdoor dynamic profile ID (defaults to employer_id; only needed for employers with a separate profile).
Try in playground →
post/glassdoor/v1/employer/jobs1 credit

Employer job listings (one page; cursor pagination).

ParameterAllowed / rangeDescription
employer_idrequiredGlassdoor employer ID. Don't know it? Call employer/search with the company name first — it returns employer_id.
page = 1optional1–Page number (easy paging: 1, 2, 3…).
cursoroptionalNext page: pass the previous response's meta.pagination.next_cursor (the 'Next' button does this automatically).
page_size = 30optional1–100Jobs per page (1–100).
page_cursoroptionalAdvanced: raw Glassdoor pagination cursor. Prefer `cursor`.
Try in playground →
post/glassdoor/v1/employer/jobs-harvest1 credit

Fetch all available Glassdoor job listings across multiple pages.

ParameterAllowed / rangeDescription
employer_idrequiredGlassdoor employer ID. Don't know it? Call employer/search with the company name first — it returns employer_id.
page_size = 30optional1–100Jobs per page (1–100).
max_pagesoptional1–Stop the harvest after this many pages (default: run until complete).
dynamic_profile_idoptionalAdvanced: Glassdoor dynamic profile ID (defaults to employer_id; only needed for employers with a separate profile).
Try in playground →
post/glassdoor/v1/employer/salaries1 credit

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).

ParameterAllowed / rangeDescription
employer_idrequiredGlassdoor employer ID. Don't know it? Call employer/search with the company name first — it returns employer_id.
job_titleoptionalOptional: filter salary estimates to job titles matching this text (e.g. 'engineer', 'product manager'). Omit for all titles.
page = 1optional1–Page number (easy paging: 1, 2, 3…).
cursoroptionalNext page: pass the previous response's meta.pagination.next_cursor (the 'Next' button does this automatically).
page_size = 20optional1–100Job titles per page (1–100).
pay_period = ANNUALoptionalPay period for the estimates: ANNUAL (yearly) or HOURLY.
Try in playground →
post/glassdoor/v1/employer/salaries-harvest1 credit

Fetch salary estimates for all job titles at this employer across multiple pages — every title with its full pay distribution.

ParameterAllowed / rangeDescription
employer_idrequiredGlassdoor employer ID. Don't know it? Call employer/search with the company name first — it returns employer_id.
job_titleoptionalOptional: filter salary estimates to job titles matching this text (e.g. 'engineer', 'product manager'). Omit for all titles.
page_size = 20optional1–100Job titles per page (1–100).
pay_period = ANNUALoptionalPay period for the estimates: ANNUAL (yearly) or HOURLY.
max_pagesoptional1–Stop the harvest after this many pages (default: run until complete).
Try in playground →