{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Board Scraper & API — LinkedIn, Indeed, Glassdoor + 29 More",
    "description": "Job board API across 33 sources: LinkedIn, Indeed, Glassdoor, Naukri, Amazon, Workday, Welcome to the Jungle, remote job feeds, SWE internships and new grad jobs, 17 employer ATS platforms. Deduplicated, salaries in USD, 190 technologies, a hiring profile per company, new-jobs monitor.",
    "version": "1.0",
    "x-build-id": "Xt9mrjJIbmSCLeNT7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/spool~job-board-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-spool-job-board-api",
        "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~job-board-api/runs": {
      "post": {
        "operationId": "runs-sync-spool-job-board-api",
        "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~job-board-api/run-sync": {
      "post": {
        "operationId": "run-sync-spool-job-board-api",
        "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": "Up to five queries, one per line, run together and merged — `software engineer`, `data analyst`, `account executive`. Every row says which term found it.\n\nLeave empty if you only want the **Companies** list below.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "2. Location",
            "type": "string",
            "description": "City, region or country — `New York, NY`, `London`, `Germany`, or `Remote`. LinkedIn is global; set **Indeed/Glassdoor country** below for those two."
          },
          "boards": {
            "title": "3. Job boards and sources",
            "type": "array",
            "description": "**Boards** — Indeed (salary and description on every row; via proxy from Apify's network), LinkedIn (global; descriptions filled from the employer's board or LinkedIn's own job detail), Glassdoor (salaries, company ratings), Naukri (India), Bayt (Middle East), BDJobs (Bangladesh).\n\n**Free job APIs** — Remotive, RemoteOK, Arbeitnow (Europe), Jobicy, Himalayas, Working Nomads, We Work Remotely, the monthly *Ask HN: Who is hiring?* thread, **Welcome to the Jungle** (Europe, salaries) and **College jobs**, the daily-updated speedyapply list of software-engineering internships and new-grad roles (2,700+ rows, salaries on many). All answer a plain request with no key and no proxy; the remote ones join automatically when you search for remote roles.\n\nEmployers' own ATS boards are a separate layer — see **Companies** and *Enrichment*.",
            "items": {
              "type": "string",
              "enum": [
                "indeed",
                "linkedin",
                "glassdoor",
                "naukri",
                "bayt",
                "bdjobs",
                "remotive",
                "remoteok",
                "arbeitnow",
                "jobicy",
                "himalayas",
                "workingnomads",
                "weworkremotely",
                "hackernews",
                "collegejobs",
                "wttj"
              ],
              "enumTitles": [
                "Indeed — salary + description on every row",
                "LinkedIn — global; descriptions via employer boards",
                "Glassdoor — salaries, company ratings",
                "Naukri — India; skills and experience",
                "Bayt — Middle East",
                "BDJobs — Bangladesh",
                "Remotive — remote, free API",
                "RemoteOK — remote, free API, salaries",
                "Arbeitnow — Europe, free API",
                "Jobicy — remote, free API, salaries",
                "Himalayas — remote, 116k+ jobs, free API",
                "Working Nomads — remote, free API",
                "We Work Remotely — remote, RSS",
                "Hacker News: Who is hiring? — monthly thread",
                "College jobs — SWE internships and new-grad roles (speedyapply list, daily)",
                "Welcome to the Jungle — Europe (France, UK, Spain…), salaries, 10k+ jobs"
              ]
            },
            "default": [
              "indeed",
              "linkedin",
              "glassdoor"
            ]
          },
          "companies": {
            "title": "4. Companies — straight from their own job boards",
            "type": "array",
            "description": "Employers to read **directly from their own board**: a name (`Stripe`), a domain (`ramp.com`), or a board URL. Greenhouse, Ashby, Lever, SmartRecruiters, Rippling, Breezy, Personio, Teamtailor and Pinpoint boards are found by name; **Workday** (most large enterprises), Eightfold career sites, BambooHR and Recruitee are found from a careers URL; **Amazon** is found by name — paste one like `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`.\n\nThese rows carry the full description, the department and the real posting date, and never hit a rate limit. If search terms are set, only matching roles are kept; otherwise the whole board is returned.",
            "items": {
              "type": "string"
            }
          },
          "resultsPerBoard": {
            "title": "Results per board, per search term",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "1–500. Total before deduplication = this × boards × search terms × locations. You pay only for rows actually delivered after deduplication. Deep runs: 500 per board on three boards across ten locations is up to 15,000 rows before merging — LinkedIn paginates to about 1,000 per query, Indeed and Glassdoor deeper.",
            "default": 20
          },
          "enrichFromAts": {
            "title": "Match aggregator jobs to the employer's own posting",
            "type": "boolean",
            "description": "**The reason to use this Actor.** For each company found on the boards, find its own ATS board and attach the employer's posting: a direct apply URL, the department, the real posting date, and — for LinkedIn rows, which arrive with no description — the full description, without paying for LinkedIn's per-job fetch.\n\nSeventeen ATS platforms and career-site systems are recognised. Nine are found by company name; Workday, Oracle Cloud HCM, Eightfold, BambooHR and Recruitee are found from the job's own direct URL, and a named company's careers page is read for the system behind it, which Indeed and Glassdoor usually supply — so the large Workday enterprises are covered too. Measured on the platform's default run (4 Oct 2026): 9 of 34 companies had a board on the first four platforms and 12 LinkedIn rows received their description from it; the figure with twelve platforms is in the README.",
            "default": true
          },
          "fetchAggregatorPages": {
            "title": "Fetch the descriptions LinkedIn and Glassdoor withhold",
            "type": "boolean",
            "description": "LinkedIn and Glassdoor list jobs without descriptions. With this on, rows from those two boards that still have none after the employer-board match get the board's own job detail read — LinkedIn's public job fragment, Glassdoor's detail query — through paced residential proxy sessions (one request every two seconds per session, a session retired at its first rate limit), capped by *Max employer pages per run* for each board. LinkedIn also yields seniority, employment type, job function and industry.",
            "default": true
          },
          "fetchJobPages": {
            "title": "Read the employer's page for rows still missing a description",
            "type": "boolean",
            "description": "After the boards and the ATS layer, rows that still have no description but have a direct employer URL get that page fetched and its schema.org **JobPosting** data read — the block career sites publish for Google for Jobs: full description, posting date, employment type, remote flag and, when the employer states it, the salary (`salarySource: page`). One request per row, aggregator domains skipped.",
            "default": true
          },
          "companyRollup": {
            "title": "Add one hiring profile per company",
            "type": "boolean",
            "description": "One extra row per company: open roles found, which boards it posts on, its ATS, department mix, seniority mix, top technologies, salary range in USD, remote share. This is the lead-generation view — a company posting five SDR roles is a buying signal, and this is where you see it.",
            "default": true
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Passed to each board's own remote filter. Every row also carries an `remoteOnly` flag derived from the title and location, which catches postings the boards mislabel.",
            "default": false
          },
          "postedWithinHours": {
            "title": "Posted within the last N hours",
            "minimum": 1,
            "type": "integer",
            "description": "24 = last day, 168 = last week. **Board quirks:** LinkedIn cannot combine this with Easy Apply; Indeed cannot combine it with job type, remote or Easy Apply — the board silently ignores one of them."
          },
          "jobType": {
            "title": "Job type",
            "enum": [
              "",
              "fulltime",
              "parttime",
              "contract",
              "internship",
              "temporary"
            ],
            "type": "string",
            "description": "Employment type filter.",
            "default": ""
          },
          "linkedinEasyApply": {
            "title": "Easy Apply only",
            "type": "boolean",
            "description": "Quick-apply postings hosted on the board. See the LinkedIn/Indeed quirks under *Posted within*.",
            "default": false
          },
          "requireSalary": {
            "title": "Only jobs that state a salary",
            "type": "boolean",
            "description": "Keep rows with a salary from the board or the employer's ATS. Applied after deduplication and enrichment, so a LinkedIn row whose salary came from Greenhouse is kept.",
            "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"
            }
          },
          "indeedCountry": {
            "title": "Indeed / Glassdoor country",
            "type": "string",
            "description": "Which national Indeed and Glassdoor site to search: `usa`, `uk`, `canada`, `australia`, `germany`, `france`, `india`, `singapore`, `uae`, `netherlands`, `spain`, `italy`, `brazil`, `mexico`, `japan`… LinkedIn ignores this.",
            "default": "usa"
          },
          "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."
          },
          "locations": {
            "title": "More locations",
            "type": "array",
            "description": "Up to ten locations searched in the same run, one per line — `San Francisco, CA`, `Austin, TX`, `Seattle, WA`… Every board is asked for every term in every location and the results are deduplicated together. Combine with a higher *Results per board* for a full national sweep.",
            "items": {
              "type": "string"
            }
          },
          "searchEmployerBoards": {
            "title": "Also search N well-known employer boards directly",
            "minimum": 0,
            "maximum": 800,
            "type": "integer",
            "description": "Ask this many well-known employers' own boards for your search terms, straight from the source — no aggregator in between. The bundled, verified list of 1,129 employers covers 17 platforms (Greenhouse, Ashby, Lever, Workday, Oracle, SuccessFactors, Phenom, Eightfold…) with companies like Stripe, Airbnb, Anthropic, Databricks, Nvidia, Lockheed Martin and Capital One, largest board first. Rows carry the full description, the department and the real posting date. 0 = off; 100 boards take about a minute, 800 covers the whole list.",
            "default": 0
          },
          "maxAtsLookups": {
            "title": "Max companies to look up",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Each company costs one to four requests to find its board. 50 covers a typical run.",
            "default": 50
          },
          "maxJobPageFetches": {
            "title": "Max employer pages per run",
            "minimum": 0,
            "maximum": 300,
            "type": "integer",
            "description": "Cap on the employer-page reads and on the LinkedIn page reads above, each. 40 covers a default run; raise it for deep runs.",
            "default": 40
          },
          "maxDescriptionsPerBoard": {
            "title": "Max descriptions per Workday / Eightfold board",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Workday and Eightfold boards need one request per posting for its description. 60 keeps a board under a minute; set 500 to read a whole enterprise board (Nvidia's holds 1,700+ roles) with every description.",
            "default": 60
          },
          "autoRemoteFeeds": {
            "title": "Add the free remote feeds to remote searches",
            "type": "boolean",
            "description": "When the search is remote (Remote only is on, or the location says remote/anywhere/worldwide) and you have not picked any free feed yourself, Remotive, RemoteOK, Jobicy, Himalayas, Working Nomads and We Work Remotely join the run. Turn off to search the boards alone.",
            "default": true
          },
          "linkedinDescriptions": {
            "title": "LinkedIn: fetch each description from LinkedIn",
            "type": "boolean",
            "description": "One extra LinkedIn request per job, which is what LinkedIn rate-limits. Usually unnecessary: the employer-board enrichment fills the description from the company's own ATS. Turn this on only for companies with no public ATS.",
            "default": false
          },
          "linkedinCompanyIds": {
            "title": "LinkedIn: restrict to company IDs",
            "type": "array",
            "description": "Numeric LinkedIn company IDs, e.g. `1441` (Google).",
            "items": {
              "type": "string"
            }
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "markdown",
              "html"
            ],
            "type": "string",
            "description": "How board descriptions are returned. Employer-board descriptions are plain text.",
            "default": "markdown"
          },
          "radiusMiles": {
            "title": "Search radius (miles)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Around the location, where the board supports it.",
            "default": 50
          },
          "offset": {
            "title": "Skip the first N results",
            "minimum": 0,
            "type": "integer",
            "description": "Pagination: run again with an offset to go deeper on a board.",
            "default": 0
          },
          "useApifyProxy": {
            "title": "Use Apify Proxy for the boards that need it",
            "type": "boolean",
            "description": "Indeed refuses connections from Apify's own addresses, Glassdoor rejects datacenter proxies, LinkedIn rate-limits by IP. With this on, those three boards go through Apify Proxy — **residential by default**, the only group all three accept — with eight sticky sessions. Measured proxy traffic for a three-board run: about $0.0002. Naukri, Bayt, BDJobs, the free APIs and the employer boards go direct; they do not need it.",
            "default": true
          },
          "proxiedBoards": {
            "title": "Boards sent through the proxy",
            "type": "array",
            "description": "Which boards use the proxy when it is on. The default is the three that need it.",
            "items": {
              "type": "string",
              "enum": [
                "indeed",
                "linkedin",
                "glassdoor",
                "naukri",
                "bayt",
                "bdjobs"
              ]
            },
            "default": [
              "indeed",
              "linkedin",
              "glassdoor"
            ]
          },
          "proxyConfiguration": {
            "title": "Proxy settings",
            "type": "object",
            "description": "Optional. Override the proxy group (datacenter is cheaper but Glassdoor rejects it) or supply your own proxy URLs."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}