STRUCTURED DATA API

Indeed Scraper API

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

A column of job-listing cards with briefcase, location and salary icons passing through a scanning gate and laid out as structured data blocks beside a company building with a star rating

Scrape Indeed job searches, postings and companies

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.

Job search

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=…

Job posting

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

Company

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
The Indeed parser doesn't cover company tabs (/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.

How to scrape Indeed with one API call

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.

What the Indeed scraper returns

The key fields per page type. Names are snake_case across every site; the full contract is in the API reference.

type: "search"

FieldWhat it holds
query, locationThe search as Indeed read it.
total_results, pageIndeed's job count for the search; page is always 1.
jobsOrganic 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"

FieldWhat it holds
job_id, job_title, url, domainThe posting and the Indeed site it's on.
company_name, company_link, company_rating, company_reviews_count, logo_urlThe employer.
location, country, work_settingWhere, and whether it's remote or hybrid.
salary_formatted, salary_rangeIndeed's salary text and {min, max, currency, period}, when the employer lists pay.
job_type, shift_schedule, benefitsEmployment type, schedule and benefit tags.
description, description_textThe full description as HTML and as plain text.
date_posted, date_posted_parsed, valid_through, is_expiredRelative posting date ("3 days ago"), ISO dates and the expired flag.
indeed_apply, apply_link, sourceWhether it's Apply on Indeed, Indeed's apply link, and who posted it (the employer, an agency or a job board).

type: "company"

FieldWhat it holds
id, company_id, name, url, logoThe company page's slug, Indeed's employer key and the basics.
description, website, industry, sectors, company_size, revenue, founded, headquartersThe overview.
ceo, ceo_photo_url, ceo_approvalCEO and their approval rating (%).
overall_rating, reviews_count, rating_categoriesStar rating and the five category ratings: work_life_balance, compensation_benefits, job_security_advancement, management, culture.
happiness_score, work_happinessIndeed's Work Wellbeing scores.
salaries, popular_job_titles, locationsThe salary, job title and location blocks the company page shows.
reviewsThe ~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_urlCounts and links for the company's tabs.
related_companiesSimilar companies with their rating and review count.

What's not included

Everything comes from what Indeed shows a logged-out visitor. That sets these limits.

The first page of search results. Indeed shows later pages only to signed-in visitors, so a search returns its first page (about 15 organic jobs plus sponsored ones) and there's no next-page link. A URL with 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.
Some job dates are missing. Now and then a posting comes back through a search page instead of the job page. Then date_posted_parsed and valid_through are null; the relative date_posted usually is.
Rounded tab counts. A company's 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.
One page per company. The company page gives the overview, ratings and ~5 reviews. The full reviews, salaries, jobs and Q&A tabs aren't covered by the Indeed parser.
No applying. apply_link points at Indeed's apply flow, which needs an Indeed account.
Need a page type or site that isn't supported? /ai/fields extracts the fields you describe in plain language from any public page, and /html returns the rendered HTML for your own parser.

Flat pricing: 25 credits per page

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.

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

What's charged

No structured data found on a page the parser doesn't cover: a 422, not charged.
Page couldn't be fetched: a 500, not charged.
Charged even without data: 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.

Also from the terminal, AI agents, and n8n

CLI

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'

MCP server

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.

n8n

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.

Frequently asked questions

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.

Other sites on the same endpoint

One API key, one request format, the same response envelope.

YouTube Scraper API TikTok Scraper API Twitter (X) Scraper API LinkedIn Scraper API Instagram Scraper API Reddit Scraper API Google SERP API

Get Indeed data as JSON today

Get started with 2,000 free API credits. No credit card required.

Icon