Indeed Job Scraper avatar

Indeed Job Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Indeed Job Scraper

Indeed Job Scraper

💼 Indeed Job Scraper extracts real-time job listings from Indeed—titles, companies, locations, salaries, descriptions & links. ⚡ Automate at scale, filter by keywords & location, and export to CSV/JSON/API. 📊 Perfect for recruiting, market research, and job trend analytics. 🚀

Pricing

$19.99/month + usage

Rating

0.0

(0)

Developer

ScrapAPI

ScrapAPI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Indeed Job Scraper

The Indeed Job Scraper is a production-ready Apify actor that extracts structured job listings from public Indeed search and list pages — including titles, companies, locations, salaries, descriptions, and application links. It solves the manual, time-consuming task of collecting Indeed job postings by automating pagination, filtering, and data normalization at scale. Built for marketers, developers, recruiters, analysts, and researchers, this Indeed scraper lets you scrape Indeed jobs, apply filters for relevance, and export Indeed job listings to CSV/JSON/API for downstream analytics and pipelines.

What data / output can you get?

Below are examples of the structured fields the actor pushes to the Apify dataset for each Indeed job. Field names mirror the actual output.

Data typeDescriptionExample value
jobIdUnique job key extracted from Indeedb28e7b80d0399215
titleJob title as shown on IndeedSales Associate
normalizedTitleNormalized/standardized title from page dataSales Associate
companyNameEmployer nameAcme Corp
locationShortShort location string for quick filteringNew York, NY
postedTextRelative time posted string3 days ago
salaryTextSalary text if found (extracted or from page)$22 an hour
jobUrlDirect Indeed viewjob URLhttps://www.indeed.com/viewjob?jk=b28e7b80d0399215
job.salary.currencyParsed salary currency (when detected)USD
job.isRemoteBoolean flag for remote roles (derived)true
company.rating.scoreCompany rating score (if available)4.1
apply.applyUrlDirect or third-party apply link (if found)https://www.indeed.com/rc/clk?jk=b28e7...
location.cityCity extracted from the listingNew York

Bonus outputs include rich nested objects:

  • job: full/HTML descriptions, job types, shift and schedule, benefits, attributes, parsed salary min/max with weekly projections, hiring stats, dates, and status flags.
  • company: display name, rating count, branding (logo/header), and Indeed company page link when available.
  • sourceMeta: source “Indeed”, feedId/fccId, scrapingInfo (page/index), and ranking scores.
  • _raw: the original raw scraped object for full fidelity.

You can export results in Apify to JSON or CSV, or access them via the Apify API for integration with your pipelines.

Key features

  • ⚡ Automatic proxy fallback & resilience
    Starts clean and escalates on blocks: no proxy ➜ datacenter ➜ residential (with retries). On the Apify platform, the actor defaults to residential for reliability and then sticks with it.

  • 📦 Batch scraping & bulk automation
    Provide multiple Indeed search/list URLs at once and the actor will crawl each, follow pagination, and collect results up to your limits.

  • 🎯 Powerful filters
    Configure remote/hybrid, US experience level (entry_level, mid_level, senior_level), posting age (fromDays), sort (relevance or date), country domain, and job type.

  • 🧠 Accurate job parsing
    Captures title, company, location, salary (parsed and normalized), benefits, job descriptions (text + HTML), apply links, and more with robust DOM and script-data extraction.

  • 🔁 Deduplication & similar jobs handling
    Enable unique jobs only across URLs and choose whether to include “View similar jobs” cards.

  • 🧪 Controlled limits & pagination
    Set maxRows for total listings and maxRowsPerUrl for per-URL caps while the actor follows next-page buttons and start offsets.

  • 🧰 Developer-friendly JSON output
    Clean, predictable JSON with top-level convenience fields plus nested objects for job, company, location, apply, sourceMeta, and _raw. Ideal for APIs, ETL, and Python Indeed scraper workflows.

  • 🗺️ Global domains
    Select from multiple Indeed country domains (e.g., us, uk, ca, au, etc.) to target the right market.

