{
  "openapi": "3.0.1",
  "info": {
    "title": "Indeed Jobs Scraper — Multi-Country Jobs & Salaries",
    "description": "Scrape Indeed jobs in any country (US, UK, FR, DE, CA, ES, IT, NL, AU...) by keyword + location. Get title, company, rating, salary min/max, remote, job type, posted date, snippet + full description. Deduped by jobkey. Search + job-detail modes. No rate limits or page caps.",
    "version": "1.0",
    "x-build-id": "03eVPACp2Qgfq0rQf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dltik~indeed-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dltik-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/dltik~indeed-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dltik-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/dltik~indeed-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dltik-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": {
          "mode": {
            "title": "Scraping mode",
            "enum": [
              "search",
              "job-detail"
            ],
            "type": "string",
            "description": "What to scrape. 'search' finds jobs by query + location + filters and paginates up to maxResults. 'job-detail' returns the complete record (full description, salary, benefits) for specific Indeed jobkeys or viewjob URLs.",
            "default": "search"
          },
          "country": {
            "title": "Country",
            "enum": [
              "us",
              "gb",
              "ca",
              "au",
              "fr",
              "de",
              "es",
              "it",
              "nl",
              "be",
              "ch",
              "at",
              "ie",
              "in",
              "br",
              "mx",
              "pt",
              "pl",
              "se",
              "sg",
              "za",
              "nz",
              "jp"
            ],
            "type": "string",
            "description": "Indeed country site to scrape. Routes to the right host (e.g. us=www.indeed.com, gb=uk.indeed.com, fr=fr.indeed.com, de=de.indeed.com). Also sets the Accept-Language header and default salary currency for that market.",
            "default": "us"
          },
          "query": {
            "title": "Search query (keyword)",
            "type": "string",
            "description": "Job keyword(s) to search, e.g. 'python developer', 'registered nurse', 'commercial'. Used in 'search' mode (maps to Indeed's ?q= parameter). Leave empty to browse a location only."
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City, region, postal code or country to search within, e.g. 'New York', 'London', 'Remote', '75001'. Used in 'search' mode (maps to Indeed's ?l= parameter). Combine with 'radius' to widen the area."
          },
          "maxResults": {
            "title": "Max results (search mode)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum jobs to return in 'search' mode. Indeed paginates 10 per page (start=0,10,20...); the scraper walks pages until this cap or no more cards. Deduped by jobkey. Aliases 'limit'/'max' accepted. Each result is billed at the per-event price — start small to validate output.",
            "default": 25
          },
          "radius": {
            "title": "Search radius (miles/km)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Optional search radius around the location, in the market's unit (miles for US/UK, km for metric markets). Maps to Indeed's ?radius=. Typical values: 5, 10, 25, 50. Leave empty for Indeed's default."
          },
          "fromDays": {
            "title": "Posted within N days",
            "minimum": 1,
            "maximum": 60,
            "type": "integer",
            "description": "Only return jobs posted within the last N days (recency filter, maps to Indeed's ?fromage=). Common values: 1, 3, 7, 14. Leave empty for all dates. Great for daily monitoring pipelines."
          },
          "jobType": {
            "title": "Job type",
            "enum": [
              "any",
              "fulltime",
              "parttime",
              "contract",
              "temporary",
              "internship"
            ],
            "type": "string",
            "description": "Filter by employment type (maps to Indeed's ?jt=). Leave as 'any' for no filter.",
            "default": "any"
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "When true, restrict 'search' results to remote-friendly jobs using Indeed's remote facet (sc=0kf:attr(DSQF7)). Each result still carries a 'remote' field (remote/hybrid/onsite) so you can filter downstream too. Superseded by 'workArrangement' — if you set workArrangement, use that instead.",
            "default": false
          },
          "workArrangement": {
            "title": "Work arrangement",
            "enum": [
              "any",
              "remote",
              "hybrid"
            ],
            "type": "string",
            "description": "Filter 'search' results by on-site/remote arrangement (maps to Indeed's sc=0kf:attr facet). 'any' = no filter; 'remote' = fully remote jobs (attr DSQF7); 'hybrid' = hybrid jobs (attr PAXZC). This is the richer replacement for the legacy 'remoteOnly' boolean.",
            "default": "any"
          },
          "experienceLevel": {
            "title": "Experience level",
            "enum": [
              "any",
              "entry",
              "mid",
              "senior"
            ],
            "type": "string",
            "description": "Filter 'search' results by required experience level (maps to Indeed's sc=0kf:explvl facet). 'any' = no filter; 'entry' = ENTRY_LEVEL; 'mid' = MID_LEVEL; 'senior' = SENIOR_LEVEL. Combinable with workArrangement.",
            "default": "any"
          },
          "sortBy": {
            "title": "Sort results by",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "How to order 'search' results. 'relevance' = Indeed's default ranking; 'date' = most recently posted first (appends sort=date). Use 'date' for job-alert / daily-monitoring pipelines to catch the newest postings.",
            "default": "relevance"
          },
          "resolveApplyUrl": {
            "title": "Resolve final external apply URL (job-detail mode)",
            "type": "boolean",
            "description": "When true (job-detail mode only), makes ONE extra proxied request per job to follow Indeed's apply redirect and reveal the FINAL external employer/ATS apply URL (e.g. the company's Workday/Greenhouse/careers-page link). Off by default — the record already includes 'apply_url' (the employer link when Indeed exposes it directly, no extra request). This adds no separate charge but uses more proxy bandwidth, so enable it only when you specifically need the resolved destination.",
            "default": false
          },
          "jobUrlsOrKeys": {
            "title": "Job URLs or keys (job-detail mode)",
            "type": "array",
            "description": "For 'job-detail' mode: a list of Indeed jobkeys or full viewjob URLs to fetch complete records for. Accepts either form, e.g. 'https://www.indeed.com/viewjob?jk=1a2b3c4d5e6f7g8h' or just '1a2b3c4d5e6f7g8h'. Ignored in 'search' mode.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "customProxyUrl": {
            "title": "Custom proxy / unblocker URL (recommended)",
            "type": "string",
            "description": "STRONGLY RECOMMENDED for reliable results. This target edge-blocks the shared Apify residential pool (anti-bot challenge / login-wall). When set, this single premium-unblocker URL is used as the ONLY proxy (no rotation — the unblocker handles IPs + challenge solving). Format: http://user:pass@host:port. Works with Bright Data Web Unlocker, Oxylabs Web Unblocker, ScraperAPI (proxy mode), ZenRows. Leave empty to fall back to the Apify proxy below."
          },
          "proxyConfig": {
            "title": "Proxy configuration (residential strongly recommended)",
            "type": "object",
            "description": "Indeed is Cloudflare / anti-bot guarded and typically blocks datacenter and direct IPs. Enable Apify Proxy with the RESIDENTIAL group for reliable results. If a Cloudflare challenge is detected the run fails-fast with instructions and does NOT charge you.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}