Indeed Jobs Feed
Pricing
$4.00 / 1,000 results
Indeed Jobs Feed
Structured job data from Indeed across 62 markets. Full descriptions, parsed salary, employment type, hiring signals, and incremental change tracking for recurring monitoring workflows.
Pricing
$4.00 / 1,000 results
Rating
0.0
(0)
Developer
Black Falcon Data
Actor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
๐ What is Indeed Jobs Feed?
Indeed Jobs Feed extracts structured job listing data from Indeed across 62 country domains โ with built-in change tracking for recurring monitoring workflows. Get job titles, companies, locations, structured salary data, full descriptions, hiring signals, and company profiles as clean JSON.

Indeed is one of the world's largest job search platforms, but it has no bulk export or data API. This actor bridges that gap โ it delivers structured, analytics-ready job data that you can feed into dashboards, databases, recruiting pipelines, or AI workflows.
โจ Why choose this actor?
| Feature | Indeed Jobs Feed | Typical alternatives |
|---|---|---|
| Country coverage | 62 markets | Usually 1โ5 |
| Structured salary (min/max/currency/period) | Yes | Sometimes |
| Full job descriptions | Yes | Often truncated |
| Company profile enrichment | Yes (industry, headcount, HQ, revenue) | Rare |
| Hiring urgency signals | Yes (urgency, candidate count, repost detection) | No |
| Incremental change tracking | Yes (NEW/UPDATED/EXPIRED/REAPPEARED) | Usually no |
| Compact mode for AI agents | Yes (17 core fields) | No |
| Description truncation | Yes (configurable) | No |
| Pay per result | $0.004/result | Often flat monthly |
๐ Quick start
Minimal input to get started:
{"query": "software engineer","country": "US","location": "New York","maxResults": 20}
With filters
{"query": "nurse","country": "US","location": "Chicago","jobType": "fulltime","postedDays": 7,"radius": 25,"sort": "date"}
AI-agent compact output
{"query": "product manager","country": "US","compact": true,"descriptionMaxLength": 500,"maxResults": 50}
๐ Sample output
{"jobId": "b0bf7dd80caee255...","jobKey": "f1a14830c3d33862","title": "Senior Software Engineer","company": "AEGIS","location": "New York, NY, US","salaryText": "USD 140,000-250,000 YEAR","salaryMin": 140000,"salaryMax": 250000,"salaryCurrency": "USD","salaryType": "YEAR","employmentType": "FULL_TIME","postedDate": "2026-03-16T21:22:36.192Z","validThrough": "2026-07-14T22:51:34.683Z","canonicalUrl": "https://www.indeed.com/viewjob?jk=f1a14830c3d33862","portalUrl": "https://www.indeed.com","description": "We are seeking a skilled Java Developer with 3-4 years of professional experience...","descriptionLength": 5259,"locationCity": "New York","locationRegion": "NY","locationCountry": "US","isRemote": false,"companyRating": 4.1,"companyReviewsCount": 21,"contentQuality": "full","detailFetched": true,"scrapedAt": "2026-03-21T10:00:00.000Z","changeType": null,"stateKey": null}
Up to 71 fields per record depending on listing content, market, and enrichment options.
โ๏ธ Input reference
Search
| Field | Type | Default | Description |
|---|---|---|---|
query | string or string[] | โ | Search keywords. Use JSON array for multi-query: ["data engineer", "data scientist"]. Required unless startUrls is provided. |
country | string | "US" | Country code. Determines which Indeed domain to search. 62 markets available. |
location | string or string[] | โ | City, state, or region. Use JSON array for multi-location: ["New York", "San Francisco"]. |
startUrls | string[] | โ | Direct Indeed search or job detail URLs. |
maxResults | integer | 50 | Maximum total job listings to return (1โ500). |
maxPages | integer | 5 | Maximum pages per search source (1โ50). |
Filters
| Field | Type | Default | Description |
|---|---|---|---|
postedDays | integer | โ | Only jobs posted within N days. Snaps to nearest valid: 1, 3, 7, or 14. |
jobType | string | โ | Employment type: fulltime, parttime, contract, temporary, internship. |
remoteFilter | string | โ | Remote work filter: remote or hybrid. |
radius | integer | โ | Search radius in miles. Snaps to nearest valid: 5, 10, 15, 25, 35, 50, 100. |
sort | string | "relevance" | Sort order: relevance or date. |
Enrichment
| Field | Type | Default | Description |
|---|---|---|---|
includeDetails | boolean | true | Fetch each job's detail page for full description, structured data, and hiring signals. Set to false for fast listing-only scraping. |
includeCompanyProfile | boolean | false | Fetch company profile pages for industry, headcount, revenue, and more. Cached per unique company within each run. |
Output format
| Field | Type | Default | Description |
|---|---|---|---|
compact | boolean | false | Output only 17 core fields. Ideal for AI agents and MCP workflows where token budget matters. |
descriptionMaxLength | integer | โ | Truncate descriptions to N characters. Set to 0 to omit descriptions entirely. Leave empty for full descriptions. |
Incremental tracking
| Field | Type | Default | Description |
|---|---|---|---|
incrementalMode | boolean | false | Compare against previous run state. Requires stateKey. |
stateKey | string | โ | Stable identifier for the tracked search universe (e.g. "us-software-nyc"). |
emitUnchanged | boolean | false | Also emit records that haven't changed since last run. |
emitExpired | boolean | false | Also emit records from prior state that are no longer found. |
๐ฆ Output fields
Core job fields
| Field | Type | Available | Description |
|---|---|---|---|
jobId | string | Always | Unique identifier |
title | string | Always | Position title |
company | string | Always | Company name |
companyUrl | string | Always | Company profile URL |
location | string | Always | Location string |
canonicalUrl | string | Always | Job page URL |
portalUrl | string | Always | Indeed portal URL (e.g. https://www.indeed.com) |
sourceUrl | string | Always | URL that was scraped |
Location
| Field | Type | Available | Description |
|---|---|---|---|
locationCity | string | Always | Parsed city |
locationRegion | string | Always | Parsed state/region |
locationCountry | string | Always | Country code |
locationFormatted | string | Always | Formatted location string |
isRemote | boolean | Always | Remote work flag |
latitude | number | Where available | Geo latitude (market-dependent) |
longitude | number | Where available | Geo longitude (market-dependent) |
Salary
| Field | Type | Available | Description |
|---|---|---|---|
salaryText | string | Where provided | Normalized salary string (e.g. "USD 70,000-95,000 YEAR") |
salaryMin | number | Where provided | Minimum salary value |
salaryMax | number | Where provided | Maximum salary value |
salaryCurrency | string | Where provided | Currency code |
salaryType | string | Where provided | Pay period: HOUR, YEAR, MONTH, WEEK, DAY |
Employment and dates
| Field | Type | Available | Description |
|---|---|---|---|
employmentType | string | With detail enrichment | FULL_TIME, PART_TIME, CONTRACTOR, etc. |
postedDate | string | With detail enrichment | ISO-8601 publication date |
validThrough | string | With detail enrichment | ISO-8601 expiration date |
Description
| Field | Type | Available | Description |
|---|---|---|---|
description | string | With detail enrichment | Full plain-text job description |
descriptionLength | integer | With detail enrichment | Character count |
Quality signals
| Field | Type | Available | Description |
|---|---|---|---|
requirements | array | Where provided | Structured requirements with severity |
benefits | array | Where provided | Benefits list |
attributes | array | Where provided | Job attributes (education, experience level) |
extractedEmails | array | Rare | Contact emails found in description |
applyUrl | string | Where available | Direct application URL |
Hiring insights
These fields come from embedded page data. Availability varies by market and listing.
| Field | Type | Available | Description |
|---|---|---|---|
hiringAge | string | Where available | How long the job has been posted |
isUrgentlyHiring | boolean | Where available | Urgent hiring flag |
numOfCandidates | number | Where available | Applicant count |
isRecurringHire | boolean | Where available | Recurring hire flag |
isRepost | boolean | Where available | Whether this is a repost |
isLatestPost | boolean | Where available | Whether this is the latest version |
jobOccupations | array | Where available | Occupation categories |
Company (from detail page)
| Field | Type | Available | Description |
|---|---|---|---|
companyRating | number | Where available | Rating (0โ5 scale) |
companyReviewsCount | integer | Where available | Number of reviews |
companyLogoUrl | string | Where available | Logo URL |
Company profile (with includeCompanyProfile enabled)
| Field | Type | Available | Description |
|---|---|---|---|
companyIndustry | string | Commonly | Industry classification |
companyEmployeeRange | string | Commonly | Employee count range |
companySectorNames | array | Commonly | Sector categories |
companyFoundedYear | integer | Commonly | Year founded |
companyHeadquarters | string | Commonly | HQ location |
companyWebsite | string | Commonly | Corporate website |
companyOpenJobsCount | integer | Commonly | Active job count |
companyDescription | string | Commonly | Company description |
companyRevenue | string | Rare | Revenue range |
companyCeo | string | Rare | CEO name |
Metadata
| Field | Type | Available | Description |
|---|---|---|---|
scrapedAt | string | Always | ISO-8601 scrape timestamp |
detailFetched | boolean | Always | Whether detail page was fetched |
contentQuality | string | Always | "full", "thin", or "serp_only" |
isSponsored | boolean | Always | Sponsored listing flag |
sourceDomain | string | Always | Indeed domain used |
sourceCountry | string | Always | Country from domain |
searchQuery | string | Always | Query that found this job |
Incremental tracking fields
Present on every record. Values are null in non-incremental mode.
| Field | Type | Description |
|---|---|---|
changeType | string | NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED |
trackedHash | string | Content hash for change detection |
firstSeenAt | string | Timestamp of first observation |
lastSeenAt | string | Timestamp of most recent observation |
previousSeenAt | string | Timestamp of observation before last |
expiredAt | string | Timestamp when last classified as EXPIRED |
stateKey | string | The state key used |
๐ก Use cases
Job market intelligence
Monitor hiring trends by keyword, location, or industry. Track which roles are growing, where demand is concentrated, and how job volumes change over time.
Salary benchmarking
Collect structured salary data (min/max/currency/period) across roles and regions. Compare compensation across companies, markets, and job types.
Recruitment analytics
Track which companies are hiring, what they pay, and how urgently. Use hiring signals like urgency flags and candidate counts to prioritize outreach.
Lead generation
Extract hiring companies with enriched profiles (industry, headcount, headquarters) for B2B outreach. Companies actively hiring are more likely to need supporting services.
Competitor monitoring
Use incremental mode on a schedule to track how a company's job postings change over time โ new roles, removed positions, salary adjustments.
AI-agent workflows
Compact mode reduces output to 17 core fields, and description truncation controls token budget. Designed for MCP servers, LLM pipelines, and automated analysis.
๐ค AI-agent and MCP usage
This actor is optimized for AI-agent consumption:
- Compact mode โ 17 core fields only, reducing token usage
- Description truncation โ set
descriptionMaxLengthto control payload size - Deterministic schema โ every field is always present (null when unavailable), so agents never encounter missing keys
- Pay-per-result billing โ agents pay only for data they consume
{"query": "data scientist","country": "US","compact": true,"descriptionMaxLength": 300,"maxResults": 25}
๐ Incremental mode
Track job posting changes across runs:
{"query": "machine learning engineer","location": "Berlin","country": "DE","incrementalMode": true,"stateKey": "de-ml-berlin","emitExpired": true}
Change types
| Type | Meaning |
|---|---|
NEW | Job not seen in previous run |
UPDATED | Job exists but content changed |
UNCHANGED | Same content (only emitted if emitUnchanged is true) |
EXPIRED | Was found before but not in current run (only if emitExpired is true) |
REAPPEARED | Was previously expired but found again |
How state keys work
- Use a descriptive, stable key per search universe:
"us-software-nyc","de-data-berlin" - Different queries and locations should use different keys to avoid cross-contamination
- Unchanged jobs are not emitted by default โ you only pay for new and changed records
- Changing the key starts fresh with no prior state
๐ How to scrape Indeed job listings
- Go to Apify Console and open Indeed Jobs Feed
- Enter your search keywords in the
queryfield (e.g. "software engineer") - Select a country (62 markets available)
- Optionally set a location, job type filter, or posting age
- Set
maxResultsto control how many listings to extract - Click Start and wait for results
- Download your data as JSON, CSV, or Excel from the Output tab
โ ๏ธ Known limitations
- Salary availability โ not all listings include salary data. Coverage varies by country and job type.
- Company profile gaps โ revenue and CEO are rarely available. Industry and headcount are available for most established companies.
- Geo coordinates โ latitude and longitude are available in some markets and page variants, absent in others.
- Hiring insights โ fields like hiring age and urgency come from embedded page data, typically populated on 10โ30% of listings.
- Rate limiting โ Indeed may throttle requests at high volume. The actor handles this with built-in rate management.
- Deduplication โ results are automatically deduplicated across all search sources within a single run.
๐ฐ How much does it cost to scrape Indeed?
$0.004 per emitted result ($4.00 per 1,000 results).
| Scenario | Results | Cost |
|---|---|---|
| Quick search | 50 jobs | $0.20 |
| Market survey | 500 jobs | $2.00 |
| Daily monitoring (incremental) | ~20 new/changed per day | ~$0.08/day |
| Full market scan | 500 jobs + company profiles | $2.00 |
In incremental mode, unchanged jobs are not emitted by default โ so you only pay for new and changed records. Company profile enrichment is included at no extra cost per result.