{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Jobs Scraper (All In One)",
    "description": "Scrapes live jobs from four ATS platforms — Ashby, BambooHR, Breezy HR and SmartRecruiters — into one unified schema. Paste mixed career page URLs and each is routed automatically. Split city/state/country, ISO 8601 UTC dates, and descriptions as clean Markdown for LLM use.",
    "version": "0.1",
    "x-build-id": "pAU94VCFRbGU0d0o3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapyx~ats-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapyx-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/scrapyx~ats-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapyx-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/scrapyx~ats-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapyx-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": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "Career page URLs",
            "type": "array",
            "description": "Career page URLs from any mix of the four supported ATS platforms — the Actor detects which is which from the URL and routes each one automatically, so you can paste them all into a single run.\n\nSupported forms:\n\n- **Ashby** — `https://jobs.ashbyhq.com/posthog`\n- **BambooHR** — `https://nectar.bamboohr.com/careers`\n- **Breezy HR** — `https://boldare.breezy.hr`\n- **SmartRecruiters** — `https://jobs.smartrecruiters.com/BoschGroup`\n\nA URL that points at one specific job (`https://jobs.ashbyhq.com/posthog/<uuid>`, `https://nectar.bamboohr.com/careers/157`, `https://boldare.breezy.hr/p/<id>`) scrapes just that posting instead of the whole board.\n\nYou can also use the shorthand `platform:company` — `ashby:posthog`, `bamboohr:nectar`, `breezy:boldare`, `smartrecruiters:BoschGroup`.\n\nIf a company's careers page lives on its own domain, use the ATS URL its Apply button points at — that is the one this Actor can read.",
            "default": [
              "https://jobs.ashbyhq.com/posthog",
              "https://nectar.bamboohr.com/careers",
              "https://boldare.breezy.hr",
              "https://jobs.smartrecruiters.com/BoschGroup"
            ],
            "items": {
              "type": "string"
            }
          },
          "includeDescription": {
            "title": "Fetch full job descriptions",
            "type": "boolean",
            "description": "Fetch each job's full description and convert it to clean Markdown (`descriptionMarkdown`) alongside the original HTML.\n\nThis is the Actor's main cost lever. On **Ashby** it is free — the description already ships in the board response, so no extra requests are made either way. On **BambooHR**, **Breezy** and **SmartRecruiters** it costs one extra request per job.\n\nTurning it off on BambooHR also drops `location.country`, which only appears on that platform's detail response.",
            "default": true
          },
          "maxItems": {
            "title": "Max jobs per board",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many jobs from each career page. Set to 0 for every job on the board.\n\nDefaults to a bounded 200 rather than unlimited because board sizes vary enormously — a single Ashby board can hold 700+ postings and one SmartRecruiters enterprise board over 4,700 (the default example, BoschGroup, is one of these) — so an unbounded first run can turn into a multi-thousand-request crawl. Raise it or set it to 0 once you know how big your target boards are.",
            "default": 200
          },
          "pageSize": {
            "title": "Page size",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Rows per request, for SmartRecruiters — the only one of the four platforms that paginates at all. Ashby, BambooHR and Breezy return their whole board in a single response and ignore this setting.\n\nCapped at 100 because SmartRecruiters silently clamps anything higher back to 100 while still reporting success, so a larger number here would quietly mean something other than what it says.",
            "default": 100
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Upper bound on requests in flight across the whole run — boards and their per-job detail fetches draw from the same budget.\n\nNone of these four platforms showed rate limiting during testing, but they are small companies' careers pages as often as they are enterprises'; the default is deliberately modest.",
            "default": 6
          },
          "minRequestInterval": {
            "title": "Minimum interval between requests",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Seconds to leave between the START of one request and the next, across the whole run. 0 disables pacing.\n\nThis, not concurrency, is the honest speed control: once a rate cap binds, extra concurrency buys nothing.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy on the shared datacenter pool. This is the default because it is included in your plan at no extra cost and this target works through it. If you start seeing blocks, challenges or empty results, switch the group here to Residential -- it uses real consumer IPs and gets through more, but Apify bills residential traffic per gigabyte, so leave it off unless you need it.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}