{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Job Scraper — Greenhouse, Lever, Ashby, Workday",
    "description": "Scrape jobs from company career pages across Greenhouse, Lever, Ashby, Workday and SmartRecruiters. Unified schema, deduplication, delta mode and salary data. No cookies, no proxies, no login.",
    "version": "1.1",
    "x-build-id": "wne7mpFNHdOf4Ofcn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ultramarine_freezer~ats-job-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ultramarine_freezer-ats-job-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/ultramarine_freezer~ats-job-scraper/runs": {
      "post": {
        "operationId": "runs-sync-ultramarine_freezer-ats-job-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/ultramarine_freezer~ats-job-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-ultramarine_freezer-ats-job-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",
        "properties": {
          "companies": {
            "title": "Companies",
            "type": "array",
            "description": "Company domains or names. The Actor automatically finds which ATS each company uses and scrapes its job board. Example: <code>stripe.com</code>, <code>databricks.com</code>, <code>openai</code>.",
            "items": {
              "type": "string"
            }
          },
          "presetLists": {
            "title": "Preset company lists",
            "type": "array",
            "description": "Curated bundles of companies, each verified live against its ATS. Pick one and run — no slugs to look up.",
            "items": {
              "type": "string",
              "enum": [
                "yc-and-ai",
                "fintech",
                "devtools",
                "bigtech-startups",
                "data-infra",
                "security",
                "ecommerce-retail",
                "healthtech",
                "gaming-media",
                "mobility-logistics",
                "enterprise-saas"
              ],
              "enumTitles": [
                "AI labs & AI-native startups (15 companies, ~2,500 jobs)",
                "Fintech, banking & payments (18 companies, ~2,300 jobs)",
                "Developer tools & infrastructure (17 companies, ~1,300 jobs)",
                "Product, design & collaboration (10 companies, ~900 jobs)",
                "Data platforms & analytics (13 companies, ~2,400 jobs)",
                "Cybersecurity & identity (10 companies, ~1,000 jobs)",
                "E-commerce, delivery & retail (5 companies, ~1,200 jobs)",
                "Health technology (3 companies, ~110 jobs)",
                "Gaming, music & creator platforms (8 companies, ~570 jobs)",
                "Mobility, autonomy & logistics (9 companies, ~1,400 jobs)",
                "Sales, marketing & support SaaS (10 companies, ~760 jobs)"
              ]
            }
          },
          "boardUrls": {
            "title": "Job board URLs",
            "type": "array",
            "description": "Paste career page URLs and the Actor works out the ATS and identifier by itself. Example: <code>https://boards.greenhouse.io/figma</code> or <code>https://jobs.lever.co/shieldai</code>.",
            "items": {
              "type": "string"
            }
          },
          "boards": {
            "title": "Job boards (advanced)",
            "type": "array",
            "description": "Scrape specific boards directly.<br><b>Greenhouse / Lever / Ashby / SmartRecruiters:</b> <code>{\"ats\":\"greenhouse\",\"slug\":\"stripe\"}</code><br><b>Workday:</b> <code>{\"ats\":\"workday\",\"tenant\":\"nvidia\",\"site\":\"NVIDIAExternalCareerSite\"}</code>"
          },
          "searchText": {
            "title": "Keyword (title or description)",
            "type": "string",
            "description": "Keep only jobs containing this text in the title or description."
          },
          "titleKeywords": {
            "title": "Title must contain any of",
            "type": "array",
            "description": "Keep only jobs whose <b>title</b> contains at least one of these. More precise than a full-text search.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Title must NOT contain",
            "type": "array",
            "description": "Drop jobs whose title contains any of these. Useful for stripping out <code>intern</code>, <code>manager</code> or a stack you don't want.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Description must NOT contain",
            "type": "array",
            "description": "Drop jobs whose title or description contains any of these words.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Departments",
            "type": "array",
            "description": "Keep only jobs in these departments or teams (partial, case-insensitive match).",
            "items": {
              "type": "string"
            }
          },
          "skills": {
            "title": "Required skills",
            "type": "array",
            "description": "Keep only jobs where the Actor detected at least one of these skills in the posting. Example: <code>Python</code>, <code>Kubernetes</code>, <code>React</code>.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Keep only jobs matching any of these locations (partial, case-insensitive).",
            "items": {
              "type": "string"
            }
          },
          "excludeLocations": {
            "title": "Exclude locations",
            "type": "array",
            "description": "Drop jobs matching any of these locations.",
            "items": {
              "type": "string"
            }
          },
          "countryCodes": {
            "title": "Country codes",
            "type": "array",
            "description": "Keep only jobs in these countries, as ISO-3166 alpha-2 codes: <code>US</code>, <code>GB</code>, <code>DE</code>, <code>MX</code>. The Actor derives the code even when the ATS only wrote the country name.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Genuinely remote roles only. Hybrid is excluded — several ATS platforms flag hybrid roles as remote, and this Actor does not.",
            "default": false
          },
          "workplaceTypes": {
            "title": "Workplace types",
            "type": "array",
            "description": "Keep only these workplace arrangements.",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "onsite"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On site"
              ]
            }
          },
          "seniorityLevels": {
            "title": "Seniority",
            "type": "array",
            "description": "Keep only these seniority levels, detected from the job title and description.",
            "items": {
              "type": "string",
              "enum": [
                "intern",
                "entry",
                "mid",
                "senior",
                "lead",
                "director",
                "executive"
              ],
              "enumTitles": [
                "Intern",
                "Entry level",
                "Mid level",
                "Senior",
                "Lead / Staff / Principal",
                "Director",
                "Executive"
              ]
            }
          },
          "employmentTypes": {
            "title": "Employment types",
            "type": "array",
            "description": "Keep only these employment types.",
            "items": {
              "type": "string",
              "enum": [
                "full_time",
                "part_time",
                "contract",
                "intern",
                "temporary",
                "other"
              ],
              "enumTitles": [
                "Full time",
                "Part time",
                "Contract",
                "Intern",
                "Temporary",
                "Other"
              ]
            }
          },
          "maxAgeDays": {
            "title": "Maximum age (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Drop jobs published or updated longer ago than this. Kills stale listings."
          },
          "maxYearsExperience": {
            "title": "Maximum years of experience required",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs asking for at most this many years. Jobs that don't state a requirement are kept."
          },
          "visaSponsorshipOnly": {
            "title": "Visa sponsorship only",
            "type": "boolean",
            "description": "Keep only jobs where the posting explicitly says sponsorship is available.",
            "default": false
          },
          "excludeAgencies": {
            "title": "Exclude recruitment agencies",
            "type": "boolean",
            "description": "Drop postings that read as agency or staffing listings rather than direct employers.",
            "default": false
          },
          "excludeCompanies": {
            "title": "Exclude companies",
            "type": "array",
            "description": "Drop jobs from these companies (partial, case-insensitive match on the company name).",
            "items": {
              "type": "string"
            }
          },
          "requireSalary": {
            "title": "Only jobs with salary data",
            "type": "boolean",
            "description": "Keep only postings that publish a pay range.",
            "default": false
          },
          "minSalaryUsd": {
            "title": "Minimum salary (annual USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs whose range reaches at least this amount, converted to annual USD. Jobs without salary data are dropped."
          },
          "maxSalaryUsd": {
            "title": "Maximum salary (annual USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs whose range starts at or below this amount, converted to annual USD."
          },
          "outputProfile": {
            "title": "Output profile",
            "enum": [
              "full",
              "compact",
              "minimal"
            ],
            "type": "string",
            "description": "<b>Full</b> — every field including the HTML description.<br><b>Compact</b> — drops the HTML description, keeps plain text.<br><b>Minimal</b> — 17 core fields, ideal for dashboards and spreadsheets.",
            "default": "full"
          },
          "enrichment": {
            "title": "Derive extra fields",
            "type": "boolean",
            "description": "Adds seniority, skills, benefits, years of experience, education level, visa sponsorship, security clearance, agency detection and salary normalised to annual USD. Rule-based, so it costs nothing extra and never invents a value.",
            "default": true
          },
          "extractSalaryFromDescription": {
            "title": "Read salary from the description",
            "type": "boolean",
            "description": "When the ATS gives no structured pay data, look for an explicit range in the description text. Requires a currency symbol next to the numbers, so it can't mistake other figures for a salary.",
            "default": true
          },
          "includeDescription": {
            "title": "Include full job description",
            "type": "boolean",
            "description": "Fetch the complete description as HTML and plain text. For Workday and SmartRecruiters this needs one extra request per job. Turning it off also disables description-based enrichment.",
            "default": true
          },
          "includeCompensation": {
            "title": "Include salary data",
            "type": "boolean",
            "description": "Extract structured salary ranges where the ATS exposes them. Ashby and Lever provide real numbers.",
            "default": true
          },
          "deduplicate": {
            "title": "Remove duplicate jobs",
            "type": "boolean",
            "description": "Drop repeated listings of the same role at the same company and location, which ATS boards commonly publish once per office.",
            "default": true
          },
          "maxItems": {
            "title": "Maximum jobs (total)",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on jobs pushed to the dataset across all boards."
          },
          "maxItemsPerBoard": {
            "title": "Maximum jobs per board",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap per company. Useful when scraping many companies and you only want a sample of each."
          },
          "deltaMode": {
            "title": "Delta mode (only changes)",
            "type": "boolean",
            "description": "Return only jobs that are new, changed or removed since the previous run. Ideal for daily monitoring: cheaper runs and no repeated data.",
            "default": false
          },
          "deltaStateKey": {
            "title": "Delta state name",
            "type": "string",
            "description": "Name under which the comparison state is stored. Use different names to track several independent watchlists.",
            "default": "default"
          },
          "includeRemovedInDelta": {
            "title": "Report removed jobs",
            "type": "boolean",
            "description": "In delta mode, also output jobs that disappeared since the last run, marked <code>removed</code>. Removed rows are never charged.",
            "default": true
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Post a digest of the jobs found to Slack when the run finishes."
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL",
            "type": "string",
            "description": "Post a digest of the jobs found to Discord when the run finishes."
          },
          "webhookUrl": {
            "title": "Custom webhook URL",
            "type": "string",
            "description": "POST a JSON body with the run summary and up to 100 jobs to your own endpoint."
          },
          "webhookHeaders": {
            "title": "Custom webhook headers",
            "type": "object",
            "description": "Extra HTTP headers for the custom webhook, e.g. an authorization token."
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Parallel requests. Lower it if a career site starts rate limiting.",
            "default": 10
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "ATS APIs are public and normally need no proxy. Enable one only if you hit rate limits from your own IP.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}