Indeed Jobs Scraper avatar

Indeed Jobs Scraper

Pricing

Pay per event

Go to Apify Store
Indeed Jobs Scraper

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

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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 rotationcurl-cffi impersonates 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-After honoured.
  • 🧱 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

  1. Click Try for free at the top of the page.
  2. Fill in the input form — most fields have sensible defaults.
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
queriesarrayyes[{'keyword': 'software engineer', 'location': 'Austin, TX'}, {'keyword': 'registered nurse', 'location': 'Remote'}]One or more {"keyword": "...", "location": "..."} pairs. Every query is scraped independently — one…
radiusMilesintegernoNoneSearch radius around each query's location. Omitted from the request when left blank.
datePostedstringnoNoneMaps to Indeed's fromage param. Leave blank for any time.
jobTypestringnoNoneMaps to Indeed's jt param. Leave blank for all types.
maxResultsPerQueryintegerno100Hard cap on emitted rows per query; also bounds pagination.
proxyConfigurationobjectno{'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.

FieldTypeNotes
job_keystringIndeed's internal job id from the mosaic-provider-jobcards blob.
titlestringPosting title.
companystringEmployer name.
locationstringDisplay location text.
salary_textstringRaw salary string as shown on the card, verbatim.
salary_minnumberParsed lower bound from salary_text.
salary_maxnumberParsed upper bound from salary_text.
salary_currencystringParsed currency; defaults 'USD' when a numeric salary is present and no other symbol is detected.
salary_periodstringOne of hour/day/week/month/year, parsed from salary_text; null when unparseable.
job_typestringNormalized employment-type text from the card, when present.
posted_date_textstringRaw posted-date string as shown, e.g. 'Posted 3 days ago'.
posted_datestringBest-effort ISO-8601 parse of posted_date_text; null when unparseable.
snippetstringShort description text from the card.
job_urlstringCanonical https://www.indeed.com/viewjob?jk=<job_key>.
search_keywordstringThe query keyword that produced this row.
search_locationstringThe query location that produced this row.
scraped_atstringISO-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:

EventUSDWhat it is
actor-start$0.2One-off warm-up charge per run
job-result$0.003Per 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.com only — 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 viewjob page 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.