Indeed Job Scraper
Pricing
from $3.99 / 1,000 results
Indeed Job Scraper
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScraperX
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Indeed Job Scraper — Extract Job Listings, Salaries, Companies & Apply Links (62 Countries)
Scrape Indeed job listings at scale with full descriptions, parsed salary ranges, employer profiles and direct apply URLs. Search by keyword and location, or paste Indeed search and company URLs — the Actor works across 62 Indeed country domains.
It talks to Indeed's official mobile-app GraphQL endpoint, which means fast, clean, structured JSON instead of fragile HTML parsing — and usually no proxy needed at all.
What you get
| 💼 Job data | 💰 Salary | 🏢 Employer |
|---|---|---|
| Job title & normalized title | Raw salary text as shown | Company name & display name |
| Full description (text and HTML) | Parsed min / max | Industry, revenue, employee count |
| Job type(s) — full-time, contract… | Currency & pay period | Company description |
| Shift & schedule | Weekly-normalised min/max | CEO name and photo |
| Attributes and benefits | Extraction source | Corporate website & careers link |
| Remote / hybrid flag | Indeed company page link | |
| Posted date + "3 days ago" text | Logo and header image | |
| Urgently-hiring & high-volume flags | Company addresses |
Plus location (country, state, city, postcode, street, formatted long/short) and apply (job URL, Indeed apply flag, third-party apply URL, original apply URL).
Key features
- Two ways to search. Option 1: keyword + location + filters. Option 2: paste Indeed search or company URLs — each becomes its own search, and the parameters in the URL (
q,l,radius,fromage,jt,sort) override your top-level settings. - 62 country domains. US, UK, Canada, Australia, Germany, France, Spain, Netherlands, India, Japan, Brazil, UAE, Singapore, South Africa and many more — one
countryCodefield away. - Salary parsing that is actually useful. Indeed shows salary as free text ("$25 – $32 an hour"). The Actor also returns a parsed object with
min,max,currency,type, and — crucially —weeklyMin/weeklyMaxso hourly, monthly and yearly postings become directly comparable. - Full job descriptions, in plain text and HTML — not truncated snippets.
- Rich employer profiles attached to every job: industry, revenue band, headcount, CEO, corporate website and Indeed company page.
- Real apply links.
applyUrl,originalApplyUrlandthirdPartyApplyUrl, plus flags for whether Indeed Apply is enabled — everything an application-automation workflow needs. - Honest filtering. Some Indeed filters are server-side and some can only be applied afterwards. The Actor does both and tells you which is which (see the input table), so you never get silently wrong results.
- Deduplication.
enableUniqueJobsremoves repeats by Indeed job key across pages and across URLs. - No proxy required by default. If Indeed returns 401/403/429, the Actor automatically retries with a fallback ladder: datacenter → residential, 3 retries per tier.
Use cases
- Recruitment & sourcing — track who is hiring for which roles, where, and at what pay.
- Salary benchmarking — use the weekly-normalised salary fields to compare hourly, monthly and annual postings on one axis.
- Job boards & aggregators — feed a niche job board with fresh, structured listings and working apply links.
- Lead generation for staffing and HR tech — companies posting many roles are companies with hiring budget;
corporateWebsiteand company data give you the approach. - Labour-market research — measure hiring volume by industry, city or seniority over time.
- Competitive intelligence — watch a competitor's Indeed company page and see exactly which teams they are growing.
- Job-alert automation — schedule a daily run with
fromDays: 1and push new matches to Slack or e-mail. - Relocation & remote-work research — filter for remote or hybrid roles across multiple countries at once.
How it works
- You choose a setup style — query + filters, or start URLs.
- The Actor queries Indeed's mobile GraphQL API for each search, paging until your row cap is reached.
- Every job card is expanded into a full record: description, salary, employer details, location and apply links.
- Post-filters are applied for the criteria Indeed cannot filter server-side (hybrid, seniority level, and some job types).
- Duplicates are dropped by job key when unique mode is on.
- Rows stream into the dataset, each with flat scalar fields for the table view plus a full nested structure underneath.
Quick start
- Open the Actor and pick a Country — e.g.
us. - Enter a Query — e.g.
Data Analyst. - Enter a Location — a city, state, postcode, or
remote. - Set Max rows (start with 20–50).
- Click Start, then export the Output tab as CSV, Excel or JSON.
Minimal input
{"countryCode": "us","query": "Data Analyst","location": "New York, NY","maxRows": 50}
Input configuration
Option 1 — search with query & filters
| Field | Type | Default | Description |
|---|---|---|---|
countryCode | string | us | Indeed country domain. 62 options: us, uk, ca, au, de, fr, es, it, nl, in, jp, br, mx, ae, sg, za, pl, se, and more. |
query | string | Sales | Job keywords — title, skills, company. |
location | string | — | City, state, postcode, or remote. Leave empty for no location filter. |
maxRows | integer | 10 | Total jobs to scrape across the whole run. |
radius | string | — | Search radius from the location: 0, 5, 10, 15, 25, 35, 50, 100. |
remote | string | — | remote (applied server-side) or hybrid (post-filtered on description/attributes). |
level | string | — | entry_level, mid_level, senior_level. US only, post-filtered on title/attributes/description. |
fromDays | string | 0 | Only jobs posted in the last 1, 3, 7, 14 or 30 days. |
sort | string | relevance | relevance or date. |
jobType | string | — | fulltime, parttime, contract, internship (server-side); temporary, permanent, seasonal, freelance, volunteer (post-filtered on text). |
Filter interaction to know about: server-side,
fromDaysis mutually exclusive withjobTypeandremote. When you setfromDays, the other two automatically become post-filters. The results are still correct — they are just filtered after retrieval, so you may need a highermaxRowsto reach your target count.
Option 2 — start URLs
| Field | Type | Default | Description |
|---|---|---|---|
urls | array | — | Indeed search URLs (https://www.indeed.com/jobs?q=…&l=…) or company URLs (https://www.indeed.com/cmp/<name>). Each runs as its own search and overrides Option 1. |
maxRowsPerUrl | integer | — | Optional per-URL cap. Leave empty when you only have one URL — otherwise it silently limits you below maxRows. |
Output & network
| Field | Type | Default | Description |
|---|---|---|---|
enableUniqueJobs | boolean | true | Deduplicate by Indeed job key across pages and URLs. |
includeSimilarJobs | boolean | true | Kept for input-schema compatibility only — no effect on the mobile-API path, which never returns "view similar jobs" placeholder cards. |
proxyConfiguration | object | off | Usually unnecessary. On 401/403/429 the Actor falls back to datacenter, then residential (3 retries per tier). |
Output data
Each row has flat scalar fields at the top (so Apify's table view and CSV exports look right) plus a full nested structure underneath.
Flat quick fields
jobId, title, normalizedTitle, companyName, locationShort, postedText, salaryText, jobUrl.
job
id / jobKey, title, displayTitle, descriptionText, descriptionHtml, isRemote, jobType[], shiftAndSchedule[], workingSystem[], attributes[], benefits[], salary { text, currency, type, min, max, weeklyMin, weeklyMax, source }, hiring { urgentlyHiring, highVolumeHiring, isRepost, organicApplyStarts, numOfCandidates }, dates { postedText, postedToday, datePublished, pubDateEpoch }, status { expired, newJob, visited }.
company
name, displayName, industry, revenue, numEmployees, foundedYear, description, briefDescription, rating { score, count }, ceo { name, photoUrl, startDate }, branding { logoUrl, headerUrl }, links { corporateWebsite, careers, indeedCompanyPage }, addresses[].
location
countryCode, country, state, stateName, city, postalCode, streetAddress, formattedShort, formattedLong, latitude, longitude.
apply
jobUrl, applyUrl, originalApplyUrl, thirdPartyApplyUrl, indeedApplyEnabled.
Example output (trimmed)
{"jobId": "b1c2d3e4f5a6b7c8","title": "Senior Data Analyst","companyName": "Example Analytics Inc.","locationShort": "New York, NY","postedText": "3 days ago","salaryText": "$95,000 - $120,000 a year","jobUrl": "https://www.indeed.com/viewjob?jk=b1c2d3e4f5a6b7c8","job": {"jobKey": "b1c2d3e4f5a6b7c8","isRemote": false,"jobType": ["Full-time"],"benefits": ["Health insurance", "401(k)", "Paid time off"],"salary": {"text": "$95,000 - $120,000 a year","currency": "USD","type": "YEAR","min": 95000,"max": 120000,"weeklyMin": 1826.92,"weeklyMax": 2307.69,"source": "EXTRACTION"},"dates": { "postedText": "3 days ago", "postedToday": false, "datePublished": "2026-08-07" },"descriptionText": "We are looking for a Senior Data Analyst to…"},"company": {"name": "Example Analytics Inc.","industry": "Information Technology","numEmployees": "201 to 500","revenue": "$25M to $100M (USD)","links": { "corporateWebsite": "https://example-analytics.com" }},"location": { "country": "United States", "state": "NY", "city": "New York", "postalCode": "10012" },"apply": {"jobUrl": "https://www.indeed.com/viewjob?jk=b1c2d3e4f5a6b7c8","applyUrl": "https://example-analytics.com/careers/apply/1234","indeedApplyEnabled": false}}
Illustrative values — a live run returns current Indeed data.
Usage examples
Fresh remote roles from the last 24 hours
{"countryCode": "us","query": "Product Manager","location": "remote","remote": "remote","fromDays": "1","sort": "date","maxRows": 200}
Entry-level jobs within 25 miles of a city
{"countryCode": "us","query": "Marketing","location": "Austin, TX","radius": "25","level": "entry_level","jobType": "fulltime","maxRows": 150}
Everything a specific company is hiring for
{"urls": ["https://www.indeed.com/cmp/Example-Analytics"],"maxRows": 300}
Multi-country sweep for one role
Run once per country domain (countryCode) and merge the datasets, or supply country-specific search URLs:
{"urls": ["https://uk.indeed.com/jobs?q=data+engineer&l=London","https://de.indeed.com/jobs?q=data+engineer&l=Berlin","https://nl.indeed.com/jobs?q=data+engineer&l=Amsterdam"],"maxRows": 600,"maxRowsPerUrl": 200}
Salary benchmarking
Run a broad query, export to CSV, then compare job.salary.weeklyMin / weeklyMax — hourly, monthly and annual postings become directly comparable.
Run it from your own code
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scraperx/indeed-job-scraper").call(run_input={"countryCode": "us","query": "Data Analyst","location": "New York, NY","maxRows": 100,"fromDays": "7",})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["title"], "|", job["companyName"], "|", job.get("salaryText"), "|", job["jobUrl"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const run = await client.actor('scraperx/indeed-job-scraper').call({countryCode: 'us',query: 'Data Analyst',location: 'New York, NY',maxRows: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
cURL
curl -X POST "https://api.apify.com/v2/acts/scraperx~indeed-job-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"countryCode":"us","query":"Data Analyst","location":"New York, NY","maxRows":100}'
Integrations
Push jobs into Google Sheets, Airtable, Slack, Make, Zapier, Google Drive or your own ATS via webhooks. Pair with Schedules and fromDays: "1" for a daily job-alert pipeline.
Pricing
Pay-per-event: a small Actor-start charge plus a charge per job row delivered to your dataset. You pay for listings, not for run time. Current rates are shown on the Pricing tab of this Actor's page, and Apify displays an estimate before and during each run.
Cost tip: because post-filters (hybrid, level, temporary/permanent/seasonal/freelance) drop rows after retrieval, set maxRows a little above your target when you use them.
Limits & good to know
maxRowsis a run-wide total. With multiple start URLs, addmaxRowsPerUrlto distribute it — but remember it can cap you belowmaxRowsif set too low.- Post-filtered criteria reduce the final row count (see the filter note above).
levelis US-only.includeSimilarJobsdoes nothing on the mobile-API path — it exists only so older inputs keep validating.- Company rating and review counts are not returned by the mobile endpoint and come back
null; industry, revenue, headcount and CEO data usually are. - Latitude/longitude are only populated when Indeed publishes them for that posting.
- Indeed rotates job keys when a posting is reposted — use
jobIdfor deduplication within a run, and the apply URL for cross-run matching. - Default run options are 4 GB memory and a 1-hour timeout.
FAQ
Do I need an Indeed account or API key? No. The Actor uses Indeed's public mobile app endpoint without authentication.
Do I need proxies? Usually not. Enable Apify Proxy only if you hit rate limiting — the Actor already escalates automatically on 401/403/429.
Which countries are supported?
62 Indeed domains, selected with countryCode — or just paste a country-specific Indeed URL.
Can I scrape a specific company's jobs?
Yes — paste its Indeed company URL (https://www.indeed.com/cmp/<name>) into urls.
Do I get the full job description?
Yes, in both plain text (job.descriptionText) and HTML (job.descriptionHtml).
How do I compare salaries fairly?
Use job.salary.weeklyMin and weeklyMax — the Actor normalises hourly, weekly, monthly and yearly pay to a weekly figure.
Can I get the direct application link?
Yes — apply.applyUrl, apply.originalApplyUrl and apply.thirdPartyApplyUrl, plus the indeedApplyEnabled flag.
How do I build a daily job alert?
Set fromDays: "1" and sort: "date", save it as a Task, and attach a daily Schedule with a Slack or e-mail integration.
Which export formats are supported? JSON, CSV, Excel (XLSX), XML and RSS. The flat top-level fields make CSV readable; JSON keeps the full nested detail.
Legal & responsible use
This Actor collects publicly available job postings — content employers publish specifically to be found. It does not log in, submit applications, or access private candidate data. Job descriptions remain the property of their authors. Use the data in line with Indeed's terms and applicable law, and treat any personal data (recruiter or CEO names) under GDPR and comparable rules.
Support
Need extra fields, another country, or a custom hiring-data pipeline? Open an issue on the Issues tab.