Indeed Jobs Scraper — Bypass 25 Limit, 60+ Countries avatar

Indeed Jobs Scraper — Bypass 25 Limit, 60+ Countries

Pricing

from $1.40 / 1,000 job listing scrapeds

Go to Apify Store
Indeed Jobs Scraper — Bypass 25 Limit, 60+ Countries

Indeed Jobs Scraper — Bypass 25 Limit, 60+ Countries

Scrape 100% real Indeed job postings from 60+ countries. Bypass the 25-job limit with multi-city discovery. Get salaries, company profiles, full descriptions, ATS apply URLs, and resume match scores. No login. Residential proxy. $1.40 per 1,000 jobs scraped

Pricing

from $1.40 / 1,000 job listing scrapeds

Rating

0.0

(0)

Developer

Scrape Pilot

Scrape Pilot

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share


💼 Indeed Jobs Scraper — Search by Keyword or URL [Bypass the 25-Job Limit]


Extract 100% genuine job postings from Indeed across 60+ countries — job titles, salaries, company ratings, full descriptions, GPS, company profiles, and ATS apply URLs — using keyword search, direct URLs, or regional auto-expansion. Bypasses Indeed's ~25-jobs-per-page limit with deep multi-city discovery. No login required. Residential proxy ready. Pay per successful result — just $1.40 per 1,000 jobs scraped.


💡 What is the Indeed Jobs Scraper?

This actor extracts full job postings from Indeed by loading public search result pages in a stealth Playwright browser, reading the embedded mosaic-provider-jobcards JSON model, and then batch-hydrating complete HTML job descriptions via Indeed's internal /rpc/jobdescs endpoint. It uses a multi-layer enrichment pipeline so each output record is as complete as possible:

  1. Search-page JSON extraction — pulls the mosaicProviderJobCardsModel.results object straight from window.mosaic.providerData (title, company, salary, rating, location, taxonomy, external apply URL).
  2. RPC description hydration — batches job keys and calls Indeed's internal /rpc/jobdescs?jks=... endpoint for the full rich HTML job description (not just the snippet).
  3. Company profile enrichment — matches well-known employers against a built-in company database (CEO, revenue, industry, website, employee count, founded year), with sensible generic fallbacks for unknown companies.
  4. Resume keyword scoring — compares your resume/CV skills against each job's title + description and returns a 0–100 match score plus matched/missing keyword lists.
  5. Requirements & benefits extraction — automatically parses bullet-point requirements and benefits out of the job description using section-header heuristics with regex fallbacks.

On top of core job data, the actor supports regional auto-expansion: give a US state (e.g., "Texas") or country and it will run the same query across 5–8 top cities in that region, producing 2–5× more unique jobs than a single national search — this is the main mechanism that bypasses Indeed's ~25-jobs-per-page limit.

No Indeed account, no login, no cookies required. You are charged only for successful job records.


🚀 Key Features

FeatureDescription
Dual search modesKeyword + Country + Location OR start URLs — perfect for ad-hoc searches and repeatable saved searches.
Bypass the 25-job limitDeep multi-city discovery + seniority expansions + pagination produce 2–5× more unique jobs than a single national query.
Rich structured dataSalary (min/max/type/currency), job type, remote flag, city/state/postal, date published, company rating, review count.
Full job descriptionsBatch hydration via Indeed's internal /rpc/jobdescs RPC — plain text and original HTML.
External / ATS apply URLCaptures the thirdPartyApplyUrl so you can hit the real application portal directly.
Company profile enrichmentCEO name, revenue, industry, website, employee count, and founded year for known employers.
Resume match score0–100 fit score per job with matched & missing keyword lists.
Requirements & benefits extractionAuto-parses bullet points under "Requirements", "Qualifications", "Benefits", "Perks", etc.
Regional auto-expansionGive a US state, UK region, or Canadian province and it auto-expands to top cities.
Seniority deep searchOptional expansion to Senior / Lead / Junior variants of your base keyword.
60+ country domainsUS, UK, Canada, Australia, Germany, France, India, Netherlands, Spain, Italy, Brazil, Mexico, Singapore, Japan, Ireland, and many more.
Advanced Indeed filtersRadius, date posted, remote/hybrid, job type, minimum salary, sort by relevance or date.
Powerful post-filtersStrict keyword match, only jobs with salary, only external jobs, one job per company.
Residential proxy readyUses Apify's RESIDENTIAL proxy group by default with stealth Playwright to avoid IP blocks.
Pay per successCharged only for job records that pass all your filters.
Spending limit protectionAutomatically stops the run when your Apify pay-per-event spending limit is reached.
Clean, structured JSONReady for CRM, job boards, dashboards, spreadsheets, and data pipelines.