How to use Indeed Job Scraper - step by step

  1. Sign in to Apify and open the Actor in the Apify Console.
  2. Choose your approach:
    • Option 1: Use Query + Filters — set countryCode, query, location, and any filters (remote, level, fromDays, sort, jobType, radius). The actor will build and add a search URL.
    • Option 2: Start URLs — paste one or more Indeed search/list URLs into urls. You can combine both options; the actor will scrape all provided URLs plus the query-built search URL.
  3. Set limits:
    • maxRows to control total listings to collect.
    • maxRowsPerUrl to cap per-URL collection.
  4. Configure output and deduplication:
    • includeSimilarJobs to include/exclude similar job cards.
    • enableUniqueJobs to deduplicate by job ID across URLs.
  5. (Optional) Configure proxyConfiguration. By default, requests go directly to Indeed with automatic fallback on blocks. On Apify platform runs, the actor defaults to residential for reliability.
  6. Click Start. The actor will navigate each URL, parse listings, follow pagination, and extract embedded job details (salary, benefits, description) when available.
  7. Monitor progress in the Log and see pushed items accumulating in the Dataset.
  8. Export results from the Dataset as JSON or CSV, or consume via the Apify API.

Pro tip: Set sort to date to push items in descending publication order. Pair with enableUniqueJobs for clean, fresh feeds in automated Indeed job scraping workflows.

Use cases

Use caseDescription
Recruiting pipeline enrichmentAggregate Indeed job postings across locations and titles to keep ATS or CRM openings fresh and de-duplicated.
Market and location analysisCompare job availability and demand by city/state or country by scraping Indeed jobs at scale with consistent fields.
Compensation benchmarkingCollect salaryText and parsed salary ranges to analyze pay distributions across roles and regions.
Job board aggregationFeed a custom job board or newsletter by exporting Indeed job listings to CSV/JSON/API on a schedule.
Academic & labor researchBuild datasets of job titles, descriptions, and benefits for trend analysis and skills taxonomy research.
Data engineering pipelinesUse the API-friendly JSON to land jobs into your warehouse or trigger ETL with Airflow, n8n, or custom scripts.

Why choose Indeed Job Scraper?

This Indeed job listings scraper is built for precision, resilience, and clean data pipelines.

  • ✅ Structured, analysis-ready output (job, company, location, apply, sourceMeta, _raw)
  • 🌍 Country-aware domains and filters (remote/hybrid, level, fromDays, sort, jobType)
  • 📈 Scales from a single search to hundreds of URLs with pagination and limits
  • 🧹 Smart deduplication and similar-jobs control for clean datasets
  • 🔐 Robust connection strategy with automatic proxy fallback and retries
  • 💻 Developer-friendly JSON suitable for APIs, Python, and automated ETL
  • 💾 Easy exports to JSON/CSV and consumption via the Apify API

Unlike brittle browser extensions or ad-hoc scripts, this Indeed job board scraper is production-ready, handles pagination and embedded details, and keeps your outputs consistent run after run.

Yes — when used responsibly. This actor is designed to extract data from publicly available Indeed pages only. Users are responsible for ensuring their usage complies with applicable laws and Indeed’s terms.

Guidelines:

  • Scrape only public pages and avoid login-protected content.
  • Comply with data protection regulations (e.g., GDPR, CCPA) and internal policies.
  • Use reasonable limits and avoid overloading the site.
  • Consult your legal team for edge cases or compliance questions.

Input parameters & output format

Example JSON input

{
"countryCode": "us",
"query": "Sales",
"location": "New York, NY",
"radius": "10",
"remote": "remote",
"level": "entry_level",
"fromDays": "7",
"sort": "date",
"jobType": "fulltime",
"urls": [
"https://www.indeed.com/jobs?q=sales&l=New+York%2C+NY"
],
"maxRows": 100,
"maxRowsPerUrl": 50,
"includeSimilarJobs": true,
"enableUniqueJobs": true,
"proxyConfiguration": {
"useApifyProxy": false
}
}

