{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Jobs Scraper: All Company Job Boards",
    "description": "Get live job openings from any company, whatever its ATS: Greenhouse, Ashby, Lever, Workday, SmartRecruiters, Workable, Personio, Rippling, Recruitee. One unified schema, cross-ATS dedup, new-jobs-only delta mode.",
    "version": "0.1",
    "x-build-id": "2IlxPQgTUlBFOctFY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alexmorain~ats-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alexmorain-ats-jobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/alexmorain~ats-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-alexmorain-ats-jobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/alexmorain~ats-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-alexmorain-ats-jobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "companies"
        ],
        "properties": {
          "companies": {
            "title": "Companies",
            "type": "array",
            "description": "One company per line. Three accepted forms, freely mixed in the same list:<br>• <b>a domain</b>, the simplest: <code>stripe.com</code>. A built-in directory of 17,000+ job boards resolves it, and if the company is not in it the Actor probes the ATS APIs live.<br>• <b>a job board URL</b>, the most reliable: <code>https://jobs.lever.co/acme</code>, <code>https://acme.wd5.myworkdayjobs.com/External</code>. Open a company careers page, copy the URL it redirects to, paste it here.<br>• <b>an explicit ats:slug pair</b>, for full control: <code>greenhouse:stripe</code>, <code>ashby:linear</code>. Workday needs its three parts: <code>workday:acme|wd5|External</code>.<br><br>You never need to know which ATS a company uses. Start with domains; switch to a board URL only for a company that fails to resolve, which the log names explicitly.<br><br>A company that fails does not stop the others: the run only fails if every single one fails.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "all",
              "new-only"
            ],
            "type": "string",
            "description": "<b>All live jobs</b> returns every opening currently published by these companies, on every run. Use it for a one-off export, or to build your first snapshot.<br><br><b>New jobs only</b> keeps a persistent registry of everything previous runs have already seen and returns only what appeared since. This turns the Actor into monitoring: schedule it daily and a quiet day costs you the start fee alone, since a job you are not shown is a job you are not charged for. The first run in this mode still returns everything, because nothing has been seen yet.",
            "default": "all"
          },
          "includeDescription": {
            "title": "Include full job description",
            "type": "boolean",
            "description": "Adds the complete job description to every row.<br><br><b>Off by default on purpose.</b> Descriptions multiply the payload up to 12x on some boards, and on SmartRecruiters and Workday they cost one extra HTTP request per job, which makes the run several times longer. It does not change the price.<br><br>Turn it on when you need to read or classify the content of the jobs, for example to filter with an LLM downstream. Leave it off when you only need titles, locations and apply links.",
            "default": false
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "type": "integer",
            "description": "Safety cap per company, useful when your list contains a giant that publishes thousands of openings and would dominate both the dataset and the bill.<br><br><code>0</code> means no cap, which is the default: you get everything each company publishes.",
            "default": 0
          },
          "titleKeywords": {
            "title": "Title keywords",
            "type": "array",
            "description": "Keep only jobs whose title contains at least one of these words, case-insensitive. One word or phrase per line: <code>engineer</code>, <code>data</code>, <code>product manager</code>.<br><br><b>Filtering is free.</b> It happens inside the Actor before anything is returned, so a job that does not match is never charged. Filtering a 3,000-job board down to the 40 roles you care about costs you 40 jobs, not 3,000.<br><br>Leave empty to keep every title.",
            "items": {
              "type": "string"
            }
          },
          "locationKeywords": {
            "title": "Location keywords",
            "type": "array",
            "description": "Keep only jobs whose location contains at least one of these words, case-insensitive: <code>Paris</code>, <code>New York</code>, <code>Germany</code>.<br><br>Boards write locations in their own way, so match on the shortest distinctive part: <code>Berlin</code> catches \"Berlin, Germany\" and \"Berlin (hybrid)\" alike. Free like the title filter: non-matching jobs are never charged.<br><br>Leave empty to keep every location.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only jobs the ATS itself flags as remote, plus those whose location text says so. Applied before output, so filtered-out jobs are never charged.<br><br>Note that boards declare remote inconsistently; combining this with a location keyword such as <code>remote</code> catches the ones that only say it in words.",
            "default": false
          },
          "registryKey": {
            "title": "Delta registry key",
            "type": "string",
            "description": "Only used by <b>New jobs only</b> mode. Names the persistent registry of already-seen jobs.<br><br>Leave empty and it is derived from your company list, which is what you want: the same list always finds its own registry again, and two different lists never pollute each other. Set it by hand only to make several schedules share one memory, for example a daily run and a weekly catch-up over the same companies."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "pattern": "^https?://.+",
            "type": "string",
            "description": "If set, the Actor POSTs a small JSON summary to this URL at the end of the run, <b>only when at least one job was returned</b>. Combined with delta mode and a daily schedule, that is a push notification: silence when nothing moved, a call when a company opens a role.<br><br>Leave empty to skip it. An unreachable webhook is logged as a warning and never fails the run."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "<b>Leave this off.</b> Every ATS endpoint the Actor reads is a public JSON API with no anti-bot layer, so a proxy adds latency and buys nothing. Kept for the rare corporate network edge case."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}