Indeed Jobs Scraper
Pricing
Pay per event
Indeed Jobs Scraper
Scrape Indeed job listings from 60+ countries without a browser. Returns title, company, location, salary, employment type, full description, easy-apply flag and employer apply link, with optional company profile data. Pay per result.
Pricing
Pay per event
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Indeed HTTP Scraper
Extract job listings from Indeed across 60+ countries. Returns structured fields per job including full descriptions, salary ranges, company ratings, benefits, and hiring counts. Pay per event, no subscription.
Two optional toggles control field coverage and cost:
includeJobDetails: true(default): addsdescription_full,description_html,description_md, andrequirementsto every jobincludeCompanyDetails: true: adds website, industry, size, revenue, CEO, and other company profile fields per job (billed per unique company)
Searches page through Indeed's job search API in batches of up to 50 jobs, so a query can return hundreds of jobs. The default newest order is enforced on the collected results (newest posted_at first).
Need higher-fidelity detail extraction through a real browser? See our indeed-scraper actor (higher cost).
What you get
Core job fields (all runs)
| Field | Description |
|---|---|
id | Indeed job key (jk= parameter) |
title | Job title as displayed on Indeed |
normalized_title | Indeed's canonical title |
company | Hiring company name (deprecated alias, use company_name) |
company_name | Hiring company name (canonical, same value as company) |
company_logo_url | Company logo image URL |
company_url | Link to company's Indeed profile (/cmp/ path; deprecated alias, use company_profile_url) |
company_profile_url | Link to company's Indeed profile (canonical, same value as company_url) |
company_overview_url | Company overview link from SERP card |
location | Full formatted location string |
city | City component |
state | State or region component (also region, canonical) |
region | State or region (canonical, same value as state) |
street_address | Street address of the job site when Indeed provides it |
postal_code | Postal code |
country | Two-letter ISO country code |
work_location_type | Remote, Hybrid, or In-person |
remote_option | remote, hybrid or onsite (canonical, derived from work_location_type) |
employment_type | full-time, part-time, contract, temporary, internship, apprenticeship |
top_listing | True if sponsored |
hires_needed | Number of hires needed |
salary_text | Formatted salary string |
salary_min | Minimum salary value |
salary_max | Maximum salary value |
salary_currency | ISO currency code |
salary_period | year, month, week, day, or hour |
description_snippet | Short excerpt (up to 500 chars) |
company_benefits | Benefits list |
skills | Required skills |
posted_at | ISO 8601 posting date (kept for backward compatibility) |
posted_at_datetime | Same instant as posted_at, ISO 8601 (UTC) |
posted_at_text | Relative text shown on the search card, for example "Posted 3 days ago" (null when Indeed does not show one) |
apply_url | Direct apply link (falls back to source URL) |
is_easy_apply | True for Indeed Apply, false when the application leaves Indeed, null when unknown |
external_apply_url | Indeed redirect to the employer's own application page (only when not Indeed Apply) |
job_url | Canonical Indeed job URL (always emitted, same value as source_url) |
source_url | Canonical Indeed job URL |
source_platform | Always indeed.com |
company_rating | Indeed company rating (0-5) |
company_review_count | Number of Indeed reviews |
search_query | Keyword query that produced this result |
serp_page | SERP page number (1-indexed) |
serp_position | Position within the SERP page |
scraped_at | ISO 8601 scrape timestamp |
Additional fields when includeJobDetails: true (default)
| Field | Description |
|---|---|
description_full | Full job description, plain text |
description_html | Full job description, raw HTML |
description_md | Full job description, Markdown |
requirements | Bullet list of job requirements extracted from the description |
Descriptions, salary fields (salary_min, salary_max, salary_currency, salary_period) and basic company fields (company_website, company_size, company_industry) come back inline with search results. Where Indeed provides no structured pay for a country (for example the UK), pay that the employer states explicitly in the description, such as "£40,000 per annum", is extracted into the salary fields. includeCompanyDetails: true adds the full company profile. When employmentType or remoteOnly is set, the actor falls back to the search-page path, where these fields fill less often.
Additional fields when includeCompanyDetails: true
| Field | Description |
|---|---|
company_description | Company description from Indeed's company profile page |
company_website | Official company website URL |
company_industry | Industry or sector |
company_size | Employee count range |
company_revenue | Annual revenue range |
company_founded | Year founded |
company_headquarters | HQ address or city |
ceo_name | CEO name |
ceo_approval | CEO approval percentage |
company_happiness_score | Indeed composite happiness score |
company_social_urls | List of social profile URLs when available in the company profile. Not all companies have social links in their Indeed profiles. |
What is NOT available (constraint documentation)
- Some older or expired listings may return empty descriptions. These will have
description_full: nulleven withincludeJobDetails: true. - Company enrichment requires an active Indeed company profile. Jobs without a known company profile will have null company enrichment fields even with
includeCompanyDetails: true. directUrlsmode performs a SERP lookup per job key to fetch title, company, location, andposted_at. If the listing has expired or the search index does not return the exact card, those fields will be null. The description fetch still succeeds regardless.- With
employmentTypeorremoteOnlyset, results come from Indeed's search page, which only serves the first page (about 15 jobs) to anonymous visitors. Use several specific queries for larger result sets, or drop those two filters. company_social_urlsis often empty because many Indeed company profiles list no social links.employment_typeis only present when Indeed shows a job type on the listing.
Deprecation notes
companyis deprecated (2026-09-29) and will be removed after 2027-09-29. Usecompany_name; both are emitted.company_urlis deprecated (2026-09-29) and will be removed after 2027-09-29. Usecompany_profile_url; both are emitted.stateandregioncarry the same value;work_location_typeandremote_optionare both emitted.
Input
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries | string[] | ["software engineer"] | One or more job search keywords |
searchUrls | string[] | [] | Pre-built Indeed search URLs preserving all filters |
directUrls | string[] | [] | Direct links to specific Indeed job listings |
location | string | "" | Location text combined with searchQueries |
country | enum | us | Indeed country domain (60+ options) |
sortBy | enum | newest | newest (newest posting first) or relevance (Indeed's default ranking) |
includeJobDetails | boolean | true | Fetch full descriptions, HTML, Markdown, and requirements |
includeCompanyDetails | boolean | false | Fetch company profile for website, CEO, revenue, industry, social URLs |
maxResultsPerQuery | integer | 50 | Cap per search query |
maxResults | integer | 100 | Hard cap across all queries |
titleFilter | string | "" | Comma-separated title terms (case-insensitive substring OR-match). Filters by job title after SERP fetch and before detail-fetch. Empty or omitted disables the filter. Example: Software Engineer, Backend Developer. |
postedWithinDays | integer | 0 | Approximate date filter (0 = no filter). Snaps to nearest bucket: 1, 3, 7, or 14 days. Values above 14 disable the filter. |
employmentType | enum | "" | Filter by employment type. FULL_TIME and PART_TIME map to Indeed sc= attribute codes. INTERNSHIP, TEMPORARY, CONTRACT, TRAINEE have no direct Indeed attribute code and are treated as no filter. |
remoteOnly | boolean | false | When true, restricts results to 100% remote positions using Indeed's homeoffice attribute filter. |
startPage | integer | 0 | Skip N SERP pages before collecting |
maxConcurrency | integer | 5 | Parallel workers for description and company fetches |
forceHTMLPath | boolean | false | Force the search-page path even with sortBy: relevance (Advanced) |
sortBy note: newest (default) asks Indeed for date order and then sorts the collected results by posted_at, newest first, because Indeed's own date order also surfaces refreshed and boosted listings. relevance keeps Indeed's default ranking. For scheduled scrapes, newest avoids re-scraping older listings.
postedWithinDays note: jobs older than the window are dropped and paging stops once a whole page is older. Indeed publishes dates at day resolution for most listings, so the cutoff is approximate to within a day.
Filter note: employmentType and remoteOnly are applied by Indeed's own search-page filters, which limits a query to about 15 jobs. Output fields and pricing are identical.
radiusKm: Indeed's radius filter is available through searchUrls. Build your URL in the Indeed UI with the radius you need, then paste it into searchUrls. The location field alone does not support a radius parameter.
Pricing
Pay-per-event (PPE):
| Event | Unit price | When it fires |
|---|---|---|
actor-start | $0.001 | Once per run |
serp-page-scanned | $0.003 | Per search page fetched |
job-with-description | $0.005 | Per job with description_full populated (includeJobDetails: true) |
company-enriched | $0.005 | Per unique company profile fetched (includeCompanyDetails: true) |
Example costs (includeJobDetails: true):
- 100 jobs from one query (2 search pages of 50): $0.001 + 2 x $0.003 + 100 x $0.005 = $0.507
- 100 jobs across 3 queries (about 3 search pages): $0.001 + 3 x $0.003 + 100 x $0.005 = $0.510
- 40 jobs, one query (1 search page): $0.001 + 1 x $0.003 + 40 x $0.005 = $0.204
- 100 jobs plus company profiles (30 unique companies): $0.510 + 30 x $0.005 = $0.660
So expect roughly $0.50 to $0.55 per 100 jobs with descriptions, plus $0.005 per unique company if you enable company enrichment. The actor start fee applies once per run.
Use with AI agents (MCP)
Connect this actor to Claude, Cursor, or any MCP-compatible agent:
{"mcpServers": {"apify": {"command": "npx","args": ["mcp-remote","https://mcp.apify.com/?tools=santamaria-automations/indeed-http-scraper","--header","Authorization: Bearer <YOUR_API_TOKEN>"]}}}
For per-tool schemas and copy-paste snippets for MCP clients, see the MCP tab.
The agent can call santamaria-automations/indeed-http-scraper with a natural language query. Output fields follow the schema described above. Constraints (sparse company profiles, empty descriptions for expired listings) are documented so the agent can handle nulls correctly.
For API access in any language, see the API tab.
Usage Examples
Precision title filter
Returns only US software engineering jobs whose title contains "backend" or "senior" (case-insensitive substring match). Non-matching SERP rows are dropped before the detail-fetch step, so you don't pay for job-detail events on jobs you don't want.
{"searchQueries": ["software engineer"],"titleFilter": "backend, senior","country": "us","sortBy": "newest","maxResults": 50}
Example matched titles: "Senior Software Engineer, Backend", "Backend Developer (Fintech, Remote)".
Related actors
- linkedin-scraper: LinkedIn job listings
- glassdoor-scraper: Glassdoor jobs with company reviews and ratings
- stepstone-de-scraper: StepStone Germany job listings
- reed-uk-scraper: Reed UK job listings
- indeed-scraper: browser-based Indeed scraper, higher fidelity at higher cost
- website-email-scraper: find contact emails for hiring companies from
company_website - website-contact-extractor: extract contact pages, phones, and social links from
company_websiteURLs
Support
- Questions or issues? Email contact@nanoscrape.com, we typically reply within 6 hours. You can also open a ticket in the Issues tab on the actor page.
- Feature request for this actor? Open a ticket in the Issues tab or email contact@nanoscrape.com with the platform field you need and (if possible) a URL that shows the data live.
- Need a scraper for a job board we don't cover yet? Email contact@nanoscrape.com with the target site and your rough usage volume. We ship one-off boards regularly.