Parameters

  • countryCode (string)
    Select the Indeed country domain to scrape from. Default: "us". Required: No.

  • query (string)
    Job search keywords (e.g. job title, skills). Required when using Option 1. Default: "Sales". Required: No.

  • location (string)
    Job location for search. Leave empty for remote or use 'remote'. Default: "". Required: No.

  • maxRows (integer)
    Maximum number of jobs to scrape in total. Minimum: 1, Maximum: 1000. Default: 100. Required: No.

  • radius (string)
    Search radius from location. Allowed: "", "0", "5", "10", "15", "25", "35", "50", "100". Default: "". Required: No.

  • remote (string)
    Filter by remote or hybrid work. Allowed: "", "remote", "hybrid". Default: "". Required: No.

  • level (string)
    Experience level (US). Allowed: "", "entry_level", "mid_level", "senior_level". Default: "". Required: No.

  • fromDays (string)
    Only jobs posted in the last N days. Allowed: "0", "1", "3", "7", "14", "30". Default: "0". Required: No.

  • sort (string)
    Sort results by relevance or date. Allowed: "", "relevance", "date". Default: "relevance". Required: No.

  • jobType (string)
    Filter by employment type. Allowed: "", "fulltime", "parttime", "contract", "temporary", "internship", "volunteer", "permanent", "seasonal", "freelance". Default: "". Required: No.

  • urls (array)
    Start URLs: list of Indeed search or job list URLs. Can be used together with Option 1 (query/filters). Required: No.

  • maxRowsPerUrl (integer)
    Maximum jobs to scrape per start URL (when using Option 2). Minimum: 1, Maximum: 500. Default: 50. Required: No.

  • includeSimilarJobs (boolean)
    Include 'View similar jobs' cards in results. Default: true. Required: No.

  • enableUniqueJobs (boolean)
    Deduplicate by job ID across URLs. Default: true. Required: No.

  • proxyConfiguration (object)
    By default requests go directly to Indeed; if blocked, the actor falls back to datacenter then residential (with up to 3 retries) and sticks with residential thereafter. Prefill: {"useApifyProxy": false}. Required: No.

Example JSON output item

{
"jobId": "b28e7b80d0399215",
"title": "Sales Associate",
"normalizedTitle": "Sales Associate",
"companyName": "Acme Corp",
"locationShort": "New York, NY",
"postedText": "3 days ago",
"salaryText": "$22 an hour",
"jobUrl": "https://www.indeed.com/viewjob?jk=b28e7b80d0399215",
"job": {
"id": "b28e7b80d0399215",
"jobKey": "b28e7b80d0399215",
"title": "Sales Associate",
"displayTitle": "Sales Associate",
"normalizedTitle": "Sales Associate",
"descriptionText": "As a Sales Associate, you will...",
"descriptionHtml": "<div id=\"jobDescriptionText\">...</div>",
"jobDescription": "As a Sales Associate, you will...",
"jobDescriptionHTML": "<div id=\"jobDescriptionText\">...</div>",
"language": "en",
"locale": "en_US",
"isRemote": true,
"remoteLocation": "Remote",
"jobType": ["Full-time"],
"shiftAndSchedule": ["Day shift"],
"workingSystem": ["Remote"],
"occupation": [],
"requirements": [],
"attributes": [],
"benefits": ["Health insurance", "Paid time off"],
"salary": {
"text": "$22 an hour",
"currency": "USD",
"type": "hourly",
"min": 22,
"max": 22,
"weeklyMin": 880,
"weeklyMax": 880,
"source": "EXTRACTION"
},
"hiring": {
"urgentlyHiring": false,
"highVolumeHiring": false,
"isRepost": false,
"organicApplyStarts": null,
"numOfCandidates": null
},
"dates": {
"postedText": "3 days ago",
"formattedRelativeTime": "3 days ago",
"postedToday": false,
"datePublished": "2026-04-10",
"pubDateEpoch": 1712700000000
},
"status": {
"expired": false,
"newJob": false,
"visited": false
}
},
"company": {
"name": "Acme Corp",
"displayName": "Acme Corp",
"industry": null,
"revenue": null,
"numEmployees": null,
"foundedYear": null,
"description": null,
"briefDescription": null,
"rating": { "score": 4.1, "count": 128 },
"ceo": { "name": null, "photoUrl": null, "startDate": null },
"branding": {
"logoUrl": "https://.../logo.png",
"headerUrl": "https://.../header.jpg",
"brandColor": null,
"showJobBranding": false
},
"links": {
"corporateWebsite": null,
"careers": null,
"facebook": null,
"instagram": null,
"twitter": null,
"indeedCompanyPage": "https://www.indeed.com/cmp/Acme-Corp"
},
"emails": []
},
"location": {
"countryCode": "US",
"country": "United States",
"state": "NY",
"stateName": "New York",
"city": "New York",
"postalCode": "10001",
"streetAddress": null,
"formattedShort": "New York, NY",
"formattedLong": "New York, NY 10001",
"latitude": null,
"longitude": null
},
"apply": {
"jobUrl": "https://www.indeed.com/viewjob?jk=b28e7b80d0399215",
"applyUrl": "https://www.indeed.com/rc/clk?jk=b28e7b80d0399215",
"originalApplyUrl": "https://www.indeed.com/rc/clk?jk=b28e7b80d0399215",
"thirdPartyApplyUrl": "https://www.indeed.com/rc/clk?jk=b28e7b80d0399215",
"indeedApplyEnabled": true
},
"sourceMeta": {
"source": "Indeed",
"feedId": 123456,
"fccId": "abcdef123",
"scrapingInfo": { "page": 1, "index": 0 },
"rankingScores": { "bid": null, "bidPosition": null, "eApply": null, "eQualified": null }
},
"_raw": {
"id": "b28e7b80d0399215",
"company": "Acme Corp"
}
}

