[Home](https://scrapfly.io/)/[Scrapers](https://scrapfly.io/scrapers)/Indeed

Job postings · salaries · company ratings · search results

# // Indeed Scraper API

Get Indeed job postings, pay ranges, company ratings and search results as clean JSON. Scrapfly handles the bot checks, so you send a URL and read the data.

- **Clone it and run it.** An open-source Indeed scraper for job pages and search results, tested against live Indeed every night.
- **Title, company, pay and job type in one request.** Read the posting data Indeed embeds in each job page, along with the full description.
 
 [Get free API key](https://scrapfly.io/register) [View GitHub scraper](https://github.com/scrapfly/scrapfly-scrapers/tree/main/indeed-scraper) [Read Unblocker docs](https://scrapfly.io/docs/scrape-api/unblocker) 

1,000 free credits. No credit card required.

 [  ](https://scrapeway.com/web-scraping-api/scrapfly) [  ](https://www.capterra.com/p/212653/Scrapfly/)  

 4.9/5 from 238 reviews 

 



 

 

 Indeed pages · illustration

 

 

 Job posting JSON**Output**

```
{
  <span class="c-str">"job_key"</span>: <span class="c-str">"5b40111f8d9e8fc5"</span>,
  <span class="c-str">"title"</span>: <span class="c-str">"Data Analyst"</span>,
  <span class="c-str">"company"</span>: <span class="c-str">"Columbia University"</span>,
  <span class="c-str">"location"</span>: <span class="c-str">"New York, NY"</span>,
  <span class="c-str">"pay"</span>: <span class="c-str">"$66,300 - $75,000 a year"</span>,
  <span class="c-str">"job_type"</span>: <span class="c-str">"Full-time"</span>,
  <span class="c-str">"rating"</span>: <span class="c-num">4.1</span>,
  <span class="c-str">"reviews"</span>: <span class="c-num">1930</span>
}
```

Printed by the Python request below[See the request ↓](#implementation)

  

What you can scrape from Indeed

Four kinds of Indeed data you can scrape with Scrapfly, no Indeed account required.

 ## // Scrape Indeed job postings

Job title, company, location, pay, job type and schedule, with the full job description and listed benefits. Key every record on the job key to match the same posting across repeat requests.

- jobKey
- jobTitle
- companyName
- formattedLocation
- salary
- jobType
- benefits
- sanitizedJobDescription

  ## // Scrape Indeed salaries

The pay range employers post, as text on the job page and as minimum, maximum and pay period on search cards. Compare yearly and hourly pay for the same role across companies and locations.

- salary
- extractedSalary.min
- extractedSalary.max
- extractedSalary.type
- salarySnippet

  ## // Scrape Indeed search results

Job cards for a keyword and location: job key, title, company, location, pay, a description snippet and posting date, plus a sponsored flag. Indeed shows the first results page to signed-out visitors, so narrow the keyword or location to reach more jobs.

- jobkey
- displayTitle
- company
- formattedLocation
- salarySnippet
- snippet
- pubDate
- sponsored

  ## // Scrape Indeed company ratings

The company name, star rating and review count Indeed shows next to each job, on job pages and search cards. Track how employers in a market are rated alongside the jobs they post.

- companyName
- companyRating
- companyReviewCount
- ratingsModel

  



Reliability

## // Get past Indeed's "Security Check" page

Indeed's Cloudflare check can answer with HTTP 403 and a "Security Check" page, and job pages can return 401 "Authenticating..." instead of the posting. Use Unblocker (formerly ASP) with residential proxies, and render job pages in a browser.

`unblocker=true`Enable Scrapfly's [Unblocker](https://scrapfly.io/products/unblocker) for Indeed's Cloudflare check.



`render_js=true`Load job pages in a browser, with `proxy_pool=residential` and `country=US` for Indeed.com.



`window._rootProps`Job data sits in the page's embedded JSON. Check for that data before parsing, so a check page never reaches your dataset.



 



Choose your tools

## // Scrapfly products for Indeed scraping

Start with the Web Scraping API, Unblocker and residential proxies. Add a job extraction model, screenshots, an unblocked browser session or a URL-list crawl as your workflow needs them. One API key covers all five products.

 ### Web Scraping API for Indeed

Fetch job and search URLs with Unblocker and residential proxies. Render job pages in a browser so the posting data loads.

Read `window._rootProps` on job pages for the posting, and the job cards script on search pages.

 

```
GET /scrape?url=https://www.indeed.com/viewjob?jk=5b40111f8d9e8fc5&unblocker=true&render_js=true&proxy_pool=residential&country=US
```

 [Explore Web Scraping API →](https://scrapfly.io/products/web-scraping-api)  ### Data Extraction API for Indeed jobs

Add `extraction_model=job_posting` for a standard job record, with no parser to write.

Get job title, company, company rating, location, salary text, employment type, posting date and description in the same schema you use for other job boards.

 

```
GET /scrape?url=https://www.indeed.com/viewjob?jk=5b40111f8d9e8fc5&unblocker=true&render_js=true&proxy_pool=residential&country=US&extraction_model=job_posting
```

 [Explore Data Extraction API →](https://scrapfly.io/products/extraction-api)  ### Screenshot API for Indeed job pages

Capture the job page with its title, company, rating, pay and job type.

Keep a dated visual record of each posting alongside your JSON.

 

```
GET /screenshot?url=https://www.indeed.com/viewjob?jk=5b40111f8d9e8fc5&country=us&capture=fullpage&format=png
```

 [Explore Screenshot API →](https://scrapfly.io/products/screenshot-api)  ### Cloud Browser API for Indeed sessions

Call the Cloud Browser Unblock API with an Indeed URL to get a hosted Chromium session that is already past the Cloudflare check.

Connect Playwright or Puppeteer to the returned `ws_url` and navigate to the job page.

 

```
POST https://browser.scrapfly.io/unblock?key=KEY {"url": "https://www.indeed.com/viewjob?jk=5b40111f8d9e8fc5", "country": "us"}
```

 [Explore Cloud Browser API →](https://scrapfly.io/products/cloud-browser-api)  ### Crawler API for lists of Indeed URLs

Submit job and search URLs as one bounded job, with Unblocker and residential proxies applied to the requests.

Ask for HTML output and parse the embedded job or search JSON after the job finishes.

- url\_list
- unblocker
- proxy\_pool
- country
- content\_formats

 [Explore Crawler API →](https://scrapfly.io/products/crawler-api)  



One request

## // Fetch an Indeed job posting and read its pay and company rating

The JSON at the top is what this code prints for a data analyst job in New York: one request, then selected fields from the page's embedded job data.

Install `scrapfly-sdk` and replace the key below. The example uses only the SDK and Python's standard library.

**Prefer the full scraper?** The open-source [Indeed scraper on GitHub](https://github.com/scrapfly/scrapfly-scrapers/tree/main/indeed-scraper) covers job pages and search results in Python 3.10. It runs against live Indeed every night. Clone it, set `SCRAPFLY_KEY`, and run `poetry run python run.py`.

 

 Python · scrapfly-sdkscrape + parse

```
<span class="c-key">import</span> json, re
<span class="c-key">from</span> scrapfly <span class="c-key">import</span> ScrapeConfig, ScrapflyClient

client = ScrapflyClient(key=<span class="c-str">"YOUR_SCRAPFLY_KEY"</span>)
result = client.scrape(ScrapeConfig(
    <span class="c-str">"https://www.indeed.com/viewjob?jk=5b40111f8d9e8fc5"</span>,
    unblocker=<span class="c-key">True</span>, render_js=<span class="c-key">True</span>,
    proxy_pool=<span class="c-str">"residential"</span>, country=<span class="c-str">"US"</span>,
))
start = re.search(<span class="c-str">r"window\._rootProps\s*=\s*"</span>, result.content)
<span class="c-key">if</span> start <span class="c-key">is</span> <span class="c-key">None</span>:
    <span class="c-key">raise</span> RuntimeError(<span class="c-str">"Indeed returned no job data"</span>)
props, _ = json.JSONDecoder().raw_decode(result.content, start.end())
job = props[<span class="c-str">"preloadedVJData"</span>][<span class="c-str">"jobInfoWrapperModel"</span>][<span class="c-str">"jobInfoModel"</span>]
header = job[<span class="c-str">"jobInfoHeaderModel"</span>]
summary = job[<span class="c-str">"structuredDataJobSummaryModel"</span>]
ratings = header[<span class="c-str">"companyReviewModel"</span>][<span class="c-str">"ratingsModel"</span>]
posting = {
    <span class="c-str">"job_key"</span>: summary[<span class="c-str">"jobKey"</span>],
    <span class="c-str">"title"</span>: header[<span class="c-str">"jobTitle"</span>],
    <span class="c-str">"company"</span>: header[<span class="c-str">"companyName"</span>],
    <span class="c-str">"location"</span>: header[<span class="c-str">"formattedLocation"</span>],
    <span class="c-str">"pay"</span>: summary[<span class="c-str">"salary"</span>],
    <span class="c-str">"job_type"</span>: job[<span class="c-str">"jobMetadataHeaderModel"</span>][<span class="c-str">"jobType"</span>],
    <span class="c-str">"rating"</span>: ratings[<span class="c-str">"rating"</span>],
    <span class="c-str">"reviews"</span>: ratings[<span class="c-str">"count"</span>],
}
print(json.dumps(posting, indent=<span class="c-num">2</span>))
```

 

 



What the data is used for

## // Common Indeed scraping use cases

### Salary benchmarking

Compare posted pay ranges for a role across companies, cities and pay periods.



### Hiring trend tracking

Follow which companies post which roles in a market, keyed on the job key.



### Job aggregation

Feed job titles, companies, locations and descriptions into your own job board or alerts.



### Labor market research

Study demand for skills and job types across keywords and locations.



### Employer research

Pair each employer's open roles with its Indeed rating and review count.



### Lead generation

Find companies hiring for the roles your product or service supports.



 



Common questions

## // Indeed scraping FAQ

 Is scraping Indeed legal?There is no universal answer. Legality depends on your jurisdiction, the data, the access method and how you use the result. Keep the workflow to public job pages, avoid signed-in content, treat any recruiter or contact names as personal data, review Indeed's terms, and get legal advice for commercial use.

 Do I need an Indeed account or API key?No. These requests read public Indeed.com pages signed out. You only need a Scrapfly API key, not an Indeed account or publisher access.

 Why does Indeed return a "Security Check" page?That is Indeed's Cloudflare bot check. It answers with HTTP 403 and a "Security Check" page, and job pages can return 401 "Authenticating..." instead. Set `unblocker=true`, `proxy_pool=residential` and `country=US`, and add `render_js=true` for job pages. Check that the response contains the expected job or search JSON before parsing it.

 Can I scrape Indeed salaries?Yes, when the employer posts pay. A job page embeds the pay range as text, and search cards carry the minimum, maximum and pay period (yearly or hourly). Many postings list no pay, so expect the field to be empty on some jobs.

 Can I scrape Indeed search results?Yes. A search page for a keyword and location embeds its job cards with job key, title, company, location, pay, snippet and posting date. Indeed shows only the first results page to signed-out visitors, so split a broad search into narrower keywords or locations.

 Can I scrape full job descriptions?Yes. Each job page embeds the full description as HTML, along with the job type, schedule and listed benefits. Fetch the job page for every job key you collect from search.

 How much does scraping Indeed cost?A job or search page with Unblocker and residential proxies costs 40 to 80 credits: 25 for residential proxies, 5 for browser rendering, and 15 or 50 for getting past the Cloudflare check, the lower figure when a solved session is reused. The job extraction model adds credits; a Screenshot API capture costs 60 credits. Every account starts with 1,000 free credits.

 What are the rate limits when scraping Indeed?Scrapfly sets no Indeed-specific limit. Your maximum parallelism is the concurrency quota on your plan, or a lower cap configured for the project. Each in-flight request uses one slot until it finishes.

 



Start with one request

## Fetch the URL. Read the JSON.

Web Scraping API with Unblocker and residential proxies, one call per Indeed URL.

Proxies across 190+ countries

 [Indeed scraper on GitHub](https://github.com/scrapfly/scrapfly-scrapers/tree/main/indeed-scraper) [How to scrape Indeed](https://scrapfly.io/blog/posts/how-to-scrape-indeedcom) [All scraper pages](https://scrapfly.io/scrapers) 

 

 [Get free API key](https://scrapfly.io/register) [Read the docs](https://scrapfly.io/docs/scrape-api/unblocker)