Indeed Jobs Scraper - Salary & Job Monitoring
Pricing
from $4.00 / 1,000 indeed job listings
Indeed Jobs Scraper - Salary & Job Monitoring
Scrape Indeed jobs by keyword, location, or search URL. Export salaries, full descriptions, company data, and apply links to JSON or CSV. Monitor new jobs with deduplication and clear result limits.
Pricing
from $4.00 / 1,000 indeed job listings
Rating
2.2
(2)
Developer
Newbs
Maintained by CommunityActor stats
14
Bookmarked
450
Total users
2
Monthly active users
8 days ago
Last modified
Categories
Share
Indeed Jobs Scraper turns job searches into structured data for recruiting, job boards, and salary research. Search by keyword and location or paste an Indeed search URL. Get titles, salaries, companies, full descriptions, benefits, and apply links as JSON, CSV, or Excel, without an Indeed login.
Use standard for descriptions and recruiting data, basic for smaller payloads, or full for available company enrichment. Schedule a Task with onlyNewJobs to collect newly discovered listings. There are 60+ selectable country markets; source availability and field coverage vary by market.
Quick start
{"keyword": "software engineer","country": "united states","city": "Austin, TX","numberOfResults": 25,"maxResultsTotal": 25,"postedWithinDays": 0,"dataDepth": "standard"}
- Click Try for free, enter a job title, choose a country, and optionally add a city.
- Start with 25 results and standard data depth. Keep the date filter at
0for the widest coverage. - Click Start. When the run finishes, open Jobs and export JSON, CSV, or Excel. Open Run summary if fewer jobs were returned than requested.
The job array remains supported for multiple keywords and existing API integrations. A result count is a maximum: Indeed may expose fewer matching jobs.
Why use this Indeed jobs API?
- Fast API-first collection: keyword searches use Indeed's structured job response rather than loading every listing in a browser.
- Useful salary fields: original salary text, pay period, currency, estimated-pay flag, minimum, maximum, and annualized compensation.
- Recruiting-ready data: benefits, skills, work arrangement, experience level, job type, full description, company profile, and direct application URL.
- Precise location data: formatted and split city/state fields, latitude, longitude, requested location, and radius provenance.
- Predictable limits: set both results per search and a hard maximum across the complete run.
- Monitoring mode: return only jobs that were not seen by the same recurring search during the selected retention window.
- Clean exports: choose complete nested JSON or flat spreadsheet-friendly columns.
- Operational diagnostics: every run writes an
OUTPUTsummary with results, scanned rows, filters, duplicates, failures, and limit status.
Tested on Apify
Hosted checks on September 15, 2026 returned 100 unique jobs out of 100 requested for software engineer in Austin, TX, and 25 unique companies out of 25 requested with uniqueCompanies: true. The runs took about 11 seconds and 6 seconds respectively. Both standard-mode datasets had titles, companies, locations, and descriptions on every row. These are individual smoke tests, not guaranteed speeds or coverage for other searches.
Additional checks covered a France search with flat output and concurrent searches with result and spending caps.
Choose the data depth
| Mode | Best for | Included data |
|---|---|---|
basic | High-volume feeds and fast monitoring | Title, company, location, coordinates, date, salary, attributes, and apply URL |
standard | Recruiting and job-market analysis | Basic fields plus full description, benefits, skills, and public emails |
full | Company leads and enriched datasets | Standard fields plus employer website, industry, size, revenue, locations, CEO, and images |
Existing integrations that omit dataDepth keep the previous full-data behavior. The Store form recommends standard for a better speed-to-detail balance.
Search options
| Input | Description |
|---|---|
keyword | One role, skill, company, or Indeed search expression |
job | Additional keywords; retained for backward compatibility |
startUrls | Indeed search URLs or direct job URLs |
jobKeys | jk identifiers from direct Indeed job URLs |
country / city | Hiring market and optional city, state, region, or postal code |
numberOfResults | Maximum accepted jobs for each search |
maxResultsTotal | Hard result cap across all searches; 0 disables the global cap |
postedWithinDays | Freshness filter; 0 includes all available dates |
remoteMode | Any, remote, hybrid, or on-site |
jobTypes | Full-time, part-time, contract, temporary, internship, and more |
requireSalary | Return only jobs with exposed compensation |
minimumAnnualSalary | Filter using annualized compensation in the market currency |
experienceLevel | Entry, mid, or senior heuristic classification |
Indeed search URLs preserve their keyword, location, radius, freshness, and sort settings. Direct job URLs are best effort because individual job pages can require verification; keyword and search-URL collection remains the recommended high-reliability path.
Indeed search expressions
Indeed accepts useful expressions in keyword. Validate important expressions with a small run before scaling them.
"data engineer"title:("senior data engineer") -interntitle:("data engineer" or "data scientist")company:Google
Output fields
Each nested result has schemaVersion: "2.0" and can include:
title,subTitle,jobKey,jobDate,jobType,workArrangement, andexperienceLevelformattedLocationplus city, state, postal code, country, latitude, and longitudesalarywith original, parsed, currency, estimated, and annualized valuesbenefits,skills,attributes,emails, and full text/HTML descriptionsindeedJobLinkandapplicationInfo.externalApplyUrl- company profile, review URL, website, industry, employee count, revenue, locations, CEO, logo, and description
searchQuery,source, and optionaldataQualitymetadata
Set outputFormat to flat for top-level fields such as companyName, salaryMin, latitude, externalApplyUrl, and completenessScore.
Abbreviated example (illustrative values; optional fields depend on the listing):
{"schemaVersion": "2.0","title": "Software Engineer","subTitle": "Example Company","jobKey": "example-job-key","formattedLocation": "Austin, TX","salary": {"salaryMin": 120000,"salaryMax": 150000,"salaryType": "year","currency": "USD"},"jobDescription": "Build and maintain software services.","applicationInfo": { "externalApplyUrl": "https://example.com/careers" }}
Incremental job monitoring
Use onlyNewJobs: true in a scheduled Task to skip jobs already returned by the same search configuration. The Actor stores job keys in a dedicated named key-value store and automatically removes entries older than seenJobTtlDays.
{"keyword": "data engineer","country": "united states","city": "Remote","postedWithinDays": 7,"sortType": "date","onlyNewJobs": true,"seenJobTtlDays": 30,"maxResultsTotal": 100}
Use a custom incrementalStoreName when multiple Tasks should intentionally share monitoring state. Otherwise, the Actor isolates state using a fingerprint of the search configuration.
Pricing
The Pricing tab shows the price that applies to your run. The already scheduled price from September 15, 2026, 13:46 UTC is $4 per 1,000 saved jobs + $0.005 per run start. Until that time, the previous tiered rates apply. Platform usage is included.
At the scheduled rate, 25 saved jobs cost $0.105, 100 cost $0.405, and 1,000 cost $4.005, including one start event. A search with no saved jobs still incurs the start event.
Empty searches, filtered jobs, previously seen jobs, and duplicates do not create billable result events. Use Apify's maximum charge per run together with maxResultsTotal for strict spending control.
API and automation
# Set APIFY_TOKEN to your Apify API token in your environment.# This small synchronous example waits for completion and returns dataset rows.curl --fail-with-body --request POST \"https://api.apify.com/v2/acts/newbs~indeed-job-scraper/run-sync-get-dataset-items?format=json&clean=true&maxTotalChargeUsd=1" \--header "Authorization: Bearer $APIFY_TOKEN" \--header "Content-Type: application/json" \--data '{"keyword":"software engineer","country":"united states","city":"Austin, TX","numberOfResults":25,"maxResultsTotal":25,"dataDepth":"standard"}'
For larger collections, start asynchronously with POST /v2/acts/newbs~indeed-job-scraper/runs, poll GET /v2/actor-runs/{id} until it finishes, and fetch GET /v2/datasets/{defaultDatasetId}/items. The run's output links point to the jobs and diagnostics.
Save common configurations as Apify Tasks, schedule them, and connect successful runs to webhooks, Make, Zapier, n8n, a database, or a spreadsheet. The Actor can also be called through Apify's MCP integration for AI-agent workflows.
Reliability and diagnostics
The Actor distinguishes a valid empty search from a source failure:
SUCCEEDED: jobs were saved.EMPTY: Indeed returned no source jobs.FILTERED: source jobs were found but none matched the filters.UNCHANGED: every matched job was already returned by the same incremental monitor.MAX_RESULTS_REACHED: the configured global result cap stopped additional searches.CHARGE_LIMIT_REACHED: Apify's spending limit stopped additional results.PARTIAL: some jobs were saved before a later source request failed; inspect the error before using the run as a complete feed.FAILED: the source request did not complete.
Check the OUTPUT record in the run's default key-value store for request-level details. Restrictive combinations can require scanning more source jobs; the Actor chooses a page size at the start and keeps it fixed for valid pagination while respecting the scan cap.
Get more matching jobs
- Leave
postedWithinDaysat0, widen the city radius, or omitcityfor a country-wide search. - Use several related keywords in
job, or add separate city searches instartUrls.numberOfResultsapplies per search;maxResultsTotalcaps the full run. - Start without salary, experience, or remote-only filters. Add filters after checking the source coverage.
- Duplicates and previously seen jobs are skipped during collection, so the Actor can continue looking for replacements within its scan budget.
- Each search scans at most five times its requested count, up to 1,000 source jobs and ten pages. Splitting relevant searches across cities or keywords can expand coverage. The Actor cannot guarantee all jobs on Indeed.
Frequently asked questions
Why are salary, benefits, or company fields empty?
Indeed does not expose every field for every listing. Missing data stays empty. basic omits full descriptions; use standard or full when you need them. Public emails and external application links are included only when present in the source.
Can I export jobs to a spreadsheet or automate a daily feed?
Yes. Use outputFormat: "flat" for spreadsheet columns, then export CSV or Excel. Save an Apify Task and add a schedule for recurring collection. Use onlyNewJobs: true to suppress previously returned jobs.
Why did my run return fewer jobs than requested?
Check Run summary. SOURCE_EXHAUSTED means Indeed supplied no more pages; SCAN_LIMIT or PAGE_LIMIT means the bounded scan ended; RESULT_LIMIT or RUN_LIMIT means your result or spending cap was reached. Filters, duplicate listings, and location coverage also affect the count. REPEATED_CURSOR means Indeed repeated a page cursor and collection stopped to avoid wasting requests.
How do I report a problem?
Open an Actor issue with the run ID, search input with credentials removed, expected result, and Run summary. Sharing the run for debugging helps reproduce source failures.
Responsible use
This Actor extracts publicly available job-posting data. Results can contain employer-provided content or public contact information. Your use must comply with applicable laws, privacy requirements, contractual obligations, and platform terms. This Actor is not affiliated with, endorsed by, or sponsored by Indeed.