Note: Some fields may be null or empty when not present on the page (e.g., salary, benefits, coordinates). When sort is set to date, items are sorted by publication time before being pushed.

FAQ

Do I need to use a proxy?

No, you don’t have to set one. By default, requests go directly to Indeed and the actor automatically falls back to datacenter and then residential proxy if blocked. On Apify platform runs, it defaults to residential for reliability.

Can I scrape multiple Indeed URLs in one run?

Yes. Add multiple search/list pages to urls and the Indeed jobs web scraper will process each, follow pagination, and respect your maxRows and maxRowsPerUrl limits.

Does it support filtering by remote/hybrid or job level?

Yes. Use the remote parameter for remote or hybrid, and level for US experience levels (entry_level, mid_level, senior_level). You can also filter by fromDays, sort, jobType, radius, and countryCode.

How many jobs can I scrape per run?

You control this via maxRows (total cap) and maxRowsPerUrl (per-URL cap). The maximum allowed by the input schema for maxRows is 1000 per run.

What data fields are included?

Each item includes top-level fields like jobId, title, companyName, locationShort, postedText, salaryText, jobUrl, plus nested job, company, location, apply, sourceMeta, and _raw objects. Salaries are parsed into currency, type, min/max, and weekly projections when detectable.

What formats can I export to?

You can export Indeed job listings to JSON or CSV from the Apify Dataset, or pull them programmatically via the Apify API — perfect for developers building a Python Indeed scraper pipeline.

Does it deduplicate jobs?

Yes. Set enableUniqueJobs to true to deduplicate by job ID across all start URLs, ensuring a clean feed when you export Indeed job listings.

Is there a free trial?

Yes. On Apify, actors typically include trial minutes to test runs (this actor lists trial minutes in the Store). You can experiment with small batches before scaling.

Closing CTA / Final thoughts

The Indeed Job Scraper is built to automate accurate, scalable Indeed job data extraction for recruiters, analysts, and developers. With bulk URL support, robust filters, automatic proxy fallback, and structured JSON designed for APIs and ETL, it helps you analyze hiring trends, enrich pipelines, and export Indeed job listings with confidence.

Start a run in Apify Console, or integrate via the Apify API to build an automated Indeed job postings scraper workflow in your stack. Extract smarter, cleaner insights from Indeed at scale.