📥 Input Parameters

ParameterTypeRequiredDefaultDescription
positionstringNo""Primary job title / keyword (e.g., "Senior Full-Stack Developer").
keywordsarrayNo[]Additional keywords run as separate searches.
countrystringNo"United States"Target Indeed country domain (60+ supported).
locationstringNo""City, state, region, or "Remote". Leave blank for a national search.
radiusintegerNo25Search radius in miles.
datePostedstringNo"any"any, 1, 3, 7, 14, 30 (days).
postedBystringNo"all"all, employer, recruiter.
jobTypearrayNo[]full-time, part-time, contract, internship, temporary.
remotestringNo"any"any, remote, hybrid.
experienceLevelstringNo"all"all, entry, mid, senior.
minSalaryintegerNonullMinimum annualized salary floor. Hourly salaries are multiplied by 2080 before comparison.
sortstringNo"relevance"relevance or date.
startUrlsarrayNo[]Indeed search URLs to scrape directly (bypasses keyword building).
deepSearchbooleanNofalseAdds Senior / Lead / Junior variants of your primary keyword.
expandToCitiesbooleanNotrueIf location matches a known region, auto-expands to top cities in that region.
strictKeywordMatchbooleanNofalseRejects jobs whose title + description don't contain all query terms.
includeJobsWithNoSalarybooleanNotrueSet false to keep only jobs with a salary.
oneJobPerCompanybooleanNofalseKeep only the first job per company.
resolveExternalApplyUrlbooleanNofalseCharge an extra PPE event when an external apply URL is present.
includeCompanyDetailsbooleanNotrueEnrich with CEO, revenue, industry, website, employee count, founded year.
resumeKeywordsarrayNo[]Resume skills used to compute the resumeMatchScore.
onlyExternalJobsbooleanNofalseKeep only jobs with an external apply URL.
flattenOutputbooleanNotrueFlatten output JSON (single-level).
maxJobsintegerNo50Hard cap on the number of jobs pushed to the dataset.
proxyobjectNo{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}Apify Proxy configuration.

Example Input (Keyword + Regional auto-expansion)

{
"position": "Senior Full-Stack Developer",
"keywords": ["React", "Python", "AWS"],
"country": "United States",
"location": "Texas",
"radius": 25,
"datePosted": "7",
"jobType": ["full-time", "contract"],
"remote": "remote",
"deepSearch": true,
"expandToCities": true,
"includeCompanyDetails": true,
"resumeKeywords": ["React", "Python", "AWS Amplify", "FastAPI", "TypeScript"],
"maxJobs": 200
}

Example Input (Direct Indeed URLs)

{
"startUrls": [
{ "url": "https://www.indeed.com/jobs?q=python+developer&l=Remote" },
{ "url": "https://uk.indeed.com/jobs?q=data+engineer&l=London" }
],
"maxJobs": 100,
"includeCompanyDetails": true
}

Example Input (Minimum salary + external jobs only)

{
"position": "Backend Engineer",
"country": "United States",
"location": "Remote",
"minSalary": 120000,
"onlyExternalJobs": true,
"includeJobsWithNoSalary": false,
"maxJobs": 50
}

📤 Output Fields

Each successful job is pushed to the dataset as an object with the following fields:

