{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Board Scraper: LinkedIn, Indeed, Glassdoor Job Postings API",
    "description": "Jobs API & LinkedIn, Indeed, Glassdoor scraper: up to 12 boards incl. The Muse job board, deduped. Job board aggregator & job search aggregator for new job postings data; job monitoring, LinkedIn job alerts. Job scraping tool, job scraper tool, multi source job scraper. No API key, no compute fees.",
    "version": "0.1",
    "x-build-id": "B62JegvIy3JtAtXqR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/flash_scraper~multi-jobboard-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-flash_scraper-multi-jobboard-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/flash_scraper~multi-jobboard-scraper/runs": {
      "post": {
        "operationId": "runs-sync-flash_scraper-multi-jobboard-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/flash_scraper~multi-jobboard-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-flash_scraper-multi-jobboard-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": {
          "searchTerm": {
            "title": "Search term",
            "type": "string",
            "description": "Job title or keywords sent to every selected board, e.g. registered nurse. Free text: quotes and boolean operators are not guaranteed. searchTerms or roleSelect override it.",
            "default": "software engineer"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City/state/country, e.g. Austin, TX. Empty = nationwide in the countryIndeed country (default USA) on Indeed (and Glassdoor where supported), anywhere on other boards. locations/citySelect override."
          },
          "sites": {
            "title": "Job boards",
            "type": "array",
            "description": "Default: linkedin, indeed, glassdoor, muse (Muse has no salary). The 7 remote-only boards auto-join if isRemote is on and this is the default. naukri/bdjobs bill only for a place in India/Bangladesh.",
            "items": {
              "type": "string",
              "enum": [
                "linkedin",
                "indeed",
                "glassdoor",
                "muse",
                "remotive",
                "jobicy",
                "himalayas",
                "hn_hiring",
                "devitjobs_us",
                "devitjobs_uk",
                "remoteok",
                "weworkremotely",
                "working_nomads",
                "google",
                "zip_recruiter",
                "bayt",
                "bdjobs",
                "naukri"
              ],
              "enumTitles": [
                "LinkedIn",
                "Indeed",
                "Glassdoor",
                "The Muse",
                "Remotive · remote-only",
                "Jobicy · remote-only",
                "Himalayas · remote-only",
                "HN Who-is-Hiring · remote-only",
                "DevITjobs US · tech, ~100% salary",
                "DevITjobs UK · discontinued upstream 2026-08-29",
                "Remote OK · remote-only",
                "We Work Remotely · remote-only",
                "Working Nomads · remote-only",
                "Google Jobs · blocked at source",
                "ZipRecruiter · blocked at source",
                "Bayt / MENA · blocked at source",
                "BDJobs / Bangladesh · places in Bangladesh only, billed per row",
                "Naukri / India · places in India only, billed per row"
              ]
            },
            "default": [
              "linkedin",
              "indeed",
              "glassdoor",
              "muse"
            ]
          },
          "maxResults": {
            "title": "Max job postings per board",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Rows asked from each board per search (1-500, clamped): 4 boards x 20 = up to 80 rows per search; each term x location, URL and ATS company has its own cap. Billed per row after dedup.",
            "default": 20
          },
          "hoursOld": {
            "title": "Posted within (hours)",
            "minimum": 1,
            "type": "integer",
            "description": "Only postings from the last N hours (board-side), e.g. 168. Empty or over 8760 = any age. When set, easyApply is dropped on LinkedIn/Indeed and jobType/isRemote on Indeed (logged)."
          },
          "isRemote": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Remote jobs only: rows whose own is_remote is false are dropped before billing. If sites is the default (re-picking the same 4 counts), the 7 remote-only boards join: more rows, bigger bill.",
            "default": false
          },
          "onlyNewJobs": {
            "title": "Only new jobs (monitoring mode)",
            "type": "boolean",
            "description": "For schedules: delivers and bills only postings not in this search's memory (your account; forgets those no delivering run found in 90 days). A job re-listed under a new URL or board can bill again.",
            "default": false
          },
          "searchTerms": {
            "title": "Search terms (multiple)",
            "type": "array",
            "description": "Up to 5 searches in one run, merged and deduped (a job found by two terms bills once). Overrides searchTerm and roleSelect. Terms past the 5th are listed in RUN_SUMMARY, not run.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations (multiple)",
            "type": "array",
            "description": "Several places in one run, e.g. Austin, TX and Denver, CO. Replaces location and citySelect. Max 10 places, 50 term x location searches; each pair bills up to maxResults per board.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "atsCompanies": {
            "title": "Watch specific companies (ATS boards)",
            "type": "array",
            "description": "Up to 20 companies (name or myworkdayjobs.com URL) on Greenhouse, Lever, Ashby, Recruitee, BambooHR, Workable or Workday; maxResults per company. sites still run and bill; sites: [] skips them.",
            "items": {
              "type": "string"
            }
          },
          "searchUrls": {
            "title": "Search URLs",
            "type": "array",
            "description": "LinkedIn, Indeed (any country) or Glassdoor search URLs, each run on its own board with its own filters. Replaces searchTerm, locations and sites. Unparsed URLs: RUN_SUMMARY.search_url_errors.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "jobType": {
            "title": "Job type",
            "enum": [
              "",
              "fulltime",
              "parttime",
              "internship",
              "contract"
            ],
            "type": "string",
            "description": "Keep one employment type; empty = any. Indeed and Glassdoor filter board-side (Indeed not with hoursOld), then rows whose job_type contradicts it are dropped before billing; untyped rows are kept.",
            "default": ""
          },
          "experienceLevel": {
            "title": "Experience level (best-effort)",
            "type": "array",
            "description": "Keep only these seniority levels; empty = all. Best-effort: the board's level where published, else read from the title. Unknown level is kept. Filtered rows are never billed.",
            "items": {
              "type": "string",
              "enum": [
                "internship",
                "entry",
                "associate",
                "mid_senior",
                "director",
                "executive"
              ],
              "enumTitles": [
                "Internship",
                "Entry level",
                "Associate",
                "Mid-Senior level",
                "Director",
                "Executive"
              ]
            },
            "default": []
          },
          "requireSalary": {
            "title": "Only jobs with salary",
            "type": "boolean",
            "description": "Keep only postings with a salary figure (salary_min or salary_max). Others are dropped before billing. Glassdoor and Indeed publish salary most often, LinkedIn rarely.",
            "default": false
          },
          "maxAgeDays": {
            "title": "Max posting age (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Drop postings older than N days, e.g. 7 (any N, applied literally). After scraping, before billing, on every board; never clashes with other filters. Undated postings are kept. Empty = no limit."
          },
          "targetCompanies": {
            "title": "Only these companies",
            "type": "array",
            "description": "Keep only these employers; everything else is dropped before billing. Names are normalized: Google matches Google LLC, Amazon keeps Amazon Web Services but not Amazonia. Empty = all.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeCompanies": {
            "title": "Exclude companies",
            "type": "array",
            "description": "Drop these employers, e.g. a staffing agency. Case-insensitive, legal suffixes ignored: Wipro also drops Wipro Limited (not Wiprox). Filtered rows are never billed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Drop postings whose title contains any of these words or phrases, e.g. senior, intern. Case-insensitive substring match on the title only. Filtered rows are never billed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "requireTitleKeywords": {
            "title": "Require title keywords",
            "type": "array",
            "description": "Keep only postings whose title contains at least one of these words or phrases, e.g. intern. Case-insensitive, title only. Dropped rows are never billed; not part of the onlyNewJobs memory.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeCities": {
            "title": "Exclude cities",
            "type": "array",
            "description": "Drop postings whose location mentions any of these places, e.g. San Francisco. Whole-word, case-insensitive, on the board's own location text; best-effort. Filtered rows are never billed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeAgencies": {
            "title": "Exclude staffing agencies & recruiters",
            "type": "boolean",
            "description": "Drop postings whose company name looks like a staffing agency or recruiter (staffing, recruit, talent...). Heuristic on the name only; excludeCompanies is exact. Never billed.",
            "default": false
          },
          "excludeClosed": {
            "title": "Exclude closed LinkedIn postings",
            "type": "boolean",
            "description": "Drop LinkedIn postings marked No longer accepting applications (read only with linkedinFetchDescription on). Off: they ship with is_closed true. LinkedIn only. Never billed.",
            "default": false
          },
          "strictKeywordMatch": {
            "title": "Only job postings that mention my search term",
            "type": "boolean",
            "description": "Drop postings whose title and description never mention your search words. Use for narrow roles: LinkedIn pads results with loosely related jobs. Can only lower the bill.",
            "default": false
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "markdown",
              "html"
            ],
            "type": "string",
            "description": "Format of the description column: markdown (best for LLMs and spreadsheets) or html (the board's original markup).",
            "default": "markdown"
          },
          "descriptionHtml": {
            "title": "Raw HTML description column",
            "type": "boolean",
            "description": "Add a description_html column with the board's original HTML next to description. No extra requests, no extra cost per row; roughly doubles dataset size.",
            "default": false
          },
          "includeCompanyDetails": {
            "title": "Company details block",
            "type": "boolean",
            "description": "No effect, kept for compatibility: since v0.1.48 the company block ships on every run. Fields a board does not publish stay null.",
            "default": false
          },
          "resumeKeywords": {
            "title": "Resume keywords (scoring only)",
            "type": "array",
            "description": "Your skills, e.g. Python, SOC 2: matched_keywords and keyword_match_percent (0-100) score against this list instead of the search terms. Never removes a row or changes billing.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "",
              "relevance",
              "date_desc",
              "salary_desc"
            ],
            "type": "string",
            "description": "Order of the final rows: relevance, date_desc or salary_desc; empty = board order. Applied before the charge cap. Rows missing the sort key go last.",
            "default": ""
          },
          "enforceAnnualSalary": {
            "title": "Annual salary normalization",
            "type": "boolean",
            "description": "Rewrite hourly and monthly salary_min/salary_max as annual figures where possible. salary_min_annual and salary_max_annual are filled on every row either way.",
            "default": false
          },
          "countryIndeed": {
            "title": "Indeed/Glassdoor country",
            "type": "string",
            "description": "Indeed/Glassdoor site country, e.g. usa, uk; Indeed searches all of it if location is empty. Other boards ignore it. If unset, a location naming a country switches Indeed. Bad values fall back to usa.",
            "default": "usa"
          },
          "linkedinFetchDescription": {
            "title": "Full LinkedIn job details",
            "type": "boolean",
            "description": "On: opens job pages (description, job_type, job_level, industry, emails, is_closed, pay) + BambooHR/Workable/Workday details. Off: 13-18 s vs 30-113 s, same price; filters keep unjudged LinkedIn rows.",
            "default": true
          },
          "linkedinCompanyIds": {
            "title": "LinkedIn company IDs",
            "type": "array",
            "description": "Restrict LinkedIn to these numeric company IDs, e.g. 1441 (from a previous run's company_linkedin_id column or a LinkedIn URL's f_C). Other boards ignore it.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "distance": {
            "title": "Distance (miles)",
            "minimum": 0,
            "type": "integer",
            "description": "Search radius in miles around the location, e.g. 25. LinkedIn and Indeed honor it; Glassdoor and the API boards ignore it. No effect without a location."
          },
          "easyApply": {
            "title": "Easy Apply only",
            "type": "boolean",
            "description": "Keep only easy-apply postings on LinkedIn and Indeed; other boards ignore it. With hoursOld set it is dropped for those two boards (logged) and their rows come back unfiltered.",
            "default": false
          },
          "offset": {
            "title": "Offset",
            "minimum": 0,
            "type": "integer",
            "description": "Skip the first N postings on each board, e.g. 50, to page past an earlier run. Boards reorder, so it is not a stable cursor. API boards fetch N extra rows and return the tail."
          },
          "googleSearchTerm": {
            "title": "Google Jobs query",
            "type": "string",
            "description": "Full Google Jobs query string. Google Jobs is blocked at the source, so this currently changes nothing."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Keep the default datacenter proxy (measured faster than residential). Switch to RESIDENTIAL only if Glassdoor comes back short. No proxy = LinkedIn only. Row price never changes.",
            "default": {
              "useApifyProxy": true
            }
          },
          "userAgent": {
            "title": "User agent",
            "type": "string",
            "description": "Custom User-Agent header instead of the built-in one. Leave empty unless a board blocks the default."
          },
          "caCert": {
            "title": "CA certificate",
            "type": "string",
            "description": "Custom CA certificate (path or contents), only for your own proxy that terminates TLS. Leave empty for Apify Proxy."
          },
          "webhookUrl": {
            "title": "Alert webhook URL (Slack, Discord, n8n, Make, Zapier…)",
            "type": "string",
            "description": "Optional. After a run delivers rows, POSTs a digest (Slack/Discord message, else JSON with the first 20 rows). Quiet runs send nothing. Pair with onlyNewJobs. Never fails the run."
          },
          "preset": {
            "title": "Preset",
            "enum": [
              "",
              "salary_research",
              "competitor_intel",
              "remote_only",
              "fresh_postings",
              "recruiter_leads"
            ],
            "type": "string",
            "description": "Goal shortcut; fills only options left at default. salary_research, competitor_intel (needs targetCompanies), remote_only (sets isRemote, can raise the bill), fresh_postings (7 days), recruiter_leads.",
            "default": ""
          },
          "roleSelect": {
            "title": "Role (quick pick)",
            "enum": [
              "",
              "software engineer",
              "data analyst",
              "registered nurse",
              "sales representative",
              "product designer",
              "devops engineer",
              "machine learning engineer",
              "project manager",
              "accountant",
              "truck driver",
              "retail associate",
              "civil engineer",
              "lab technician",
              "customer support",
              "content writer",
              "security engineer",
              "financial analyst",
              "teacher",
              "chef",
              "electrician"
            ],
            "type": "string",
            "description": "Form quick pick for a common job title, sent as plain keywords. Overrides searchTerm; searchTerms overrides it. Empty = use searchTerm.",
            "default": ""
          },
          "citySelect": {
            "title": "City (quick pick)",
            "enum": [
              "",
              "Remote",
              "New York, NY",
              "San Francisco, CA",
              "Los Angeles, CA",
              "Chicago, IL",
              "Austin, TX",
              "Seattle, WA",
              "Boston, MA",
              "Washington, DC",
              "Atlanta, GA",
              "Dallas, TX",
              "Denver, CO",
              "Miami, FL",
              "Phoenix, AZ",
              "Houston, TX",
              "Toronto, ON",
              "London",
              "Berlin",
              "Amsterdam",
              "Dublin",
              "Paris",
              "Sydney",
              "Bengaluru",
              "Singapore"
            ],
            "type": "string",
            "description": "Form quick pick for a metro. Overrides location; locations overrides it. A non-US metro also sets countryIndeed unless you set it. Remote searches the word Remote; use isRemote for remote jobs.",
            "default": ""
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}