{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Job Board Feed: Greenhouse, Lever & Ashby Jobs",
    "description": "Pulls open jobs from company job boards on Greenhouse, Lever and Ashby through their public APIs into one clean schema. Filter by location, department, keyword or remote, and track only new, changed and closed jobs between runs. No recruiter names or emails.",
    "version": "0.1",
    "x-build-id": "6fAwZmVUBfwFGk3dM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/opendatalabs~ats-job-board-feed/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-opendatalabs-ats-job-board-feed",
        "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/opendatalabs~ats-job-board-feed/runs": {
      "post": {
        "operationId": "runs-sync-opendatalabs-ats-job-board-feed",
        "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/opendatalabs~ats-job-board-feed/run-sync": {
      "post": {
        "operationId": "run-sync-opendatalabs-ats-job-board-feed",
        "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": {
          "greenhouseBoards": {
            "title": "Greenhouse boards",
            "maxItems": 500,
            "type": "array",
            "description": "Greenhouse job boards to read. Give the board token (airbnb) or any board or job URL, such as https://boards.greenhouse.io/airbnb or https://job-boards.greenhouse.io/airbnb/jobs/123. The token is the first part of the path on the company's hosted board. If no board is given in any of the three fields, the run uses the demo boards (airbnb, leverdemo, ashby).",
            "items": {
              "type": "string"
            }
          },
          "leverSites": {
            "title": "Lever sites",
            "maxItems": 500,
            "type": "array",
            "description": "Lever job sites to read. Give the site name (leverdemo) or a URL such as https://jobs.lever.co/leverdemo. EU-hosted sites (jobs.eu.lever.co/...) are detected from the URL and read from Lever's EU API.",
            "items": {
              "type": "string"
            }
          },
          "ashbyBoards": {
            "title": "Ashby job boards",
            "maxItems": 500,
            "type": "array",
            "description": "Ashby job boards to read. Give the job board name (ashby) or a URL such as https://jobs.ashbyhq.com/ashby. Names are case-sensitive and may contain spaces, exactly as they appear in the company's jobs.ashbyhq.com address.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Run mode",
            "enum": [
              "snapshot",
              "changes"
            ],
            "type": "string",
            "description": "Snapshot returns every open job that matches your filters. Only new and changed jobs compares each board against the previous run's baseline, saved in a named key-value store, and returns just the jobs that are new or changed, plus job-closed rows for jobs that came down. The first change-tracking run returns everything and saves the baseline.",
            "default": "snapshot"
          },
          "emitClosedJobs": {
            "title": "Report closed jobs",
            "type": "boolean",
            "description": "Change tracking only. When on, a job delivered on an earlier run that is no longer on the board is returned as a job-closed row. A board that suddenly returns zero jobs is only treated as closed after two empty runs in a row, to avoid false alarms.",
            "default": true
          },
          "skipExistingOnFirstRun": {
            "title": "Skip existing jobs on the first run",
            "type": "boolean",
            "description": "Change tracking only. When on, the first run quietly saves the current jobs as the baseline without returning or charging for them, so later runs only alert on jobs posted from now on.",
            "default": false
          },
          "stateStoreName": {
            "title": "Baseline store name",
            "type": "string",
            "description": "Change tracking only. Name of the key-value store that keeps the baseline between runs. Use a different name per saved task if you track different filters on the same boards. Letters, digits and hyphens only.",
            "default": "ats-job-board-feed-state"
          },
          "titleKeywords": {
            "title": "Job title keywords",
            "type": "array",
            "description": "Keep only jobs whose title contains at least one of these words or phrases. Matching ignores case. Leave empty to keep every title.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Drop jobs whose title contains any of these words or phrases, for example intern or senior. Matching ignores case.",
            "items": {
              "type": "string"
            }
          },
          "locationKeywords": {
            "title": "Location keywords",
            "type": "array",
            "description": "Keep only jobs whose location (any of its listed locations) contains at least one of these words, such as a city, state or country. Matching ignores case. Leave empty for all locations.",
            "items": {
              "type": "string"
            }
          },
          "departmentKeywords": {
            "title": "Department or team keywords",
            "type": "array",
            "description": "Keep only jobs whose department or team contains at least one of these words, such as engineering or sales. Matching ignores case. Leave empty for all departments.",
            "items": {
              "type": "string"
            }
          },
          "remote": {
            "title": "Remote filter",
            "enum": [
              "any",
              "remote",
              "notRemote"
            ],
            "type": "string",
            "description": "Keep all jobs, only remote jobs, or only on-site and hybrid jobs. Remote is read from the ATS's own workplace field when the company sets it, and otherwise from the location text.",
            "default": "any"
          },
          "includeDescription": {
            "title": "Include job description text",
            "type": "boolean",
            "description": "Adds the job description as plain text. Off by default to keep rows small. Email addresses, phone numbers, personal profile links and named recruiter or hiring-manager mentions are removed from the text.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Upper limit on rows returned per run, shared fairly across all boards. The default of 100 keeps a run at about $0.20. Rows held back by this limit are returned on the next change-tracking run rather than lost.",
            "default": 100
          },
          "requestsPerSecond": {
            "title": "Requests per second",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Ceiling on API requests per second across the whole run. Each board is usually one request, so the default is plenty. Any crawl-delay published in the ATS's robots.txt is also honoured.",
            "default": 2
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 300,
            "type": "integer",
            "description": "How long to wait for one board API response before retrying. Very large boards with descriptions can take a while.",
            "default": 60
          },
          "maxRetries": {
            "title": "Attempts per request",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to try a request that fails with a network error, a rate limit or a server error, with growing pauses in between.",
            "default": 4
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Checks each ATS API host's robots.txt before requesting it and skips anything it disallows. Leave this on.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}