{
  "openapi": "3.0.1",
  "info": {
    "title": "Jobs Search API: 236,000 Roles, No Cookies, No Company List",
    "description": "Search every open role across 7,368 Greenhouse, Ashby and Workable boards at once, without knowing a company name. The data comes from each employer's own board, so there is no login and no cookies. Or switch to Companies mode for who is hiring hardest and the departments they just entered.",
    "version": "0.1",
    "x-build-id": "2FTdH2fjlbZZI8gkE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/glitchbound~ats-jobs-search/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-glitchbound-ats-jobs-search",
        "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/glitchbound~ats-jobs-search/runs": {
      "post": {
        "operationId": "runs-sync-glitchbound-ats-jobs-search",
        "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/glitchbound~ats-jobs-search/run-sync": {
      "post": {
        "operationId": "run-sync-glitchbound-ats-jobs-search",
        "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": "What to return",
            "enum": [
              "jobs",
              "companies"
            ],
            "type": "string",
            "description": "Jobs returns one row per open role. Companies returns one row per COMPANY ranked by how many roles they opened recently, with new departments and locations called out. Use Companies for sales and recruiting prospecting; use Jobs to find the roles themselves.",
            "default": "jobs"
          },
          "title": {
            "title": "Job title contains any of",
            "uniqueItems": true,
            "type": "array",
            "description": "Words that must appear in the job title, one per line. Several lines are OR-ed. End a word with * to match its prefix: engineer* also matches engineering. Quotes are not needed and a multi-word line is matched as a phrase, so product manager finds \"Product Manager\" but not \"Product Marketing Manager\".",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location contains any of",
            "uniqueItems": true,
            "type": "array",
            "description": "Places to match, one per line, e.g. berlin or united kingdom. Several lines are OR-ed. Matched against the location the employer published, so a country works when a city is not given. For remote work use Work arrangement instead, which uses what the board states rather than the word in the text.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Country",
            "type": "array",
            "description": "Only roles in these countries, matched on a country resolved from the employer's location string rather than on the text itself. Use it when you want German roles without caring whether the board wrote \"Berlin, Germany\", \"Berlin\", \"Munich, DE\" or \"DE - Berlin\". Resolved on 87.8% of roles; the rest publish something no rule can read, like \"EMEA\" or a bare \"Cambridge\", and are excluded rather than guessed at.",
            "items": {
              "type": "string"
            }
          },
          "company": {
            "title": "Company contains any of",
            "uniqueItems": true,
            "type": "array",
            "description": "Company or board names to match, one per line. Several lines are OR-ed. Use * for a prefix.",
            "items": {
              "type": "string"
            }
          },
          "department": {
            "title": "Department contains any of",
            "uniqueItems": true,
            "type": "array",
            "description": "Departments or teams to match, one per line, e.g. engineering or design. Present on 44% of jobs, so this narrows results to those that publish it.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Any field contains any of",
            "uniqueItems": true,
            "type": "array",
            "description": "Search title, company, location and department together, one term per line. Use this when you do not care which field matched.",
            "items": {
              "type": "string"
            }
          },
          "titleExclude": {
            "title": "Job title must NOT contain",
            "uniqueItems": true,
            "type": "array",
            "description": "Drop roles whose title contains any of these, one per line, e.g. intern or sales. Excluded jobs are never returned and never charged.",
            "items": {
              "type": "string"
            }
          },
          "companyExclude": {
            "title": "Company must NOT contain",
            "uniqueItems": true,
            "type": "array",
            "description": "Drop jobs from these companies, one per line. Useful for staffing agencies or companies you have already applied to.",
            "items": {
              "type": "string"
            }
          },
          "locationExclude": {
            "title": "Location must NOT contain",
            "uniqueItems": true,
            "type": "array",
            "description": "Drop jobs in these places, one per line.",
            "items": {
              "type": "string"
            }
          },
          "workArrangements": {
            "title": "Work arrangement",
            "uniqueItems": true,
            "type": "array",
            "description": "Remote, hybrid or on-site. Taken from what the board itself states wherever it does: Ashby publishes a workplace type and Workable publishes a remote flag. Where neither says, it is read from the location text, and a job we could not classify is left out of all three rather than guessed into one.",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "onsite"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On-site"
              ]
            }
          },
          "seniority": {
            "title": "Seniority",
            "uniqueItems": true,
            "type": "array",
            "description": "Derived from the job title, because no ATS publishes a seniority field. About a third of jobs carry one; the rest state nothing recognisable in the title and are left unlabelled rather than guessed. Filtering here therefore narrows to jobs that say so in the title.",
            "items": {
              "type": "string",
              "enum": [
                "intern",
                "junior",
                "senior",
                "staff",
                "principal",
                "lead",
                "director",
                "executive"
              ],
              "enumTitles": [
                "Intern",
                "Junior",
                "Senior",
                "Staff",
                "Principal",
                "Lead",
                "Director",
                "Executive"
              ]
            }
          },
          "employmentTypes": {
            "title": "Employment type",
            "uniqueItems": true,
            "type": "array",
            "description": "Full-time, contract, part-time, temporary or internship. Taken from the board's own field on 42% of jobs; the rest do not publish one and are left unlabelled.",
            "items": {
              "type": "string",
              "enum": [
                "full-time",
                "part-time",
                "contract",
                "temporary",
                "internship"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract",
                "Temporary",
                "Internship"
              ]
            }
          },
          "platforms": {
            "title": "Applicant tracking system",
            "uniqueItems": true,
            "type": "array",
            "description": "Limit to jobs from one system. Leave empty to search all three.",
            "items": {
              "type": "string",
              "enum": [
                "greenhouse",
                "ashby",
                "workable"
              ],
              "enumTitles": [
                "Greenhouse",
                "Ashby",
                "Workable"
              ]
            }
          },
          "postedAfter": {
            "title": "Posted on or after",
            "type": "string",
            "description": "An ISO date, e.g. 2026-07-01. Jobs whose board publishes no posting date are excluded when this is set, because no date is not evidence of a recent one."
          },
          "withSalaryOnly": {
            "title": "Only jobs with a published salary",
            "type": "boolean",
            "description": "Keep only roles where the employer published a pay band. Present on 7.7% of the index, from Ashby boards, as the band the employer wrote rather than a number parsed out of prose.",
            "default": false
          },
          "minAnnualSalary": {
            "title": "Minimum salary per year",
            "type": "integer",
            "description": "Only roles whose published lower bound is at least this, per year. Hourly and monthly bands are converted (2,080 hours or 12 months). Compared in the role's own currency, so pair it with Salary currency. Roles that publish no band are excluded, because an absent number is not evidence of a high one."
          },
          "maxAnnualSalary": {
            "title": "Maximum salary per year",
            "type": "integer",
            "description": "Only roles whose published lower bound is at most this, per year. Same conversion and same currency caveat as the minimum."
          },
          "salaryCurrency": {
            "title": "Salary currency",
            "type": "array",
            "description": "Restrict to bands published in these currencies. Nothing is converted between them: 88% of published bands are US dollars, and baking today's exchange rate into an index rebuilt every night would go stale by morning.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Maximum jobs to return",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "A hard ceiling on jobs returned and charged. Defaults to 1,000 if you leave it out, and is capped at 10,000 for one search, so a broad query can never produce a surprise bill. Set it to 0 for a dry run that returns and charges nothing."
          },
          "hiringLabels": {
            "title": "Hiring pace (Companies mode)",
            "uniqueItems": true,
            "type": "array",
            "description": "Surging is the top 1% of companies by roles opened in 30 days, growing the top 10%, steady the top half. The cut points are percentiles of the live data, not fixed numbers, so they keep their meaning as the index grows.",
            "items": {
              "type": "string",
              "enum": [
                "surging",
                "growing",
                "steady",
                "slow",
                "quiet"
              ],
              "enumTitles": [
                "Surging (top 1%)",
                "Growing (top 10%)",
                "Steady",
                "Slow",
                "Quiet (nothing new)"
              ]
            }
          },
          "minOpenedLast30": {
            "title": "Minimum roles opened in 30 days (Companies mode)",
            "minimum": 0,
            "type": "integer",
            "description": "Only companies that opened at least this many roles in the last 30 days."
          },
          "minOpenedLast7": {
            "title": "Minimum roles opened in 7 days (Companies mode)",
            "minimum": 0,
            "type": "integer",
            "description": "Only companies that opened at least this many roles in the last 7 days. The sharpest signal that something changed at that company this week."
          },
          "minOpenRoles": {
            "title": "Minimum total open roles (Companies mode)",
            "minimum": 0,
            "type": "integer",
            "description": "Filters out companies with only a handful of postings."
          },
          "enteringNewDepartments": {
            "title": "Only companies entering a new function (Companies mode)",
            "type": "boolean",
            "description": "Only companies whose recent postings are in a department they were not hiring for before. A company opening its first sales or security roles is a company that just changed strategy, which is the strongest buying signal in the dataset.",
            "default": false
          },
          "shrinkingOnly": {
            "title": "Only shrinking companies (Companies mode)",
            "type": "boolean",
            "description": "Only companies that CLOSED more roles in the last 30 days than they opened, sorted by how fast they are shrinking. Needs closure history, so companies with no closure data yet are excluded rather than counted. A churn signal for sales prospecting and a warning sign for job seekers.",
            "default": false
          },
          "withContactOnly": {
            "title": "Only companies with contact details (Companies mode)",
            "type": "boolean",
            "description": "Only companies whose own website publishes a way to reach them: a role address like info@ or sales@, a phone number from a tel: link, or the company's own social profiles. Nothing is guessed and no personal address of a named individual is ever collected. Companies not yet crawled are excluded rather than counted as having none.",
            "default": false
          },
          "includeStaffingAgencies": {
            "title": "Include staffing agencies (Companies mode)",
            "type": "boolean",
            "description": "Staffing agencies and recruiters post enormous volumes on behalf of other companies and dominate any hiring ranking, so they are excluded by default in Companies mode. 126 companies (2.7% of jobs) are flagged, conservatively and by name, and every row carries looksLikeAgency so you can judge for yourself. Jobs mode never hides them.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}