Indeed Jobs Scraper
Pricing
Pay per event
Indeed Jobs Scraper
Scrape Indeed.com job search results by keyword and location — structured title, company, salary, job type, posted date, snippet, and apply URL. Multi-query fan-out with per-query fault isolation. No login, no API key required. Bulk job listings export to CSV.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
🎯 What this scrapes
Indeed is the largest single job board by search volume. Give this Actor one or more keyword + location pairs and it fans out across every query, pulls the same JSON payload Indeed's own search results page renders from, and hands back normalized job postings — structured salary, job type, posted date, and a direct apply link. No login, no API key, no scraping the rendered HTML card markup that breaks every time Indeed tweaks a class name.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real browser TLS handshakes so Indeed sees a browser, not Python. - 🌐 Apify Proxy rotation — fresh session and exit IP on every block.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Per-query fault isolation — one blocked query logs and moves on; it never aborts the other queries in the run.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, structured salary parsing, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for jobs that hit your dataset. No data, no charge.
💡 Use cases
- Recruiting and staffing pipeline seeding — bulk-pull open roles matching a client's target titles/locations.
- Job-aggregator backfill — feed a niche job board or newsletter from Indeed's index.
- Labor-market research — track posting volume, salary bands, and job-type mix over time.
- HR-tech competitive intel — see what titles and comp ranges competitors are hiring for.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
queries | array | yes | [{'keyword': 'software engineer', 'location': 'Austin, TX'}, {'keyword': 'registered nurse', 'location': 'Remote'}] | One or more {"keyword": "...", "location": "..."} pairs. Every query is scraped independently — one… |
radiusMiles | integer | no | None | Search radius around each query's location. Omitted from the request when left blank. |
datePosted | string | no | None | Maps to Indeed's fromage param. Leave blank for any time. |
jobType | string | no | None | Maps to Indeed's jt param. Leave blank for all types. |
maxResultsPerQuery | integer | no | 100 | Hard cap on emitted rows per query; also bounds pagination. |
proxyConfiguration | object | no | {'useApifyProxy': True} | Apify Proxy. No forced proxy group by default — the target's proxy-tier requirement is confirmed by a cloud recon spike… |
Example input
{"queries": [{"keyword": "software engineer","location": "Austin, TX"},{"keyword": "registered nurse","location": "Remote"}],"maxResultsPerQuery": 3,"proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
job_key | string | Indeed's internal job id from the mosaic-provider-jobcards blob. |
title | string | Posting title. |
company | string | Employer name. |
location | string | Display location text. |
salary_text | string | Raw salary string as shown on the card, verbatim. |
salary_min | number | Parsed lower bound from salary_text. |
salary_max | number | Parsed upper bound from salary_text. |
salary_currency | string | Parsed currency; defaults 'USD' when a numeric salary is present and no other symbol is detected. |
salary_period | string | One of hour/day/week/month/year, parsed from salary_text; null when unparseable. |
job_type | string | Normalized employment-type text from the card, when present. |
posted_date_text | string | Raw posted-date string as shown, e.g. 'Posted 3 days ago'. |
posted_date | string | Best-effort ISO-8601 parse of posted_date_text; null when unparseable. |
snippet | string | Short description text from the card. |
job_url | string | Canonical https://www.indeed.com/viewjob?jk=<job_key>. |
search_keyword | string | The query keyword that produced this row. |
search_location | string | The query location that produced this row. |
scraped_at | string | ISO-8601 wall-clock time this row was constructed. |
Example output
{"job_key": "a1b2c3d4e5f6g7h8","title": "Senior Backend Engineer","company": "Acme Co","location": "Austin, TX","salary_text": "$130,000 - $165,000 a year","salary_min": 130000.0,"salary_max": 165000.0,"salary_currency": "USD","salary_period": "year","job_type": "Full-time","posted_date_text": "Posted 3 days ago","posted_date": "2026-09-09T00:00:00Z","snippet": "We're looking for a Senior Backend Engineer to join our platform team...","job_url": "https://www.indeed.com/viewjob?jk=a1b2c3d4e5f6g7h8","search_keyword": "software engineer","search_location": "Austin, TX","scraped_at": "2026-09-12T12:00:00Z"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
job-result | $0.003 | Per unique dataset item |
Example: 1 000 jobs at the rates above ≈ $3.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- US
www.indeed.comonly — other Indeed country subdomains are not covered. - Read-only public search data — no login, no applying, no resume upload.
- Full job-description body is not included; only the search-result snippet. Fetching the full
viewjobpage is a separate cost and is not part of this Actor. - Historical/removed postings are not available — only what Indeed's live search index returns at run time.
❓ FAQ
Is this legal?
We only fetch content the source makes publicly available. Respect any platform terms of service before using output commercially.
How do I export to Sheets?
After the run, click Storage → Dataset → Export and pick CSV. Google Sheets imports it directly.
Why is my run slow?
Indeed rate-limits aggressively for large pulls. The Actor backs off automatically and processes queries independently. Lower maxResultsPerQuery or trim the queries list if you're testing.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.