Glassdoor APIglassdoor.com ↗
Search Glassdoor job listings by keyword, location, and filters. Get full job details including pay estimates, skills, employer info, and more.
What is the Glassdoor API?
The Glassdoor API covers job listing data across two endpoints: search_jobs and get_job_details. Search returns up to 50 listing summaries per page — including job title, employer name, pay estimate with source, extracted skills, and posting age — filtered by job type, employer rating, remote options, and days posted. The detail endpoint returns the full record for a single listing, including an HTML job description, employer profile fields, location coordinates, and education or experience requirements.
curl -X GET 'https://api.parse.bot/scraper/f4f34fc3-2298-4057-b2c0-35f749ea7ca9/search_jobs?keyword=software+engineer&page_size=5&remote_only=true&location=New+York%2C+NY' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace glassdoor-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Glassdoor Jobs SDK — search listings, drill into details."""
from parse_apis.glassdoor_com_api import Glassdoor, DaysPosted, JobType, UpstreamError
client = Glassdoor()
# Search for recent full-time software engineer jobs, capped at 5 results.
for summary in client.job_summaries.search(
keyword="software engineer",
job_type=JobType.FULL_TIME,
days_posted=DaysPosted.LAST_WEEK,
limit=5,
):
pay = f"${summary.pay_estimate.p50:,.0f}/{summary.pay_period}" if summary.pay_estimate and summary.pay_period else "n/a"
print(f"{summary.title} @ {summary.employer_name} — {summary.location} ({pay})")
# Drill into the first hit for the full description and employer info.
hit = client.job_summaries.search(
keyword="data scientist",
remote_only=True,
limit=1,
).first()
if hit is not None:
try:
job = hit.details()
print(f"\n{job.title}")
print(f" Location : {job.location}")
print(f" Expired : {job.expired}")
print(f" Skills : {', '.join(job.skills[:5])}")
if job.employer and job.employer.name:
emp = job.employer
print(f" Employer : {emp.name} ({emp.size}) — rating {emp.rating}")
if emp.ratings.overall_rating is not None:
print(f" Culture : {emp.ratings.culture_and_values_rating}")
except UpstreamError as e:
# Unknown or removed listing ids cause a site-level server error.
print(f"Could not fetch details: {e.message}")
print("\nexercised: job_summaries.search / details / jobs.get (via details)")
Searches Glassdoor job listings for a keyword in a location and returns one page of listing summaries (title, employer, location, posting age, pay estimate with its source, skills, snippet, link). The free-text location is resolved to the first matching Glassdoor city, state or country; when it matches nothing the result is an empty page with location null. Pagination is cursor-based and forward-only through the site's own cursors: page 1 needs no cursor; to fetch a later page pass page_number together with the matching cursor from the previous response (next_page_cursor/next_page_number for the immediate next page, or any entry of pagination_cursors). A page_number above 1 without page_cursor is rejected. page_size is clamped to 1-50 (site default 30). total_jobs_count is the count the site reports for the search; for some filtered searches the site returns fewer listings than that count and no further cursors, so treat next_page_cursor null as the end of accessible results. Each call makes two upstream requests (location lookup plus search). A nonexistent keyword yields total_jobs_count 0 and an empty jobs array.
| Param | Type | Description |
|---|---|---|
| keywordrequired | string | Job title or search phrase, e.g. one shape: software engineer. |
| job_type | string | Employment type filter. Omitted = all types. |
| location | string | Free-text city, state or country as typed on the site (e.g. one shape: New York, NY). The first Glassdoor match is used; the resolved place is echoed in the response location object. |
| page_size | integer | Listings per page; clamped to 1-50. |
| min_rating | string | Minimum employer overall rating. Omitted = any rating. |
| days_posted | string | Only listings posted within this many days. Omitted = any time. |
| page_cursor | string | Opaque continuation cursor for page_number, copied unchanged from next_page_cursor or pagination_cursors[*].cursor of a previous response with the same search inputs. |
| page_number | integer | Result page to return. Values above 1 require page_cursor. |
| remote_only | boolean | true restricts results to remote / work-from-home listings. |
| radius_miles | string | Search radius around the location in miles. Omitted = site default (25). |
| easy_apply_only | boolean | true restricts results to listings with Glassdoor Easy Apply. |
{
"type": "object",
"fields": {
"jobs": "array of listing summaries: job_listing_id (string, input for get_job_details), title, employer_name, employer_id (string or null), employer_rating (number or null), location, age_in_days (integer), easy_apply, is_sponsored, pay_currency, pay_period (ANNUAL|HOURLY or null), pay_estimate ({p10,p50,p90} numbers or null), salary_source (EMPLOYER_PROVIDED|ESTIMATED or null), description_snippet, skills (array of strings), normalized_title, job_url, logo_url (or null)",
"keyword": "echo of the searched keyword",
"location": "resolved place: location_id, name, long_name, type (CITY|STATE|COUNTRY), country; null when the location text matched nothing",
"page_size": "integer effective page size after clamping",
"page_number": "integer page returned",
"next_page_cursor": "opaque cursor for next_page_number, or null",
"next_page_number": "integer page number of the next page, or null when no continuation is offered",
"total_jobs_count": "integer count the site reports for the search (may exceed the accessible listings)",
"pagination_cursors": "array of {page_number, cursor} continuations the site offers from this page"
},
"sample": {
"data": {
"jobs": [
{
"title": "Member of Technical Staff (Software Engineer, Computer Growth)",
"skills": [
"Android",
"SQL",
"Python"
],
"job_url": "https://www.glassdoor.com/job-listing/member-of-technical-staff-software-engineer-computer-growth-perplexity-ai-JV_IC1132348_KO0,59_KE60,73.htm?jl=1010158130702",
"location": "New York, NY",
"logo_url": "https://media.glassdoor.com/sql/8515634/perplexity-ai-squareLogo-1706133200580.png",
"easy_apply": false,
"pay_period": "ANNUAL",
"age_in_days": 111,
"employer_id": "8515634",
"is_sponsored": false,
"pay_currency": "USD",
"pay_estimate": {
"p10": 220000,
"p50": 312500,
"p90": 405000
},
"employer_name": "Perplexity AI",
"salary_source": "EMPLOYER_PROVIDED",
"job_listing_id": "1010158130702",
"employer_rating": 4.6,
"normalized_title": "software engineer",
"description_snippet": "Design, build, and own growth surfaces across the full funnel…"
}
],
"keyword": "software engineer",
"location": {
"name": "New York, NY",
"type": "CITY",
"country": "United States",
"long_name": "New York, NY (US)",
"location_id": "1132348"
},
"page_size": 30,
"page_number": 1,
"next_page_cursor": "AB4AAYEAHgAAAAAAAAAAAAAAAmRPGCgASAEBAQhMoeO+8zPXht6riRw/uFhaSyszpUhWy0KFoPCAbY97Gd2Eixi9HYGT/fyN+lGg/zCJj7imM2A8bHxkzfkG2ZLLJgB7bAAA",
"next_page_number": 2,
"total_jobs_count": 3571,
"pagination_cursors": [
{
"cursor": "AB4AAYEAHgAAAAAAAAAAAAAAAmRPGCgASAEBAQhMoeO+8zPXht6riRw/uFhaSyszpUhWy0KFoPCAbY97Gd2Eixi9HYGT/fyN+lGg/zCJj7imM2A8bHxkzfkG2ZLLJgB7bAAA",
"page_number": 2
}
]
},
"status": "success"
}
}About the Glassdoor API
Search Endpoint
The search_jobs endpoint accepts a keyword string and an optional free-text location (e.g. New York, NY or Germany). Glassdoor resolves the location text to its first matching place, returning a location object with location_id, name, long_name, type (CITY, STATE, or COUNTRY), and country. Results come back as an array of job summaries under jobs, each carrying a job_listing_id you pass to the detail endpoint, plus title, employer_name, employer_id, a pay estimate with its stated source, a text snippet, extracted skills, and a direct job_url.
Filters and Pagination
You can narrow results with job_type (employment type), days_posted (age cap in days), min_rating (minimum employer overall star rating), and page_size (1–50, clamped). Pagination uses an opaque cursor: the response includes next_page_cursor, next_page_number, and a pagination_cursors array of {page_number, cursor} pairs. Pages beyond the first require the page_cursor copied from the previous response. The total_jobs_count field reflects the count Glassdoor reports for the query, which may exceed the number of listings actually accessible through pagination.
Job Detail Endpoint
get_job_details takes a job_listing_id from a search result and returns the full listing record. Key fields include an HTML description, job_types array, pay_period (ANNUAL, HOURLY, or null), easy_apply boolean, expired boolean, location display name, and arrays for skills, education, and experience labels. The employer object adds size, headquarters, industry, sector, type, revenue, rating, logo_url, and website — data not present in search summaries.
The Glassdoor API is a managed, monitored endpoint for glassdoor.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when glassdoor.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official glassdoor.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate job postings by keyword and location to track hiring demand across cities or regions using
search_jobs. - Build a salary intelligence tool using the
pay_periodand pay estimate fields returned byget_job_details. - Filter listings to only remote or Easy Apply jobs and surface them in a specialized job board using
easy_applyand job-type filters. - Track employer hiring activity over time by querying
search_jobswithdays_postedand monitoringemployer_idfrequency. - Extract required skills and education from job descriptions using the
skillsandeducationarrays inget_job_details. - Monitor how long a specific listing has been active by comparing
posting_ageanddiscovery_datefrom the detail endpoint. - Enrich a company profile with live job count and employer metadata (industry, sector, revenue, headquarters) from the
employerobject.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Glassdoor have an official developer API?+
What does the `location` object in `search_jobs` tell me, and what happens if my location string doesn't match?+
location input to the first matching place in its index and returns a location object with location_id, name, long_name, type (CITY, STATE, or COUNTRY), and country. If the input text matches nothing, the location field comes back as null and the search proceeds without a geographic filter.How does cursor-based pagination work, and why might `total_jobs_count` be misleading?+
next_page_cursor and a pagination_cursors array. To fetch page 2 or beyond, pass the cursor from the previous response as page_cursor along with the target page_number. The total_jobs_count reflects the count Glassdoor reports for the query, but the actual number of pages you can navigate may be lower — Glassdoor limits deep pagination on its own site.Does the API return company reviews, interview data, or salary reports from Glassdoor?+
search_jobs and per-listing details via get_job_details, including employer metadata like rating, industry, and revenue. Company reviews, interview questions, and standalone salary reports are not included. You can fork this API on Parse and revise it to add an endpoint targeting that data.Is the full job description text available, and in what format?+
get_job_details endpoint returns a description field containing the full job description as HTML. The search_jobs endpoint returns only a short text snippet per listing, not the full description.