Indeed Jobs Scraper avatar

Indeed Jobs Scraper

Pricing

from $3.40 / 1,000 results

Go to Apify Store
Indeed Jobs Scraper

Indeed Jobs Scraper

Extract Indeed job listings at 100 jobs/sec across all 63 countries. No proxies needed. Returns the full job payload including compensation models, geodata, occupation taxonomy, employer recruit data, and hidden fields not available via standard scraping.

Pricing

from $3.40 / 1,000 results

Rating

0.0

(0)

Developer

Metaretica

Metaretica

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Indeed Jobs Scraper — 100 jobs/sec · All 63 countries · Full field coverage

Extract job listings directly from Indeed's internal API — including fields not exposed in the public UI — at up to 100 jobs per second, across all 63 countries Indeed operates in. No proxies required. Works with or without a search query.

Try it free →


What does this Indeed scraper do?

This Actor extracts the full job listing payload for any country Indeed supports, including fields not surfaced in the standard Indeed UI. Output includes compensation models, administrative geodata, employer-submitted recruit data, occupation taxonomies, and auction metadata.

You can run it two ways:

  • With a query — search for specific roles, companies, or keywords, filtered by country, location, date range, and more
  • Without a query — retrieve the full job stock for any of the 63 supported countries

Because the data is deeply nested (compensation union types, admin1–4 location hierarchy, multi-field recruit block, occupations array), JSON is the recommended output format. CSV and Excel exports are available through the Apify platform but will flatten or truncate nested fields.


What data does this scraper extract?

The Actor returns the complete job listing payload per result. Below is a full field reference.

Job essentials

FieldDescription
job.keyIndeed's unique job key (jk)
job.titleOriginal job title as submitted by the employer
job.displayTitleIndeed's formatted display title
job.normalizedTitleIndeed's normalized title (lowercase, canonical form)
job.normalizedCategoryBroad category (e.g. food, tech)
job.languageLanguage code of the listing (e.g. fr, en)
job.expiredWhether the listing is still active
job.datePublishedOriginal publication timestamp (milliseconds)
job.dateOnIndeedTimestamp when the job was ingested into Indeed's index
job.dateLastAnnotatedTimestamp of Indeed's last internal annotation update
job.refNumEmployer's own reference number for the listing
job.urlEmployer's original job posting URL
job.attributesArray of { key, label } tags (job type, benefits, skills, etc.)

Employer

FieldDescription
job.employer.nameCompany name as registered on Indeed
job.employer.keyIndeed's internal employer key
job.sourceEmployerNameEmployer name as it appears in the source feed

Recruit block (employer-submitted data)

The recruit block contains data submitted directly by the employer, which may differ from Indeed's own normalized fields.

FieldDescription
job.recruit.titleEmployer's own job title (may differ from job.title)
job.recruit.employerNameEmployer name from the recruit feed
job.recruit.viewJobUrlDirect URL to the employer's job posting
job.recruit.experienceExperience requirement string
job.recruit.expirationDateEmployer-set expiration date
job.recruit.workScheduleWork schedule information
job.recruit.detailedSalaryDetailed salary from the employer's own data
job.recruit.commuteInformationCommute details when provided
job.recruit.photoUrlArray of employer-provided photo URLs

Compensation

Compensation is returned as a structured object. The baseSalary.range field uses union types — each result will be one of Range (min + max), AtLeast (min only), AtMost (max only), or Exactly (single value).

FieldDescription
job.compensation.baseSalary.rangeSalary range union: { min, max } / { min } / { max } / { value }
job.compensation.baseSalary.unitOfWorkPay period: YEAR, MONTH, HOUR, etc.
job.compensation.currencyCodeISO currency code (e.g. EUR, USD, GBP)
job.compensation.formattedTextHuman-readable salary string when available
job.compensation.salarySourceHow Indeed obtained the salary figure
job.compensation.estimated.baseSalaryIndeed's estimated salary when employer did not provide one
job.compensation.estimated.formattedTextFormatted estimated salary string
job.compensation.keyBase64-encoded compensation protobuf (full internal salary model)

Location

The location block includes a full administrative hierarchy — useful for regional filtering and geodata pipelines.

