{
  "openapi": "3.0.1",
  "info": {
    "title": "Indeed Jobs Scraper — Salaries, Benefits & Company Data",
    "description": "Indeed jobs scraper and API: every posting with its full description, the employer's salary and Indeed's estimate in USD, benefits and schedule, company industry, size, revenue, CEO and website. 74 countries, pasted Indeed URLs, filters that never bill, a new-jobs monitor. $3 per 1,000 jobs.",
    "version": "1.0",
    "x-build-id": "COZkAO8qwmS0waOyw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/spool~indeed-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-spool-indeed-scraper",
        "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/spool~indeed-scraper/runs": {
      "post": {
        "operationId": "runs-sync-spool-indeed-scraper",
        "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/spool~indeed-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-spool-indeed-scraper",
        "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": {
          "searchTerms": {
            "title": "1. Job titles or keywords",
            "type": "array",
            "description": "One search per term. Indeed's own matching: a term finds postings whose title or text matches it. Up to 10 terms.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "2. Location",
            "type": "string",
            "description": "City, state, postal code or country as you would type it on Indeed. Leave empty for the whole country."
          },
          "locations": {
            "title": "More locations",
            "type": "array",
            "description": "Each term is searched in each of these places too (up to 10 places in all).",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Indeed country",
            "type": "string",
            "description": "Which Indeed site: usa, uk, canada, australia, germany, france, india, netherlands, spain, italy, brazil, mexico, singapore, uae, south africa ... 74 countries. Pasted URLs carry their own country.",
            "default": "usa"
          },
          "searchUrls": {
            "title": "Or paste Indeed search URLs",
            "type": "array",
            "description": "Indeed search URLs copied from the browser (any country site). Keywords, place, radius, date window, remote, job type and experience level are read from the URL; one search per URL, up to 20. When given, the fields above are ignored.",
            "items": {
              "type": "string"
            }
          },
          "results": {
            "title": "Results per run",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Jobs to deliver per run, across all searches, after deduplication and filters. Up to 10,000. A search is paged 100 at a time until the target is met; rows a filter removes are never charged.",
            "default": 200
          },
          "postedWithinHours": {
            "title": "Posted within the last N hours",
            "minimum": 1,
            "type": "integer",
            "description": "Only postings that reached Indeed in the last N hours (24 = today, 72 = three days, 168 = a week). Indeed applies this itself."
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Indeed's remote filter, then every row is judged again by its location, attributes and text; rows without remote evidence are removed before billing.",
            "default": false
          },
          "jobType": {
            "title": "Job type",
            "enum": [
              "",
              "fulltime",
              "parttime",
              "contract",
              "temporary",
              "internship",
              "perdiem",
              "volunteer"
            ],
            "type": "string",
            "description": "Indeed's own job-type filter.",
            "default": ""
          },
          "indeedApplyOnly": {
            "title": "Indeed Apply only",
            "type": "boolean",
            "description": "Only postings that take applications through Indeed itself.",
            "default": false
          },
          "radiusMiles": {
            "title": "Search radius (miles)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Distance around the place, in miles (Indeed's unit everywhere).",
            "default": 50
          },
          "includeEstimatedSalary": {
            "title": "Include Indeed's salary estimate",
            "type": "boolean",
            "description": "Indeed's own pay estimate, when its API returns one (measured: rarely; the fields are null otherwise). Delivered in the estimatedSalary* fields, never mixed into the employer's salary fields, and not counted by the salary filter.",
            "default": true
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "markdown",
              "html",
              "text"
            ],
            "type": "string",
            "description": "How the full description is delivered. Every Indeed row carries its description; no extra request is made.",
            "default": "markdown"
          },
          "requireSalary": {
            "title": "Only jobs that state a salary",
            "type": "boolean",
            "description": "Only postings where the employer states pay (Indeed's estimate does not count). Removed rows are never charged.",
            "default": false
          },
          "minSalaryUsd": {
            "title": "Minimum salary (USD, annualised)",
            "type": "integer",
            "description": "Compared against the annualised USD figure, so an hourly US wage and a monthly EUR salary are judged on the same scale."
          },
          "requireTech": {
            "title": "Only jobs mentioning these technologies",
            "type": "array",
            "description": "Keep rows whose text names any of these — `Kubernetes`, `Snowflake`, `Salesforce`, `React`… Spelled as in the output's `tech` field. 190 technologies are recognised.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Exclude titles containing",
            "type": "array",
            "description": "Drop jobs whose title contains any of these words or phrases (case-insensitive). Removed rows are never charged.",
            "items": {
              "type": "string"
            }
          },
          "requireTitleKeywords": {
            "title": "Title must contain",
            "type": "array",
            "description": "Keep only jobs whose title contains at least one of these words or phrases (case-insensitive, title only). The answer to a board that matches your term against descriptions. Removed rows are never charged.",
            "items": {
              "type": "string"
            }
          },
          "excludeCompanies": {
            "title": "Exclude companies",
            "type": "array",
            "description": "Drop these employers. Names are normalised first, so `Wipro` also drops `Wipro Limited`. Removed rows are never charged.",
            "items": {
              "type": "string"
            }
          },
          "targetCompanies": {
            "title": "Only these companies",
            "type": "array",
            "description": "Keep only these employers (competitor hiring watch). Same normalisation plus a parent match: `Amazon` keeps `Amazon Web Services`, not `Amazonia`. Removed rows are never charged.",
            "items": {
              "type": "string"
            }
          },
          "excludeCities": {
            "title": "Exclude places",
            "type": "array",
            "description": "Drop jobs whose location mentions any of these places (whole word, case-insensitive). Removed rows are never charged.",
            "items": {
              "type": "string"
            }
          },
          "excludeAgencies": {
            "title": "Drop staffing agencies",
            "type": "boolean",
            "description": "Drop rows whose company name reads like a staffing or recruiting agency (staffing, recruit…, headhunt…, talent…, manpower, personnel, placement…, consultanc…, resourcing, workforce…). A heuristic on the name only. Removed rows are never charged.",
            "default": false
          },
          "maxAgeDays": {
            "title": "Maximum posting age (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Drop postings older than N days by the employer's publish date (Indeed's own window above counts the day the posting reached Indeed). Rows without a date are kept."
          },
          "experienceLevel": {
            "title": "Experience level",
            "type": "array",
            "description": "Keep only these levels, read from the board's own label where it has one, else from the title (Senior, Principal, Lead; Junior, Graduate, Entry level; Intern; Director; VP, Chief, Head of). A row with no level cue is kept, never dropped. Removed rows are never charged.",
            "items": {
              "type": "string",
              "enum": [
                "junior",
                "mid",
                "senior",
                "manager",
                "director",
                "executive"
              ]
            }
          },
          "strictKeywordMatch": {
            "title": "Strict keyword match",
            "type": "boolean",
            "description": "Keep only rows whose title or description contains every word of one of your search terms. Off by default: LinkedIn never answers \"nothing matched\" and returns loosely related postings instead. Removed rows are never charged.",
            "default": false
          },
          "resumeKeywords": {
            "title": "Score rows against these keywords",
            "type": "array",
            "description": "Your skills (`Python`, `Kubernetes`, `C++`, `.NET`). Every row gets `matchedKeywords` and `keywordMatchPercent` against them; without this list the same two fields score the row against the run's own search terms. Annotation only: nothing is removed, nothing changes the bill.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort each wave",
            "enum": [
              "",
              "salary_desc",
              "date_desc"
            ],
            "type": "string",
            "description": "Order of the rows inside each delivered page: Indeed's relevance (default), highest salary first, or newest first.",
            "default": ""
          },
          "expandTerms": {
            "title": "Also search related titles",
            "type": "boolean",
            "description": "When your own words leave the target short, the same role is also searched under its other names (electrician: journeyman electrician, electrical technician); a row found that way must carry the related title in its own title. searchTerm on every row says which term found it.",
            "default": true
          },
          "onlyNew": {
            "title": "Only new jobs since the last run (monitor mode)",
            "type": "boolean",
            "description": "Remember every posting this search has delivered and return only the ones not seen before. Put the run on a schedule — daily, hourly — and you get a feed of new postings; nothing delivered earlier is charged again. The memory is a record per search in a key-value store named `job-board-api-monitor` in **your** account (see *Monitor name*). Postings not seen for 60 days are forgotten, so a role closed and reposted later shows up again.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name of the memory record for this search. Leave empty and it is derived from the search itself (terms, location, sites, companies), so the same search always shares one memory. Set a name to share one memory between different searches, or change it to start fresh. It is a label, not a credential — it appears in your key-value store as the record key."
          },
          "webhookUrl": {
            "title": "Alert webhook",
            "type": "string",
            "description": "When rows are delivered, POST a digest here: a Slack or Discord incoming webhook gets a short message with the first rows and a link to all of them; any other URL gets the full JSON digest (run and dataset ids and links, counts, the first ten rows). A run that delivers nothing sends nothing, so a scheduled monitor only speaks when there is something new."
          },
          "useApifyProxy": {
            "title": "Use Apify Proxy",
            "type": "boolean",
            "description": "Indeed refuses requests from Apify's own addresses, so the run uses residential proxy sessions. Turn off only if you supply your own proxies below.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy settings",
            "type": "object",
            "description": "Your own proxy settings, if any. Default: Apify Proxy, residential group, eight sessions named per run."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}