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 postings from Indeed — titles, companies, locations, salaries, descriptions & links. ⚙️ Filters by keyword, location, date, remote. 📦 Exports CSV/JSON & API-ready. 🚀 Perfect for recruiters, HR, analysts & market research.

Pricing

$19.99/month + usage

Rating

0.0

(0)

Developer

ScraperForge

ScraperForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 days ago

Last modified

Share

Indeed Job Scraper

The Indeed Job Scraper is an Apify actor that extracts real-time job listings from Indeed — including titles, companies, locations, salaries, descriptions, and apply links — from search and list result pages. It solves the tedious, error-prone process of gathering job data at scale by offering a production-ready Indeed job postings scraper with pagination, filtering, and deduplication built in. Designed for recruiters, HR teams, data analysts, developers, and researchers, this Indeed job data extraction tool lets you scrape Indeed jobs across countries with flexible filters and export clean, structured records to CSV/JSON or via API. Use it as a reliable Indeed jobs API alternative for automated pipelines, whether you’re a marketer tracking trends or a developer wiring a Python workflow.

What data / output can you get?

Each dataset item is one job with a flat summary and rich nested objects. Here are key fields you’ll receive:

Data fieldDescriptionExample value
jobIdUnique Indeed job key used for deduplication and linking“b28e7b80d0399215”
titleJob title as shown on the card/pane“Sales Associate”
normalizedTitleNormalized title when available“Sales Associate”
companyNameEmployer name“Acme Corp”
locationShortShort, formatted location string“New York, NY”
postedTextRelative posting time text“3 days ago”
salaryTextSalary text detected on page or in description“$20 an hour”
jobUrlCanonical Indeed job URLhttps://www.indeed.com/viewjob?jk=b28e7b80d0399215”
company.rating.scoreEmployer rating score4.1
location.cityCity parsed or resolved from page data“New York”
apply.originalApplyUrlOriginal/third‑party apply link when presenthttps://www.indeed.com/rc/clk?jk=…”
sourceMeta.fccIdFCC/company identifier from card or URL“123abc456”

Bonus: Each item also includes rich nested objects with comprehensive details:

  • job: titles, descriptionText/descriptionHtml, isRemote, jobType, shiftAndSchedule, workingSystem, occupation, requirements, attributes, benefits, detailed salary (currency, min/max, weeklyMin/weeklyMax), hiring insights (urgentlyHiring, highVolumeHiring, isRepost, organicApplyStarts, numOfCandidates), dates (postedToday, datePublished), status flags.
  • company: displayName, rating (score, count), branding (logo/header), and an Indeed company page link when available.
  • location: countryCode/country, state/stateName, city, postalCode, coordinates, formattedLong/Short.
  • apply: jobUrl, applyUrl, originalApplyUrl, thirdPartyApplyUrl, indeedApplyEnabled.
  • sourceMeta: source “Indeed”, feedId, fccId, scrapingInfo (page, index), rankingScores.
  • _raw: the raw scraped job object for advanced use.

Exports are accessible via Apify’s Dataset in JSON or CSV, perfect for workflows like “Indeed job scraper Python” pipelines, analytics, or downstream systems.

Key features

  • 🚦 Automatic proxy escalation & resilience
    Starts without a proxy locally and escalates connection tiers on blocks (datacenter → residential, with retries). When running on Apify, it defaults to residential for reliability and still handles fallback logic — ideal for “Indeed job scraping automation” at scale.

  • 📚 Batch scraping & pagination
    Add multiple search/list URLs and the scraper follows next-page links and start offsets to extract more jobs per URL. It also builds a search URL from your query and location so you can “extract Indeed job listings” from both inputs in one run.

  • 🎯 Precision filtering & sorting
    Filter by remote/hybrid (remote work settings), US job level (entry_level, mid_level, senior_level), recency (fromDays), sort (relevance or date), and employment type (jobType). Great for “Indeed remote jobs scraper” use cases.

  • 🔎 Rich, structured output
    Captures titles, employer meta, locations, salary ranges (with currency and min/max), benefits, schedules, and full descriptions. Each item ships with a top-level summary and deeply structured details — a reliable “Indeed web scraper for jobs” output.

  • 🧹 Deduplication across URLs
    Enable unique jobs only to deduplicate by job ID across inputs. Ideal for aggregated “Indeed job listings scraping tool” workflows.

  • 🧪 Developer-friendly & API-ready
    Access results via the Apify API for easy integration with your stack as an “Indeed jobs API alternative.” Works perfectly with Python or BeautifulSoup-based post-processing and fits into Scrapy pipelines as a source feed.

  • ⚙️ Live dataset pushes
    Results are pushed as they’re discovered (and sorted when you choose sort=date), so you can stream data into automations or dashboards.