FieldDescription
job.location.cityCity name
job.location.postalCodePostal / ZIP code
job.location.neighborhoodNeighborhood when available
job.location.streetAddressStreet address when available
job.location.countryCodeISO country code (e.g. FR, DE, US)
job.location.countryNameFull country name
job.location.admin1CodeLevel-1 administrative division code (region / state)
job.location.admin1NameLevel-1 administrative division name
job.location.admin2CodeLevel-2 administrative division code (department / county)
job.location.admin2NameLevel-2 administrative division name
job.location.admin3CodeLevel-3 subdivision code when available
job.location.admin3NameLevel-3 subdivision name when available
job.location.admin4CodeLevel-4 subdivision code when available
job.location.admin4NameLevel-4 subdivision name when available
job.location.latitudeLatitude coordinate
job.location.longitudeLongitude coordinate
job.location.formatted.shortShort formatted location (e.g. Grenoble (38))
job.location.formatted.longLong formatted location (e.g. 38100 Grenoble)

Job description

FieldDescription
job.description.htmlFull job description as HTML
job.description.textFull job description as plain text
job.description.hash3232-bit hash of the description (useful for deduplication)

Occupations & attributes

FieldDescription
job.occupationsArray of { key, label } — Indeed's occupation taxonomy
job.attributesArray of { key, label } — tags for job type, benefits, skills, schedules, work arrangements

Occupation categories

Indeed's occupation taxonomy is organized into 23 top-level categories, each subdivided up to 6 tiers. The occupations array on each listing may contain one or more entries at any tier level.

Tier 1 categorySUID
Architecture & EngineeringHY4VD
Business Operations & ManagementMGTWW
Cleaning & Grounds Maintenance67D4Z
Community & Human ServicesBCMJX
Construction & ExtractionSZ69B
Education & InstructionAB5HX
Farming, Fishing & Forestry5FNC8
Finance & Accounting6YCJB
Food & BeverageNPKCD
HealthcareCFV7X
LegalW727U
Manufacturing & Utilities6XYW3
Marketing, Advertising & Public RelationsW83QK
Media, Arts & DesignSWYS8
Personal ServiceDSCP2
Protective & SecurityHNQ6F
Repair, Maintenance & InstallationYAQ96
Sales & RetailNTGY4
Science & Research585N6
Supply Chain & LogisticsTVT66
TechnologyEHPW9
TransportationCKA43
Travel, Attractions & EventsFYPW9

→ Full occupation SUID reference (all tiers): docs.indeed.com/job-sync-api/reference/occupations

Attribute categories

The attributes array uses 5-character SUIDs drawn from Indeed's search attribute taxonomy. Attributes cover:

  • Technical skills — programming languages, software tools, certifications (e.g. GFRKJ AWS, RY9MK Linux, HT6WW Machine learning)
  • Benefits & perks — remote work, company housing, transport allowance, restaurant d'entreprise
  • Work arrangements — flextime, part-time, side-job friendly
  • Requirements — licenses, education level, experience thresholds
  • Schedule options — shift patterns, on-call, overtime (see Shifts & schedules below)
  • Job characteristics — entry-level, management experience required, bilingual

→ Full attribute SUID reference (58 categories): docs.indeed.com/job-sync-api/reference/search-attributes

Shifts & schedules

Schedule-related attributes that commonly appear in the attributes array:

ConceptSUIDApplies in
Weekly schedule
Monday to FridaySAP7AAT, AU, BE, BR, CA, CH, DE, DK, ES, FR, GB, HK, IE, IN, IT, MX, MY, NL, NO, NZ, PH, PL, PT, SE, SG, US
Weekend availability7SRRRAT, AU, BE, BR, CA, CH, DE, DK, ES, FR, GB, HK, IE, IN, IT, JP, MX, MY, NL, NO, NZ, PH, PL, PT, SE, SG, US
Weekends only5HX7DAT, AU, BE, BR, CA, CH, DE, DK, ES, FR, GB, HK, IE, IN, IT, MX, NL, NZ, PL, PT, SE, US
No weekendsFM8WHAT, AU, CA, CH, DE, FR, GB, IE, IT, NZ, PL, US
FlextimeHY5VTBE, CA, DE, DK, ES, FR, GB, IE, IT, JP, NL, NO, PH, PL, PT, US
Shift systemSUDVYAU, BE, BR, DE, ES, FI, HK, HU, IN, IT, JP, MX, NL, NO, NZ, PH, PL, PT, SE, SG, UA
Shift length
8 hour shift5GUGEAT, AU, BR, CA, CH, DE, ES, FR, GB, IE, MX, NZ, PH, PL, PT, US
10 hour shiftEQHS8AT, AU, CA, CH, DE, ES, FR, GB, IE, MX, NZ, PH, PL, US
12 hour shift4XK2YAT, AU, BR, CA, CH, DE, ES, FR, GB, IE, MX, NZ, PH, PL, PT, US
Shift time
Morning shiftFDF8VAU, CA, CH, DE, FR, HK, IN, JP, MX, MY, NZ, PH, PL, SG, US
Day shiftPMS5QAT, AU, BE, BR, CA, CH, DE, ES, FR, GB, HK, IE, IN, IT, JP, MX, MY, NL, NZ, PH, PL, PT, SE, SG, US
Evening shiftK8AKPAT, AU, BE, CA, CH, DE, FR, IE, IN, JP, MY, NL, NZ, PH, SE, US
Night shiftH3N5UAT, AU, BE, BR, CA, CH, DE, DK, ES, FR, GB, HK, IE, IN, IT, JP, MX, MY, NL, NO, NZ, PH, PL, PT, SE, SG, US
Rotating shiftJCVZEAU, CA, FR, GB, IN, MX, MY, NZ, PH, RU, UA, US
Supplemental
On callVZD9QAT, AU, BE, CA, CH, DE, ES, HK, IE, MX, MY, NL, NZ, PH, SE, SG, US
Overtime5WFZMAT, AU, BE, CA, CH, DE, ES, FR, GB, IE, IT, JP, MX, NL, NZ, PH, PL, SE, US
Holiday work possibleVDB9UAT, AU, BE, BR, CA, CH, DE, ES, FR, GB, HK, IE, IT, JP, MX, MY, NL, NZ, PH, PL, PT, SG, US

