Indeed Jobs Scraper - 11 Countries, Salary & Apply URL
Pricing
from $4.00 / 1,000 job returneds
Indeed Jobs Scraper - 11 Countries, Salary & Apply URL
Scrape Indeed jobs by keyword and location. It works on all 11 country sites. Each job has title, company, location and the apply link. You also get salary when posted, job type, benefits and a remote flag. It reads Indeed's own JSON, not the page HTML. $4.00 per 1,000 jobs.
Pricing
from $4.00 / 1,000 job returneds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Indeed Jobs Scraper
window.mosaic.providerData["mosaic-provider-jobcards"] is where an Indeed results page keeps its jobs, as JSON, before a single card renders. This actor takes them from there instead of parsing rendered HTML, on all eleven country sites: US, UK, Canada, Germany, France, Australia, India, Netherlands, Spain, Italy and Ireland. You supply a keyword and a location. Each posting comes back as a row with the salary, the benefits list and the employer's star rating attached, where Indeed publishes them.
Indeed sits behind Cloudflare, which is why most HTTP scrapers hand you a Just a moment… page. This one reads Indeed's own in-page job data over a Chrome TLS fingerprint, takes a fresh exit address for every page, and falls back to a real browser when a page keeps refusing.
What you get per job
| Field | Notes |
|---|---|
jobId | Indeed's jk key. Stable, good as a primary key. |
title, company, location | As shown on the card. |
salary | The posted range or estimate, e.g. $140,000 - $215,000 a year. Often null — plenty of employers don't post pay. |
jobTypes | Array, e.g. ["Full-time"]. Empty when the card doesn't say. |
benefits | Array, e.g. ["401(k)","Health insurance","Paid time off"]. |
remote | Boolean, taken from Indeed's own remote attribute or the location text. |
postedText | As shown, e.g. 30+ days ago. Not a timestamp. |
snippet | The description excerpt from the card. |
companyRating, companyReviewCount | Indeed's employer rating out of 5 and how many reviews it's based on. null for companies without one. |
url | https://<site>/viewjob?jk=<jobId>. |
Real row from a software engineer / New York run:
{"ok": true,"jobId": "b709e7cb840be77f","title": "Sr. Backend Engineer - Charlotte AI (Hybrid, EST)","company": "CrowdStrike","location": "New York State","salary": "$140,000 - $215,000 a year","jobTypes": ["Full-time"],"benefits": ["401(k)", "Parental leave", "Health insurance", "Paid time off"],"remote": true,"postedText": "30+ days ago","snippet": "Building globally distributed, fault-tolerant, highly scalable cloud ecosystems…","companyRating": 3.8,"companyReviewCount": 55,"url": "https://www.indeed.com/viewjob?jk=b709e7cb840be77f"}
Input
{"query": "software engineer","location": "New York","country": "us","maxItems": 100}
| Field | Default | Notes |
|---|---|---|
query | required | Job title or keywords. |
location | empty | City, state, or remote. Leave it blank to search the whole country. |
country | us | us, uk, ca, de, fr, au, in, nl, es, it, ie. |
maxItems | 50 | 1 to 1000. Indeed pages ten at a time. |
proxyConfiguration | Apify datacenter | The actor rotates addresses itself. Put your own servers in proxyUrls if you have them; metered residential groups aren't offered. |
notionConnector / notionParentId | — | Optional delivery into Notion via an Apify MCP connector. |
Limits worth knowing
- Card data only. The full job description is on the detail page and isn't fetched.
salary,companyRatingandcompanyReviewCountare blank on a large share of rows. Plenty of employers never fill them in, and nothing can recover a field the posting doesn't carry.- The browser locale is always en-US, whichever country you pick. That changes how relative dates are phrased, not which country's jobs you get.
- Fewer results than
maxItemsis normal. Indeed rate-limits per session as well as per address: a client that gets page one fine can be refused on page two. The run rotates and retries, then keeps what it has rather than throwing it away. - Blocked runs cost nothing. If Cloudflare refuses every address, you get one
ok: falserow witherrorCode: "BLOCKED"and no charge. Re-running usually lands on friendlier addresses; if you need reliability at volume, supply your own residential proxies inproxyConfiguration.proxyUrls.
Billing
$4.00 per 1,000 jobs ($0.004 each). Flat on every plan.
The per-job price is the whole bill. Browser time, proxy rotation and the retries after a block are already inside it, and none of them turn up as a separate line.
Only rows with ok: true are charged. BLOCKED, NO_RESULTS and BAD_INPUT rows are free.