Indeed Jobs Scraper - Fast & Reliable (API-based) avatar

Indeed Jobs Scraper - Fast & Reliable (API-based)

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Indeed Jobs Scraper - Fast & Reliable (API-based)

Indeed Jobs Scraper - Fast & Reliable (API-based)

Scrape Indeed job listings reliably via Indeed's mobile-app GraphQL backend (no Cloudflare-gated HTML). Get title, company, location, salary, remote flag, date posted, and apply URL. Filter by keyword, location, country, job type, remote, and date posted. Export JSON/CSV/Excel.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

Shahryar

Shahryar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Indeed Jobs Scraper – Fast, Reliable Indeed Job Data (No API Key)

Indeed Jobs Scraper extracts Indeed job listings quickly and reliably by talking to Indeed's mobile-app GraphQL backend instead of the Cloudflare-gated indeed.com HTML site. Search by job title / keyword and location, then export clean, structured data: title, company, salary, remote flag, date posted, apply URL, and more. This Indeed scraper needs no API key and no login, and you can export results to JSON, CSV, or Excel.

Built for recruiters, job boards, sourcers, market-research and data teams who need dependable Indeed data without fighting bot walls — a drop-in Indeed API alternative powered by Apify.

What it does

  • 🔎 Keyword search – scrape Indeed by one or more job titles / keywords, each searched separately.
  • 📍 Location + radius – search by city, state, ZIP, region, or "Remote", with an adjustable mile radius (0–100).
  • 🧰 Filters – job type (full-time / part-time / contract / internship), remote-only, and date posted (last N days).
  • 💵 Salary – min/max, currency, and pay period when Indeed provides it (real or estimated), plus a formatted salaryText.
  • 🏢 Company details – name, company page URL, corporate website, logo, industry, and size label when Indeed exposes them.
  • 🔗 Apply URLs – the canonical Indeed job URL plus the recruiter apply URL when available.
  • 📤 Export anywhere – download as JSON, CSV, or Excel, or pull from the Apify dataset API.

Why this scraper

Most Indeed scrapers hit indeed.com HTML, which sits behind Cloudflare and breaks constantly. This Actor instead uses the same private GraphQL API that the Indeed iPhone app uses (apis.indeed.com/graphql) with the app's static API key and iOS User-Agent — the approach popularized by the open-source JobSpy project. That backend returns clean JSON, so results are:

  • Fast – structured JSON, up to 100 jobs requested per page, cursor-paginated.
  • 🛡️ Reliable – no HTML parsing, no CAPTCHAs, far fewer blocks than HTML scraping. The Actor rotates proxy sessions and backs off automatically on rate limits.
  • 🧱 Complete – salary, company, location, remote flag, date posted, description, and apply URL in one record.
  • 🌍 Global – choose the Indeed country site (US, UK, CA, DE, IN, AU, and 60+ more).
  • 🔓 No API key – uses the key embedded in Indeed's mobile app; you only configure Apify Proxy.

Pairs well with our other job and lead-gen scrapers (LinkedIn, Yelp, Google Maps, and more) to build complete recruiting and lead-generation pipelines.

Example input

{
"searchQueries": ["software engineer", "product manager"],
"location": "New York, NY",
"country": "us",
"radius": 25,
"maxItems": 100,
"datePosted": 7,
"jobType": "fulltime",
"remoteOnly": false,
"proxyConfiguration": { "useApifyProxy": true }
}

Note: Indeed cannot combine datePosted with the jobType / remoteOnly filter. If you set both, datePosted is used and the job-type/remote filter is ignored for that run (the Actor logs a warning).

Example output

Every item is pushed with type: "job". Optional fields are set to null when Indeed does not expose them (the Actor never guesses values). A representative item:

{
"type": "job",
"id": "in-1a2b3c4d5e6f7g8h",
"title": "Senior Software Engineer",
"company": "Acme Corp",
"companyRating": null,
"companyUrl": "https://www.indeed.com/cmp/Acme-Corp",
"companyWebsite": "https://www.acme.com",
"companyLogo": "https://d2q79iu7y748jz.cloudfront.net/s/_squareLogo/abc123.png",
"companyIndustry": "Information Technology",
"companySize": "1,000+ employees",
"location": "New York, NY",
"city": "New York",
"state": "NY",
"country": "US",
"postalCode": "10001",
"isRemote": false,
"salary": {
"min": 140000,
"max": 180000,
"currency": "USD",
"period": "yearly",
"isEstimated": false
},
"salaryText": "USD 140,000 - USD 180,000 / year",
"jobType": ["fulltime"],
"source": "Indeed",
"datePosted": "2026-06-22T00:00:00.000Z",
"description": "We are hiring a Senior Software Engineer to ...",
"url": "https://www.indeed.com/viewjob?jk=1a2b3c4d5e6f7g8h",
"applyUrl": "https://www.indeed.com/viewjob?jk=1a2b3c4d5e6f7g8h",
"scrapedAt": "2026-06-26T12:00:00.000Z"
}

Output fields

Every record uses type: "job". Fields marked "if available" come straight from Indeed and are null when Indeed does not provide them for a listing.