How to use Indeed Job Scraper - step by step

  1. Sign in to Apify
    Create or log in to your Apify account to run the actor.

  2. Open the actor in Apify Console
    Find “indeed-job-scraper” under Actors and open it.

  3. Choose your targeting method(s)

    • Option 1 (builds a search URL): set countryCode (e.g., “us”), query (e.g., “Sales”), and optional location (city/state/zip or “remote”).
    • Option 2 (start URLs): add one or more Indeed search or job list URLs in urls. The actor will scrape these and also add the built search URL from Option 1 (when provided).
  4. Configure filters and limits

    • maxRows, maxRowsPerUrl to control volume.
    • remote, level (US), fromDays, sort, jobType for precision.
    • includeSimilarJobs and enableUniqueJobs for output control.
  5. Set proxy options (optional)

    • By default locally, it starts with no proxy and escalates if blocked.
    • On Apify, it uses RESIDENTIAL by default for reliability. You can also explicitly set proxyConfiguration.
  6. Start the run
    Click Start. The actor navigates pages, follows pagination, and pushes jobs to the dataset. If blocks occur, it retries and escalates connection tiers automatically.

  7. Download your results
    Go to the Run’s Dataset and export results to JSON or CSV, or consume via the Apify API for downstream integrations.

Pro Tip: Automate recurring collections by scheduling runs and connecting the Dataset API to your data warehouse or CRM — an easy “Indeed job scraper Python” pipeline without maintaining fragile Selenium scripts.

Use cases

Use caseDescription
Recruitment ops — curated pipelinesAggregate targeted roles by query, location, jobType, and level; export CSV to feed ATS systems.
Labor market analytics — trend trackingAnalyze salaryText, posting recency, and jobType distributions across regions for research reports.
Competitive hiring intelligenceMonitor competitors’ hiring signals using postedText, benefits, and normalized titles for benchmarking.
Remote/hybrid job boardsFilter remote or hybrid roles and build niche feeds powered by the “Indeed remote jobs scraper” capability.
Data engineering — API pipelineTreat the Dataset as an “Indeed jobs API alternative” for ingestion into ETL workflows and dashboards.
Academic & policy researchStudy geographic distributions and role types using structured location and occupation fields.
Product research & GTMEnrich GTM datasets by combining job metadata with market segments and company ratings.

Why choose Indeed Job Scraper?

Built for precision, automation, and reliability, this actor delivers structured Indeed job data at scale without flaky setups.

  • 🎯 Accurate, structured output: Clean top-level summaries plus detailed nested objects for analysis-ready data.
  • 🌍 Global coverage: Select countryCode to target regional Indeed domains, then refine by query/location.
  • 📈 Scalable & resilient: Handles pagination, bulk URLs, deduplication, and automatic connection-tier fallback.
  • 👩‍💻 Developer access: Consume via Apify API for a plug‑and‑play “Indeed jobs API alternative” in Python or other stacks.
  • 🛡️ Safe & compliant use: Scrapes publicly available pages only and avoids logins/cookies by design.
  • 💸 Cost-effective ops: No need to maintain headless browsers or brittle scripts; run and export via Apify.
  • 🔌 Integration-ready: Export CSV/JSON for CRMs, BI tools, or code workflows; ideal for “BeautifulSoup Indeed scraper” post-processing.

In short: a production-ready Indeed web scraper for jobs that outperforms ad‑hoc browser extensions and unstable scripts.

Yes — when done responsibly. This actor only collects data from publicly available Indeed pages and does not access authenticated content. You should:

  • Scrape only public information and avoid personal/sensitive data.
  • Comply with relevant regulations (e.g., GDPR, CCPA) and your local laws.
  • Respect platform terms and use reasonable limits (e.g., maxRows).
  • Consult your legal team for edge cases or jurisdiction-specific concerns.

Input parameters & output format

Example JSON input

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

