{
  "data": {
    "id": "Vca3eYHucX05fr0Rv",
    "actId": "oxfvcKGObMtxWk8cf",
    "userId": "9Um4NEFR7z42j35AD",
    "startedAt": "2026-08-16T17:54:22.000Z",
    "finishedAt": "2026-08-16T17:55:17.597Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 55526,
      "runTimeSecs": 55.526,
      "computeUnits": 0.06169555555555555,
      "imageSizeBytes": 536523264
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Indeed Jobs Scraper input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"required\": [\n    \"searchTerm\"\n  ],\n  \"properties\": {\n    \"country\": {\n      \"title\": \"1. Country - Indeed site\",\n      \"type\": \"string\",\n      \"description\": \"Choose the Indeed country site first. Keywords, Location, filters, and saved jobs all use this country.\",\n      \"editor\": \"select\",\n      \"sectionCaption\": \"Choose jobs\",\n      \"sectionDescription\": \"First choose the country site. Then enter Keywords. Location is optional and narrows the keyword search; it is not a separate search mode. Leave Location blank for country-wide results. Job listings to collect is the shared save limit for the whole run.\",\n      \"default\": \"us\",\n      \"enum\": [\n        \"ar\",\n        \"au\",\n        \"at\",\n        \"bh\",\n        \"be\",\n        \"br\",\n        \"ca\",\n        \"cl\",\n        \"cn\",\n        \"co\",\n        \"cr\",\n        \"cz\",\n        \"dk\",\n        \"ec\",\n        \"eg\",\n        \"fi\",\n        \"fr\",\n        \"de\",\n        \"gr\",\n        \"hk\",\n        \"hu\",\n        \"in\",\n        \"id\",\n        \"ie\",\n        \"il\",\n        \"it\",\n        \"jp\",\n        \"kw\",\n        \"lu\",\n        \"my\",\n        \"mx\",\n        \"ma\",\n        \"nl\",\n        \"nz\",\n        \"ng\",\n        \"no\",\n        \"om\",\n        \"pk\",\n        \"pa\",\n        \"pe\",\n        \"ph\",\n        \"pl\",\n        \"pt\",\n        \"qa\",\n        \"ro\",\n        \"sa\",\n        \"sg\",\n        \"za\",\n        \"kr\",\n        \"es\",\n        \"se\",\n        \"ch\",\n        \"tw\",\n        \"th\",\n        \"tr\",\n        \"ua\",\n        \"ae\",\n        \"gb\",\n        \"us\",\n        \"uy\",\n        \"ve\",\n        \"vn\"\n      ],\n      \"enumTitles\": [\n        \"Argentina\",\n        \"Australia\",\n        \"Austria\",\n        \"Bahrain\",\n        \"Belgium\",\n        \"Brazil\",\n        \"Canada\",\n        \"Chile\",\n        \"China\",\n        \"Colombia\",\n        \"Costa Rica\",\n        \"Czech Republic\",\n        \"Denmark\",\n        \"Ecuador\",\n        \"Egypt\",\n        \"Finland\",\n        \"France\",\n        \"Germany\",\n        \"Greece\",\n        \"Hong Kong\",\n        \"Hungary\",\n        \"India\",\n        \"Indonesia\",\n        \"Ireland\",\n        \"Israel\",\n        \"Italy\",\n        \"Japan\",\n        \"Kuwait\",\n        \"Luxembourg\",\n        \"Malaysia\",\n        \"Mexico\",\n        \"Morocco\",\n        \"Netherlands\",\n        \"New Zealand\",\n        \"Nigeria\",\n        \"Norway\",\n        \"Oman\",\n        \"Pakistan\",\n        \"Panama\",\n        \"Peru\",\n        \"Philippines\",\n        \"Poland\",\n        \"Portugal\",\n        \"Qatar\",\n        \"Romania\",\n        \"Saudi Arabia\",\n        \"Singapore\",\n        \"South Africa\",\n        \"South Korea\",\n        \"Spain\",\n        \"Sweden\",\n        \"Switzerland\",\n        \"Taiwan\",\n        \"Thailand\",\n        \"Turkey\",\n        \"Ukraine\",\n        \"United Arab Emirates\",\n        \"United Kingdom\",\n        \"United States\",\n        \"Uruguay\",\n        \"Venezuela\",\n        \"Vietnam\"\n      ]\n    },\n    \"searchTerm\": {\n      \"title\": \"2. Keywords - search jobs\",\n      \"type\": \"string\",\n      \"description\": \"Required. Search Indeed by job titles/keywords inside the selected country. Enter one job title, skill, company, or role group per line.\",\n      \"editor\": \"textarea\",\n      \"prefill\": \"software engineer\\ndata analyst\\nsales representative\"\n    },\n    \"location\": {\n      \"title\": \"3. Location - optional filter\",\n      \"type\": \"string\",\n      \"description\": \"Optional. If filled, Indeed searches for Keywords AND this Location inside the selected country. Leave blank for country-wide results.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\"\n    },\n    \"maxItems\": {\n      \"title\": \"Job listings to collect (shared cap)\",\n      \"type\": \"integer\",\n      \"description\": \"Total jobs to save for this run. All keywords and the selected country/location share this same limit.\",\n      \"editor\": \"number\",\n      \"default\": 25,\n      \"minimum\": 1,\n      \"maximum\": 10000\n    },\n    \"postedWithinDays\": {\n      \"title\": \"Posted within\",\n      \"type\": \"string\",\n      \"description\": \"Only keep jobs posted in this time window.\",\n      \"editor\": \"select\",\n      \"sectionCaption\": \"Filters\",\n      \"sectionDescription\": \"Use filters to narrow the jobs you save. Keep them broad for your first test run.\",\n      \"default\": \"7\",\n      \"enum\": [\n        \"0\",\n        \"1\",\n        \"3\",\n        \"7\",\n        \"14\",\n        \"30\"\n      ],\n      \"enumTitles\": [\n        \"Any time\",\n        \"Last 24 hours\",\n        \"Last 3 days\",\n        \"Last 7 days\",\n        \"Last 14 days\",\n        \"Last 30 days\"\n      ]\n    },\n    \"radiusMiles\": {\n      \"title\": \"Search radius\",\n      \"type\": \"integer\",\n      \"description\": \"Search distance in miles when you enter a location.\",\n      \"editor\": \"number\",\n      \"default\": 25,\n      \"minimum\": 0,\n      \"maximum\": 100\n    },\n    \"sortBy\": {\n      \"title\": \"Sort by\",\n      \"type\": \"string\",\n      \"description\": \"Choose the order for Indeed results.\",\n      \"editor\": \"select\",\n      \"default\": \"relevance\",\n      \"enum\": [\n        \"date\",\n        \"relevance\"\n      ],\n      \"enumTitles\": [\n        \"Date\",\n        \"Relevance\"\n      ]\n    },\n    \"jobType\": {\n      \"title\": \"Job type\",\n      \"type\": \"string\",\n      \"description\": \"Choose one job type, or keep Any.\",\n      \"editor\": \"select\",\n      \"default\": \"any\",\n      \"enum\": [\n        \"any\",\n        \"fulltime\",\n        \"parttime\",\n        \"contract\",\n        \"internship\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Full-time\",\n        \"Part-time\",\n        \"Contract\",\n        \"Internship\"\n      ]\n    },\n    \"remoteOnly\": {\n      \"title\": \"Remote jobs only\",\n      \"type\": \"boolean\",\n      \"description\": \"Turn on to save only jobs that Indeed marks or describes as remote.\",\n      \"editor\": \"checkbox\",\n      \"default\": false\n    },\n    \"maxPagesPerSearch\": {\n      \"title\": \"Page depth\",\n      \"type\": \"integer\",\n      \"description\": \"How many result pages to check for each keyword/location. Increase slowly for larger runs.\",\n      \"editor\": \"number\",\n      \"default\": 2,\n      \"minimum\": 1,\n      \"maximum\": 100\n    },\n    \"excludeCompanies\": {\n      \"title\": \"Skip employers\",\n      \"type\": \"string\",\n      \"description\": \"Optional. Enter one employer per line. Matching jobs are skipped and counted in the run summary.\",\n      \"editor\": \"textarea\",\n      \"default\": \"\"\n    },\n    \"salaryType\": {\n      \"title\": \"Salary period\",\n      \"type\": \"string\",\n      \"description\": \"Optional salary-period filter. Rows without matching salary data are skipped when Salary period or Minimum salary is used.\",\n      \"editor\": \"select\",\n      \"default\": \"any\",\n      \"enum\": [\n        \"any\",\n        \"year\",\n        \"hour\",\n        \"month\",\n        \"week\",\n        \"day\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Yearly\",\n        \"Hourly\",\n        \"Monthly\",\n        \"Weekly\",\n        \"Daily\"\n      ]\n    },\n    \"minSalary\": {\n      \"title\": \"Minimum salary\",\n      \"type\": \"integer\",\n      \"description\": \"Optional salary floor for the selected salary period. Use 0 to keep all salaries.\",\n      \"editor\": \"number\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"saveOnlyUniqueItems\": {\n      \"title\": \"Unique jobs only (remove duplicates)\",\n      \"type\": \"boolean\",\n      \"description\": \"Save each Indeed job only once, even if it appears from more than one keyword or page. Keep this on for normal runs.\",\n      \"editor\": \"checkbox\",\n      \"sectionCaption\": \"Quality controls\",\n      \"sectionDescription\": \"Use these controls to save cleaner jobs or add extra fields. The defaults are best for most users.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"balanceKeywordCoverage\": {\n      \"title\": \"Balance keyword coverage\",\n      \"type\": \"boolean\",\n      \"description\": \"Give each keyword a turn before going deeper. Useful when you enter more than one keyword.\",\n      \"editor\": \"checkbox\",\n      \"default\": true\n    },\n    \"followApplyRedirects\": {\n      \"title\": \"Resolve final apply URLs\",\n      \"type\": \"boolean\",\n      \"description\": \"Adds the final employer or ATS destination when available. Slower because each apply link is checked.\",\n      \"editor\": \"checkbox\",\n      \"default\": false\n    },\n    \"scrapeCompanyDetails\": {\n      \"title\": \"Add company profile fields\",\n      \"type\": \"boolean\",\n      \"description\": \"Adds company website, industry, size, revenue, and description when available from the listing source.\",\n      \"editor\": \"checkbox\",\n      \"default\": false\n    },\n    \"requestDelayMillis\": {\n      \"title\": \"Delay between requests\",\n      \"type\": \"integer\",\n      \"description\": \"Wait time between Indeed requests.\",\n      \"editor\": \"number\",\n      \"sectionCaption\": \"Run tuning\",\n      \"sectionDescription\": \"Tune request pacing for larger runs. Defaults are recommended for most users.\",\n      \"default\": 2500,\n      \"minimum\": 0,\n      \"maximum\": 60000\n    }\n  }\n}",
    "readme": "## What does Indeed Jobs Scraper do?\n\nIndeed Jobs Scraper allows you to extract clean, deduplicated job data from\n[Indeed](https://www.indeed.com/) job listings: job title, full description,\ncompany name, location, salary, employment type, benefits, skills, apply links,\nposting metadata, and more.\n\nTo get that data, choose the Indeed country site, enter keywords, optionally add\na location, set how many jobs to save, and click **Start**. You can also run the\nscraper through the Apify API, schedule it, or connect it to other tools.\nIt saves one row per job by default, so overlapping keywords, locations, and\npages do not fill your dataset with duplicate listings.\n\nWith Indeed Jobs Scraper, you can:\n\n- Scrape Indeed job listings by job title, keyword, company, country, and\n  location.\n- Extract detailed job posting data, including description text and HTML when\n  available.\n- Collect salary ranges, company details, location fields, benefits, skills,\n  apply URLs, and job URLs.\n- Filter Indeed jobs by posting date, radius, job type, remote status, employer,\n  salary period, and minimum salary.\n- Run one country-wide search from the form or larger keyword/location matrices\n  from JSON or API input.\n- Save clean unique job listings with duplicate skips counted in the run\n  summary.\n- Download Indeed job data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n- Check the run summary to see how many jobs were found, saved, skipped,\n  duplicated, filtered, or stopped.\n\n## What job listing data can I extract?\n\nWith this Actor, you can extract the following data from public Indeed job\npostings:\n\n|                            |                           |                       |\n| -------------------------- | ------------------------- | --------------------- |\n| 💼 Job title               | 🏢 Company name           | 📍 Job location       |\n| 📝 Full description text   | 🧾 Description HTML       | 🔎 Description status |\n| 💰 Salary range            | 💵 Salary currency        | ⏱ Salary period       |\n| 🧑‍💻 Employment type         | 🪜 Seniority              | 🏠 Remote status      |\n| 🎁 Benefits                | 🧰 Skills                 | 🚀 Apply link         |\n| 🔗 Indeed job URL          | 🏷 Sponsored / Easy Apply | 📅 Posted date        |\n| 🌎 Country and source site | 🔍 Search keyword         | 🧭 Search location    |\n| 📊 Jobs saved              | ♻️ Duplicates skipped     | 🚦 Stop reason        |\n\nHere are the main output groups:\n\n| Data group              | Example fields                                                                                            |\n| ----------------------- | --------------------------------------------------------------------------------------------------------- |\n| 💼 Job details          | `jobId`, `title`, `employmentType`, `seniority`, `isRemote`, `isSponsored`, `isEasyApply`                 |\n| 🏢 Company details      | `companyName`, `companyUrl`, `companyWebsite`, `companyIndustry`, `companyEmployees`, `companyRevenue`    |\n| 📍 Location             | `locationRaw`, `locationCity`, `locationRegion`, `locationCountry`, `resolvedCountry`, `sourceSite`       |\n| 💰 Salary               | `salaryRaw`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salarySource`                   |\n| 📝 Description          | `descriptionSnippet`, `descriptionText`, `descriptionHtml`, `descriptionStatus`                           |\n| 🚀 Links and enrichment | `benefits`, `skills`, `applyUrl`, `finalApplyUrl`, `applyUrlResolveStatus`, `jobUrl`                      |\n| 📊 Run summary          | `candidateItemsSeen`, `jobsSaved`, `duplicateCandidatesSeen`, `duplicatesSkipped`, warnings, `stopReason` |\n\nSalary, benefits, skills, company profile fields, and final apply URLs depend on\nwhat is available on each Indeed listing. If full job descriptions matter for\nyour workflow, check the `descriptionStatus` field in the output.\n\n## Can I use this Actor through an API?\n\nYes. You can run Indeed Jobs Scraper manually in Apify Console or use it as an\nAPI for Indeed job data.\n\nDevelopers can call this Actor through:\n\n- Apify API\n- Python SDK\n- Node.js SDK\n- Webhooks\n- Scheduled runs\n- Apify integrations\n\nThis makes it useful for recruiting pipelines, dashboards, job boards,\nwarehouse loads, agents, and automated market research workflows.\n\n## Why scrape Indeed?\n\nIndeed is a large source of job market data. Scraping Indeed can help you track\nhiring demand, salary signals, employer activity, and job-description language\nacross roles and locations.\n\nHere are just some of the ways you could use Indeed job data:\n\n|                               |                                                                          |\n| ----------------------------- | ------------------------------------------------------------------------ |\n| 📈 Monitor hiring trends      | Track demand by role, skill, location, company, or remote status.        |\n| 💰 Benchmark salaries         | Compare salary ranges across markets and job families.                   |\n| 🧲 Build recruiting workflows | Collect active job listings for sourcing, staffing, and lead generation. |\n| 🏢 Track competitors          | Watch hiring activity, expansion signals, and technology adoption.       |\n| 🧪 Research labor markets     | Analyze job descriptions, benefits, skills, and compensation signals.    |\n| 🧱 Enrich job boards          | Feed clean Indeed job data into apps, databases, and career tools.       |\n\n## Scrape Indeed salaries and full descriptions\n\nUse Indeed Jobs Scraper when salary ranges, full descriptions, and job URLs are\nthe fields that matter most. Each saved row can include `salaryRaw`,\n`salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`,\n`descriptionText`, `descriptionHtml`, `descriptionStatus`, `applyUrl`, and\n`jobUrl` when those values are available on the public listing.\n\n## Indeed benefits and skills scraper\n\nIndeed listings often include useful labor-market signals beyond the job title.\nThis Actor saves benefits, skills, employment type, seniority, remote status,\ncompany fields, and posting metadata where available, so you can compare hiring\nrequirements across roles, markets, and employers.\n\n## Indeed Jobs API for job listings\n\nIndeed Jobs Scraper can be run manually in Apify Console or called as an API.\nUse it from scheduled runs, webhooks, the Apify API, Python SDK, Node.js SDK, or\ndownstream warehouse jobs when you need repeatable Indeed job-listing data.\n\nNo Indeed account login or user-provided browser cookies are required.\n\n## Clean, duplicate-free Indeed job datasets\n\nIndeed search results can overlap across related keywords, locations, and pages.\nFor normal datasets, keep `saveOnlyUniqueItems` enabled so the Actor saves one\nrow per job and skips duplicate candidates before they become saved rows.\n\nThe `OUTPUT` summary shows `candidateItemsSeen`, `duplicateCandidatesSeen`,\n`duplicatesSkipped`, and `jobsSaved`, so you can see how many matching rows were\nfound, how many were duplicates, and how many unique job listings were saved.\nTurn unique-job mode off only when you intentionally want to measure keyword\noverlap or search ranking behavior.\n\n## How much does scraping Indeed cost?\n\nIndeed Jobs Scraper uses a Pay-Per-Event pricing model. You are charged for\nsaved job listings.\n\nThe current price is **$1.50 per 1,000 saved job listings**, or **$0.0015 per\njob listing**. For example:\n\n| Saved job listings | Estimated Actor charge |\n| ------------------ | ---------------------- |\n| 100 jobs           | $0.15                  |\n| 1,000 jobs         | $1.50                  |\n| 10,000 jobs        | $15.00                 |\n\nCheck the **Pricing** tab for the current rate before production runs. Start\nwith `maxItems` between 10 and 100 if you want to test the output before running\nlarger searches. For normal runs, keep **Unique jobs only** enabled so duplicate\ncandidates are skipped before they become saved rows.\n\n## How do I use Indeed Jobs Scraper?\n\nIndeed Jobs Scraper was designed for an easy start even if you've never extracted\ndata from the web before. Here's how you can scrape Indeed job data with this\ntool:\n\n1. Create or log in to your Apify account.\n2. Open **Indeed Jobs Scraper**.\n3. Choose the Indeed country site to search.\n4. Add a job title, keyword, skill, or company to search for.\n5. Optionally add a location. Location narrows the keyword search; leave it\n   empty for a country-wide search.\n6. Set the maximum number of job listings to collect.\n7. Add filters such as posted date, radius, job type, remote-only, employer\n   exclusions, or salary filters if needed.\n8. Click **Start** and wait for the data to be extracted.\n9. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## ⬇️ Input\n\nThe input uses one main search flow:\n\n1. Country\n   Choose the Indeed country site to search.\n\n2. Keywords\n   Search Indeed by job titles/keywords inside the selected country.\n\n3. Location\n   Optionally enter a city, state, province, or region. Location narrows the\n   keyword search; it is not a separate search mode. Leave it blank for\n   country-wide results.\n\n`Job listings to collect` is the shared cap for the whole run. All keywords and\nthe selected country/location share this same save limit.\n\nYou can also add optional filters for date, radius, job type, remote jobs,\nemployers, salary, and enrichment.\n\nHere's a simple input example for a country-wide software engineer search in the\nUnited States:\n\n```json\n{\n    \"searchTerm\": \"software engineer\",\n    \"country\": \"us\",\n    \"location\": \"\",\n    \"postedWithinDays\": \"7\",\n    \"radiusMiles\": 25,\n    \"sortBy\": \"relevance\",\n    \"maxItems\": 25,\n    \"maxPagesPerSearch\": 2,\n    \"balanceKeywordCoverage\": true,\n    \"saveOnlyUniqueItems\": true,\n    \"excludeCompanies\": \"\",\n    \"salaryType\": \"any\",\n    \"minSalary\": 0,\n    \"followApplyRedirects\": false,\n    \"scrapeCompanyDetails\": false,\n    \"jobType\": \"any\",\n    \"remoteOnly\": false\n}\n```\n\nClick on the **Input** tab for a full explanation of input in JSON.\n\n### Search terms\n\nUse one job title, skill, company, or role family per line. Multiple distinct\nsearch terms can help you collect broader job market data.\n\nGood search terms:\n\n```text\ndata engineer\nanalytics engineer\ndata scientist\n```\n\nOverlapping search terms can return the same job more than once. Keep\n`saveOnlyUniqueItems` enabled unless you are measuring keyword overlap or search\nranking.\n\n### Locations and countries\n\nChoose one Indeed country site first. Location is optional and narrows the\nkeyword search inside that country. For a country-wide search, leave the\nlocation field empty.\n\nSupported countries:\n\n```text\nArgentina, Australia, Austria, Bahrain, Belgium, Brazil, Canada, Chile, China,\nColombia, Costa Rica, Czech Republic, Denmark, Ecuador, Egypt, Finland, France,\nGermany, Greece, Hong Kong, Hungary, India, Indonesia, Ireland, Israel, Italy,\nJapan, Kuwait, Luxembourg, Malaysia, Mexico, Morocco, Netherlands, New Zealand,\nNigeria, Norway, Oman, Pakistan, Panama, Peru, Philippines, Poland, Portugal,\nQatar, Romania, Saudi Arabia, Singapore, South Africa, South Korea, Spain,\nSweden, Switzerland, Taiwan, Thailand, Turkey, Ukraine, United Arab Emirates,\nUnited Kingdom, United States, Uruguay, Venezuela, Vietnam\n```\n\n### Filters, quality controls, and enrichment\n\n| Option                       | What it does                                                                    |\n| ---------------------------- | ------------------------------------------------------------------------------- |\n| `postedWithinDays`           | Keeps jobs from the selected freshness window.                                  |\n| `radiusMiles`                | Searches around the selected location.                                          |\n| `jobType`                    | Filters full-time, part-time, contract, or internship jobs.                     |\n| `remoteOnly`                 | Returns remote jobs only.                                                       |\n| `excludeCompanies`           | Skips matching employers and counts skipped rows in the run summary.            |\n| `salaryType` and `minSalary` | Filters jobs by salary period and minimum salary when salary data is available. |\n| `saveOnlyUniqueItems`        | Removes duplicate jobs from overlapping keywords, locations, and pages.         |\n| `balanceKeywordCoverage`     | Gives each keyword a turn before going deeper into one keyword's pages.         |\n| `followApplyRedirects`       | Adds the final employer or ATS apply URL when available. This is slower.        |\n| `scrapeCompanyDetails`       | Adds company website, industry, size, revenue, and description when available.  |\n\n## ⬆️ Output sample\n\nThe results will be wrapped into a dataset which you can find in the **Output**\ntab. Each result is one saved Indeed job listing.\n\nFor easier postprocessing, export the results to one of the supported formats:\nJSON, JSONL, CSV, Excel spreadsheet, XML, RSS, or HTML table.\n\nHere's an example of the exported JSON output:\n\n```json\n{\n    \"jobId\": \"example-job-key\",\n    \"title\": \"Junior Data Analyst\",\n    \"companyName\": \"Example Company\",\n    \"companyUrl\": \"https://www.indeed.com/cmp/example-company\",\n    \"locationRaw\": \"London\",\n    \"locationCity\": \"London\",\n    \"locationRegion\": \"ENG\",\n    \"locationCountry\": \"gb\",\n    \"resolvedCountry\": \"gb\",\n    \"sourceSite\": \"uk.indeed.com\",\n    \"isRemote\": false,\n    \"salaryRaw\": \"GBP 24,000-42,000 per year\",\n    \"salaryMin\": 24000,\n    \"salaryMax\": 42000,\n    \"salaryCurrency\": \"GBP\",\n    \"salaryPeriod\": \"year\",\n    \"salarySource\": \"listing\",\n    \"employmentType\": \"fulltime\",\n    \"seniority\": \"junior\",\n    \"descriptionSnippet\": \"Support data-driven decision-making processes...\",\n    \"descriptionText\": \"Full job description text...\",\n    \"descriptionHtml\": \"<p>Full job description HTML...</p>\",\n    \"descriptionStatus\": \"full\",\n    \"benefits\": [\"Example benefit\"],\n    \"skills\": [\"SQL\", \"Python\", \"Power BI\"],\n    \"applyUrl\": \"https://example.com/apply\",\n    \"jobUrl\": \"https://uk.indeed.com/viewjob?jk=example-job-key\",\n    \"query\": \"data analyst\",\n    \"searchLocation\": \"London\",\n    \"verifiedAt\": \"2026-06-21T02:15:24.063Z\",\n    \"isExpired\": false,\n    \"verificationSource\": \"search\",\n    \"scrapedAt\": \"2026-06-21T02:15:24.063Z\"\n}\n```\n\n### Run summary\n\nIndeed Jobs Scraper also saves an `OUTPUT` summary in the default key-value store.\nUse it to see why the final number of saved jobs changed.\n\n```json\n{\n    \"stopReason\": \"max_items_reached\",\n    \"resolvedCountry\": \"gb\",\n    \"sourceSite\": \"uk.indeed.com\",\n    \"searchesQueued\": 1,\n    \"pagesParsed\": 1,\n    \"requestedMaxItems\": 10,\n    \"candidateItemsSeen\": 100,\n    \"jobsSaved\": 10,\n    \"duplicateCandidatesSeen\": 0,\n    \"duplicatesSkipped\": 0,\n    \"rowsExcludedByCompany\": 0,\n    \"rowsExcludedByDate\": 0,\n    \"rowsExcludedBySalary\": 0,\n    \"blockedPages\": 0,\n    \"failedRequests\": 0,\n    \"warnings\": [],\n    \"statusMessage\": \"Saved 10 Indeed jobs.\"\n}\n```\n\n## Why did I get fewer jobs than requested?\n\n`maxItems` is a cap on saved rows, not a guarantee that every search has that\nmany matching jobs.\n\nIf your run saves fewer jobs than requested, check the `OUTPUT` summary. It\nshows whether rows were skipped because of duplicates, employer exclusions, date\nfilters, salary filters, source exhaustion, page limits, failed requests, or\nblocked pages.\n\nCommon reasons include:\n\n- The selected role and location have fewer available jobs than `maxItems`.\n- Strict filters removed many candidate rows.\n- Multiple keywords returned the same jobs and unique-job mode skipped\n  duplicates.\n- The search depth limit was reached before enough unique matching jobs were\n  found.\n\nIf you need more rows, increase `maxPagesPerSearch`, relax strict filters, add\nmore distinct keywords, expand the search radius, or search a broader location.\n\n## Tips for scraping Indeed\n\n- Start with a small test run and inspect the dataset before increasing\n  `maxItems`.\n- Use distinct keywords instead of near-duplicates.\n- Keep `saveOnlyUniqueItems` enabled for normal datasets.\n- Use `postedWithinDays` for fresh job monitoring.\n- Enable `followApplyRedirects` only when you need the final apply destination.\n- Enable `scrapeCompanyDetails` only when company profile enrichment matters.\n- Check `descriptionStatus` when full job descriptions are important.\n\n## FAQ\n\n### Does Indeed Jobs Scraper need login or cookies?\n\nNo. You do not need to provide an Indeed account, login session, or browser\ncookies.\n\n### Can I use Indeed Jobs Scraper through an API?\n\nYes. Run it with the Apify API, Python SDK, Node.js SDK, webhooks, schedules, or\nintegrations. The dataset contains saved job rows and the `OUTPUT` key-value\nstore record contains the run summary.\n\n### Why are salaries, benefits, skills, or full descriptions sometimes missing?\n\nThose fields depend on what Indeed exposes for each listing. Use\n`descriptionStatus`, salary fields, and the run summary to separate complete\nrows from partial rows.\n\n### How do I avoid duplicate jobs?\n\nKeep `saveOnlyUniqueItems` enabled. The Actor saves one row per job across\noverlapping keywords, locations, and pages. The `OUTPUT` summary reports\n`candidateItemsSeen`, `duplicateCandidatesSeen`, `duplicatesSkipped`, and\n`jobsSaved`, so you can audit how many candidates were found, skipped as\nduplicates, and saved as unique job listings.\n\n### How much does it cost?\n\nThe current Actor charge is **$1.50 per 1,000 saved job listings**. Check the\nPricing tab before production runs because live Store pricing is the source of\ntruth.\n\n## Is it legal to scrape Indeed?\n\nThis Actor extracts public job listing data. You are responsible for making sure\nyour use case complies with applicable laws, platform terms, and privacy rules.\n\nJob listings can sometimes include personal data or contact details. You should\nnot scrape, store, or process personal data unless you have a legitimate reason\nand the right legal basis. If you're unsure whether your reason is legitimate,\nconsult your lawyers.\n\nIndeed is a trademark of its owner. This Actor is independent and is not\naffiliated with, endorsed by, or sponsored by Indeed.\n\n## Support\n\nIf a run does not return what you expected, open an issue with the run ID and\nthe input you used. The run summary shows saved rows, skipped rows, filters,\nwarnings, and stop reason so support can be specific.\n\nRelated searches: Indeed scraper, Indeed jobs scraper, scrape Indeed jobs,\nIndeed job listings, remove duplicate jobs, duplicate-free job scraper, unique\njob listings, deduped job listings, job board deduplication, Indeed job\ndescriptions, Indeed full description scraper, Indeed salary scraper, Indeed\nbenefits and skills scraper, Indeed Jobs API, job market data, recruiting data,\nHR analytics, salary benchmarking, job board data, company hiring signals.\n\n## 🔗 Related job scrapers\n\nCompare public job and freelance demand across these sources.\n\n### Compare jobs across sources\n\n- [LinkedIn Jobs Scraper](https://apify.com/chronometrica/linkedin-jobs-scraper)\n  — find public job listings, employers, locations, and company details.\n- [Google Jobs Scraper](https://apify.com/chronometrica/google-jobs-scraper)\n  — find public job listings, employers, locations, and apply links.\n- [Naukri Jobs Scraper](https://apify.com/chronometrica/naukri-jobs-scraper)\n  — find public India job listings, employers, locations, and skills.\n- [Upwork Job Scraper](https://apify.com/chronometrica/upwork-job-scraper)\n  — find fresh freelance jobs, skills, budgets, and client signals.\n",
    "changelog": "# Changelog\n\n## 2026-06-24 - Public Surface Alignment\n\n### Changed\n\n- Aligned the public example input, Store metadata, and schema presentation with\n  the current README and first-run defaults.\n- Documented optional apply-link resolution status fields in the dataset schema.\n- Kept Actor metadata focused on buyer-facing fields.\n\n## 2026-06-22 - Input Form Clarity Pass\n\n### Changed\n\n- Reorganized the top input form section around Country, Keywords, optional\n  Location, and the shared saved-job cap.\n- Clarified that Location narrows the keyword search inside the selected\n  country.\n- Rewrote form help text in simpler language and moved keyword-balancing into\n  quality controls.\n- Moved employer and salary filters into the Filters section.\n- Kept page depth with Filters, moved enrichment toggles into Quality controls,\n  and renamed the remaining advanced request pacing section to Run tuning.\n- Removed hidden runtime keyword and location fallbacks so API behavior matches\n  the blank form state.\n\n## 2026-06-22 - Country Coverage Expansion\n\n### Added\n\n- Expanded the supported Indeed country options in the input form.\n- Added currency detection support for the expanded country set.\n\n## 2026-06-22 - Input Form Example Update\n\n### Changed\n\n- Updated the keyword example values shown in the input form.\n- Made the keyword field required in the input schema while keeping location\n  blank and optional for country-wide searches.\n\n## 2026-06-22 - Duplicate-Free Jobs Positioning Pass\n\n### Changed\n\n- Updated Store SEO metadata, README positioning, pricing copy, FAQ, and input\n  form microcopy to make unique saved job listings and duplicate-skip accounting\n  clearer.\n- Kept the public Actor title, slug, input keys, output schema, dataset schema,\n  pricing, and runtime behavior unchanged.\n\n## 2026-06-22 - Store Ranking And Quality Score Pass\n\n### Changed\n\n- Added SEO title, SEO description, and a second Store category for clearer\n  Indeed salary, description, benefits, skills, and job-listing search intent.\n- Reduced default run size and search depth so first runs and automated Store\n  health checks complete faster while larger production runs remain supported.\n- Expanded the README with long-tail use-case sections, API positioning, FAQ\n  entries, and related job-scraper links.\n\n## 2026-06-21 - Actor Slug Keyword Match\n\n### Changed\n\n- Renamed the public Actor technical slug from\n  `chronometrica/indeed-scraper` to `chronometrica/indeed-jobs-scraper` to\n  match the primary Store search keyword.\n- Kept the existing Actor ID, title, pricing, README, schemas, and build\n  continuity while changing the URL slug.\n- Published this changelog through the Actor definition so it appears in the\n  Apify Actor information surface.\n\n### Verified\n\n- Deployed build `1.1.3` under the new slug and confirmed a one-item smoke run\n  saved an Indeed job.\n- Deployed a follow-up metadata-only build with the official changelog included\n  in the active Actor source.\n- Confirmed the old `chronometrica/indeed-scraper` slug no longer resolves.\n\n## 2026-06-21 - Store README Template Pass\n\n### Changed\n\n- Reworked the public README into Apify's approved Store-style Q&A structure,\n  starting with what the Actor does, what data it extracts, why to scrape\n  Indeed, how to use it, pricing guidance, input, output, tips, legal notes,\n  and support.\n- Made the README more faithful to approved Apify examples by adding\n  template-style phrasing, emoji data tables, an API section, pricing examples,\n  and arrow-labeled input/output sections.\n- Updated the Actor card description under the title to match the new Store\n  positioning.\n- Removed the duplicate README H1 so Apify can use the Actor title as the page\n  H1.\n\n## 2026-06-20 - Dataset Presentation Schema\n\n### Added\n\n- Added a curated default dataset schema so saved job listings open in a cleaner\n  table view with buyer-facing columns, labels, and link formatting.\n\n## 2026-06-20 - Trust And Filter Pass\n\n### Added\n\n- Added run-summary trust fields for requested max items, candidate rows seen,\n  company/date/salary exclusions, stop reason, resolved country, and source site.\n- Added dataset fields for description HTML/status, salary source, live-search\n  verification status, resolved country, and source site.\n- Added company exclusion, pay-period, and minimum-salary filters.\n- Added conservative salary extraction from description text when structured\n  salary data is missing.\n\n### Changed\n\n- Reworked the public Actor title, description, and README around full\n  description fields, source provenance, and auditable run summaries.\n- Simplified the public Actor title to `Indeed Scraper` while keeping\n  job-specific proof in the description and README.\n- Applied new filters immediately after each discovery page is parsed, before\n  duplicate handling, apply-link resolution, and dataset writes.\n- Enforced posted-within filtering after discovery when the source cannot\n  combine freshness with remote-only or job-type filters.\n- Added a reason-aware `statusMessage` to run summaries and no-result logs.\n- Clarified public form help text around saved result caps, skipped rows, strict\n  salary filters, and search depth.\n- Documented `OUTPUT.input` as the normalized run-input provenance record.\n- Updated the README example to use the schema-valid posted-within value.\n\n### Fixed\n\n- Fixed minimum-salary filtering for rows that only have `salaryMin`.\n\n## 2026-06-20 - Advanced Controls\n\n### Added\n\n- Added form toggles for balanced keyword coverage, unique saved rows, final\n  apply URL resolution, and company profile fields.\n- Added optional final apply URL output fields when apply-link resolution is\n  enabled.\n- Added optional company profile output fields when company details are enabled.\n\n### Changed\n\n- Kept unique saved rows on by default while allowing duplicate appearances for\n  keyword overlap and ranking research.\n- Kept existing `searchDistribution` JSON/API inputs compatible while replacing\n  the public dropdown with a simpler keyword-coverage toggle.\n- Raised the default max pages per search to 5 so the 500-row default can be\n  reached for a single keyword/location search.\n- Polished public form labels and descriptions around keyword input, result\n  volume, uniqueness, search depth, apply URLs, and company profile fields.\n\n## 2026-06-20 - Output Surface Hardening\n\n### Changed\n\n- Removed the declared dataset schema from the public Actor definition.\n- Kept saved dataset rows and run summaries focused on buyer-facing fields.\n- Replaced the exhaustive README field list with a category-level output\n  description and representative example.\n\n## 2026-06-20 - Public Store Copy Cleanup\n\n### Changed\n\n- Replaced the Actor README with user-facing Store copy focused on search\n  inputs, use cases, output fields, and example data.\n- Updated the Actor card description for clearer search and buyer intent.\n- Kept public Actor documentation focused on buyer-facing workflows.\n\n## 2026-06-20 - Public Form Simplification\n\n### Changed\n\n- Simplified the visible input form around job keyword, country, location,\n  result limit, and common job filters.\n- Moved infrastructure-oriented controls out of the public form.\n- Reordered the Search section so Country appears before Location.\n\n## 2026-06-20 - Input And Output Improvements\n\n### Changed\n\n- Added structured output fields for job, company, location, salary, benefits,\n  skills, apply URL, job URL, and scrape metadata.\n- Improved support for common JSON/API parameter aliases used by job scraping\n  workflows.\n- Hardened input normalization for string booleans, case-insensitive sorting,\n  hyphenated job types, and invalid values.\n\n### Fixed\n\n- Improved remote-job normalization by trusting source remote indicators before\n  applying text heuristics.\n\n## 2026-06-20 - Indeed Jobs Scraper MVP\n\n### Added\n\n- Added keyword, country, location, date posted, radius, sort, job type, remote,\n  result limit, and pagination controls.\n- Added normalized dataset output suitable for analytics, recruiting workflows,\n  job boards, and automation.\n- Added input, output, and dataset schemas for the Apify Console and API.\n",
    "actorDefinition": {
      "$schema": "https://apify.com/schemas/v1/actor.ide.json",
      "actorSpecification": 1,
      "name": "indeed-jobs-scraper",
      "title": "Indeed Jobs Scraper",
      "description": "Scrape Indeed job listings by keyword, country, and location. Save clean unique job rows by default, skip duplicates across overlapping searches, and extract titles, companies, salaries, full descriptions, benefits, skills, apply links, and job URLs.",
      "seoTitle": "Indeed Jobs Scraper | Unique Job Listings",
      "seoDescription": "Scrape Indeed jobs and save clean unique listings. Remove duplicates across overlapping searches, get salaries, descriptions, skills, apply links, and run-summary counts.",
      "categories": [
        "JOBS",
        "AUTOMATION"
      ],
      "version": "1.2",
      "buildTag": "latest",
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 4096
      },
      "exampleRunInput": {
        "contentType": "application/json; charset=utf-8",
        "body": "{\n    \"searchTerm\": \"software engineer\",\n    \"country\": \"us\",\n    \"location\": \"\",\n    \"postedWithinDays\": \"7\",\n    \"radiusMiles\": 25,\n    \"sortBy\": \"relevance\",\n    \"maxItems\": 25,\n    \"maxPagesPerSearch\": 2,\n    \"balanceKeywordCoverage\": true,\n    \"saveOnlyUniqueItems\": true,\n    \"excludeCompanies\": \"\",\n    \"salaryType\": \"any\",\n    \"minSalary\": 0,\n    \"followApplyRedirects\": false,\n    \"scrapeCompanyDetails\": false,\n    \"jobType\": \"any\",\n    \"remoteOnly\": false\n}"
      },
      "input": {
        "title": "Indeed Jobs Scraper input",
        "type": "object",
        "schemaVersion": 1,
        "required": [
          "searchTerm"
        ],
        "properties": {
          "country": {
            "title": "1. Country - Indeed site",
            "type": "string",
            "description": "Choose the Indeed country site first. Keywords, Location, filters, and saved jobs all use this country.",
            "editor": "select",
            "sectionCaption": "Choose jobs",
            "sectionDescription": "First choose the country site. Then enter Keywords. Location is optional and narrows the keyword search; it is not a separate search mode. Leave Location blank for country-wide results. Job listings to collect is the shared save limit for the whole run.",
            "default": "us",
            "enum": [
              "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",
              "gb",
              "us",
              "uy",
              "ve",
              "vn"
            ],
            "enumTitles": [
              "Argentina",
              "Australia",
              "Austria",
              "Bahrain",
              "Belgium",
              "Brazil",
              "Canada",
              "Chile",
              "China",
              "Colombia",
              "Costa Rica",
              "Czech Republic",
              "Denmark",
              "Ecuador",
              "Egypt",
              "Finland",
              "France",
              "Germany",
              "Greece",
              "Hong Kong",
              "Hungary",
              "India",
              "Indonesia",
              "Ireland",
              "Israel",
              "Italy",
              "Japan",
              "Kuwait",
              "Luxembourg",
              "Malaysia",
              "Mexico",
              "Morocco",
              "Netherlands",
              "New Zealand",
              "Nigeria",
              "Norway",
              "Oman",
              "Pakistan",
              "Panama",
              "Peru",
              "Philippines",
              "Poland",
              "Portugal",
              "Qatar",
              "Romania",
              "Saudi Arabia",
              "Singapore",
              "South Africa",
              "South Korea",
              "Spain",
              "Sweden",
              "Switzerland",
              "Taiwan",
              "Thailand",
              "Turkey",
              "Ukraine",
              "United Arab Emirates",
              "United Kingdom",
              "United States",
              "Uruguay",
              "Venezuela",
              "Vietnam"
            ]
          },
          "searchTerm": {
            "title": "2. Keywords - search jobs",
            "type": "string",
            "description": "Required. Search Indeed by job titles/keywords inside the selected country. Enter one job title, skill, company, or role group per line.",
            "editor": "textarea",
            "prefill": "software engineer\ndata analyst\nsales representative"
          },
          "location": {
            "title": "3. Location - optional filter",
            "type": "string",
            "description": "Optional. If filled, Indeed searches for Keywords AND this Location inside the selected country. Leave blank for country-wide results.",
            "editor": "textfield",
            "default": ""
          },
          "maxItems": {
            "title": "Job listings to collect (shared cap)",
            "type": "integer",
            "description": "Total jobs to save for this run. All keywords and the selected country/location share this same limit.",
            "editor": "number",
            "default": 25,
            "minimum": 1,
            "maximum": 10000
          },
          "postedWithinDays": {
            "title": "Posted within",
            "type": "string",
            "description": "Only keep jobs posted in this time window.",
            "editor": "select",
            "sectionCaption": "Filters",
            "sectionDescription": "Use filters to narrow the jobs you save. Keep them broad for your first test run.",
            "default": "7",
            "enum": [
              "0",
              "1",
              "3",
              "7",
              "14",
              "30"
            ],
            "enumTitles": [
              "Any time",
              "Last 24 hours",
              "Last 3 days",
              "Last 7 days",
              "Last 14 days",
              "Last 30 days"
            ]
          },
          "radiusMiles": {
            "title": "Search radius",
            "type": "integer",
            "description": "Search distance in miles when you enter a location.",
            "editor": "number",
            "default": 25,
            "minimum": 0,
            "maximum": 100
          },
          "sortBy": {
            "title": "Sort by",
            "type": "string",
            "description": "Choose the order for Indeed results.",
            "editor": "select",
            "default": "relevance",
            "enum": [
              "date",
              "relevance"
            ],
            "enumTitles": [
              "Date",
              "Relevance"
            ]
          },
          "jobType": {
            "title": "Job type",
            "type": "string",
            "description": "Choose one job type, or keep Any.",
            "editor": "select",
            "default": "any",
            "enum": [
              "any",
              "fulltime",
              "parttime",
              "contract",
              "internship"
            ],
            "enumTitles": [
              "Any",
              "Full-time",
              "Part-time",
              "Contract",
              "Internship"
            ]
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Turn on to save only jobs that Indeed marks or describes as remote.",
            "editor": "checkbox",
            "default": false
          },
          "maxPagesPerSearch": {
            "title": "Page depth",
            "type": "integer",
            "description": "How many result pages to check for each keyword/location. Increase slowly for larger runs.",
            "editor": "number",
            "default": 2,
            "minimum": 1,
            "maximum": 100
          },
          "excludeCompanies": {
            "title": "Skip employers",
            "type": "string",
            "description": "Optional. Enter one employer per line. Matching jobs are skipped and counted in the run summary.",
            "editor": "textarea",
            "default": ""
          },
          "salaryType": {
            "title": "Salary period",
            "type": "string",
            "description": "Optional salary-period filter. Rows without matching salary data are skipped when Salary period or Minimum salary is used.",
            "editor": "select",
            "default": "any",
            "enum": [
              "any",
              "year",
              "hour",
              "month",
              "week",
              "day"
            ],
            "enumTitles": [
              "Any",
              "Yearly",
              "Hourly",
              "Monthly",
              "Weekly",
              "Daily"
            ]
          },
          "minSalary": {
            "title": "Minimum salary",
            "type": "integer",
            "description": "Optional salary floor for the selected salary period. Use 0 to keep all salaries.",
            "editor": "number",
            "default": 0,
            "minimum": 0,
            "maximum": 10000000
          },
          "saveOnlyUniqueItems": {
            "title": "Unique jobs only (remove duplicates)",
            "type": "boolean",
            "description": "Save each Indeed job only once, even if it appears from more than one keyword or page. Keep this on for normal runs.",
            "editor": "checkbox",
            "sectionCaption": "Quality controls",
            "sectionDescription": "Use these controls to save cleaner jobs or add extra fields. The defaults are best for most users.",
            "default": true,
            "prefill": true
          },
          "balanceKeywordCoverage": {
            "title": "Balance keyword coverage",
            "type": "boolean",
            "description": "Give each keyword a turn before going deeper. Useful when you enter more than one keyword.",
            "editor": "checkbox",
            "default": true
          },
          "followApplyRedirects": {
            "title": "Resolve final apply URLs",
            "type": "boolean",
            "description": "Adds the final employer or ATS destination when available. Slower because each apply link is checked.",
            "editor": "checkbox",
            "default": false
          },
          "scrapeCompanyDetails": {
            "title": "Add company profile fields",
            "type": "boolean",
            "description": "Adds company website, industry, size, revenue, and description when available from the listing source.",
            "editor": "checkbox",
            "default": false
          },
          "requestDelayMillis": {
            "title": "Delay between requests",
            "type": "integer",
            "description": "Wait time between Indeed requests.",
            "editor": "number",
            "sectionCaption": "Run tuning",
            "sectionDescription": "Tune request pacing for larger runs. Defaults are recommended for most users.",
            "default": 2500,
            "minimum": 0,
            "maximum": 60000
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Indeed Jobs Scraper output",
        "description": "Normalized job rows are stored in the default dataset. OUTPUT contains a compact run summary and warnings.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Job results",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "output": {
            "type": "string",
            "title": "Run summary",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/OUTPUT"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "type": "object",
            "properties": {
              "jobId": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Job ID",
                "description": "Stable job identifier for this listing.",
                "example": "example-job-key"
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Job title",
                "description": "Job title shown on the listing.",
                "example": "Senior Data Engineer"
              },
              "companyName": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Company",
                "description": "Hiring company name.",
                "example": "Example Company"
              },
              "companyRating": {
                "type": [
                  "number",
                  "null"
                ],
                "title": "Company rating"
              },
              "companyUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Company URL",
                "description": "Company profile URL when available.",
                "example": "https://www.indeed.com/cmp/example-company"
              },
              "companyWebsite": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Company website",
                "description": "Company website when company details are enabled and available.",
                "example": "https://example.com"
              },
              "companyIndustry": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Company industry"
              },
              "companyEmployees": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Company size"
              },
              "companyRevenue": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Company revenue"
              },
              "companyDescription": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Company description"
              },
              "locationRaw": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Location",
                "description": "Listing location text.",
                "example": "Austin, TX"
              },
              "locationCity": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "City"
              },
              "locationRegion": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Region"
              },
              "locationCountry": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Country",
                "example": "us"
              },
              "resolvedCountry": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Resolved country",
                "example": "us"
              },
              "sourceSite": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Source site",
                "example": "www.indeed.com"
              },
              "isRemote": {
                "type": [
                  "boolean",
                  "null"
                ],
                "title": "Remote"
              },
              "salaryRaw": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Salary",
                "description": "Original compensation text when available.",
                "example": "$120,000 - $180,000 a year"
              },
              "salaryMin": {
                "type": [
                  "number",
                  "null"
                ],
                "title": "Minimum salary"
              },
              "salaryMax": {
                "type": [
                  "number",
                  "null"
                ],
                "title": "Maximum salary"
              },
              "salaryCurrency": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Salary currency",
                "example": "USD"
              },
              "salaryPeriod": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Salary period",
                "example": "year"
              },
              "salarySource": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Salary source",
                "example": "listing"
              },
              "employmentType": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Employment type",
                "example": "fulltime"
              },
              "seniority": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Seniority",
                "example": "senior"
              },
              "postedAtRaw": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Posted"
              },
              "postedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Posted at",
                "format": "date-time"
              },
              "descriptionSnippet": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Description snippet"
              },
              "descriptionText": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Description text"
              },
              "descriptionHtml": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Description HTML"
              },
              "descriptionStatus": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Description status",
                "example": "full"
              },
              "benefits": {
                "type": "array",
                "title": "Benefits",
                "items": {
                  "type": "string"
                }
              },
              "skills": {
                "type": "array",
                "title": "Skills",
                "items": {
                  "type": "string"
                }
              },
              "applyUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Apply URL"
              },
              "finalApplyUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Final apply URL"
              },
              "applyUrlRedirected": {
                "type": [
                  "boolean",
                  "null"
                ],
                "title": "Apply URL redirected"
              },
              "applyUrlResolveStatus": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Apply URL resolve status",
                "example": "http_200"
              },
              "jobUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Job URL"
              },
              "query": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Search keyword"
              },
              "searchLocation": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Search location"
              },
              "searchPosition": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Search position"
              },
              "pageNumber": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Search page"
              },
              "isSponsored": {
                "type": [
                  "boolean",
                  "null"
                ],
                "title": "Sponsored"
              },
              "isUrgentlyHiring": {
                "type": [
                  "boolean",
                  "null"
                ],
                "title": "Urgently hiring"
              },
              "isEasyApply": {
                "type": [
                  "boolean",
                  "null"
                ],
                "title": "Easy apply"
              },
              "verifiedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Verified at",
                "format": "date-time"
              },
              "verificationSource": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Verification source",
                "example": "search"
              },
              "isExpired": {
                "type": [
                  "boolean",
                  "null"
                ],
                "title": "Expired"
              },
              "scrapedAt": {
                "type": "string",
                "title": "Scraped at",
                "format": "date-time",
                "example": "2026-06-20T18:00:00.000Z"
              }
            },
            "required": [
              "jobId",
              "title",
              "companyName",
              "jobUrl",
              "scrapedAt"
            ]
          },
          "views": {
            "overview": {
              "title": "Job listings",
              "description": "One row per saved Indeed job listing.",
              "transformation": {
                "fields": [
                  "title",
                  "companyName",
                  "locationRaw",
                  "salaryRaw",
                  "employmentType",
                  "isRemote",
                  "postedAtRaw",
                  "descriptionSnippet",
                  "applyUrl",
                  "jobUrl",
                  "query",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "companyName": {
                    "label": "Company",
                    "format": "text"
                  },
                  "locationRaw": {
                    "label": "Location",
                    "format": "text"
                  },
                  "salaryRaw": {
                    "label": "Salary",
                    "format": "text"
                  },
                  "employmentType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "isRemote": {
                    "label": "Remote",
                    "format": "boolean"
                  },
                  "postedAtRaw": {
                    "label": "Posted",
                    "format": "text"
                  },
                  "descriptionSnippet": {
                    "label": "Description",
                    "format": "text"
                  },
                  "applyUrl": {
                    "label": "Apply",
                    "format": "link"
                  },
                  "jobUrl": {
                    "label": "Job URL",
                    "format": "link"
                  },
                  "query": {
                    "label": "Search",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped at",
                    "format": "date"
                  }
                }
              }
            }
          }
        }
      },
      "environmentVariables": {
        "INDEED_API_KEY": "@indeedApiKey"
      },
      "dockerfile": "../Dockerfile",
      "changelog": "# Changelog\n\n## 2026-06-24 - Public Surface Alignment\n\n### Changed\n\n- Aligned the public example input, Store metadata, and schema presentation with\n  the current README and first-run defaults.\n- Documented optional apply-link resolution status fields in the dataset schema.\n- Kept Actor metadata focused on buyer-facing fields.\n\n## 2026-06-22 - Input Form Clarity Pass\n\n### Changed\n\n- Reorganized the top input form section around Country, Keywords, optional\n  Location, and the shared saved-job cap.\n- Clarified that Location narrows the keyword search inside the selected\n  country.\n- Rewrote form help text in simpler language and moved keyword-balancing into\n  quality controls.\n- Moved employer and salary filters into the Filters section.\n- Kept page depth with Filters, moved enrichment toggles into Quality controls,\n  and renamed the remaining advanced request pacing section to Run tuning.\n- Removed hidden runtime keyword and location fallbacks so API behavior matches\n  the blank form state.\n\n## 2026-06-22 - Country Coverage Expansion\n\n### Added\n\n- Expanded the supported Indeed country options in the input form.\n- Added currency detection support for the expanded country set.\n\n## 2026-06-22 - Input Form Example Update\n\n### Changed\n\n- Updated the keyword example values shown in the input form.\n- Made the keyword field required in the input schema while keeping location\n  blank and optional for country-wide searches.\n\n## 2026-06-22 - Duplicate-Free Jobs Positioning Pass\n\n### Changed\n\n- Updated Store SEO metadata, README positioning, pricing copy, FAQ, and input\n  form microcopy to make unique saved job listings and duplicate-skip accounting\n  clearer.\n- Kept the public Actor title, slug, input keys, output schema, dataset schema,\n  pricing, and runtime behavior unchanged.\n\n## 2026-06-22 - Store Ranking And Quality Score Pass\n\n### Changed\n\n- Added SEO title, SEO description, and a second Store category for clearer\n  Indeed salary, description, benefits, skills, and job-listing search intent.\n- Reduced default run size and search depth so first runs and automated Store\n  health checks complete faster while larger production runs remain supported.\n- Expanded the README with long-tail use-case sections, API positioning, FAQ\n  entries, and related job-scraper links.\n\n## 2026-06-21 - Actor Slug Keyword Match\n\n### Changed\n\n- Renamed the public Actor technical slug from\n  `chronometrica/indeed-scraper` to `chronometrica/indeed-jobs-scraper` to\n  match the primary Store search keyword.\n- Kept the existing Actor ID, title, pricing, README, schemas, and build\n  continuity while changing the URL slug.\n- Published this changelog through the Actor definition so it appears in the\n  Apify Actor information surface.\n\n### Verified\n\n- Deployed build `1.1.3` under the new slug and confirmed a one-item smoke run\n  saved an Indeed job.\n- Deployed a follow-up metadata-only build with the official changelog included\n  in the active Actor source.\n- Confirmed the old `chronometrica/indeed-scraper` slug no longer resolves.\n\n## 2026-06-21 - Store README Template Pass\n\n### Changed\n\n- Reworked the public README into Apify's approved Store-style Q&A structure,\n  starting with what the Actor does, what data it extracts, why to scrape\n  Indeed, how to use it, pricing guidance, input, output, tips, legal notes,\n  and support.\n- Made the README more faithful to approved Apify examples by adding\n  template-style phrasing, emoji data tables, an API section, pricing examples,\n  and arrow-labeled input/output sections.\n- Updated the Actor card description under the title to match the new Store\n  positioning.\n- Removed the duplicate README H1 so Apify can use the Actor title as the page\n  H1.\n\n## 2026-06-20 - Dataset Presentation Schema\n\n### Added\n\n- Added a curated default dataset schema so saved job listings open in a cleaner\n  table view with buyer-facing columns, labels, and link formatting.\n\n## 2026-06-20 - Trust And Filter Pass\n\n### Added\n\n- Added run-summary trust fields for requested max items, candidate rows seen,\n  company/date/salary exclusions, stop reason, resolved country, and source site.\n- Added dataset fields for description HTML/status, salary source, live-search\n  verification status, resolved country, and source site.\n- Added company exclusion, pay-period, and minimum-salary filters.\n- Added conservative salary extraction from description text when structured\n  salary data is missing.\n\n### Changed\n\n- Reworked the public Actor title, description, and README around full\n  description fields, source provenance, and auditable run summaries.\n- Simplified the public Actor title to `Indeed Scraper` while keeping\n  job-specific proof in the description and README.\n- Applied new filters immediately after each discovery page is parsed, before\n  duplicate handling, apply-link resolution, and dataset writes.\n- Enforced posted-within filtering after discovery when the source cannot\n  combine freshness with remote-only or job-type filters.\n- Added a reason-aware `statusMessage` to run summaries and no-result logs.\n- Clarified public form help text around saved result caps, skipped rows, strict\n  salary filters, and search depth.\n- Documented `OUTPUT.input` as the normalized run-input provenance record.\n- Updated the README example to use the schema-valid posted-within value.\n\n### Fixed\n\n- Fixed minimum-salary filtering for rows that only have `salaryMin`.\n\n## 2026-06-20 - Advanced Controls\n\n### Added\n\n- Added form toggles for balanced keyword coverage, unique saved rows, final\n  apply URL resolution, and company profile fields.\n- Added optional final apply URL output fields when apply-link resolution is\n  enabled.\n- Added optional company profile output fields when company details are enabled.\n\n### Changed\n\n- Kept unique saved rows on by default while allowing duplicate appearances for\n  keyword overlap and ranking research.\n- Kept existing `searchDistribution` JSON/API inputs compatible while replacing\n  the public dropdown with a simpler keyword-coverage toggle.\n- Raised the default max pages per search to 5 so the 500-row default can be\n  reached for a single keyword/location search.\n- Polished public form labels and descriptions around keyword input, result\n  volume, uniqueness, search depth, apply URLs, and company profile fields.\n\n## 2026-06-20 - Output Surface Hardening\n\n### Changed\n\n- Removed the declared dataset schema from the public Actor definition.\n- Kept saved dataset rows and run summaries focused on buyer-facing fields.\n- Replaced the exhaustive README field list with a category-level output\n  description and representative example.\n\n## 2026-06-20 - Public Store Copy Cleanup\n\n### Changed\n\n- Replaced the Actor README with user-facing Store copy focused on search\n  inputs, use cases, output fields, and example data.\n- Updated the Actor card description for clearer search and buyer intent.\n- Kept public Actor documentation focused on buyer-facing workflows.\n\n## 2026-06-20 - Public Form Simplification\n\n### Changed\n\n- Simplified the visible input form around job keyword, country, location,\n  result limit, and common job filters.\n- Moved infrastructure-oriented controls out of the public form.\n- Reordered the Search section so Country appears before Location.\n\n## 2026-06-20 - Input And Output Improvements\n\n### Changed\n\n- Added structured output fields for job, company, location, salary, benefits,\n  skills, apply URL, job URL, and scrape metadata.\n- Improved support for common JSON/API parameter aliases used by job scraping\n  workflows.\n- Hardened input normalization for string booleans, case-insensitive sorting,\n  hyphenated job types, and invalid values.\n\n### Fixed\n\n- Improved remote-job normalization by trusting source remote indicators before\n  applying text heuristics.\n\n## 2026-06-20 - Indeed Jobs Scraper MVP\n\n### Added\n\n- Added keyword, country, location, date posted, radius, sort, job type, remote,\n  result limit, and pagination controls.\n- Added normalized dataset output suitable for analytics, recruiting workflows,\n  job boards, and automation.\n- Added input, output, and dataset schemas for the Apify Console and API.\n",
      "readme": "## What does Indeed Jobs Scraper do?\n\nIndeed Jobs Scraper allows you to extract clean, deduplicated job data from\n[Indeed](https://www.indeed.com/) job listings: job title, full description,\ncompany name, location, salary, employment type, benefits, skills, apply links,\nposting metadata, and more.\n\nTo get that data, choose the Indeed country site, enter keywords, optionally add\na location, set how many jobs to save, and click **Start**. You can also run the\nscraper through the Apify API, schedule it, or connect it to other tools.\nIt saves one row per job by default, so overlapping keywords, locations, and\npages do not fill your dataset with duplicate listings.\n\nWith Indeed Jobs Scraper, you can:\n\n- Scrape Indeed job listings by job title, keyword, company, country, and\n  location.\n- Extract detailed job posting data, including description text and HTML when\n  available.\n- Collect salary ranges, company details, location fields, benefits, skills,\n  apply URLs, and job URLs.\n- Filter Indeed jobs by posting date, radius, job type, remote status, employer,\n  salary period, and minimum salary.\n- Run one country-wide search from the form or larger keyword/location matrices\n  from JSON or API input.\n- Save clean unique job listings with duplicate skips counted in the run\n  summary.\n- Download Indeed job data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n- Check the run summary to see how many jobs were found, saved, skipped,\n  duplicated, filtered, or stopped.\n\n## What job listing data can I extract?\n\nWith this Actor, you can extract the following data from public Indeed job\npostings:\n\n|                            |                           |                       |\n| -------------------------- | ------------------------- | --------------------- |\n| 💼 Job title               | 🏢 Company name           | 📍 Job location       |\n| 📝 Full description text   | 🧾 Description HTML       | 🔎 Description status |\n| 💰 Salary range            | 💵 Salary currency        | ⏱ Salary period       |\n| 🧑‍💻 Employment type         | 🪜 Seniority              | 🏠 Remote status      |\n| 🎁 Benefits                | 🧰 Skills                 | 🚀 Apply link         |\n| 🔗 Indeed job URL          | 🏷 Sponsored / Easy Apply | 📅 Posted date        |\n| 🌎 Country and source site | 🔍 Search keyword         | 🧭 Search location    |\n| 📊 Jobs saved              | ♻️ Duplicates skipped     | 🚦 Stop reason        |\n\nHere are the main output groups:\n\n| Data group              | Example fields                                                                                            |\n| ----------------------- | --------------------------------------------------------------------------------------------------------- |\n| 💼 Job details          | `jobId`, `title`, `employmentType`, `seniority`, `isRemote`, `isSponsored`, `isEasyApply`                 |\n| 🏢 Company details      | `companyName`, `companyUrl`, `companyWebsite`, `companyIndustry`, `companyEmployees`, `companyRevenue`    |\n| 📍 Location             | `locationRaw`, `locationCity`, `locationRegion`, `locationCountry`, `resolvedCountry`, `sourceSite`       |\n| 💰 Salary               | `salaryRaw`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salarySource`                   |\n| 📝 Description          | `descriptionSnippet`, `descriptionText`, `descriptionHtml`, `descriptionStatus`                           |\n| 🚀 Links and enrichment | `benefits`, `skills`, `applyUrl`, `finalApplyUrl`, `applyUrlResolveStatus`, `jobUrl`                      |\n| 📊 Run summary          | `candidateItemsSeen`, `jobsSaved`, `duplicateCandidatesSeen`, `duplicatesSkipped`, warnings, `stopReason` |\n\nSalary, benefits, skills, company profile fields, and final apply URLs depend on\nwhat is available on each Indeed listing. If full job descriptions matter for\nyour workflow, check the `descriptionStatus` field in the output.\n\n## Can I use this Actor through an API?\n\nYes. You can run Indeed Jobs Scraper manually in Apify Console or use it as an\nAPI for Indeed job data.\n\nDevelopers can call this Actor through:\n\n- Apify API\n- Python SDK\n- Node.js SDK\n- Webhooks\n- Scheduled runs\n- Apify integrations\n\nThis makes it useful for recruiting pipelines, dashboards, job boards,\nwarehouse loads, agents, and automated market research workflows.\n\n## Why scrape Indeed?\n\nIndeed is a large source of job market data. Scraping Indeed can help you track\nhiring demand, salary signals, employer activity, and job-description language\nacross roles and locations.\n\nHere are just some of the ways you could use Indeed job data:\n\n|                               |                                                                          |\n| ----------------------------- | ------------------------------------------------------------------------ |\n| 📈 Monitor hiring trends      | Track demand by role, skill, location, company, or remote status.        |\n| 💰 Benchmark salaries         | Compare salary ranges across markets and job families.                   |\n| 🧲 Build recruiting workflows | Collect active job listings for sourcing, staffing, and lead generation. |\n| 🏢 Track competitors          | Watch hiring activity, expansion signals, and technology adoption.       |\n| 🧪 Research labor markets     | Analyze job descriptions, benefits, skills, and compensation signals.    |\n| 🧱 Enrich job boards          | Feed clean Indeed job data into apps, databases, and career tools.       |\n\n## Scrape Indeed salaries and full descriptions\n\nUse Indeed Jobs Scraper when salary ranges, full descriptions, and job URLs are\nthe fields that matter most. Each saved row can include `salaryRaw`,\n`salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`,\n`descriptionText`, `descriptionHtml`, `descriptionStatus`, `applyUrl`, and\n`jobUrl` when those values are available on the public listing.\n\n## Indeed benefits and skills scraper\n\nIndeed listings often include useful labor-market signals beyond the job title.\nThis Actor saves benefits, skills, employment type, seniority, remote status,\ncompany fields, and posting metadata where available, so you can compare hiring\nrequirements across roles, markets, and employers.\n\n## Indeed Jobs API for job listings\n\nIndeed Jobs Scraper can be run manually in Apify Console or called as an API.\nUse it from scheduled runs, webhooks, the Apify API, Python SDK, Node.js SDK, or\ndownstream warehouse jobs when you need repeatable Indeed job-listing data.\n\nNo Indeed account login or user-provided browser cookies are required.\n\n## Clean, duplicate-free Indeed job datasets\n\nIndeed search results can overlap across related keywords, locations, and pages.\nFor normal datasets, keep `saveOnlyUniqueItems` enabled so the Actor saves one\nrow per job and skips duplicate candidates before they become saved rows.\n\nThe `OUTPUT` summary shows `candidateItemsSeen`, `duplicateCandidatesSeen`,\n`duplicatesSkipped`, and `jobsSaved`, so you can see how many matching rows were\nfound, how many were duplicates, and how many unique job listings were saved.\nTurn unique-job mode off only when you intentionally want to measure keyword\noverlap or search ranking behavior.\n\n## How much does scraping Indeed cost?\n\nIndeed Jobs Scraper uses a Pay-Per-Event pricing model. You are charged for\nsaved job listings.\n\nThe current price is **$1.50 per 1,000 saved job listings**, or **$0.0015 per\njob listing**. For example:\n\n| Saved job listings | Estimated Actor charge |\n| ------------------ | ---------------------- |\n| 100 jobs           | $0.15                  |\n| 1,000 jobs         | $1.50                  |\n| 10,000 jobs        | $15.00                 |\n\nCheck the **Pricing** tab for the current rate before production runs. Start\nwith `maxItems` between 10 and 100 if you want to test the output before running\nlarger searches. For normal runs, keep **Unique jobs only** enabled so duplicate\ncandidates are skipped before they become saved rows.\n\n## How do I use Indeed Jobs Scraper?\n\nIndeed Jobs Scraper was designed for an easy start even if you've never extracted\ndata from the web before. Here's how you can scrape Indeed job data with this\ntool:\n\n1. Create or log in to your Apify account.\n2. Open **Indeed Jobs Scraper**.\n3. Choose the Indeed country site to search.\n4. Add a job title, keyword, skill, or company to search for.\n5. Optionally add a location. Location narrows the keyword search; leave it\n   empty for a country-wide search.\n6. Set the maximum number of job listings to collect.\n7. Add filters such as posted date, radius, job type, remote-only, employer\n   exclusions, or salary filters if needed.\n8. Click **Start** and wait for the data to be extracted.\n9. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## ⬇️ Input\n\nThe input uses one main search flow:\n\n1. Country\n   Choose the Indeed country site to search.\n\n2. Keywords\n   Search Indeed by job titles/keywords inside the selected country.\n\n3. Location\n   Optionally enter a city, state, province, or region. Location narrows the\n   keyword search; it is not a separate search mode. Leave it blank for\n   country-wide results.\n\n`Job listings to collect` is the shared cap for the whole run. All keywords and\nthe selected country/location share this same save limit.\n\nYou can also add optional filters for date, radius, job type, remote jobs,\nemployers, salary, and enrichment.\n\nHere's a simple input example for a country-wide software engineer search in the\nUnited States:\n\n```json\n{\n    \"searchTerm\": \"software engineer\",\n    \"country\": \"us\",\n    \"location\": \"\",\n    \"postedWithinDays\": \"7\",\n    \"radiusMiles\": 25,\n    \"sortBy\": \"relevance\",\n    \"maxItems\": 25,\n    \"maxPagesPerSearch\": 2,\n    \"balanceKeywordCoverage\": true,\n    \"saveOnlyUniqueItems\": true,\n    \"excludeCompanies\": \"\",\n    \"salaryType\": \"any\",\n    \"minSalary\": 0,\n    \"followApplyRedirects\": false,\n    \"scrapeCompanyDetails\": false,\n    \"jobType\": \"any\",\n    \"remoteOnly\": false\n}\n```\n\nClick on the **Input** tab for a full explanation of input in JSON.\n\n### Search terms\n\nUse one job title, skill, company, or role family per line. Multiple distinct\nsearch terms can help you collect broader job market data.\n\nGood search terms:\n\n```text\ndata engineer\nanalytics engineer\ndata scientist\n```\n\nOverlapping search terms can return the same job more than once. Keep\n`saveOnlyUniqueItems` enabled unless you are measuring keyword overlap or search\nranking.\n\n### Locations and countries\n\nChoose one Indeed country site first. Location is optional and narrows the\nkeyword search inside that country. For a country-wide search, leave the\nlocation field empty.\n\nSupported countries:\n\n```text\nArgentina, Australia, Austria, Bahrain, Belgium, Brazil, Canada, Chile, China,\nColombia, Costa Rica, Czech Republic, Denmark, Ecuador, Egypt, Finland, France,\nGermany, Greece, Hong Kong, Hungary, India, Indonesia, Ireland, Israel, Italy,\nJapan, Kuwait, Luxembourg, Malaysia, Mexico, Morocco, Netherlands, New Zealand,\nNigeria, Norway, Oman, Pakistan, Panama, Peru, Philippines, Poland, Portugal,\nQatar, Romania, Saudi Arabia, Singapore, South Africa, South Korea, Spain,\nSweden, Switzerland, Taiwan, Thailand, Turkey, Ukraine, United Arab Emirates,\nUnited Kingdom, United States, Uruguay, Venezuela, Vietnam\n```\n\n### Filters, quality controls, and enrichment\n\n| Option                       | What it does                                                                    |\n| ---------------------------- | ------------------------------------------------------------------------------- |\n| `postedWithinDays`           | Keeps jobs from the selected freshness window.                                  |\n| `radiusMiles`                | Searches around the selected location.                                          |\n| `jobType`                    | Filters full-time, part-time, contract, or internship jobs.                     |\n| `remoteOnly`                 | Returns remote jobs only.                                                       |\n| `excludeCompanies`           | Skips matching employers and counts skipped rows in the run summary.            |\n| `salaryType` and `minSalary` | Filters jobs by salary period and minimum salary when salary data is available. |\n| `saveOnlyUniqueItems`        | Removes duplicate jobs from overlapping keywords, locations, and pages.         |\n| `balanceKeywordCoverage`     | Gives each keyword a turn before going deeper into one keyword's pages.         |\n| `followApplyRedirects`       | Adds the final employer or ATS apply URL when available. This is slower.        |\n| `scrapeCompanyDetails`       | Adds company website, industry, size, revenue, and description when available.  |\n\n## ⬆️ Output sample\n\nThe results will be wrapped into a dataset which you can find in the **Output**\ntab. Each result is one saved Indeed job listing.\n\nFor easier postprocessing, export the results to one of the supported formats:\nJSON, JSONL, CSV, Excel spreadsheet, XML, RSS, or HTML table.\n\nHere's an example of the exported JSON output:\n\n```json\n{\n    \"jobId\": \"example-job-key\",\n    \"title\": \"Junior Data Analyst\",\n    \"companyName\": \"Example Company\",\n    \"companyUrl\": \"https://www.indeed.com/cmp/example-company\",\n    \"locationRaw\": \"London\",\n    \"locationCity\": \"London\",\n    \"locationRegion\": \"ENG\",\n    \"locationCountry\": \"gb\",\n    \"resolvedCountry\": \"gb\",\n    \"sourceSite\": \"uk.indeed.com\",\n    \"isRemote\": false,\n    \"salaryRaw\": \"GBP 24,000-42,000 per year\",\n    \"salaryMin\": 24000,\n    \"salaryMax\": 42000,\n    \"salaryCurrency\": \"GBP\",\n    \"salaryPeriod\": \"year\",\n    \"salarySource\": \"listing\",\n    \"employmentType\": \"fulltime\",\n    \"seniority\": \"junior\",\n    \"descriptionSnippet\": \"Support data-driven decision-making processes...\",\n    \"descriptionText\": \"Full job description text...\",\n    \"descriptionHtml\": \"<p>Full job description HTML...</p>\",\n    \"descriptionStatus\": \"full\",\n    \"benefits\": [\"Example benefit\"],\n    \"skills\": [\"SQL\", \"Python\", \"Power BI\"],\n    \"applyUrl\": \"https://example.com/apply\",\n    \"jobUrl\": \"https://uk.indeed.com/viewjob?jk=example-job-key\",\n    \"query\": \"data analyst\",\n    \"searchLocation\": \"London\",\n    \"verifiedAt\": \"2026-06-21T02:15:24.063Z\",\n    \"isExpired\": false,\n    \"verificationSource\": \"search\",\n    \"scrapedAt\": \"2026-06-21T02:15:24.063Z\"\n}\n```\n\n### Run summary\n\nIndeed Jobs Scraper also saves an `OUTPUT` summary in the default key-value store.\nUse it to see why the final number of saved jobs changed.\n\n```json\n{\n    \"stopReason\": \"max_items_reached\",\n    \"resolvedCountry\": \"gb\",\n    \"sourceSite\": \"uk.indeed.com\",\n    \"searchesQueued\": 1,\n    \"pagesParsed\": 1,\n    \"requestedMaxItems\": 10,\n    \"candidateItemsSeen\": 100,\n    \"jobsSaved\": 10,\n    \"duplicateCandidatesSeen\": 0,\n    \"duplicatesSkipped\": 0,\n    \"rowsExcludedByCompany\": 0,\n    \"rowsExcludedByDate\": 0,\n    \"rowsExcludedBySalary\": 0,\n    \"blockedPages\": 0,\n    \"failedRequests\": 0,\n    \"warnings\": [],\n    \"statusMessage\": \"Saved 10 Indeed jobs.\"\n}\n```\n\n## Why did I get fewer jobs than requested?\n\n`maxItems` is a cap on saved rows, not a guarantee that every search has that\nmany matching jobs.\n\nIf your run saves fewer jobs than requested, check the `OUTPUT` summary. It\nshows whether rows were skipped because of duplicates, employer exclusions, date\nfilters, salary filters, source exhaustion, page limits, failed requests, or\nblocked pages.\n\nCommon reasons include:\n\n- The selected role and location have fewer available jobs than `maxItems`.\n- Strict filters removed many candidate rows.\n- Multiple keywords returned the same jobs and unique-job mode skipped\n  duplicates.\n- The search depth limit was reached before enough unique matching jobs were\n  found.\n\nIf you need more rows, increase `maxPagesPerSearch`, relax strict filters, add\nmore distinct keywords, expand the search radius, or search a broader location.\n\n## Tips for scraping Indeed\n\n- Start with a small test run and inspect the dataset before increasing\n  `maxItems`.\n- Use distinct keywords instead of near-duplicates.\n- Keep `saveOnlyUniqueItems` enabled for normal datasets.\n- Use `postedWithinDays` for fresh job monitoring.\n- Enable `followApplyRedirects` only when you need the final apply destination.\n- Enable `scrapeCompanyDetails` only when company profile enrichment matters.\n- Check `descriptionStatus` when full job descriptions are important.\n\n## FAQ\n\n### Does Indeed Jobs Scraper need login or cookies?\n\nNo. You do not need to provide an Indeed account, login session, or browser\ncookies.\n\n### Can I use Indeed Jobs Scraper through an API?\n\nYes. Run it with the Apify API, Python SDK, Node.js SDK, webhooks, schedules, or\nintegrations. The dataset contains saved job rows and the `OUTPUT` key-value\nstore record contains the run summary.\n\n### Why are salaries, benefits, skills, or full descriptions sometimes missing?\n\nThose fields depend on what Indeed exposes for each listing. Use\n`descriptionStatus`, salary fields, and the run summary to separate complete\nrows from partial rows.\n\n### How do I avoid duplicate jobs?\n\nKeep `saveOnlyUniqueItems` enabled. The Actor saves one row per job across\noverlapping keywords, locations, and pages. The `OUTPUT` summary reports\n`candidateItemsSeen`, `duplicateCandidatesSeen`, `duplicatesSkipped`, and\n`jobsSaved`, so you can audit how many candidates were found, skipped as\nduplicates, and saved as unique job listings.\n\n### How much does it cost?\n\nThe current Actor charge is **$1.50 per 1,000 saved job listings**. Check the\nPricing tab before production runs because live Store pricing is the source of\ntruth.\n\n## Is it legal to scrape Indeed?\n\nThis Actor extracts public job listing data. You are responsible for making sure\nyour use case complies with applicable laws, platform terms, and privacy rules.\n\nJob listings can sometimes include personal data or contact details. You should\nnot scrape, store, or process personal data unless you have a legitimate reason\nand the right legal basis. If you're unsure whether your reason is legitimate,\nconsult your lawyers.\n\nIndeed is a trademark of its owner. This Actor is independent and is not\naffiliated with, endorsed by, or sponsored by Indeed.\n\n## Support\n\nIf a run does not return what you expected, open an issue with the run ID and\nthe input you used. The run summary shows saved rows, skipped rows, filters,\nwarnings, and stop reason so support can be specific.\n\nRelated searches: Indeed scraper, Indeed jobs scraper, scrape Indeed jobs,\nIndeed job listings, remove duplicate jobs, duplicate-free job scraper, unique\njob listings, deduped job listings, job board deduplication, Indeed job\ndescriptions, Indeed full description scraper, Indeed salary scraper, Indeed\nbenefits and skills scraper, Indeed Jobs API, job market data, recruiting data,\nHR analytics, salary benchmarking, job board data, company hiring signals.\n\n## 🔗 Related job scrapers\n\nCompare public job and freelance demand across these sources.\n\n### Compare jobs across sources\n\n- [LinkedIn Jobs Scraper](https://apify.com/chronometrica/linkedin-jobs-scraper)\n  — find public job listings, employers, locations, and company details.\n- [Google Jobs Scraper](https://apify.com/chronometrica/google-jobs-scraper)\n  — find public job listings, employers, locations, and apply links.\n- [Naukri Jobs Scraper](https://apify.com/chronometrica/naukri-jobs-scraper)\n  — find public India job listings, employers, locations, and skills.\n- [Upwork Job Scraper](https://apify.com/chronometrica/upwork-job-scraper)\n  — find fresh freelance jobs, skills, budgets, and client signals.\n"
    },
    "buildNumber": "1.2.14",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.2"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.06169555555555555
    }
  }
}