Indeed Jobs Scraper | 18 Fields, 17 Countries, No Login avatar

Indeed Jobs Scraper | 18 Fields, 17 Countries, No Login

Pricing

from $3.00 / 1,000 job scrapeds

Go to Apify Store
Indeed Jobs Scraper | 18 Fields, 17 Countries, No Login

Indeed Jobs Scraper | 18 Fields, 17 Countries, No Login

Scrape public Indeed job listings by keyword and location: title, company, location, salary, job type, posted date, description, apply URL. No login. Pay per job.

Pricing

from $3.00 / 1,000 job scrapeds

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

61

Total users

25

Monthly active users

4 days ago

Last modified

Share

Indeed Jobs Scraper: 18 Fields, 17 Countries, No Login

💰 From $3.00 / 1,000 results.

Scrape public Indeed job listings by keyword and location with no login required: title, company, location, salary, job type, posted date, description snippet, apply URL, and 10 more fields, across 17 country sites.

What it does

Indeed's search results are public, but a plain, unproxied HTTP request into them is blocked by a PerimeterX security check backed by an interactive Cloudflare Turnstile challenge. This actor routes each request through Apify's UNBLOCKER proxy group, which clears that layer server-side (no browser needed on our end), then reads the job data straight out of the page's own embedded JavaScript model rather than scraping rendered HTML, so the fields you get back are the same ones Indeed's own front end uses internally.

Each search page is solved with a fresh proxy session, and a page is retried a few times if the first attempt gets a block/challenge response. Jobs are deduplicated by Indeed's own job key across pages, and the actor stops cleanly once a page returns no new jobs or a page can't be solved after retrying, rather than paying to keep retrying a degraded proxy pool. The first page of results is normally enough to satisfy a typical request; deeper pagination is solved less reliably and may stop early on a large maxResults.

You give it a query, an optional location, and a country. Every returned record carries the search_query and search_location that produced it, so a multi-search dataset stays attributable to what generated each row.

Input

FieldTypeRequiredDefaultDescription
querystringyes"software engineer"Job title, skill, or keyword to search for (Indeed's "what" field).
locationstringno"New York"City, state, ZIP, or "Remote" (Indeed's "where" field). Leave empty for nationwide.
countrystringno"US"Which of the 17 supported Indeed country sites to search (US, GB, CA, IN, AU, DE, FR, NL, IE, SG, NZ, ES, IT, BR, MX, ZA, AE). Sets the Indeed domain (ccTLD).
maxResultsintegerno45Maximum job listings to return. Each solved search page yields roughly 15 to 45 jobs.
proxyobjectnoUNBLOCKERIndeed hard-blocks datacenter and unproxied traffic. Apify's UNBLOCKER proxy group is required and is the default.

Example input

{
"query": "software engineer",
"location": "New York",
"country": "US",
"maxResults": 45
}

Example output

Field list and example are taken from a real run, not a mock-up.

{
"job_id": "82075119d56dbfed",
"job_url": "https://www.indeed.com/viewjob?jk=82075119d56dbfed",
"title": "Apprentice Electrician",
"company": "Huckleberry Electric",
"location": "Lynnwood, WA",
"remote": false,
"salary": "$21 - $28 an hour",
"job_type": "Full-time",
"posted": "30+ days ago",
"posted_date": "2026-06-11T05:00:00.000Z",
"description": "Want to become a highly skilled residential electrician. Assist journeyman electricians with residential service and installation projects.",
"company_rating": 4.2,
"company_review_count": 38,
"urgently_hiring": false,
"sponsored": true,
"search_query": "electrician",
"search_location": "Seattle, WA",
"scraped_at": "2026-07-27T08:55:11.044Z"
}
FieldDescription
job_idIndeed job key, unique per posting
job_urlCanonical Indeed job posting URL
titleJob title
companyCompany name
locationJob location
remoteWhether the job is flagged remote
salarySalary text exactly as Indeed shows it
job_typeEmployment type: Full-time, Part-time, Contract, and so on
postedRelative posting time, e.g. "3 days ago"
posted_dateAbsolute posting date as an ISO timestamp, when Indeed provides it
descriptionJob description snippet, plain text
company_ratingCompany star rating on Indeed, when shown
company_review_countNumber of company reviews on Indeed, when shown
urgently_hiringIndeed's "Urgently hiring" flag
sponsoredWhether the listing is a sponsored result
search_queryThe query this job was found under
search_locationThe location this job was found under
scraped_atISO timestamp when this record was captured

Use cases

Recruitment market mapping. Run the same query weekly across cities to see who's hiring, at what salary, and how fast postings turn over.

Compensation benchmarking. The salary string is captured verbatim as Indeed shows it, so you can band roles by title and location without running a survey.

Competitor headcount signals. Track a named company's postings over time as a leading indicator of expansion or a new team standing up.

Lead generation for staffing agencies. Companies posting urgently_hiring roles are in-market right now, not just browsing.

Job-board aggregation. Feed a niche board or newsletter with fresh, structured listings instead of scraping an RSS feed.

Labour-market research. Quantify remote versus on-site mix by filtering the remote boolean across a set of queries and locations.

Do I need an Indeed account or API key?

No. The actor reads publicly visible search results. There's no login step and you never supply credentials.

Which countries are supported?

Set country to one of the 17 supported Indeed sites: US, GB, CA, IN, AU, DE, FR, NL, IE, SG, NZ, ES, IT, BR, MX, ZA, or AE. location is passed through as typed, so it accepts anything the site's own location box accepts.

Why is salary a string rather than a number?

Because Indeed publishes it as a string and the shape varies: hourly ranges, annual ranges, "From £X", or nothing at all. Parsing it to a number would force a guess and quietly lose the unit, so the field is preserved exactly as displayed and left for you to parse against your own rules.

How current are the results?

They're fetched live at run time. posted keeps Indeed's own relative wording, and posted_date gives you a sortable ISO timestamp derived from it when Indeed provides one.

What does it cost?

Pay per event: $0.0048 per job delivered on the base rate, down to $0.003 per job on Gold-tier Apify plans and above. Billing fires only after a record is validated and stored, so a blocked page, an empty search, or a duplicate is never charged.

What a run with no results costs

Every run is charged one Actor Start event of $0.00005, including a run that returns nothing. The per-result charge is separate and genuinely does not fire on an empty, blocked or duplicate result, so a run that finds nothing costs $0.00005 and no more.

Use in Claude, ChatGPT & any MCP agent

https://mcp.apify.com/?tools=themineworks/indeed-scraper

Or call it programmatically with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/indeed-scraper').call({
query: 'software engineer',
location: 'New York',
country: 'US',
maxResults: 45,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

This actor collects only publicly available information, the same data any visitor can see without logging in. It doesn't access private or authenticated areas, doesn't attempt to bypass paywalls, and collects no personal data beyond what the source already publishes openly. You're responsible for using the output in line with the source site's terms and the data protection law that applies to you.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page or reach out through the Apify profile.