Input fields

  • 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. Default: 100. Required: No.
  • radius (string) — Search radius from location. 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) — List of Indeed search or job list URLs. The actor also adds the built search URL from Option 1 (when provided). Default: none. Required: No.
  • maxRowsPerUrl (integer) — Maximum jobs to scrape per start URL (when using Option 2). 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) — Optional proxy settings. By default locally, requests go directly to Indeed; if blocked, the actor falls back to datacenter then residential (up to 3 retries). On Apify, it defaults to residential for reliability. Default: none (prefill: { "useApifyProxy": false }). Required: No.

Example JSON output

{
"jobId": "b28e7b80d0399215",
"title": "Sales Associate",
"normalizedTitle": "Sales Associate",
"companyName": "Acme Corp",
"locationShort": "New York, NY",
"postedText": "3 days ago",
"salaryText": "$20 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": "You will support customers on the sales floor...",
"descriptionHtml": "<div id=\"jobDescriptionText\">...</div>",
"jobDescription": "You will support customers on the sales floor...",
"jobDescriptionHTML": "<div id=\"jobDescriptionText\">...</div>",
"language": "en",
"locale": "en_US",
"isRemote": false,
"remoteLocation": null,
"jobType": ["Full-time"],
"shiftAndSchedule": ["Day shift"],
"workingSystem": ["Onsite"],
"occupation": ["Sales"],
"requirements": [
{ "label": "1 year of retail experience", "severity": "PREFERRED" }
],
"attributes": ["Customer service"],
"benefits": ["Dental insurance", "Paid time off"],
"salary": {
"text": "$20 an hour",
"currency": "USD",
"type": "hourly",
"min": 20,
"max": 20,
"weeklyMin": 800,
"weeklyMax": 800,
"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": 1712716800000
},
"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": 120 },
"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",
"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": "abc123",
"scrapingInfo": { "page": 1, "index": 0 },
"rankingScores": {
"bid": null,
"bidPosition": null,
"eApply": null,
"eQualified": null
}
},
"_raw": {
"id": "b28e7b80d0399215"
}
}

Note: Some nested fields may be null depending on what’s present on the page. The _raw object contains the original scraped job payload for custom parsing.

FAQ

Is there a free trial or test period?

Yes. Runs on Apify include a free tier to test the actor. You can start with a small maxRows and evaluate output before scaling.

Do I need to log in or use cookies to scrape Indeed?

No. The actor collects data from publicly available Indeed pages without login. It uses Playwright to load pages and BeautifulSoup for parsing where needed.

Is this an alternative to the Indeed API?

Yes. You can treat the Apify Dataset and API as an “Indeed jobs API alternative.” Results are exportable to JSON/CSV and accessible over HTTPS for integration.

Can I use it with Python?

Yes. Fetch the Dataset via Apify’s REST API in your Python code, or trigger runs programmatically. It fits cleanly into “Indeed job scraper Python” pipelines and downstream BeautifulSoup/Scrapy workflows.

Does it support pagination and multiple URLs?

Yes. The scraper follows “next” buttons and start offsets to collect more jobs per URL, and supports multiple start URLs in a single run. It also adds a built search URL from your query/location when provided.

Can I filter for remote or hybrid roles and US experience level?

Yes. Use remote (“remote” or “hybrid”) and level (US: “entry_level”, “mid_level”, “senior_level”) to refine results. You can also filter by posting recency (fromDays) and employment type (jobType).

How does proxy handling work?

Locally, it starts without a proxy and escalates on 401/403 blocks (datacenter → residential with retries). On Apify, it defaults to RESIDENTIAL for reliability while preserving escalation logic. You can also set proxyConfiguration explicitly.

What data points are included (salary, benefits, descriptions)?

The output includes salaryText with parsed currency/type/min/max where possible, benefits, shift and schedule, working system, and full job descriptions when present, along with company ratings and structured location details.

Closing thoughts

The Indeed Job Scraper is built for fast, reliable extraction of structured job data from Indeed at scale. With pagination, precise filters, deduplication, and robust connection-tier fallback, it’s ideal for recruiters, analysts, developers, and researchers. Export CSV/JSON or consume via API to power your “Indeed job scraping automation”, data pipelines, and reporting. Start extracting smarter, cleaner Indeed job data with a production-ready, integration-friendly workflow today.