An Indeed scraper you call over HTTP: send a search, job posting or company URL to /data and get job cards with salaries, the full job description, or a company's ratings and reviews back as JSON. No Indeed API key or partner account. Flat 25 credits per page.
2,000 free API credits · No credit card required
Send the page's normal URL to /data. The page type is detected from the URL, and the response tells you which one it was in request_parameters.type.
type: "search"
The first page of results: Indeed's total count plus every organic and sponsored job card, with company, rating, location, salary, job type, snippet and posting date.
indeed.com/jobs?q=nurse&l=Chicago, IL
indeed.com/q-python-l-remote-jobs.html
uk.indeed.com/jobs?q=…
type: "job"
Title, company, location, salary, job type, schedule, benefits, the full description (HTML and text), posting and expiry dates and how to apply.
indeed.com/viewjob?jk=JOB_KEY
indeed.com/rc/clk?jk=JOB_KEY
any search URL with vjk=JOB_KEY
type: "company"
Overview, industry, size, revenue, founded, headquarters and CEO, the overall and per-category ratings, popular salaries and job titles, and the ~5 reviews on the company page.
indeed.com/cmp/Walmart
uk.indeed.com/cmp/Tesco
/cmp/Name/reviews, /salaries, /jobs…), salary pages (/career/…/salaries), and the home page and other Indeed pages. /data still takes these URLs: as on any site without a dedicated parser, an AI model learns the page's structure (the first request for a new kind of page can take up to about 45 seconds) and returns its key values, priced per site rather than at the flat 25 credits (see the API reference). If no structured data can be found, you get a 422 that isn't charged.
No selectors, proxies, or headless browser to run. The page-scraping options (js, proxy, headers…) don't apply; country picks the proxy country (default us).
curl -G "https://api.webscraping.ai/data" \
--data-urlencode "api_key=YOUR_API_KEY" \
--data-urlencode "url=https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL"
# Response (excerpt):
# {
# "request_parameters": {"url": "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
# "provider": "indeed", "type": "search"},
# "parse_status": "ok",
# "data": {
# "query": "nurse", "location": "Chicago, IL",
# "total_results": 4120, "page": 1,
# "jobs": [
# {"job_id": "3f2a1c9e8b7d6a54", "job_title": "Registered Nurse - ICU",
# "company_name": "...", "company_rating": 3.9, "company_reviews_count": 1250,
# "location": "Chicago, IL 60611", "work_setting": null,
# "salary_formatted": "$42 - $58 an hour",
# "salary_range": {"min": 42, "max": 58, "currency": "USD", "period": "hour"},
# "job_type": "Full-time", "date_posted": "3 days ago",
# "date_posted_parsed": "2026-10-24T05:00:00.000Z", "sponsored": false,
# "url": "https://www.indeed.com/viewjob?jk=3f2a1c9e8b7d6a54", ...},
# ...
# ]
# }
# }
# pip install webscraping_ai
# https://pypi.org/project/webscraping-ai/
from webscraping_ai import Client
client = Client(api_key="YOUR_API_KEY")
result = client.data("https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL")
print(result["request_parameters"]["provider"], result["parse_status"])
print(result["data"])
# Response (excerpt):
# {
# "request_parameters": {"url": "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
# "provider": "indeed", "type": "search"},
# "parse_status": "ok",
# "data": {
# "query": "nurse", "location": "Chicago, IL",
# "total_results": 4120, "page": 1,
# "jobs": [
# {"job_id": "3f2a1c9e8b7d6a54", "job_title": "Registered Nurse - ICU",
# "company_name": "...", "company_rating": 3.9, "company_reviews_count": 1250,
# "location": "Chicago, IL 60611", "work_setting": null,
# "salary_formatted": "$42 - $58 an hour",
# "salary_range": {"min": 42, "max": 58, "currency": "USD", "period": "hour"},
# "job_type": "Full-time", "date_posted": "3 days ago",
# "date_posted_parsed": "2026-10-24T05:00:00.000Z", "sponsored": false,
# "url": "https://www.indeed.com/viewjob?jk=3f2a1c9e8b7d6a54", ...},
# ...
# ]
# }
# }
// npm install webscraping-ai
// https://www.npmjs.com/package/webscraping-ai
import { WebScrapingAI } from 'webscraping-ai';
const client = new WebScrapingAI({ apiKey: 'YOUR_API_KEY' });
const result = await client.data({ url: 'https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL' });
console.log(result.request_parameters.provider, result.parse_status);
console.log(result.data);
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
// "provider": "indeed", "type": "search"},
// "parse_status": "ok",
// "data": {
// "query": "nurse", "location": "Chicago, IL",
// "total_results": 4120, "page": 1,
// "jobs": [
// {"job_id": "3f2a1c9e8b7d6a54", "job_title": "Registered Nurse - ICU",
// "company_name": "...", "company_rating": 3.9, "company_reviews_count": 1250,
// "location": "Chicago, IL 60611", "work_setting": null,
// "salary_formatted": "$42 - $58 an hour",
// "salary_range": {"min": 42, "max": 58, "currency": "USD", "period": "hour"},
// "job_type": "Full-time", "date_posted": "3 days ago",
// "date_posted_parsed": "2026-10-24T05:00:00.000Z", "sponsored": false,
// "url": "https://www.indeed.com/viewjob?jk=3f2a1c9e8b7d6a54", ...},
// ...
// ]
// }
// }
<?php
// composer require webscraping-ai/webscraping-ai-php
// https://packagist.org/packages/webscraping-ai/webscraping-ai-php
require 'vendor/autoload.php';
use WebScrapingAI\Client;
$client = new Client('YOUR_API_KEY');
$result = $client->data(url: 'https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL');
echo $result['request_parameters']['provider'], ' ', $result['parse_status'], "\n";
print_r($result['data']);
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
// "provider": "indeed", "type": "search"},
// "parse_status": "ok",
// "data": {
// "query": "nurse", "location": "Chicago, IL",
// "total_results": 4120, "page": 1,
// "jobs": [
// {"job_id": "3f2a1c9e8b7d6a54", "job_title": "Registered Nurse - ICU",
// "company_name": "...", "company_rating": 3.9, "company_reviews_count": 1250,
// "location": "Chicago, IL 60611", "work_setting": null,
// "salary_formatted": "$42 - $58 an hour",
// "salary_range": {"min": 42, "max": 58, "currency": "USD", "period": "hour"},
// "job_type": "Full-time", "date_posted": "3 days ago",
// "date_posted_parsed": "2026-10-24T05:00:00.000Z", "sponsored": false,
// "url": "https://www.indeed.com/viewjob?jk=3f2a1c9e8b7d6a54", ...},
// ...
// ]
// }
// }
# gem install webscraping_ai
# https://rubygems.org/gems/webscraping_ai
require 'webscraping_ai'
client = WebScrapingAI::Client.new(api_key: 'YOUR_API_KEY')
result = client.data('https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL')
puts "#{result['request_parameters']['provider']} #{result['parse_status']}"
puts result['data'].inspect
# Response (excerpt):
# {
# "request_parameters": {"url": "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
# "provider": "indeed", "type": "search"},
# "parse_status": "ok",
# "data": {
# "query": "nurse", "location": "Chicago, IL",
# "total_results": 4120, "page": 1,
# "jobs": [
# {"job_id": "3f2a1c9e8b7d6a54", "job_title": "Registered Nurse - ICU",
# "company_name": "...", "company_rating": 3.9, "company_reviews_count": 1250,
# "location": "Chicago, IL 60611", "work_setting": null,
# "salary_formatted": "$42 - $58 an hour",
# "salary_range": {"min": 42, "max": 58, "currency": "USD", "period": "hour"},
# "job_type": "Full-time", "date_posted": "3 days ago",
# "date_posted_parsed": "2026-10-24T05:00:00.000Z", "sponsored": false,
# "url": "https://www.indeed.com/viewjob?jk=3f2a1c9e8b7d6a54", ...},
# ...
# ]
# }
# }
// go get github.com/webscraping-ai/webscraping-ai-go/v4
// https://pkg.go.dev/github.com/webscraping-ai/webscraping-ai-go/v4
package main
import (
"context"
"fmt"
webscrapingai "github.com/webscraping-ai/webscraping-ai-go/v4"
)
func main() {
client, _ := webscrapingai.NewClient(&webscrapingai.Config{APIKey: "YOUR_API_KEY"})
res, _ := client.Data(context.Background(), &webscrapingai.DataOptions{
URL: "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
})
fmt.Println(res.RequestParameters.Provider, res.ParseStatus)
fmt.Println(string(res.Data)) // raw JSON; its shape depends on the provider and page type
}
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
// "provider": "indeed", "type": "search"},
// "parse_status": "ok",
// "data": {
// "query": "nurse", "location": "Chicago, IL",
// "total_results": 4120, "page": 1,
// "jobs": [
// {"job_id": "3f2a1c9e8b7d6a54", "job_title": "Registered Nurse - ICU",
// "company_name": "...", "company_rating": 3.9, "company_reviews_count": 1250,
// "location": "Chicago, IL 60611", "work_setting": null,
// "salary_formatted": "$42 - $58 an hour",
// "salary_range": {"min": 42, "max": 58, "currency": "USD", "period": "hour"},
// "job_type": "Full-time", "date_posted": "3 days ago",
// "date_posted_parsed": "2026-10-24T05:00:00.000Z", "sponsored": false,
// "url": "https://www.indeed.com/viewjob?jk=3f2a1c9e8b7d6a54", ...},
// ...
// ]
// }
// }
// Maven: ai.webscraping:webscraping-ai:4.3.1
// https://central.sonatype.com/artifact/ai.webscraping/webscraping-ai
import ai.webscraping.Client;
import ai.webscraping.Config;
import ai.webscraping.option.DataOptions;
import ai.webscraping.result.DataResult;
Client client = new Client(Config.builder().apiKey("YOUR_API_KEY").build());
DataResult result = client.data(DataOptions.builder()
.url("https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL")
.build());
System.out.println(result.getRequestParameters().getProvider() + " " + result.getParseStatus());
System.out.println(result.getData());
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
// "provider": "indeed", "type": "search"},
// "parse_status": "ok",
// "data": {
// "query": "nurse", "location": "Chicago, IL",
// "total_results": 4120, "page": 1,
// "jobs": [
// {"job_id": "3f2a1c9e8b7d6a54", "job_title": "Registered Nurse - ICU",
// "company_name": "...", "company_rating": 3.9, "company_reviews_count": 1250,
// "location": "Chicago, IL 60611", "work_setting": null,
// "salary_formatted": "$42 - $58 an hour",
// "salary_range": {"min": 42, "max": 58, "currency": "USD", "period": "hour"},
// "job_type": "Full-time", "date_posted": "3 days ago",
// "date_posted_parsed": "2026-10-24T05:00:00.000Z", "sponsored": false,
// "url": "https://www.indeed.com/viewjob?jk=3f2a1c9e8b7d6a54", ...},
// ...
// ]
// }
// }
// dotnet add package WebScrapingAI
// https://www.nuget.org/packages/WebScrapingAI
using WebScrapingAI;
var client = new WebScrapingAIClient(new WebScrapingAIClientOptions { ApiKey = "YOUR_API_KEY" });
var result = await client.DataAsync(new DataRequest {
Url = "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
});
Console.WriteLine($"{result.RequestParameters.Provider} {result.ParseStatus}");
Console.WriteLine(result.Data);
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL",
// "provider": "indeed", "type": "search"},
// "parse_status": "ok",
// "data": {
// "query": "nurse", "location": "Chicago, IL",
// "total_results": 4120, "page": 1,
// "jobs": [
// {"job_id": "3f2a1c9e8b7d6a54", "job_title": "Registered Nurse - ICU",
// "company_name": "...", "company_rating": 3.9, "company_reviews_count": 1250,
// "location": "Chicago, IL 60611", "work_setting": null,
// "salary_formatted": "$42 - $58 an hour",
// "salary_range": {"min": 42, "max": 58, "currency": "USD", "period": "hour"},
// "job_type": "Full-time", "date_posted": "3 days ago",
// "date_posted_parsed": "2026-10-24T05:00:00.000Z", "sponsored": false,
// "url": "https://www.indeed.com/viewjob?jk=3f2a1c9e8b7d6a54", ...},
// ...
// ]
// }
// }
Trimmed, and the counts are illustrative — they change constantly. Fields a page doesn't expose come back as null, though some flags come back false and lists come back empty. data can be null when parse_status is parse_failed or not_found, so check it before reading fields.
Country sites work the same way (uk.indeed.com, ca.indeed.com, de.indeed.com…): unless you pass country, the request goes out through that site's own country.
The key fields per page type. Names are snake_case across every site; the full contract is in the API reference.
type: "search"| Field | What it holds |
|---|---|
query, location | The search as Indeed read it. |
total_results, page | Indeed's job count for the search; page is always 1. |
jobs | Organic and sponsored cards in Indeed's order (up to 100). Each has job_id, job_title, company_name, company_link, company_rating, company_reviews_count, location, city, state, postal_code, work_setting, salary_formatted (null when Indeed only shows its own estimate), salary_range, job_type, attributes, snippet, date_posted, date_posted_parsed, sponsored, urgently_hiring, indeed_apply, is_expired and url. |
type: "job"| Field | What it holds |
|---|---|
job_id, job_title, url, domain | The posting and the Indeed site it's on. |
company_name, company_link, company_rating, company_reviews_count, logo_url | The employer. |
location, country, work_setting | Where, and whether it's remote or hybrid. |
salary_formatted, salary_range | Indeed's salary text and {min, max, currency, period}, when the employer lists pay. |
job_type, shift_schedule, benefits | Employment type, schedule and benefit tags. |
description, description_text | The full description as HTML and as plain text. |
date_posted, date_posted_parsed, valid_through, is_expired | Relative posting date ("3 days ago"), ISO dates and the expired flag. |
indeed_apply, apply_link, source | Whether it's Apply on Indeed, Indeed's apply link, and who posted it (the employer, an agency or a job board). |
type: "company"| Field | What it holds |
|---|---|
id, company_id, name, url, logo | The company page's slug, Indeed's employer key and the basics. |
description, website, industry, sectors, company_size, revenue, founded, headquarters | The overview. |
ceo, ceo_photo_url, ceo_approval | CEO and their approval rating (%). |
overall_rating, reviews_count, rating_categories | Star rating and the five category ratings: work_life_balance, compensation_benefits, job_security_advancement, management, culture. |
happiness_score, work_happiness | Indeed's Work Wellbeing scores. |
salaries, popular_job_titles, locations | The salary, job title and location blocks the company page shows. |
reviews | The ~5 reviews on the company page: title, text, rating, job_title, location, date, current_employee. |
salaries_count, jobs_count, qa_count, reviews_url, salaries_url, jobs_url, qa_url | Counts and links for the company's tabs. |
related_companies | Similar companies with their rating and review count. |
Everything comes from what Indeed shows a logged-out visitor. That sets these limits.
start= past the first page usually fails with a 500 that isn't charged (and is charged like any page on the rare occasion it gets through). Narrow the search (location, job type, date posted) to reach more jobs.date_posted_parsed and valid_through are null; the relative date_posted usually is.jobs_count and salaries_count past 1,000 are Indeed's rounded figures ("88.4K" comes back as 88400). reviews_count and qa_count are exact.apply_link points at Indeed's apply flow, which needs an Indeed account./ai/fields extracts the fields you describe in plain language from any public page, and /html returns the rendered HTML for your own parser.
Every supported Indeed page type costs the same, with no extra charge for proxies or retries. That's about $2.90 per 1,000 pages on the $29 plan.
Indeed costs more than most /data sites (15 credits a page) because Indeed only lets residential proxies through.
| Plan | Price | Credits | Pages |
|---|---|---|---|
| Free | $0 | 2,000 | up to 80 |
| Personal | $29/mo | 250,000 | up to 10,000 |
| Plus | $99/mo | 1,000,000 | up to 40,000 |
| Startup | $249/mo | 3,000,000 | up to 120,000 |
The free plan's 2,000 credits renew monthly. All plans, including pay-as-you-go credits.
422, not charged.500, not charged.parse_status parse_failed (the page was fetched but couldn't be parsed) and not_found (the page doesn't exist) are successful requests and cost 25 credits, like ok.webscraping-ai has a data command; pass - to read URLs from stdin, one per line.
webscraping-ai data 'https://www.indeed.com/jobs?q=nurse&l=Chicago%2C+IL'Claude, Cursor and other MCP clients get a webscraping_ai_data tool from the hosted MCP server (OAuth login, no API key to paste). Ask for an Indeed page's data in plain language and the agent calls it.
The WebScraping.AI n8n node has a Get Structured Data operation: feed it URLs from a sheet or a trigger and route the JSON onward, no code.
Does Indeed have an API?
Not for reading job data. Indeed's Publisher API stopped taking new publishers in 2022, and its remaining APIs are partner programs for posting jobs to Indeed. This scraper API reads Indeed's public pages instead: you send the normal indeed.com URL and get the data as JSON, with no Indeed account or partner approval.
Can I scrape Indeed salaries?
Yes, when the employer lists pay: search cards and job postings return salary_formatted (Indeed's own text) and salary_range with min, max, currency and period. A company page also returns its popular salaries by job title. Indeed's separate salary pages (/career/…/salaries) aren't covered by the Indeed parser yet.
Does it work outside the US?
Yes. Send a URL from any Indeed country site, such as uk.indeed.com, ca.indeed.com or de.indeed.com. The request goes out through that country unless you set the country parameter yourself.
Can I get more than the first page of a search?
No. Indeed shows pages past the first only to signed-in visitors, so a search URL returns the first page, and a URL with start= past it usually fails without charge. To cover more jobs, split the search into narrower ones, for example by location or date posted.
Is there a free Indeed scraper API?
Yes, for trying it out: the free plan includes 2,000 API credits every month, which covers 80 Indeed pages at 25 credits each. No credit card is needed. Paid plans start at $29/mo for 250,000 credits, or buy pay-as-you-go credits with no subscription from a $20 top-up (100,000 credits, about 4,000 pages).
How much does the Indeed Scraper API cost?
A flat 25 credits per page, for every supported Indeed page type. On the $29/mo plan (250,000 credits) that is up to 10,000 pages, or about $2.90 per 1,000. Fetch failures return a 500 and aren't charged. Pages outside the supported Indeed page types go to the AI-learned path and are priced per site. parse_failed and not_found results are successful requests and are charged.
What happens if I send a URL the Indeed parser doesn't cover?
/data still answers it: an AI model learns the page's structure (the first request for a new kind of page can take up to about 45 seconds) and returns its key values, priced per site like any site without a dedicated parser. If no structured data can be found, you get a 422 that isn't charged; /ai/fields then extracts the fields you name, and /html returns the rendered page for your own parser.
One API key, one request format, the same response envelope.
Get started with 2,000 free API credits. No credit card required.