→ Full shifts & schedules reference: docs.indeed.com/job-sync-api/reference/shifts-and-schedules

Work systems (Japan)

When scraping Japanese listings, the attributes array may include work system SUIDs defined under Japanese labor law:

Work systemSUIDDescription
Fixed working hoursA4MXDStandard set schedule with consistent start and end times
FlextimeHY5VTEmployees choose their hours within core hours
Shift systemSUDVYRotating morning / afternoon / night shifts
Variable working hours3VJ3FHours vary by period while averaging within legal limits
Deemed working hours (outside workplace)VK3PAFor field work where tracking hours is difficult
Discretionary system (professional)BDNYHSpecialized professional work with employee discretion
Discretionary system (planning)KU3VMStrategic planning work with employee discretion
Highly Professional System3943VHigh-income professionals exempt from certain labor regulations

→ Full work systems reference: docs.indeed.com/job-sync-api/reference/work-systems

Application

FieldDescription
job.indeedApply.keyBase64 Indeed Apply configuration object
job.indeedApply.scopesAvailability: DESKTOP, MOBILE
job.tracking.applyStartClick.urlFull tracking URL with jk, jobsearchTk, indpubnum parameters

Feed & source

FieldDescription
job.feed.feedSourceTypeSource type: EMPLOYER (direct) or JOB_BOARD (aggregated)
job.feed.isDradisInternal Dradis feed flag
job.feed.keyOpaque feed identifier
job.source.keyOpaque source identifier (distinct from feed key)

Grouping & auction

FieldDescription
group.countNumber of listings grouped under this result
group.keyGroup identifier for deduplication
auctionSponsored listing auction data when present
encodedAdDataEncoded advertisement metadata when present

Search metadata

FieldDescription
metadata.whatThe search term that matched this result
metadata.keywordsArray of keywords Indeed matched against

Sample output

