{
  "openapi": "3.0.1",
  "info": {
    "title": "Indeed Jobs Scraper - Salaries, Remote & Company Ratings",
    "description": "Scrape Indeed job search results in 23 countries: parsed salary ranges as numbers, remote work model, employer rating and review count, posting date and full descriptions. No login, no API key. Tells you when Indeed quietly ignored your location.",
    "version": "0.0",
    "x-build-id": "gbkvlYMoXwm0Wakzm"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/eiv~indeed-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-eiv-indeed-jobs-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/eiv~indeed-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-eiv-indeed-jobs-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/eiv~indeed-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-eiv-indeed-jobs-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": {
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "What to search for, one per line - a job title, a skill, a company name, or any phrase Indeed accepts. Each line is run as its own search and every row says which search it came from. Leave empty and fill in Indeed URLs instead if you already have the searches you want.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City, state, postcode or \"Remote\", applied to every search keyword. Worth knowing: Indeed does not reject a location it cannot parse - it quietly searches a wider area instead and returns a full page of results. This Actor reads back the location Indeed actually used and puts it on the summary row as locationUsed, and warns in the log when it differs from what you asked for."
          },
          "country": {
            "title": "Country",
            "enum": [
              "us",
              "uk",
              "ca",
              "au",
              "ie",
              "nz",
              "in",
              "sg",
              "de",
              "fr",
              "nl",
              "es",
              "it",
              "be",
              "at",
              "ch",
              "se",
              "pl",
              "br",
              "mx",
              "jp",
              "za",
              "ae"
            ],
            "type": "string",
            "description": "Indeed runs a separate site per country and they are not interchangeable - a UK search sent to the US site returns US jobs without complaining. This picks the right one.",
            "default": "us"
          },
          "startUrls": {
            "title": "Indeed search URLs",
            "type": "array",
            "description": "Paste Indeed search pages directly, for example https://www.indeed.com/jobs?q=nurse&l=Boston. A URL is used exactly as given, including any Indeed filter this Actor does not model, so nothing you set on Indeed itself is silently dropped. A /viewjob link is a single posting rather than a search and is rejected with a reason.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "sort": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Indeed's own ranking, or newest first. Date order is the one to use when you re-run a search on a schedule and only want what has appeared since.",
            "default": "relevance"
          },
          "datePosted": {
            "title": "Posted within",
            "enum": [
              "any",
              "1",
              "3",
              "7",
              "14"
            ],
            "type": "string",
            "description": "Only jobs posted in the last N days. Indeed's date is the ORIGINAL posting date, and employers repost, so a role you have seen before can reappear as new.",
            "default": "any"
          },
          "jobType": {
            "title": "Job type",
            "enum": [
              "any",
              "fulltime",
              "parttime",
              "contract",
              "temporary",
              "internship"
            ],
            "type": "string",
            "description": "Restrict to one employment type. Many postings carry no type at all, and those are excluded by any setting other than Any.",
            "default": "any"
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only postings Indeed marks as remote. Applied both as Indeed's own remote filter and again on the returned rows, because the filter alone lets hybrid roles through.",
            "default": false
          },
          "excludeSponsored": {
            "title": "Exclude sponsored adverts",
            "type": "boolean",
            "description": "Drop paid placements and keep only organic results. Worth knowing before you leave this off: Indeed puts its entire sponsored block ABOVE the organic listings, so a small job limit can return nothing but adverts - measured, the first 20 results for \"software engineer\" in Remote were 20 sponsored postings and no organic ones. Sponsored jobs are real vacancies, so this is off by default, but every row carries isSponsored either way and filtered rows are never written or charged.",
            "default": false
          },
          "radiusMiles": {
            "title": "Search radius (miles)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "How far from the location to search. Ignored when no location is set, because Indeed has nothing to measure from.",
            "default": 0
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Drop jobs whose advertised pay tops out below this, in the country's own currency and matching the posting's own period. Compared against the TOP of the range, so a role advertised at 80,000-150,000 still matches a 100,000 threshold. Postings that state no pay at all are dropped by any value above 0, so leave it at 0 unless you only want jobs with published salaries.",
            "default": 0
          },
          "includeDescription": {
            "title": "Also fetch full job descriptions",
            "type": "boolean",
            "description": "Open each posting and pull its complete description. This costs one extra request PER JOB, so it is far slower than the search itself: a search page hands over about 45 jobs in a single request, while descriptions need 45 requests for the same rows. Without it you still get Indeed's own summary snippet, roughly 200 characters.",
            "default": false
          },
          "maxJobsPerSearch": {
            "title": "Max jobs per search",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Output cap for each search keyword or URL. One request returns about 45 jobs and that is the practical ceiling per search, because Indeed only serves the first page - see Max pages per search. Setting this higher is harmless, it simply will not be reached; to collect more, add more searches.",
            "default": 50
          },
          "maxTotalJobs": {
            "title": "Max jobs in the run",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Hard cap across every search, so a long keyword list cannot run away with the bill. The same job matched by two searches is written and charged once.",
            "default": 1000
          },
          "maxPagesPerSearch": {
            "title": "Max pages per search",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Work cap: result pages read per search. Leave this at 1. Indeed serves the FIRST page of a search to an automated client and refuses the rest - measured across five runs, page two came back HTTP 502 through the unblocking proxy every time, and HTTP 403 on a plain connection. Setting it higher does not fail silently: you get the jobs from page one, a summary row reading stoppedOn \"upstreamFailed\", and an error row naming what happened. To collect more jobs, add more searches rather than more pages - another keyword, another city, or a narrower Posted within window, each of which is a fresh first page.",
            "default": 1
          },
          "maxConcurrency": {
            "title": "Concurrent requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many requests may be in flight at once, across the whole run rather than per search. Searches run in parallel; the pages within one search cannot, because each needs the one before it.",
            "default": 5
          },
          "requestDelayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "maximum": 60000,
            "type": "integer",
            "description": "Minimum gap between the start of one request and the next, applied globally rather than per worker. Note this is not the main defence here: Indeed limits by IP address rather than by rate, so the fresh proxy session used for every request is what keeps a run working.",
            "default": 500
          },
          "proxyConfig": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave this alone. Indeed refuses Apify's datacenter ranges outright - measured, HTTP 403 on the very first request, four attempts in twelve seconds - so the default group is the only one that works. The exit country is pinned automatically to whichever Indeed site you picked, which matters more than it sounds: an exit node in the wrong country makes Indeed serve a LOCALISED page, so salaries come back worded \"por hora\", dates as \"hace 3 dias\" and job types as \"Tiempo completo\", and the result set differs too.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "UNBLOCKER"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}