{
  "openapi": "3.0.1",
  "info": {
    "title": "Greenhouse & Lever Job Postings API: New & Closed",
    "description": "Live job postings from the official Greenhouse and Lever job-board APIs. Filter by title, location, country, remote, seniority and posted date. Delta mode flags new and closed jobs; closed rows are free. Every company gets a status row, so you never get a silent zero. From $1.20 per 1,000 jobs.",
    "version": "0.1",
    "x-build-id": "UfAknyxrwZwdQMNs6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/amyorkltd~ats-job-postings-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-amyorkltd-ats-job-postings-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/amyorkltd~ats-job-postings-api/runs": {
      "post": {
        "operationId": "runs-sync-amyorkltd-ats-job-postings-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/amyorkltd~ats-job-postings-api/run-sync": {
      "post": {
        "operationId": "run-sync-amyorkltd-ats-job-postings-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": {
          "companies": {
            "title": "Companies",
            "type": "array",
            "description": "Greenhouse or Lever companies to fetch. Give the board slug (spotify), a prefixed slug (greenhouse:stripe or lever:palantir) or a board URL (https://job-boards.greenhouse.io/stripe, https://jobs.lever.co/spotify or https://jobs.eu.lever.co/{slug}). A bare slug is checked once on Greenhouse and on Lever exactly as typed (US, then EU), so an unknown slug takes up to 3 requests (1 Greenhouse, 2 Lever). Slugs are never guessed: company names and domains are not looked up and return a \"not_found\" status row. Ashby boards return a status row \"unsupported_ats\", and links to other careers sites (Workday and so on) return \"not_found\", never a silent zero.",
            "items": {
              "type": "string"
            }
          },
          "preset": {
            "title": "Preset company list",
            "enum": [
              "none",
              "ai-data",
              "fintech",
              "software"
            ],
            "type": "string",
            "description": "Instead of a company list, pick a ready list of Lever companies: \"ai-data\" (8 AI, data and autonomy companies), \"fintech\" (12 fintechs) or \"software\" (12 software and SaaS companies). Every slug was checked live. Ignored if companies is set. Presets hold Lever boards only; name Greenhouse boards yourself in companies.",
            "default": "none"
          },
          "titleKeywords": {
            "title": "Title keywords",
            "type": "array",
            "description": "Keep jobs whose title contains any of these words, case-insensitive. Example: [\"engineer\", \"data\"]. Whole words or phrases; leave empty for all jobs.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Drop jobs whose title contains any of these words. Example: [\"senior\", \"manager\"].",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries (ISO codes)",
            "type": "array",
            "description": "Keep jobs located in these countries, for example [\"US\", \"GB\"]. Use ISO 3166-1 alpha-2 codes (UK works too) or English country names; some 3-letter codes such as USA also work, and an entry the Actor cannot match is skipped with a warning. A job matches when Lever's country field or any of its listed locations points to one of these countries, by country name or code, US state, Canadian province or a major city the Actor knows. A job with no country found is dropped, except a remote job, which is kept unless remote is \"exclude\".",
            "items": {
              "type": "string"
            }
          },
          "remote": {
            "title": "Remote jobs",
            "enum": [
              "include",
              "only",
              "exclude"
            ],
            "type": "string",
            "description": "Whether to keep, require or drop remote jobs. include keeps everything, only keeps remote jobs, exclude drops them. Hybrid counts as not remote.",
            "default": "include"
          },
          "seniority": {
            "title": "Seniority",
            "type": "array",
            "description": "Keep these levels: intern, entry, mid, senior, lead, executive. Inferred from the title; each row shows seniorityInferred: true. Titles with no level word count as mid.",
            "items": {
              "type": "string",
              "enum": [
                "intern",
                "entry",
                "mid",
                "senior",
                "lead",
                "executive"
              ],
              "enumTitles": [
                "Intern",
                "Entry",
                "Mid",
                "Senior",
                "Lead (staff, principal, director, people manager)",
                "Executive (VP, head of, C-level)"
              ]
            }
          },
          "postedAfter": {
            "title": "Posted after",
            "type": "string",
            "description": "Keep jobs posted on or after this time, using the board's own date: Lever createdAt; Greenhouse first_published, or updated_at when that is missing. A date (YYYY-MM-DD) or a relative window such as \"24h\", \"7d\" or \"2w\"."
          },
          "deltaMode": {
            "title": "New and closed jobs: only jobs not delivered yet (deltaMode)",
            "type": "boolean",
            "description": "Off: return every matching open job, up to maxItems. On: return matching jobs this input has not delivered yet (changeType \"new\"), up to maxItems a run, plus free closed rows (changeType \"closed\") for delivered jobs that have left their board. Jobs past the maxItems cap stay queued and are delivered as new in a later run; a job that closes before delivery gets no closed row. With no baseline yet, the first run records one and delivers open jobs as new, capped at maxItems. State lives in the key-value store \"ats-job-postings-state\", keyed by a hash of your companies and filters (or by stateKey), so different watch lists never mix. A company whose fetch fails keeps its old baseline, so a failed fetch never shows up as mass closures.",
            "default": false
          },
          "stateKey": {
            "title": "Delta state name (optional)",
            "type": "string",
            "description": "Optional name for the delta baseline, for example my-watchlist. By default the baseline is keyed by a hash of your companies and filters. Set a name to keep one baseline while you edit the list, or to run two separate baselines for the same input. Lowercase letters, digits and dashes."
          },
          "includeDescription": {
            "title": "Include job description",
            "type": "boolean",
            "description": "Add the full job description text (bigger output, same price). Emails, phone numbers, profile links and named recruiter contacts are removed. Greenhouse sends job text only when this is on, so for Greenhouse boards keywordsInDescription and salary read from the text need it.",
            "default": false
          },
          "maxItems": {
            "title": "Max job rows",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Maximum job rows to return and charge for. Company status rows and closed-job rows are free and do not count. When the limit is reached, remaining companies get a \"skipped\" status row. In deltaMode, matching jobs past the limit stay queued and are delivered as new in a later run.",
            "default": 100
          },
          "keywordsInDescription": {
            "title": "Also match keywords in the job description",
            "type": "boolean",
            "description": "When on, title keywords also match text in the job description (wider net, for example a skill like Kubernetes). For Greenhouse boards this needs includeDescription on.",
            "default": false
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Free-text location match, for example London, New York, EMEA. Keeps jobs whose location text contains any of these strings (case-insensitive). Use countries for country filtering.",
            "items": {
              "type": "string"
            }
          },
          "functions": {
            "title": "Job functions",
            "type": "array",
            "description": "Keep only these job functions (classified from title, team and department). Values: Engineering, Data & AI, Product, Design, Sales, Marketing, Customer Success & Support, Operations, Finance, Legal & Compliance, People & Recruiting, Security, IT, Research & Science, Other.",
            "items": {
              "type": "string"
            }
          },
          "employmentTypes": {
            "title": "Employment types",
            "type": "array",
            "description": "Keep only these employment types, for example Full-time, Part-time, Contract, Intern. Jobs where the ATS gives no type are dropped when this is set.",
            "items": {
              "type": "string"
            }
          },
          "includeJobsWithoutDate": {
            "title": "Keep jobs with no posted date when postedAfter is set",
            "type": "boolean",
            "description": "Some boards omit dates on a few jobs. Off by default, so date filters stay strict.",
            "default": false
          },
          "maxDescriptionChars": {
            "title": "Max description length (characters)",
            "minimum": 200,
            "maximum": 200000,
            "type": "integer",
            "description": "Descriptions longer than this are cut.",
            "default": 20000
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "type": "integer",
            "description": "Cap the job rows output per company after filters. 0 means no cap. Greenhouse boards are read whole, so their status rows and hiring-signal counts cover the whole board. In deltaMode Lever boards are read whole too, and matching jobs past the cap stay queued for a later run. With deltaMode off, a Lever board is read in pages of 500 until the jobs that pass your filters reach the cap, so its status and hiring-signal counts cover the pages read.",
            "default": 0
          },
          "outputSignalsOnly": {
            "title": "Status and hiring-signal rows only (no job rows)",
            "type": "boolean",
            "description": "Skip job rows and output only the per-company status and hiring-signal rows (free).",
            "default": false
          },
          "newRoleWindowDays": {
            "title": "New-role window (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "A role counts as new in the hiring signals if it was posted within this many days.",
            "default": 7
          },
          "maxConcurrency": {
            "title": "Companies in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many companies are scanned at the same time. Requests to each API host still start at most once per second.",
            "default": 5
          },
          "perHostDelayMs": {
            "title": "Delay between requests to the same host (ms)",
            "minimum": 1000,
            "maximum": 10000,
            "type": "integer",
            "description": "Minimum gap between request starts to the same API host. The floor is 1000 ms (at most 1 request per second per host); lower values are raised to 1000.",
            "default": 1000
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "Timeout per HTTP request. Greenhouse board requests and full Lever board fetches get at least 60 seconds, and Lever probes at least 45 seconds, automatically.",
            "default": 45
          },
          "maxRetries": {
            "title": "Max retries",
            "minimum": 0,
            "maximum": 2,
            "type": "integer",
            "description": "Retries for timeouts, 429 and 5xx responses, with exponential backoff that pauses the whole host (at most 2, so 3 attempts). After 3 failures in a row, or any 403 from Greenhouse, the Actor stops calling that host for the rest of the run. 404s are not retried.",
            "default": 2
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}