{
  "openapi": "3.0.1",
  "info": {
    "title": "🔥 Indeed Jobs Scraper API/Keyword or URL/No Login (/w EMAILS)",
    "description": "Indeed jobs + company-leads scraper — search by keyword or URL. Returns salaries, GPS, full descriptions, the resolved external/ATS apply URL, and employer firmographics (CEO, revenue, industry, website) plus optional contact-email enrichment. Clean flat output; hard maxJobs cap.",
    "version": "0.0",
    "x-build-id": "4ZrjAhzL4R1XqJKTi"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~apify-indeed-cheerio-ppr/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-apify-indeed-cheerio-ppr",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/memo23~apify-indeed-cheerio-ppr/runs": {
      "post": {
        "operationId": "runs-sync-memo23-apify-indeed-cheerio-ppr",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/memo23~apify-indeed-cheerio-ppr/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-apify-indeed-cheerio-ppr",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Indeed search-result or job URLs to scrape. Example: https://www.indeed.com/jobs?q=nurse&l=Texas — every filter present in the URL is honored. Works on any Indeed country domain (e.g. uk.indeed.com).",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "position": {
            "title": "Positions / keywords for search",
            "type": "string",
            "description": "Any combination of positions or keywords to search for, e.g. \"registered nurse\" or \"python developer\"."
          },
          "keywords": {
            "title": "Keywords — multiple searches (optional)",
            "type": "array",
            "description": "Run several keyword searches in one go. The actor searches each keyword separately (with the same country/location/filters) and merges + deduplicates the results. Use this instead of, or together with, the single field above — e.g. [\"registered nurse\", \"nurse practitioner\"].",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Country for search",
            "enum": [
              "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",
              "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"
            ],
            "type": "string",
            "description": "Select the country for your job search",
            "default": "United States"
          },
          "location": {
            "title": "Location for search",
            "type": "string",
            "description": "Any combination of city, zip code or locality for search",
            "default": ""
          },
          "radius": {
            "title": "Radius (miles)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional search radius in miles around the specified location"
          },
          "datePosted": {
            "title": "Date posted",
            "enum": [
              "",
              "1",
              "3",
              "7",
              "14",
              "30"
            ],
            "type": "string",
            "description": "Filter jobs by when they were posted",
            "default": ""
          },
          "postedBy": {
            "title": "Posted By",
            "enum": [
              "BOTH",
              "EMPLOYER",
              "STAFFING_AGENCY"
            ],
            "type": "string",
            "description": "Filter by who posted the job",
            "default": "BOTH"
          },
          "jobType": {
            "title": "Job type",
            "type": "array",
            "description": "Filter by job type (select multiple)",
            "items": {
              "type": "string",
              "enum": [
                "CONTRACT",
                "FULLTIME",
                "PARTTIME",
                "TEMPORARY",
                "INTERNSHIP",
                "PERMANENT",
                "NEW_GRAD",
                "COMMISSION"
              ],
              "enumTitles": [
                "Contract",
                "Full-time",
                "Part-time",
                "Temporary",
                "Internship",
                "Permanent",
                "New-Grad",
                "Commission"
              ]
            }
          },
          "remoteWork": {
            "title": "Remote Work",
            "enum": [
              "",
              "HYBRID",
              "REMOTE"
            ],
            "type": "string",
            "description": "Filter by remote work type",
            "default": ""
          },
          "sort": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Sort results by relevance (default) or by date (newest first). Choose Date to collect only the latest postings — ideal for daily runs.",
            "default": "relevance"
          },
          "experienceLevel": {
            "title": "Experience level",
            "enum": [
              "",
              "ENTRY_LEVEL",
              "MID_LEVEL",
              "SENIOR_LEVEL"
            ],
            "type": "string",
            "description": "Filter by the job's required experience level.",
            "default": ""
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Filter to jobs at or above this minimum salary, using Indeed's own (estimate-based) salary filter in the chosen country's currency — e.g. 150000 on a US search filters to ~$150,000+. Supported for major-currency countries (US, UK, Eurozone, CA, AU, and more); ignored for countries without a known currency symbol. Like on Indeed, this filters on Indeed's salary estimate, so some results may show a stated range that starts slightly lower."
          },
          "includeCompanyDetails": {
            "title": "Include Company Details",
            "type": "boolean",
            "description": "Set to true if you want to scrape company details. Adds the companyDetails* fields to each row (CEO name, revenue, industry, website, employee count, founded year). Default: false.",
            "default": false
          },
          "enrichEmails": {
            "title": "Enrich with company contact emails (experimental)",
            "type": "boolean",
            "description": "If enabled, tries to find a contact email for each employer by reading the company's own website (works best with 'includeCompanyDetails' enabled, which captures the company website). Adds contactEmail and contactWebsite columns plus a detailed emailEnrichment object. Best-effort.",
            "default": false
          },
          "qualifyByPayment": {
            "title": "💳 Qualify by payment (flag businesses that take money online)",
            "type": "boolean",
            "description": "Requires \"Enrich with contact emails\". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.",
            "default": false
          },
          "onlyExternalJobs": {
            "title": "Include only external sources",
            "type": "boolean",
            "description": "Set to true if you want to only external sources when scraping (i.e. keep only jobs whose application happens on an external site outside Indeed). Default: false.",
            "default": false
          },
          "resolveExternalApplyUrl": {
            "title": "Resolve External Apply URL",
            "type": "boolean",
            "description": "When enabled, jobs that redirect to a client site or ATS (have a `thirdPartyApplyUrl`) are followed through Indeed's redirect chain to capture the final external apply URL into `externalApplyUrl`. Adds one extra HTTP request per applicable job and can slow down or destabilise large runs — off by default; enable only if you specifically need the resolved external apply URL.",
            "default": false
          },
          "flattenOutput": {
            "title": "Flatten Output Structure",
            "type": "boolean",
            "description": "Output one clean, flat row per job (positionName, company, salary, location, url, description, etc.) — recommended, and the default. Set to false to instead receive Indeed's full raw nested API response (hundreds of fields, mostly internal).",
            "default": true
          },
          "expandToCities": {
            "title": "Expand Country/Region URLs into Cities",
            "type": "boolean",
            "description": "When enabled (default), search URLs whose location is a country or large region (e.g. `l=Scotland`, `l=United Kingdom`, `l=East+of+England+Region`) are automatically fanned out into a list of major-city search URLs and the results deduped by `jobId`. Indeed caps mobile SERP pagination per query, so the union of city-level queries typically yields 2-5x more total results than the parent region query. Indeed's UI emits `radius=0` (exact-match) for region chips, which would return near-zero jobs at the city level, so a `radius=0` on the parent URL is automatically bumped to `radius=25` (Indeed's UI default) for the city queries. Set to `false` to disable fan-out and scrape the exact URL you provided. No effect when the location is already a city, postcode, or empty.",
            "default": true
          },
          "deepSearch": {
            "title": "Deep search (expand keywords to get more results)",
            "type": "boolean",
            "description": "Indeed caps a single keyword search at roughly a few hundred results. With deep search on, each keyword is expanded into a set of related search terms (seniority variants like Senior/Junior/Lead and common role variants) that are searched alongside the original and deduplicated by job id — reaching well past the per-query ceiling. Best for broad searches where you expect many results. Increases the number of requests; `maxJobs` still hard-caps the rows returned and charged. Default: false.",
            "default": false
          },
          "strictMatch": {
            "title": "Strict keyword match (drop unrelated jobs)",
            "type": "boolean",
            "description": "When enabled, drops any job whose title or description does not contain your search keyword(s). Indeed's own search pads every result page with loosely-related and sponsored jobs (e.g. a 'Real Estate Agent' or 'CDL Driver' for a `typescript` search) — those appear in the output by default because the scraper returns exactly what Indeed returns. Turn this on to keep only genuine keyword matches. Keys on the `q` of your search URL (or the keyword/position input). Leave off (default) to get Indeed's full result set unchanged.",
            "default": false
          },
          "includeNoSalaryJob": {
            "title": "Include jobs with no salary",
            "type": "boolean",
            "description": "When enabled (default), every job is returned. Turn this OFF to keep only jobs that list a stated or estimated salary — the rows with no compensation data at all are dropped before being returned or charged. Useful for salary benchmarking and compensation research.",
            "default": true
          },
          "uniqueCompanies": {
            "title": "One job per company (unique companies only)",
            "type": "boolean",
            "description": "When enabled, the output contains at most one job per company — every row is a distinct employer. Dedupes on Indeed's encrypted company id (so 'Acme Inc' and 'Acme Inc.' count as one), falling back to the company name. Note: because many listings share an employer, reaching a target number of unique companies means scanning more jobs, so a narrow search may return fewer unique companies than `maxJobs`. Leave off (default) to return every job.",
            "default": false
          },
          "resumeKeywords": {
            "title": "Resume skills to match against (Profile Match)",
            "type": "array",
            "description": "A JSON array of skills to match each job description against. Each item is either a plain string (\"React\") or an object with optional aliases: {\"keyword\": \"JavaScript\", \"aliases\": [\"JS\"]}. Adds resumeMatchScore (0-100), resumeMatchedKeywords and resumeMissingKeywords to every row. Example: [{\"keyword\":\"TypeScript\",\"aliases\":[\"TS\"]}, \"React\", \"Node.js\"]."
          },
          "maxJobs": {
            "title": "Max Jobs",
            "type": "integer",
            "description": "Maximum number of jobs that will be processed. Hard cap on rows returned and charged. Default: 20000 — set a lower value (e.g. 50) for test runs.",
            "default": 20000
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "type": "integer",
            "description": "Maximum number of pages that can be processed at the same time.",
            "default": 10
          },
          "minConcurrency": {
            "title": "Min Concurrency",
            "type": "integer",
            "description": "Minimum number of pages that will be processed at the same time.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max Request Retries",
            "type": "integer",
            "description": "Number of times the crawler will retry a failed request before giving up.",
            "default": 100
          },
          "storeName": {
            "title": "Name your storage for listings (deduplication and long-term retention), it can only contain letters 'a' through 'z', the digits '0' through '9', and the hyphen ('-') but only in the middle of the string (e.g. 'my-value-1')",
            "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
            "type": "string",
            "description": "Assign a custom name to the Key-Value Store where your scraped listings will be saved. This ensures:\n 1. **Data Deduplication**: Prevents duplicate entries in the storage. \n 2. **Persistent Storage**: Enables long-term retention of listings, beyond default storage limits.\n 3. **Project Management**: Separate datasets by using unique names for different projects or analyses.\n 4. **Data Reuse**: Easily reference and reuse stored data without overwriting.\n (If left blank, the default storage will be used with standard retention limits.)"
          },
          "proxy": {
            "title": "Proxy configuration (optional override)",
            "type": "object",
            "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}