Indeed Jobs Scraper avatar

Indeed Jobs Scraper

Pricing

from $2.30 / 1,000 job scrapeds

Go to Apify Store
Indeed Jobs Scraper

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

ParseBird

Maintained by Community

Actor 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,freelance
level: entry_level,mid_level,senior_level (US only) | sort: relevance,date | fromDays: 1,3,7,14 | remote: remote,hybrid
Output: 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 editionsus, 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.

ParameterTypeRequiredDefaultDescription
urlsarrayOption A[]Indeed search URLs (.../jobs?q=...&l=...) or company URLs (.../cmp/<Company>/jobs). Filters embedded in the URL are applied.
maxRowsPerUrlintegerNo50Max jobs to scrape per URL in urls.
querystringOption BJob title, skill, or company keyword, e.g. "data analyst".
countrystringOption BusIndeed 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.
locationstringNoCity, state, or postal code, e.g. "San Francisco, CA".
radiusstringNo25Miles from location: 0, 5, 10, 15, 25, 35, 50, 100.
jobTypestringNofulltime, parttime, contract, internship, temporary, permanent, seasonal, freelance.
levelstringNoentry_level, mid_level, senior_level. United States edition only.
remotestringNoremote or hybrid.
sortstringNorelevancerelevance or date.
fromDaysstringNoOnly jobs posted within 1, 3, 7, 14 days.
maxRowsintegerNo100Max jobs to scrape for the Option B search (hard cap 5000).
enableUniqueJobsbooleanNofalseAlso drop repostings of the same title at the same company.
proxyConfigurationobjectNoApify ProxyProxy 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

FieldTypeDescription
titlestringJob title.
isRemotebooleanWhether the job is remote-eligible (from attributes and location).
jobTypestring[]Human labels Indeed applied, e.g. Full-time, Contract, plus Remote / Hybrid.
companyNamestringEmployer name.
companyUrlstringIndeed company profile URL.
companyLogoUrl / companyHeaderUrlstringCompany images.
emailsstring[]Emails found in the job description.
companyAddressesstring[]Employer addresses from the company profile.
companyNumEmployeesstringEmployee count band, e.g. 1,001 to 5,000.
companyRevenuestringRevenue band, e.g. $500M to $1B (USD).
companyIndustrystringIndustry label.
companyDescription / companyBriefDescriptionstringCompany summary.
companyLinksobjectcorporateWebsite when available.
companyCeoobjectname, photoUrl, startDate.
locationobjectcountryCode, country, city, admin1Code, postalCode, latitude, longitude, streetAddress, formattedAddressShort, formattedAddressLong, fullAddress.
benefitsstring[]Benefits detected in the job attributes.
occupationstring[]Indeed occupation categories.
attributesstring[]All skill / qualification / tag attributes.
shiftAndSchedulestring[]Shift and schedule attributes.
descriptionText / descriptionHtmlstringJob description, plain text and HTML.
salaryobjectsalaryText, salaryType, salaryMin, salaryMax, salarySource (EXTRACTION = employer-stated, ESTIMATION = Indeed estimate), salaryCurrency. null when no salary is shown.
agestringRelative age, e.g. Just posted, 3 days ago, 30+ days ago.
postedTodaybooleanPosted today.
datePublishedstringYYYY-MM-DD.
hiringDemandobjectisUrgentHire, isHighVolumeHiring.
expiredbooleanListing no longer active.
scrapingInfoobjectpage and index where the job was found.
sourcestringWhere the listing originated (ATS / job board / company).
jobUrlstringIndeed job URL.
applyUrlstringDirect apply / view URL when available.
jobKeystringIndeed job identifier.
language / localestringJob 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

  1. You provide either a list of Indeed URLs or an Option B search (keyword + country + filters).
  2. For each task, the Actor queries Indeed's mobile job-search data source for the chosen country edition.
  3. Job type, remote/hybrid, and date filters are applied — server-side where Indeed allows it, otherwise on the returned results.
  4. Company URLs are matched by company name; only that company's listings are kept.
  5. Results are paginated until maxRows (or maxRowsPerUrl) is reached, deduplicated by job key, transformed into the output schema, and pushed to the dataset.
  6. 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 ApifyClient
client = 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.

PlanPrice per jobPrice 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.

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.