{
"group": {
"count": 1,
"key": "kAP-2YoHmAPh4MKRA6ADAfIHA3RjbA=="
},
"job": {
"key": "a00d8c161c55cdcd",
"title": "EMPLOYÉ(E) POLYVALENT(E) DE CUISINE EN RESTAURATION RAPIDE",
"displayTitle": "Cuisinier (H/F)",
"normalizedTitle": "cuisinier",
"normalizedCategory": "food",
"language": "fr",
"expired": false,
"datePublished": 1570165200000,
"dateOnIndeed": 1732308703791,
"dateLastAnnotated": 1773062111718,
"url": "https://www.originel.com/offre-emploi/employe-de-cuisine-en-restauration-rapide/",
"attributes": [
{ "key": "CF3CP", "label": "Temps plein" },
{ "key": "T9BXE", "label": "CDD" },
{ "key": "NA9HP", "label": "Primes" },
{ "key": "YXGDY", "label": "Cuisine" }
],
"employer": {
"name": "Originel",
"key": "e465e7d7603c9368"
},
"sourceEmployerName": "originel",
"recruit": {
"title": "EMPLOYÉ(E) POLYVALENT(E) DE CUISINE EN RESTAURATION RAPIDE",
"employerName": "originel",
"viewJobUrl": "https://www.originel.com/offre-emploi/employe-de-cuisine-en-restauration-rapide/",
"experience": "",
"expirationDate": null,
"workSchedule": null,
"detailedSalary": null,
"commuteInformation": null,
"photoUrl": []
},
"compensation": {
"baseSalary": null,
"currencyCode": null,
"formattedText": null,
"salarySource": null,
"estimated": null,
"key": "CMrYnfMWHQB4tEYgmpXUGy..."
},
"location": {
"city": "Grenoble",
"postalCode": "38100",
"countryCode": "FR",
"countryName": "France",
"admin1Code": "ARA",
"admin1Name": "Auvergne-Rhône-Alpes",
"admin2Code": "38",
"admin2Name": "Isère",
"admin3Code": null,
"admin3Name": null,
"latitude": 45.157455,
"longitude": 5.73303,
"formatted": {
"short": "Grenoble (38)",
"long": "38100 Grenoble"
}
},
"description": {
"hash32": -958556346,
"text": "À propos d'Originel\n\nORIGINEL vous invite à découvrir...",
"html": "<div><h2>À propos d'Originel</h2>..."
},
"occupations": [
{ "key": "6AEZW", "label": "Employés/es polyvalents/es en restauration rapide" },
{ "key": "NPKCD", "label": "Métiers de la restauration" }
],
"feed": {
"feedSourceType": "EMPLOYER",
"isDradis": false,
"key": "AAAAAYCT999rKsxxcmMVIY..."
},
"indeedApply": {
"key": null,
"scopes": []
},
"tracking": {
"applyStartClick": {
"url": "http://fr.indeed.com/applystart?jk=a00d8c161c55cdcd&jobsearchTk=..."
}
}
},
"metadata": {
"what": "serveur",
"keywords": ["serveuse", "serveur", "serveuses", "serveurs"]
}
}

How to scrape Indeed jobs — step by step

  1. Click Try for free at the top of this page
  2. Create a free Apify account if you don't have one
  3. Set country and optionally a query, location, and date filters
  4. Click Start
  5. When the run finishes, download your dataset as JSON

No proxy setup. No browser configuration. No technical knowledge required.


Input options

Option A — search by query

{
"query": "data analyst",
"country": "us",
"location": "New York, NY",
"sort": "date",
"startDate": 1700000000000,
"maxResults": 500
}

Option B — full country enumeration (no query)

{
"country": "pl",
"maxResults": 50000
}

Leave query empty or omit it entirely to retrieve the full job stock for the selected country.

Supported input parameters

ParameterRequiredDescription
countryYesIndeed country market (see full list below)
queryNoJob title or keyword. Omit for full country enumeration
locationNoCity, region, or address
startDateNoFilter by dateOnIndeed range start — Unix timestamp in milliseconds
endDateNoFilter by dateOnIndeed range end — Unix timestamp in milliseconds
sortNoDATE or RELEVANCE
maxResultsNoResult cap

All 63 supported countries

Sourced directly from indeed.com/worldwide.

CountryCodeCountryCodeCountryCode
ArgentinaarHungaryhuSaudi Arabiasa
AustraliaauIndiainSingaporesg
AustriaatIndonesiaidSouth Africaza
BahrainbhIrelandieSouth Koreakr
BelgiumbeIsraelilSpaines
BrazilbrItalyitSwedense
CanadacaJapanjpSwitzerlandch
ChileclKuwaitkwTaiwantw
ChinacnLuxembourgluThailandth
ColombiacoMalaysiamalaysiaTurkeytr
Costa RicacrMexicomxUkraineua
Czech RepublicczMoroccomaUnited Arab Emiratesae
DenmarkdkNetherlandsnlUnited Kingdomuk
EcuadorecNew ZealandnzUnited Statesus
EgyptegNigeriangUruguayuy
FinlandfiNorwaynoVenezuelave
FrancefrOmanomVietnamvn
GermanydePakistanpk
GreecegrPanamapa
Hong KonghkPerupe
Philippinesph
Polandpl
Portugalpt
Qatarqa
Romaniaro

How much does it cost to scrape Indeed?

This Actor uses pay-per-event (PPE) pricing. Compute is free. You are charged only for results written to the dataset, plus a negligible one-time start fee per run.

EventCost
Per result (dataset item)$0.0049
Per run start$0.00005

Volume discounts apply automatically based on your Apify subscription tier:

TierPer result
No discount$0.0049
Bronze$0.0044
Silver$0.0039
Gold$0.0034

