Indeed Jobs Scraper avatar

Indeed Jobs Scraper

Under maintenance

Pricing

Pay per usage

Go to Apify Store
Indeed Jobs Scraper

Indeed Jobs Scraper

Under maintenance

Scrape Indeed job listings: title, company, salary, description and more. Search by keywords, location and country, or start from Indeed URLs.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Osamih

Osamih

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Extract job listings from Indeed, the world's largest job site — job title, company, location, salary, full description, ratings, posting date and more. Search by keywords and location across 57 countries, or start directly from Indeed URLs.

Indeed shut down its public Job Search API, so scraping is the only practical way to get this data programmatically. This Actor handles the hard parts for you: browser fingerprinting, residential proxy rotation and Cloudflare anti-bot protection.

Features

  • 🔍 Keyword + location search — same as Indeed's "what / where" boxes
  • 🌍 57 countries — every Indeed country site, selected with a single input field
  • 🎛️ Search filters — date posted, job type, experience level, minimum pay, remote-only, radius, sort order
  • 🔗 Start URLs — scrape any Indeed search page, company jobs page or single job URL
  • 🏢 Company details (optional) — rating, review count, industry, size, HQ, revenue, description
  • ↪️ External apply links (optional) — resolves Indeed's redirect to the employer's real application URL
  • ♻️ Deduplication — each job saved once per run, even if it appears in multiple searches
  • 📦 Structured output — clean JSON via API, or export CSV / Excel / HTML from the Apify Console

Output example

{
"positionName": "Senior Web Developer",
"id": "8a2f4e15c3b7d901",
"url": "https://www.indeed.com/viewjob?jk=8a2f4e15c3b7d901",
"company": "Acme Corp",
"companyLogo": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/acme.png",
"location": "San Francisco, CA 94105",
"salary": "$120,000 - $150,000 a year",
"jobType": ["Full-time"],
"rating": 4.2,
"reviewsCount": 128,
"postedAt": "3 days ago",
"postingDateParsed": "2026-07-02T08:00:00.000Z",
"description": "We are looking for a Senior Web Developer…",
"descriptionHTML": "<p>We are looking for a Senior Web Developer…</p>",
"externalApplyLink": "https://careers.acme.com/jobs/1234",
"isExpired": false,
"scrapedAt": "2026-07-05T12:34:56.789Z",
"searchInput": { "position": "web developer", "location": "San Francisco", "country": "US" },
"companyInfo": null
}

externalApplyLink is the employer's own application URL. Jobs that are applied to through Indeed Apply have no such URL, so the field is null for them.

Input

FieldTypeDefaultDescription
positionstringKeywords, e.g. web developer
locationstringCity, state or zip, e.g. San Francisco
countrystringUSCountry code — determines the Indeed domain
maxItemsPerSearchinteger50Result cap per search / per start URL
datePostedstringanyPosting window: 1, 3, 7 or 14 days
jobTypestringanyfulltime, parttime, contract, temporary, internship, permanent, apprenticeship, seasonal, commission, subcontract
experienceLevelstringanyentry_level, mid_level, senior_level
minSalarystringMinimum pay in local format, e.g. $60,000 or £35,000
remotebooleanfalseRemote / work-from-home jobs only
radiusintegerDistance from location in miles (max 100)
sortBystringrelevancerelevance or date (newest first)
includeSimilarJobsbooleanfalseAlso return near-duplicates Indeed normally hides
startUrlsarrayIndeed URLs to scrape directly
parseCompanyDetailsbooleanfalseAttach companyInfo from the employer's Indeed page
saveOnlyUniqueItemsbooleantrueDeduplicate jobs across searches
followApplyRedirectsbooleanfalseResolve external apply links to the final employer URL
maxConcurrencyinteger5Parallel pages (higher = faster, more blocks)
proxyConfigurationobjectApify residentialProxy settings

Minimal input:

{ "position": "web developer", "location": "San Francisco", "country": "US", "maxItemsPerSearch": 50 }

How many results can I get?

Indeed itself never serves more than ~1,000 results for a single search, no matter how you paginate. To go deeper, split one broad search into several narrower ones — by city, radius, or date posted — and run them as separate searches or start URLs. Duplicates across searches are removed automatically when saveOnlyUniqueItems is on.

Proxy requirements

Indeed uses aggressive anti-bot protection (Cloudflare). Residential proxies are effectively required — datacenter IPs get blocked almost immediately. The default input already selects the Apify RESIDENTIAL proxy group; make sure it is enabled for your Apify account. Expect roughly 0.3–1 GB of residential traffic per 1,000 jobs (the Actor blocks images, fonts and trackers to keep this low).

Integrations & API

Run the Actor from the Apify API, the JavaScript / Python clients, or on a schedule. Connect webhooks to trigger downstream workflows when a run finishes, and read results straight from the run's dataset in JSON, CSV or Excel.

# Run via API and get the dataset
curl "https://api.apify.com/v2/acts/<user>~indeed-scraper/run-sync-get-dataset-items?token=<API_TOKEN>" \
-X POST -H 'Content-Type: application/json' \
-d '{"position":"data engineer","country":"US","maxItemsPerSearch":100}'

Limitations & fair use

  • Only publicly visible job data is collected — nothing behind a login, and no personal data.
  • Job listings change fast; results reflect the moment of the run.
  • Company-jobs start URLs (/cmp/…/jobs) are supported on a best-effort basis.
  • startUrls entries with requestsFromUrl (remote URL lists) are not supported yet.
  • Respect Indeed's public data and applicable laws when using the output.

Troubleshooting

  • Run finishes with 0 items and "blocks retried" > 0 → your proxy configuration has no residential access. Switch the proxy group to RESIDENTIAL.
  • Fewer items than maxItemsPerSearch → the search genuinely has fewer results, or the ~1,000 cap was hit.
  • PARSER_DEGRADED warnings in the log → Indeed changed its page markup; the Actor falls back to secondary extraction. If fields go missing, please report it — an HTML snapshot is saved to the run's key-value store for diagnosis.

Changelog

0.1.0

  • Initial release: keyword/location/country search, start URLs, job details, company enrichment, apply-link resolution, deduplication, 57 countries.