Indeed Jobs Scraper
Pricing
from $2.30 / 1,000 job scrapeds
Indeed Jobs Scraper
Scrape Indeed job listings and company data by search URL or by keyword, country, location, radius, job type, experience level, remote status, and date posted. Export as JSON, CSV, or Excel.
Pricing
from $2.30 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
ParseBird
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
Indeed Jobs Scraper
Scrape structured job data from Indeed — the world's largest job site — by pasting search URLs or by building a search from a keyword, country, location, and filters. Get job titles, salaries, full descriptions, company profiles, benefits, locations with coordinates, and apply links as clean JSON, CSV, or Excel.
| Search 60+ Indeed country editions by keyword, location, radius, job type, experience level, remote status, and date posted — or drop in ready-made Indeed search and company URLs — and export 40+ fields per job including structured salary, company size, revenue, industry, CEO, and benefits. |
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this Actor.
Actor: parsebird/indeed-jobs-scraper (Apify). Scrapes Indeed job listings. Call it with ApifyClient.Two input modes:Option A (URLs): { "urls": ["https://www.indeed.com/jobs?q=developer&l=Austin%2C+TX", "https://www.indeed.com/cmp/Google/jobs"], "maxRowsPerUrl": 50 }Option B (search): { "query": "data analyst", "country": "us", "location": "New York, NY", "radius": "25", "jobType": "fulltime", "level": "senior_level", "remote": "remote", "sort": "date", "fromDays": "7", "maxRows": 100, "enableUniqueJobs": false }`query` + `country` are required for Option B. `country` is a 2-letter code (us, uk, ca, de, fr, in, au, ...). Enums:radius: 0,5,10,15,25,35,50,100 | jobType: fulltime,parttime,contract,internship,temporary,permanent,seasonal,freelancelevel: entry_level,mid_level,senior_level (US only) | sort: relevance,date | fromDays: 1,3,7,14 | remote: remote,hybridOutput: one dataset item per job — title, companyName, companyUrl, companyLogoUrl, salary{salaryMin,salaryMax,salaryType,salaryCurrency,salarySource},location{city,admin1Code,postalCode,latitude,longitude,formattedAddressLong}, descriptionText, descriptionHtml, jobType[], isRemote,benefits[], occupation[], attributes[], hiringDemand{isUrgentHire,isHighVolumeHiring}, datePublished, age, postedToday, expired,companyNumEmployees, companyRevenue, companyIndustry, companyCeo, companyLinks, emails[], jobUrl, applyUrl, jobKey, language, locale.Pricing: pay-per-result. API docs: https://apify.com/parsebird/indeed-jobs-scraper/api Token: https://console.apify.com/account/integrations
What does Indeed Jobs Scraper do?
This Actor extracts job postings and the company data attached to them from Indeed. It uses Indeed's own mobile data source, so results are structured and complete — no brittle HTML parsing, no missing fields.
- 🔎 Two ways to search — paste Indeed search/company URLs (Option A), or set a keyword plus filters and let the Actor build the search (Option B).
- 🌍 60+ country editions —
us,uk,ca,de,fr,in,au,nl,es,it,br,mx,jp, and more. - 🧰 Full filter set — job title keyword, location, radius, job type, experience level, remote/hybrid, posted-within-N-days, and relevance/date sorting.
- 💸 Structured salary — minimum, maximum, pay period, currency, and whether the figure is employer-stated or an Indeed estimate.
- 🏢 Company enrichment on every job — logo, header image, size, revenue, industry, short description, CEO, corporate website.
- 📍 Geocoded locations — city, state code, postal code, latitude, longitude, and a formatted full address.
- 🧾 Rich job metadata — benefits, occupation categories, skill attributes, shift & schedule, urgent/high-volume hiring flags, expired status.
- 🧹 Deduplication — skips repeated job keys automatically, and optionally repostings of the same title at the same company.
How is this different from copying Indeed by hand?
Indeed shows ~15 jobs per page and hides most structured data behind the job detail view. This Actor returns hundreds of fully-enriched jobs per run, each with a plain-text and an HTML description, a parsed salary object, and a full company profile — ready for a spreadsheet, a database, or a model.
Input parameters
query and country are required unless you provide urls. When urls is set, all Option B parameters are ignored.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| urls | array | Option A | [] | Indeed search URLs (.../jobs?q=...&l=...) or company URLs (.../cmp/<Company>/jobs). Filters embedded in the URL are applied. |
| maxRowsPerUrl | integer | No | 50 | Max jobs to scrape per URL in urls. |
| query | string | Option B | — | Job title, skill, or company keyword, e.g. "data analyst". |
| country | string | Option B | us | Indeed country edition. 2-letter code — ar, au, at, bh, be, br, ca, cl, cn, co, cr, cz, dk, ec, eg, fi, fr, de, gr, hk, hu, in, id, ie, il, it, jp, kw, lu, my, mx, ma, nl, nz, ng, no, om, pk, pa, pe, ph, pl, pt, qa, ro, sa, sg, za, kr, es, se, ch, tw, th, tr, ua, ae, uk, us, uy, ve, vn. |
| location | string | No | — | City, state, or postal code, e.g. "San Francisco, CA". |
| radius | string | No | 25 | Miles from location: 0, 5, 10, 15, 25, 35, 50, 100. |
| jobType | string | No | — | fulltime, parttime, contract, internship, temporary, permanent, seasonal, freelance. |
| level | string | No | — | entry_level, mid_level, senior_level. United States edition only. |
| remote | string | No | — | remote or hybrid. |
| sort | string | No | relevance | relevance or date. |
| fromDays | string | No | — | Only jobs posted within 1, 3, 7, 14 days. |
| maxRows | integer | No | 100 | Max jobs to scrape for the Option B search (hard cap 5000). |
| enableUniqueJobs | boolean | No | false | Also drop repostings of the same title at the same company. |
| proxyConfiguration | object | No | Apify Proxy | Proxy settings. Apify Proxy (automatic) is recommended and sufficient. |
Input example (URL-based)
{"urls": ["https://www.indeed.com/jobs?q=developer&l=Remote","https://www.indeed.com/cmp/Google/jobs"],"maxRowsPerUrl": 50}
Input example (search parameters)
{"query": "data analyst","country": "us","location": "New York, NY","radius": "25","jobType": "fulltime","sort": "date","fromDays": "7","remote": "remote","maxRows": 100}
Output example
{"title": "Senior Data Analyst","isRemote": true,"jobType": ["Full-time", "Remote"],"companyName": "Acme Analytics","companyUrl": "https://www.indeed.com/cmp/Acme-Analytics","companyLogoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/abc123","companyHeaderUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_headerimage/1960x400/def456","emails": ["talent@acme.example"],"companyAddresses": ["Dallas, TX"],"companyNumEmployees": "1,001 to 5,000","companyRevenue": "$500M to $1B (USD)","companyIndustry": "Information Technology","companyDescription": "Acme Analytics helps teams turn raw data into decisions.","companyBriefDescription": "Acme Analytics helps teams turn raw data into decisions.","companyLinks": { "corporateWebsite": "https://acme.example" },"companyCeo": { "name": "Jordan Lee", "photoUrl": "https://.../ceo.jpg", "startDate": null },"location": {"countryCode": "US","country": "United States","city": "Dallas","admin1Code": "TX","postalCode": "75201","latitude": 32.7810,"longitude": -96.7969,"streetAddress": "500 Main St","formattedAddressShort": "Dallas, TX","formattedAddressLong": "Dallas, TX 75201","fullAddress": "500 Main St, Dallas, TX 75201"},"benefits": ["Health insurance", "401(k)", "Paid time off"],"occupation": ["Data & Database Occupations", "Technology Occupations"],"attributes": ["SQL", "Python", "Tableau", "Bachelor's degree", "5 years"],"shiftAndSchedule": ["Monday to Friday"],"descriptionText": "We are hiring a Senior Data Analyst to ...","descriptionHtml": "<p>We are hiring a Senior Data Analyst to ...</p>","salary": {"salaryText": null,"salaryType": "yearly","salaryMin": 110000.0,"salaryMax": 140000.0,"salarySource": "EXTRACTION","salaryCurrency": "USD"},"age": "Just posted","postedToday": true,"datePublished": "2026-08-28","hiringDemand": { "isUrgentHire": false, "isHighVolumeHiring": true },"expired": false,"scrapingInfo": { "page": 0, "index": 3 },"source": "Acme Analytics","jobUrl": "https://www.indeed.com/viewjob?jk=1e6e49448374145b","applyUrl": "https://acme.example/careers/senior-data-analyst","jobKey": "1e6e49448374145b","language": "en","locale": "en_US"}
Output fields
| Field | Type | Description |
|---|---|---|
| title | string | Job title. |
| isRemote | boolean | Whether the job is remote-eligible (from attributes and location). |
| jobType | string[] | Human labels Indeed applied, e.g. Full-time, Contract, plus Remote / Hybrid. |
| companyName | string | Employer name. |
| companyUrl | string | Indeed company profile URL. |
| companyLogoUrl / companyHeaderUrl | string | Company images. |
| emails | string[] | Emails found in the job description. |
| companyAddresses | string[] | Employer addresses from the company profile. |
| companyNumEmployees | string | Employee count band, e.g. 1,001 to 5,000. |
| companyRevenue | string | Revenue band, e.g. $500M to $1B (USD). |
| companyIndustry | string | Industry label. |
| companyDescription / companyBriefDescription | string | Company summary. |
| companyLinks | object | corporateWebsite when available. |
| companyCeo | object | name, photoUrl, startDate. |
| location | object | countryCode, country, city, admin1Code, postalCode, latitude, longitude, streetAddress, formattedAddressShort, formattedAddressLong, fullAddress. |
| benefits | string[] | Benefits detected in the job attributes. |
| occupation | string[] | Indeed occupation categories. |
| attributes | string[] | All skill / qualification / tag attributes. |
| shiftAndSchedule | string[] | Shift and schedule attributes. |
| descriptionText / descriptionHtml | string | Job description, plain text and HTML. |
| salary | object | salaryText, salaryType, salaryMin, salaryMax, salarySource (EXTRACTION = employer-stated, ESTIMATION = Indeed estimate), salaryCurrency. null when no salary is shown. |
| age | string | Relative age, e.g. Just posted, 3 days ago, 30+ days ago. |
| postedToday | boolean | Posted today. |
| datePublished | string | YYYY-MM-DD. |
| hiringDemand | object | isUrgentHire, isHighVolumeHiring. |
| expired | boolean | Listing no longer active. |
| scrapingInfo | object | page and index where the job was found. |
| source | string | Where the listing originated (ATS / job board / company). |
| jobUrl | string | Indeed job URL. |
| applyUrl | string | Direct apply / view URL when available. |
| jobKey | string | Indeed job identifier. |
| language / locale | string | Job language and locale, e.g. en, en_US. |
Use cases
- Job market research — track salary ranges, hiring volume, and in-demand skills by role, city, or industry.
- Recruiting & sourcing — monitor competitor job openings and build talent-market maps.
- Job boards & aggregators — ingest fresh, structured listings for a niche vertical.
- Lead generation — companies that are hiring are companies that are spending; enrich them with size, revenue, and website.
- AI & LLM pipelines — feed clean job descriptions and structured salary data into embeddings, RAG, or fine-tuning sets.
- Alerting — schedule the Actor and get notified when new jobs match a saved search.
How it works
- You provide either a list of Indeed URLs or an Option B search (keyword + country + filters).
- For each task, the Actor queries Indeed's mobile job-search data source for the chosen country edition.
- Job type, remote/hybrid, and date filters are applied — server-side where Indeed allows it, otherwise on the returned results.
- Company URLs are matched by company name; only that company's listings are kept.
- Results are paginated until
maxRows(ormaxRowsPerUrl) is reached, deduplicated by job key, transformed into the output schema, and pushed to the dataset. - Export from the Apify Console or API as JSON, CSV, Excel, or feed them straight into your integrations.
Using the Actor via API
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run_input = {"query": "registered nurse","country": "us","location": "Dallas, TX","radius": "25","sort": "date","maxRows": 100,}run = client.actor("parsebird/indeed-jobs-scraper").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], "—", item["companyName"], "—", item.get("salary"))
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const input = {urls: ['https://www.indeed.com/jobs?q=software+engineer&l=Remote'],maxRowsPerUrl: 50,};const run = await client.actor('parsebird/indeed-jobs-scraper').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
The Actor runs on the Apify platform, so you also get scheduling, a full REST API, webhooks, and native integrations with Make, Zapier, Google Sheets, Slack, and more. Results export as JSON, CSV, Excel, XML, or RSS.
Pricing
This Actor uses the pay-per-result pricing model — you are charged per job scraped, regardless of compute time.
| Plan | Price per job | Price per 1,000 jobs |
|---|---|---|
| Free | $0.003 | $3.00 |
| Bronze | $0.0027 | $2.70 |
| Silver | $0.0025 | $2.50 |
| Gold | $0.0023 | $2.30 |
A job is counted when it is pushed to the dataset. Scraping 1,000 jobs on the Free plan costs about $3.00. Runs that return no data cost nothing beyond a few seconds of platform usage.
FAQ
Do I need Indeed login credentials or an API key? No. You only need an Apify account.
Which countries are supported?
60+ Indeed country editions — see the country list in the input table. Use the 2-letter code for the edition you want.
Can I scrape a specific company's jobs?
Yes. Put the company URL (e.g. https://www.indeed.com/cmp/Google/jobs) in urls. The Actor keeps only listings from that company.
How fresh are the results?
Live — every run queries Indeed directly. Use fromDays and sort: "date" to focus on the newest postings.
Why is salary sometimes null?
Many Indeed postings do not display a salary. When present, salarySource tells you whether the figure is employer-stated (EXTRACTION) or an Indeed estimate (ESTIMATION).
Why do some jobs have an empty benefits or companyCeo?
Indeed only attaches that data to some postings and some companies. Fields with no data are returned empty or null rather than guessed.
Can I filter by experience level outside the US?
Indeed only exposes the entry/mid/senior filter on its United States edition, so level is applied for country: "us" only.
Can I schedule recurring runs? Yes. Use Apify's scheduler to run the Actor hourly, daily, or on any cron expression, and connect a webhook or integration to route new jobs onward.
How large can a run be? Up to 5,000 jobs per run. For more, split the work across multiple searches (by location, role, or date window) and schedule them.
Related Actors
- Hiring.cafe Scraper — aggregated tech and startup jobs with 20+ filters.
- We Work Remotely Jobs Scraper — remote-only job board.
- Wellfound Jobs Scraper — startup jobs from Wellfound (AngelList Talent).
- Naukri Jobs Scraper — India's largest job portal.
- Browse the full ParseBird publisher page for more scrapers.
Legal and compliance
This Actor collects only publicly available job listings and company information from Indeed — data that any visitor can view without logging in. It does not access private data or bypass authentication. You are responsible for using the scraped data in accordance with Indeed's terms, applicable laws (including the GDPR and CCPA where relevant), and the purpose limitations that apply to personal data. Do not use the output to spam candidates or employers. If you plan to scrape at scale or for commercial redistribution, seek legal advice first.