Indeed Jobs Scraper
Pricing
from $1.20 / 1,000 job returneds
Indeed Jobs Scraper
Export Indeed job listings with salary, location, job type and posting date. Returns roughly 4x a single Indeed search by fanning the query across filters. No Indeed account needed.
Pricing
from $1.20 / 1,000 job returneds
Rating
0.0
(0)
Developer
丂卩ㄖㄖҜㄚ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
Export Indeed job listings as structured data: title, company, location, salary, job type, posting date and a description snippet. No Indeed account needed.
What you get
One row per job, deduplicated:
| Field | Notes |
|---|---|
jobId | Indeed's own job key, stable across runs |
title, company, location | |
remote | True when the listing is remote, from the flag or the location text |
jobTypes | Full-time, Part-time, Contract and so on, as Indeed lists them |
salaryText | The salary exactly as shown, for example "£45,000 - £55,000 a year" |
salaryMin, salaryMax, salaryCurrency | Parsed figures where Indeed gives them |
postedRelative, postedAt | "2 days ago", plus an ISO timestamp when available |
snippet | The short description Indeed shows on the card |
url | Direct link to the listing |
How it gets more than 15 jobs
An Indeed search shows 15 jobs, and page two requires a signed in account. Rather than ask you for Indeed credentials, this actor runs your search across several filters that split the results a different way, then merges and deduplicates them.
A typical city and job title returns around 60 unique jobs. The run stops early once the filters stop producing anything new, so you are not charged for queries that add nothing.
If you need more than that for one job title, run it per city rather than trying to go deeper in one place.
Pricing
You pay per unique job returned. Duplicates across filters are removed before charging, so one job is charged once no matter how many filters it appeared in. Set maxResults to cap what a run can cost.
Runs that return nothing cost nothing.
Input
{"query": "data analyst","location": "London","country": "uk","maxResults": 100}
Either query or location is required.
| Field | Type | Default | What it does |
|---|---|---|---|
query | string | What to search for, exactly as you would type it into the Indeed search box | |
location | string | A city, region or postcode to search near | |
country | string | uk | Which national Indeed site to search, as a two letter code. Match it to the location |
maxResults | integer | 100 | The most jobs to return, which is also the most a run can charge |
Output
One row per job in the dataset. A typical row:
{"jobId": "d21e90a08011fc27","title": "Data Analyst","company": "Example Analytics Ltd","location": "London","remote": false,"jobTypes": ["Full-time"],"salaryText": "£45,000 - £55,000 a year","salaryMin": 45000,"salaryMax": 55000,"salaryCurrency": "GBP","salaryPeriod": "year","postedRelative": "3 days ago","postedAt": "2026-08-07T00:00:00.000Z","snippet": "We are looking for a data analyst to join...","url": "https://uk.indeed.com/viewjob?jk=d21e90a08011fc27"}
Download it from the run as JSON, CSV or Excel, or read it straight from the API.
Run it from the API
curl -X POST "https://api.apify.com/v2/acts/spookyweb~indeed-jobs/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"query": "data analyst", "location": "London", "country": "uk", "maxResults": 100}'
Or with the Apify client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('spookyweb/indeed-jobs').call({query: 'data analyst',location: 'London',country: 'uk',maxResults: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Notes
Occasionally a run is blocked before it starts, which shows up as an error saying every request was blocked. That is a bad proxy address rather than a problem with your input, and running it again normally works.