Example: 100,000 results at the standard rate = $490, plus $0.00005 for the run start.

No proxy fees. No compute charges. No surprises.

An Apify account is required to run this Actor. See apify.com/pricing for platform subscription tiers.

Enterprise & bulk pricing

For high-volume or enterprise use cases, fixed pricing with unlimited results is available. Reach out at etr@metaretica.com.


Use cases

Labor market research — build compensation benchmarks, skills demand analyses, or hiring trend reports across countries and industries. The structured compensation union types and occupation taxonomy are directly usable without post-processing.

Job market datasets by country — the full enumeration mode (empty query) produces country-wide job stock snapshots. With date range filtering on dateOnIndeed, you can retrieve only listings added within a specific window, enabling incremental dataset updates.

Recruitment intelligence — monitor company hiring activity by filtering on employer.key or sourceEmployerName. The feed.feedSourceType field distinguishes direct employer postings (EMPLOYER) from aggregated listings (JOB_BOARD).

HR tech and ATS enrichment — pipe fresh job market data into your product to give clients real-time market context for their open roles and salary ranges.

Job aggregation — maintain a continuously refreshed index of Indeed listings. The description.hash32 field makes deduplication straightforward, and date range filtering on dateOnIndeed enables incremental indexing.

Salary benchmarking — the compensation.baseSalary.range union types and compensation.estimated block provide structured salary data at a level of detail not available from rendered HTML scraping.

Lead generationjob.url, job.recruit.viewJobUrl, tracking.applyStartClick.url, and employer.key provide multiple contact and identification vectors for companies actively hiring.


Integrations

The Actor integrates with the full Apify platform stack:

  • Apify API — trigger runs and fetch results programmatically in any language
  • Make / Zapier — pipe job data into Google Sheets, Airtable, Slack, or any SaaS tool
  • Webhooks — get notified when a run completes
  • Scheduling — run on any cron-based cadence for continuous dataset freshness

API example (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("YOUR_ACTOR_ID").call(run_input={
"query": "software engineer",
"country": "de",
"location": "Berlin",
"maxResults": 1000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

API example (JavaScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('YOUR_ACTOR_ID').call({
query: 'product manager',
country: 'fr',
maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

FAQ

Is it legal to scrape Indeed? This Actor only extracts publicly available job listing data accessible via Indeed's API. It does not extract private user data, bypass authentication, or access anything that is not already public. We recommend using extracted data responsibly and in compliance with applicable laws in your jurisdiction, including GDPR in the EU. See Apify's blog post on the legality of web scraping for further context.

Why is JSON the recommended output format? The raw API schema is deeply nested — compensation is a union type with four possible shapes, location includes up to four administrative levels, and occupations and attributes are arrays of objects. Flattening this to CSV or Excel without losing information requires post-processing decisions that vary by use case. Export as JSON and transform downstream to suit your needs. CSV is available on the Apify platform if you only need top-level scalar fields.

Why doesn't this Actor need proxies? This Actor operates at the API level rather than rendering web pages, which means it does not trigger the IP-based rate limiting that browser-based scrapers encounter. This is also why throughput reaches 100 jobs/sec and platform credit costs remain minimal regardless of result volume.

Does the empty-query mode really return all jobs in a country? Yes. When the what parameter is omitted, Indeed's API returns the full job stock for the specified country market. The Actor handles traversal automatically up to your maxResults cap.

What is dateOnIndeed vs datePublished vs dateLastAnnotated? Three distinct timestamps. datePublished is when the employer originally published the role — it may be years old for evergreen listings. dateOnIndeed is when Indeed ingested the listing into its index, and is the most useful field for freshness filtering. dateLastAnnotated is when Indeed last updated its internal annotation of the listing (taxonomy, compensation estimates, etc.).

What is feed.feedSourceType? It distinguishes EMPLOYER listings (posted directly by the company) from JOB_BOARD listings (aggregated from third-party job boards). Useful when you want to filter for direct employer postings only.

What is the compensation.key field? A base64-encoded protobuf containing Indeed's full internal compensation model, including inferred pay ranges, salary type, currency, and schema version. It is included in the output as-is. The decoded compensation data is also surfaced in the structured baseSalary and estimated fields.

What happens if Indeed changes its API? We monitor the Actor continuously. If an API change causes failures, we push a fix and announce it in the changelog.


Issues and feedback

Found a bug or want to request a feature? Open a ticket in the Issues tab. We respond within 24 hours for active subscribers.