FieldTypeDescription
typestringAlways "job" (item type discriminator).
idstringStable job ID in the form in-<indeedJobKey>.
titlestring | nullJob title.
companystring | nullEmployer / company name.
companyRatingnumber | nullEmployer star rating. This query does not request a rating field from Indeed, so this is currently always null (the field is reserved for forward compatibility).
companyUrlstring | nullIndeed company page URL (if available).
companyWebsitestring | nullEmployer's corporate website (if available).
companyLogostring | nullSquare company logo URL (if available).
companyIndustrystring | nullEmployer industry, cleaned (if available).
companySizestring | nullEmployer size label, e.g. "1,000+ employees" (if available).
locationstring | nullHuman-readable location string.
citystring | nullParsed city.
statestring | nullParsed state / admin region code.
countrystring | nullParsed country code (e.g. "US").
postalCodestring | nullParsed postal / ZIP code.
isRemotebooleantrue if the job is detected as remote (via Indeed attributes, location, or description keywords).
salaryobject | null{ min, max, currency, period, isEstimated } or null when no pay data is present.
salaryTextstring | nullFormatted salary string for quick reading, or null.
jobTypearray | nullArray of normalized types (e.g. ["fulltime"]) or null when none are tagged.
sourcestring | nullOriginal source / board the listing came from (if available).
datePostedstring | nullISO 8601 date the job was published, or null.
descriptionstring | nullClean plain-text job description (HTML stripped), or null.
urlstringCanonical Indeed job URL.
applyUrlstringRecruiter apply URL when present, otherwise the Indeed job URL.
scrapedAtstringISO 8601 timestamp of when the record was scraped.

The salary object, when present, contains: min (number | null), max (number | null), currency (string | null), period (one of hourly, daily, weekly, monthly, yearly, or the raw Indeed value), and isEstimated (boolean — true when the figure is an Indeed estimate rather than employer-posted).

Input reference

FieldTypeRequiredDefaultDescription
searchQueriesarrayYes["software engineer"]Job titles / keywords to search. Each query is searched separately. At least one non-empty value is required.
locationstringNo""City, state, ZIP, region, or "Remote". Empty = whole country.
countrystringNo"us"Indeed country code/name (us, uk, ca, de, in, au, …). Controls the regional site and currency.
radiusintegerNo25Miles around the location (0–100). Only used when a location is set.
maxItemsintegerNo100Max jobs in total across all queries. 0 = no limit.
datePostedintegerNoOnly jobs posted within the last N days (1–60). Applied as an hours filter (days × 24). Optional.
jobTypestringNo""One of fulltime, parttime, contract, internship, or empty for any.
remoteOnlybooleanNofalseOnly return jobs Indeed tags as remote.
proxyConfigurationobjectNoApify Proxy onApify Proxy settings. The default Apify proxy is recommended.

Common use cases

  • Recruiting & sourcing – pull fresh openings for a role and location every day.
  • Job-board aggregation – feed an internal board or alerting system with structured Indeed data.
  • Salary & market research – analyze pay ranges by title, location, and company.
  • Competitive hiring intelligence – track which companies are hiring for what.
  • Lead generation – build lists of companies actively hiring in a niche, then enrich with company website and size fields.

FAQ

Do I need an API key or login to scrape Indeed? No. This Indeed scraper uses the API key embedded in the Indeed mobile app (the same one JobSpy uses), so there is no API key for you to obtain and no login. You only configure Apify Proxy.

How does it avoid Cloudflare blocks? It does not scrape indeed.com HTML. It calls Indeed's mobile-app GraphQL endpoint (apis.indeed.com/graphql) with the app's static API key and an iPhone User-Agent, which returns structured JSON and is far more tolerant of automation than the HTML site.

Is this an Indeed API? It is an Indeed API alternative: the Actor speaks to Indeed's own private mobile GraphQL API and returns clean JSON, giving you API-like structured data without an official Indeed API or API key.

What formats can I export? Results land in an Apify dataset, so you can export to JSON, CSV, or Excel (plus XML, RSS, or HTML) from the Console, or fetch them via the Apify API.

Why are some salary or company fields null? Indeed does not attach salary or full company details to every listing. When data isn't present, the field is null rather than guessed. Note that companyRating is not part of this query at all, so it is currently always null (it is kept in the schema for forward compatibility).

How many jobs can I get and how is paging handled? The Actor requests up to 100 jobs per page and follows Indeed's cursor pagination automatically until your maxItems cap is hit or the results run out. Set maxItems: 0 for no limit.

Which countries are supported? US, UK, Canada, Germany, India, Australia, France, Spain, Italy, Netherlands, Ireland, Singapore, Mexico, Brazil, and 60+ more — set country to the two-letter code.

Can I filter by date AND job type? No — Indeed's backend doesn't allow both at once. If you set both, datePosted wins and the job-type/remote filter is skipped for that run (a warning is logged).

What if it stops returning results? Indeed occasionally rotates the mobile API key or rate-limits an IP. The Actor backs off, rotates the proxy session on 429, and logs a clear, actionable error on repeated 401/403 (which would indicate the embedded key needs updating).

Disclaimer

This Actor collects publicly available job-listing data. You are responsible for how you use the scraped data and for complying with Indeed's terms, applicable laws, and data-protection regulations.