FieldTypeDescription
jobKeystringIndeed's unique job ID (used to build canonical URLs).
positionNamestringOriginal job title as displayed by Indeed.
normTitlestringNormalized title (Indeed's standardized title).
companystringCompany name (falls back to "Confidential").
salarystringHuman-readable salary text (e.g., "$135,000 - $165,000 a year").
salaryMinnumber or nullMinimum salary parsed from Indeed.
salaryMaxnumber or nullMaximum salary (-1 for "From $X" style).
salaryTypestringyearly or hourly.
currencystringCurrency code (e.g., USD, GBP, EUR).
jobTypestringFull-time, Part-time, Contract, Internship, Temporary.
remotestringRemote, Hybrid, or On-site.
locationstringFormatted location string.
citystringCity.
statestringState / province.
countryCodestringISO country code (e.g., US).
postalCodestringPostal / ZIP code.
latitudenumber or nullGPS latitude (when available).
longitudenumber or nullGPS longitude (when available).
datePublishedstringISO 8601 UTC publish timestamp.
dateOnIndeedstringRelative date label (e.g., "Just posted", "2 days ago").
jobDescriptionstringFull job description as clean plain text.
jobDescriptionHtmlstringFull job description as raw HTML.
requirementsarray of stringsBullet-point requirements extracted from the description.
benefitsarray of stringsBullet-point benefits extracted from the description.
companyHeaderRatingnumber or nullIndeed company rating (0–5).
reviewsCountnumber or nullNumber of company reviews on Indeed.
companyOverviewLinkstringIndeed company overview URL.
companyDetailsCeoNamestringCEO name (if matched in the enrichment DB).
companyDetailsRevenuestringRevenue band (e.g., "$10B+").
companyDetailsIndustrystringIndustry classification.
companyDetailsWebsitestringCompany careers / corporate website.
companyDetailsEmployeesCountstringEmployee count band (e.g., "100,000+").
companyDetailsFoundedYearnumber or nullFounding year.
externalApplyUrlstringExternal / ATS apply URL (Indeed's thirdPartyApplyUrl).
urlstringCanonical Indeed job URL (/viewjob?jk=...).
jobUrlstringSame as url (alias for convenience).
resumeMatchScorenumberResume match score (0–100), only when resumeKeywords is set.
resumeMatchedKeywordsarray of stringsResume keywords found in the job.
resumeMissingKeywordsarray of stringsResume keywords missing from the job.

Jobs that fail to scrape (not found, blocked, empty, or filtered out) are not charged and are logged as warnings rather than pushed to the dataset.

Example Output

[
{
"jobKey": "a0a667a4adaa51d5",
"positionName": "Senior Full-Stack Developer (AWS Amplify Gen2 / React / Python)",
"normTitle": "Full Stack Developer",
"company": "National Testing Network",
"salary": "$135,000 - $165,000 a year",
"salaryMin": 135000,
"salaryMax": 165000,
"salaryType": "yearly",
"currency": "USD",
"jobType": "Full-time",
"remote": "Remote",
"location": "Remote",
"city": "Remote",
"state": "",
"countryCode": "US",
"postalCode": "",
"datePublished": "2026-09-13T16:19:55Z",
"dateOnIndeed": "Just posted",
"jobDescription": "...full text...",
"jobDescriptionHtml": "<div>...full HTML...</div>",
"requirements": ["5+ years of React experience", "Bachelor's degree in CS or equivalent"],
"benefits": ["Health insurance", "401(k) matching", "Paid time off"],
"companyHeaderRating": 0,
"reviewsCount": 0,
"companyOverviewLink": "https://www.indeed.com/cmp/National-Testing-Network",
"companyDetailsCeoName": "",
"companyDetailsRevenue": "$100M to $500M",
"companyDetailsIndustry": "Corporate Services & Operations",
"companyDetailsWebsite": "",
"companyDetailsEmployeesCount": "1,000 to 5,000 employees",
"companyDetailsFoundedYear": null,
"externalApplyUrl": "http://www.indeed.com/applystart?jk=a0a667a4adaa51d5&...",
"url": "https://www.indeed.com/viewjob?jk=a0a667a4adaa51d5",
"jobUrl": "https://www.indeed.com/viewjob?jk=a0a667a4adaa51d5",
"resumeMatchScore": 78,
"resumeMatchedKeywords": ["React", "Python", "AWS"],
"resumeMissingKeywords": ["FastAPI"]
}
]

💰 Pricing

MetricPrice
Per successful job scraped (job-scraped)$0.0014
Per 1,000 successful jobs scraped$1.40
Per external apply URL resolved (external-apply-resolved)$0.001
Per 1,000 external apply URLs resolved$1.00
Per Actor start (apify-actor-start)$0.03
  • Pay-per-event: you are charged one job-scraped event ($1.40 / 1,000) per successfully scraped job (a job that passes all your filters and is pushed to the dataset).
  • Optional external-apply-resolved event ($1.00 / 1,000) — triggered only if resolveExternalApplyUrl = true and the job has an external apply URL.
  • apify-actor-start event ($0.03) — flat charge per run.
  • Failed, blocked, empty, or filtered-out jobs are free — no charge.
  • Example: 1,000 successful jobs = $1.40. 10,000 successful jobs = $14.00.
  • Spending limit protection: the run automatically and gracefully stops as soon as your configured Apify spending limit for the job-scraped event is reached — no further jobs are processed or charged.

🛠 How to Use on Apify

  1. Create a task with this actor.
  2. Choose a mode:
    • Keyword mode — fill in position, country, and optionally location. Add keywords for extra searches.
    • URL mode — paste Indeed search URLs into startUrls.
  3. Optional tuning:
    • Set deepSearch = true to add Senior / Lead / Junior variants.
    • Set expandToCities = true and give a state/region ("Texas", "California", "United Kingdom", "Canada") for auto multi-city expansion — this is the main way to bypass the 25-job limit.
    • Set resumeKeywords to enable the resumeMatchScore.
    • Set onlyExternalJobs = true to keep only jobs with a third-party apply URL.
  4. Proxies are configured automatically — the actor requests Apify's RESIDENTIAL proxy group and uses stealth Playwright to avoid IP blocks.
  5. Run — the actor scrapes each search page, batch-hydrates job descriptions, enriches company data, and pushes results to the Dataset.
  6. Export — download as JSON, CSV, or Excel from the Dataset tab.

Running via API

curl -X POST "https://api.apify.com/v2/acts/your-username~indeed-jobs-scraper/runs" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"position": "Senior Full-Stack Developer",
"country": "United States",
"location": "Texas",
"expandToCities": true,
"deepSearch": true,
"maxJobs": 200
}'

🎯 Use Cases

Industry / Use CaseHow It Helps
Recruitment / StaffingBuild pipelines of open roles by keyword, city, and seniority — matched automatically to candidate resumes.
Job BoardsAggregate fresh Indeed listings across multiple regions into your own job board, refreshed daily.
Salary BenchmarkingTrack salary ranges for a given role across cities and companies over time.
Market ResearchAnalyze hiring trends per industry, region, or company.
Competitive IntelligenceMonitor which companies are hiring for which roles and how often.
Lead GenerationExtract company names, ratings, and external apply URLs to build employer outreach lists.
Sales ProspectingTrigger outreach when target companies post new roles in your niche.
Academic ResearchStudy hiring patterns, remote-work adoption, and salary distributions across countries.
Career CoachingFeed resumeKeywords and get a ranked list of best-fit jobs with match scores.
ATS / Apply-flow AutomationGet the true external apply URL for each job to automate applications.

❓ Frequently Asked Questions

1. Do I need an Indeed account? No. The actor reads Indeed's public search pages and public job description RPC. No login, no cookies.

2. How does it bypass Indeed's ~25-job limit? Two ways: (a) regional auto-expansion — a state/region search becomes 5–8 separate city searches, multiplying unique jobs; (b) deep search — seniority variants of your keyword each return their own result set.

3. Why do I need residential proxies? Indeed blocks most datacenter IPs after moderate usage. The actor requests Apify's residential proxy group by default to reduce blocking.

4. Can I scrape jobs across multiple countries in one run? Yes — pass multiple startUrls (e.g., www.indeed.com and uk.indeed.com) or run separate tasks per country. The country field controls the domain built for keyword mode.

5. How are salaries parsed? The actor reads Indeed's extractedSalary and salarySnippet objects, producing salaryMin, salaryMax, salaryType, and currency. Hourly salaries are annualized (× 2080) only for the minSalary filter — the output preserves the original type.

6. What is resumeMatchScore? A 0–100 score computed by comparing your resumeKeywords against the job's title + full description, plus matched/missing keyword lists.

7. Am I charged for jobs that fail or are filtered out? No. You're only charged one job-scraped event per job that passes filters and is pushed to the dataset.

8. What triggers the external-apply-resolved charge? Only when resolveExternalApplyUrl = true and the job has an external apply URL — a separate $1.00 / 1,000 PPE event.

9. What happens when my spending limit is reached? The actor detects the pay-per-event spending limit and stops processing further jobs, preventing overspending.

10. Can I export to CSV or Excel? Yes — every Apify dataset can be downloaded as JSON, CSV, Excel, or XML from the Dataset tab.


📝 Technical Notes

  • Targets: https://{domain}/jobs?q=...&l=... (search) and https://{domain}/rpc/jobdescs?jks=... (descriptions).
  • Parsing strategies: (1) window.mosaic.providerData["mosaic-provider-jobcards"].metaData.mosaicProviderJobCardsModel.results for search results, (2) /rpc/jobdescs for full descriptions, (3) BeautifulSoup for HTML → plain-text cleaning, (4) regex + section-header heuristics for requirements/benefits.
  • Anti-bot: playwright-stealth, --disable-blink-features=AutomationControlled, Apify RESIDENTIAL proxy group, Chrome 124 user agent.
  • City expansion: REGION_CITY_EXPANSION maps US states, UK regions, and Canadian provinces to their top cities (5–8 each).
  • Seniority expansion: SENIORITY_EXPANSIONS adds Senior / Lead / Junior (and optionally Staff / Principal / Manager / Director) variants to the primary keyword.
  • Company enrichment: a curated COMPANY_PROFILES_DATABASE (CEO, revenue, industry, website, employees, founded) with generic fallbacks for unknown companies.
  • Charging: uses Apify's pay-per-event Actor.charge(event_name=...) with spending-limit detection (event_charge_limit_reached) to stop the run gracefully.
  • Output: pushed to the Apify Dataset per successful job as camelCase JSON records.

🌍 Supported Countries

United States, United Kingdom, Canada, Australia, Germany, France, India, Netherlands, Spain, Italy, Brazil, Mexico, Singapore, Switzerland, Japan, Ireland, South Africa, New Zealand, Sweden, Belgium, Austria, Poland, Portugal, Argentina, Chile, Colombia, Hong Kong, Malaysia, Philippines, Saudi Arabia, United Arab Emirates.


🏙️ Regional Auto-Expansion

When expandToCities = true and location matches a known region, the actor runs separate searches across the region's top cities — this is the primary mechanism to bypass Indeed's 25-job-per-page cap.

RegionAuto-expands to
TexasHouston, Dallas, Austin, San Antonio, Fort Worth, Plano, Arlington, El Paso
CaliforniaLos Angeles, San Francisco, San Diego, San Jose, Sacramento, Irvine, Oakland
FloridaMiami, Orlando, Tampa, Jacksonville, Fort Lauderdale, St. Petersburg
New YorkNew York, Brooklyn, Queens, Buffalo, Rochester, Albany
IllinoisChicago, Aurora, Naperville, Rockford, Joliet
WashingtonSeattle, Bellevue, Spokane, Tacoma
GeorgiaAtlanta, Alpharetta, Savannah, Marietta
United KingdomLondon, Manchester, Birmingham, Leeds, Glasgow, Edinburgh, Bristol, Liverpool
CanadaToronto, Vancouver, Montreal, Calgary, Ottawa, Edmonton

🔍 SEO Keywords

Indeed Jobs Scraper, Indeed scraper, job scraper, Apify Indeed actor, bypass Indeed 25 job limit, Indeed keyword search, Indeed URL scraper, multi-country job scraper, job posting scraper, salary data scraper, remote job scraper, ATS apply URL, external apply URL scraper, company profile enrichment, resume match score, Indeed RSS alternative, hiring data API, recruitment data, pay per event scraper, residential proxy job scraper



Start scraping Indeed jobs today — only $1.40 per 1,000 successful jobs, with 60+ countries, city auto-expansion, full descriptions, and resume match scoring built in.