{
  "openapi": "3.0.1",
  "info": {
    "title": "Career Page Job Postings Scraper & API — Any Company, 14 ATS",
    "description": "Job postings API for 14 ATS: Greenhouse, Lever, Ashby, Workday, Workable, BambooHR, SmartRecruiters, Teamtailor, Recruitee, Personio, Rippling, Breezy, Pinpoint, Dover. Paste a company domain — it finds the board and returns every open role in one schema, with structured salary and seniority.",
    "version": "0.1",
    "x-build-id": "TknpdKIEvyPBamDSW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/vonsensey~career-page-job-postings-scraper-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-vonsensey-career-page-job-postings-scraper-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/vonsensey~career-page-job-postings-scraper-api/runs": {
      "post": {
        "operationId": "runs-sync-vonsensey-career-page-job-postings-scraper-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/vonsensey~career-page-job-postings-scraper-api/run-sync": {
      "post": {
        "operationId": "run-sync-vonsensey-career-page-job-postings-scraper-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": "The companies to pull job postings from — one per line. Paste whatever you already have: a company domain (stripe.com), a careers URL (https://figma.com/careers), a board link (https://jobs.ashbyhq.com/ramp), or an exact ats:slug pair (greenhouse:figma). For a plain domain the Actor finds the company's applicant tracking system itself, so you never have to look up board slugs. Companies whose ATS cannot be found return a free row explaining why.",
            "default": [
              "stripe.com"
            ],
            "items": {
              "type": "string"
            }
          },
          "presets": {
            "title": "Or start from a ready-made list",
            "type": "array",
            "description": "Curated company bundles you can run without researching a single slug. Every company in these lists is verified against its live board. Merged with anything in Companies above and de-duplicated.",
            "items": {
              "type": "string",
              "enum": [
                "top-tech",
                "ai-ml",
                "devtools",
                "fintech"
              ],
              "enumTitles": [
                "Top tech (28 companies)",
                "AI & ML (22 companies)",
                "Developer tools (22 companies)",
                "Fintech (16 companies)"
              ]
            },
            "default": []
          },
          "onlyNewJobs": {
            "title": "Only new or changed jobs since my last run",
            "type": "boolean",
            "description": "Return only postings that are new, or whose title, department, location, salary, employment type or workplace type changed since a previous run of this feed. Description edits do not count as a change, so a re-worded posting is never re-charged. This is what makes a daily or hourly schedule cheap: the first run returns the full board, and every run after it returns — and charges for — only what genuinely moved. Leave it off for a one-off full export.",
            "default": false
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep only postings published within this many days. Leave empty for all open roles. Postings whose board publishes no date are excluded when this is set, because they cannot be proven fresh."
          },
          "titleKeywords": {
            "title": "Job title must contain",
            "type": "array",
            "description": "Keep only jobs whose title contains one of these words (case-insensitive). For example: engineer, designer, account executive. Leave empty for every open role.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Job title must NOT contain",
            "type": "array",
            "description": "Drop jobs whose title contains any of these words. Applied after the include filter above. Useful for stripping intern, contract, or non-English duplicates out of a feed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locationKeywords": {
            "title": "Location contains",
            "type": "array",
            "description": "Keep only jobs matching one of these locations. Every location on a multi-site posting is checked, not just the first one, so a role open in both Berlin and Lisbon matches either.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote roles only",
            "type": "boolean",
            "description": "Keep only roles the board marks as remote. Hybrid roles are excluded, and so are roles where nothing on the posting says either way — 'remote only' should not return maybes.",
            "default": false
          },
          "seniority": {
            "title": "Seniority",
            "type": "array",
            "description": "Keep only these seniority levels. Seniority is inferred from the job title, because almost no ATS publishes it as a field. Entry level means genuinely junior and graduate roles — not a '0-2 years' bucket that returns experienced ones.",
            "items": {
              "type": "string",
              "enum": [
                "intern",
                "entry",
                "mid",
                "senior",
                "staff",
                "principal",
                "lead",
                "manager",
                "director",
                "vp",
                "executive"
              ],
              "enumTitles": [
                "Intern / working student",
                "Entry level / graduate",
                "Mid level",
                "Senior",
                "Staff",
                "Principal / distinguished",
                "Lead",
                "Manager",
                "Director / Head of",
                "VP",
                "Executive (C-level, founder)"
              ]
            },
            "default": []
          },
          "employmentType": {
            "title": "Employment type",
            "type": "array",
            "description": "Keep only these employment types, normalized across every platform's own vocabulary (Lever's 'Full-time', Ashby's 'FullTime' and Personio's 'permanent' all become fullTime).",
            "items": {
              "type": "string",
              "enum": [
                "fullTime",
                "partTime",
                "contract",
                "internship",
                "temporary",
                "volunteer"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract / freelance",
                "Internship",
                "Temporary / fixed-term",
                "Volunteer"
              ]
            },
            "default": []
          },
          "departments": {
            "title": "Department contains",
            "type": "array",
            "description": "Keep only jobs whose department matches one of these, for example: engineering, sales, marketing.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hasSalary": {
            "title": "Only jobs with a salary range",
            "type": "boolean",
            "description": "Keep only postings where a real salary range could be parsed into numbers. Boards differ a lot here — Ashby publishes structured pay, most others only mention it in prose, and some never do.",
            "default": false
          },
          "maxJobs": {
            "title": "Maximum jobs for the whole run",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on billable jobs for the entire run. The Actor stops at exactly this number — never over, and it tells you in the log when a cap is the reason results were truncated. Leave empty for no cap."
          },
          "maxJobsPerCompany": {
            "title": "Maximum jobs per company",
            "minimum": 1,
            "type": "integer",
            "description": "Cap per company, applied after filtering and newest-first sorting, so a handful of very large boards cannot dominate a run. Leave empty for every matching role."
          },
          "includeDescription": {
            "title": "Include full job descriptions",
            "type": "boolean",
            "description": "Add the complete job description as both HTML and plain text. Off by default because descriptions are large and most feeds do not need them. On Workday and SmartRecruiters this needs one extra request per job, so those boards get noticeably slower — the price per job does not change.",
            "default": false
          },
          "atsPlatforms": {
            "title": "Restrict to these platforms",
            "type": "array",
            "description": "Only detect and fetch these applicant tracking systems. Leave empty for all of them. Narrowing this makes auto-detection faster when you already know which platform your list uses.",
            "items": {
              "type": "string",
              "enum": [
                "greenhouse",
                "lever",
                "ashby",
                "smartrecruiters",
                "workday",
                "personio",
                "rippling",
                "breezy",
                "workable",
                "recruitee",
                "teamtailor",
                "dover",
                "bamboohr",
                "pinpoint"
              ],
              "enumTitles": [
                "Greenhouse",
                "Lever",
                "Ashby",
                "SmartRecruiters",
                "Workday",
                "Personio",
                "Rippling",
                "Breezy",
                "Workable",
                "Recruitee",
                "Teamtailor",
                "Dover",
                "BambooHR",
                "Pinpoint"
              ]
            },
            "default": []
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many company boards to fetch in parallel. The default is deliberately polite to the career sites being read; raise it for very large lists.",
            "default": 10
          },
          "stateKey": {
            "title": "Feed name (for change tracking)",
            "type": "string",
            "description": "Names the memory used by 'Only new or changed jobs'. Leave empty and it is derived from your company list, so two different lists automatically keep separate memories. Set it explicitly when you run several schedules over overlapping companies and want each to track changes independently — or set the same name on two tasks to share one memory."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}