Indeed Job Scraper avatar

Indeed Job Scraper

Pricing

from $3.99 / 1,000 results

Go to Apify Store
Indeed Job Scraper

Indeed Job Scraper

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

ScraperX

ScraperX

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

3 days ago

Last modified

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 titleRaw salary text as shownCompany name & display name
Full description (text and HTML)Parsed min / maxIndustry, revenue, employee count
Job type(s) — full-time, contract…Currency & pay periodCompany description
Shift & scheduleWeekly-normalised min/maxCEO name and photo
Attributes and benefitsExtraction sourceCorporate website & careers link
Remote / hybrid flagIndeed company page link
Posted date + "3 days ago" textLogo and header image
Urgently-hiring & high-volume flagsCompany 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 countryCode field 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 / weeklyMax so 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, originalApplyUrl and thirdPartyApplyUrl, 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. enableUniqueJobs removes 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; corporateWebsite and 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: 1 and 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

  1. You choose a setup style — query + filters, or start URLs.
  2. The Actor queries Indeed's mobile GraphQL API for each search, paging until your row cap is reached.
  3. Every job card is expanded into a full record: description, salary, employer details, location and apply links.
  4. Post-filters are applied for the criteria Indeed cannot filter server-side (hybrid, seniority level, and some job types).
  5. Duplicates are dropped by job key when unique mode is on.
  6. Rows stream into the dataset, each with flat scalar fields for the table view plus a full nested structure underneath.

Quick start

  1. Open the Actor and pick a Country — e.g. us.
  2. Enter a Query — e.g. Data Analyst.
  3. Enter a Location — a city, state, postcode, or remote.
  4. Set Max rows (start with 20–50).
  5. 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

FieldTypeDefaultDescription
countryCodestringusIndeed country domain. 62 options: us, uk, ca, au, de, fr, es, it, nl, in, jp, br, mx, ae, sg, za, pl, se, and more.
querystringSalesJob keywords — title, skills, company.
locationstringCity, state, postcode, or remote. Leave empty for no location filter.
maxRowsinteger10Total jobs to scrape across the whole run.
radiusstringSearch radius from the location: 0, 5, 10, 15, 25, 35, 50, 100.
remotestringremote (applied server-side) or hybrid (post-filtered on description/attributes).
levelstringentry_level, mid_level, senior_level. US only, post-filtered on title/attributes/description.
fromDaysstring0Only jobs posted in the last 1, 3, 7, 14 or 30 days.
sortstringrelevancerelevance or date.
jobTypestringfulltime, parttime, contract, internship (server-side); temporary, permanent, seasonal, freelance, volunteer (post-filtered on text).

Filter interaction to know about: server-side, fromDays is mutually exclusive with jobType and remote. When you set fromDays, the other two automatically become post-filters. The results are still correct — they are just filtered after retrieval, so you may need a higher maxRows to reach your target count.

Option 2 — start URLs

FieldTypeDefaultDescription
urlsarrayIndeed 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.
maxRowsPerUrlintegerOptional per-URL cap. Leave empty when you only have one URL — otherwise it silently limits you below maxRows.

Output & network

FieldTypeDefaultDescription
enableUniqueJobsbooleantrueDeduplicate by Indeed job key across pages and URLs.
includeSimilarJobsbooleantrueKept for input-schema compatibility only — no effect on the mobile-API path, which never returns "view similar jobs" placeholder cards.
proxyConfigurationobjectoffUsually 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 ApifyClient
client = 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

  • maxRows is a run-wide total. With multiple start URLs, add maxRowsPerUrl to distribute it — but remember it can cap you below maxRows if set too low.
  • Post-filtered criteria reduce the final row count (see the filter note above).
  • level is US-only.
  • includeSimilarJobs does 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 jobId for 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.


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.