{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Jobs Scraper: Workday, Greenhouse, Lever, Ashby",
    "description": "Type a company name, get its open jobs. Auto-detects the career site on 13 ATS (Workday, Greenhouse, Lever, Ashby, SmartRecruiters...) and returns one clean format: salary in USD, skills, seniority, visa sponsorship. New and closed job alerts. Pay per job delivered.",
    "version": "0.2",
    "x-build-id": "KOmjKUmXaeKdyKmRI"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dgn-lab~ats-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dgn-lab-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/dgn-lab~ats-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dgn-lab-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/dgn-lab~ats-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dgn-lab-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": "Company names (e.g. \"Stripe\"), websites (e.g. \"notion.so\"), career pages or job board URLs (e.g. https://jobs.lever.co/spotify or https://acme.wd5.myworkdayjobs.com/External). The Actor detects which ATS each company uses and follows careers links from a website. For a plain name it also looks for the company homepage (<name>.com, .fr, .io, .ai, .de, .co, accepted only when its title matches the name) and follows its careers links, which is how a name can reach a Workday site.",
            "items": {
              "type": "string"
            }
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of jobs saved per company (0 = no limit). You pay per job saved, so this cap also caps the cost: 20 = at most 20 jobs charged per company, even on a board of 700.",
            "default": 0
          },
          "sortBy": {
            "title": "Sort jobs by",
            "enum": [
              "newest",
              "salaryDesc",
              "source"
            ],
            "type": "string",
            "description": "Order of each company's matching jobs, applied before \"Max jobs per company\" so the limit keeps the first jobs in this order. \"Newest first\" sorts by publication date, then update date, jobs without a date last; BambooHR and Rippling list no dates, so their jobs keep the career site order unless a salary or date filter downloads their details. \"Highest salary first\" sorts by the maximum annual salary in USD (else the minimum), jobs without a salary last; SmartRecruiters, Workday, BambooHR and Rippling often show salaries only in the job details. \"Career site order\" keeps the order of the career site.",
            "default": "newest"
          },
          "includeDescription": {
            "title": "Include job description",
            "type": "boolean",
            "description": "Add the full job description as HTML and plain text. Turn off for lighter, faster results.",
            "default": true
          },
          "outputMode": {
            "title": "Output",
            "enum": [
              "jobs",
              "companySummary",
              "both"
            ],
            "type": "string",
            "description": "\"Jobs\" saves one item per job. \"Company summaries\" saves one item per company instead: open jobs, department, location, seniority and skill breakdowns, remote share and, with change tracking, new and closed job counts. \"Both\" saves the jobs and the summaries. Summaries count every job that matches the filters, regardless of \"Max jobs per company\". Saved with the jobs, summaries are free; saved alone, each job a summary counts is charged as one job.",
            "default": "jobs"
          },
          "titleKeywords": {
            "title": "Title keywords",
            "type": "array",
            "description": "Keep only jobs whose title contains at least one of these keywords (case-insensitive). Leave empty to keep all.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "excludeTitleKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Drop jobs whose title contains any of these keywords, e.g. \"Senior\" or \"Intern\".",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "locationKeywords": {
            "title": "Location keywords",
            "type": "array",
            "description": "Keep only jobs whose location contains at least one of these keywords, e.g. \"Paris\", \"Germany\" or \"Remote\".",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "departmentKeywords": {
            "title": "Department keywords",
            "type": "array",
            "description": "Keep only jobs whose department or team contains at least one of these keywords, e.g. \"Engineering\".",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "descriptionKeywords": {
            "title": "Description keywords",
            "type": "array",
            "description": "Keep only jobs whose description contains at least one of these keywords (case-insensitive), e.g. \"Kubernetes\" or \"Salesforce\". Descriptions are downloaded for matching even when \"Include job description\" is off. Breezy HR publishes no descriptions, so its jobs are dropped when this is set. On SmartRecruiters and Workday, descriptions are downloaded job by job, which makes matching slower.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "requiredSkills": {
            "title": "Required skills",
            "type": "array",
            "description": "Keep only jobs whose detected skills (detectedSkills, read from the title and description) include these skills, e.g. \"Python\", \"Kubernetes\" or \"Salesforce\". Names are matched case-insensitively against the built-in skill dictionary; common aliases work (\"golang\" for Go, \"k8s\" for Kubernetes, \"postgres\" for PostgreSQL). Unknown names are ignored with a warning in the log; if none is known, the run stops with an error. Use \"Description keywords\" for free text. Descriptions are downloaded for matching even when \"Include job description\" is off. Leave empty to keep all.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "requiredSkillsMode": {
            "title": "Required skills match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "Whether a job needs at least one of the required skills, or all of them.",
            "default": "any"
          },
          "visaSponsorshipOnly": {
            "title": "Only jobs offering visa sponsorship",
            "type": "boolean",
            "description": "Keep only jobs whose description says visa sponsorship is offered (visaSponsorship true). Jobs that do not mention it are dropped. Detection reads English phrasing only.",
            "default": false
          },
          "maxExperienceYears": {
            "title": "Maximum years of experience required",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Keep only jobs whose description asks for at most this many years of experience (experienceYearsMin). Jobs whose description states no requirement are kept, since most descriptions do not state one. 0 = no filter.",
            "default": 0
          },
          "workplaceTypes": {
            "title": "Workplace types",
            "type": "array",
            "description": "Keep only jobs with these workplace types. Jobs whose workplace type is not published are kept only if \"Unknown\" is selected. Leave empty to keep all.",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "onsite",
                "unknown"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On-site",
                "Unknown"
              ]
            },
            "default": []
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only remote jobs (declared remote by the ATS or mentioning remote work in the title or location). Shortcut for Workplace types = Remote that also catches undeclared remote jobs.",
            "default": false
          },
          "employmentTypes": {
            "title": "Employment types",
            "type": "array",
            "description": "Keep only these contract types. Many companies do not publish the contract type: select \"Unknown\" to keep those jobs too. Leave empty to keep all.",
            "items": {
              "type": "string",
              "enum": [
                "full-time",
                "part-time",
                "contract",
                "internship",
                "temporary",
                "unknown"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract / freelance",
                "Internship / apprenticeship",
                "Temporary",
                "Unknown (not published)"
              ]
            },
            "default": []
          },
          "seniorityLevels": {
            "title": "Seniority levels",
            "type": "array",
            "description": "Keep only jobs at these levels, read from the job title (see the seniority output field). Titles that state no level (\"Software Engineer\") have an unknown seniority and are dropped unless you also select \"Unknown\": select it when looking for mid-level roles, which often have no qualifier in the title. Leave empty to keep all.",
            "items": {
              "type": "string",
              "enum": [
                "intern",
                "junior",
                "mid",
                "senior",
                "staff",
                "principal",
                "lead",
                "manager",
                "director",
                "executive",
                "unknown"
              ],
              "enumTitles": [
                "Intern / apprentice",
                "Junior / entry level",
                "Mid level",
                "Senior",
                "Staff",
                "Principal",
                "Lead",
                "Manager (people management)",
                "Director / head of",
                "Executive (VP, C-level, founder)",
                "Unknown (no level in the title)"
              ]
            },
            "default": []
          },
          "minSalary": {
            "title": "Minimum annual salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs whose highest salary, as an annual amount, is at least this much in the minimum salary currency. Hourly, daily, weekly and monthly pay is annualised (x 2,080, 260, 52, 12); other currencies are converted with a static, approximate exchange-rate table (ECB rates of 2026-10-29). A salary without a published period is compared as a yearly amount. Jobs without a known salary, or in a currency outside the table, are dropped when this is set (0 = no filter).",
            "default": 0
          },
          "minSalaryCurrency": {
            "title": "Minimum salary currency",
            "enum": [
              "AUD",
              "BRL",
              "CAD",
              "CHF",
              "CNY",
              "CZK",
              "DKK",
              "EUR",
              "GBP",
              "HKD",
              "HUF",
              "IDR",
              "ILS",
              "INR",
              "ISK",
              "JPY",
              "KRW",
              "MXN",
              "MYR",
              "NOK",
              "NZD",
              "PHP",
              "PLN",
              "RON",
              "SEK",
              "SGD",
              "THB",
              "TRY",
              "USD",
              "ZAR"
            ],
            "type": "string",
            "description": "Currency of the minimum annual salary. Salaries in other currencies are converted with a static, approximate exchange-rate table (ECB reference rates of 2026-10-29).",
            "default": "USD"
          },
          "onlyWithSalary": {
            "title": "Only jobs with a published salary",
            "type": "boolean",
            "description": "Keep only jobs that publish a salary range.",
            "default": false
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs published in the last N days (0 = any date). Jobs without a publication date are dropped when this is set.",
            "default": 0
          },
          "monitorChanges": {
            "title": "Track changes between runs",
            "type": "boolean",
            "description": "Compare each company with the previous run and label jobs as new, updated, unchanged or closed. Schedule the Actor to get hiring alerts.",
            "default": false
          },
          "onlyChanges": {
            "title": "Only output changes",
            "type": "boolean",
            "description": "With change tracking on, skip unchanged jobs and save only new, updated and closed ones. Only the new, updated and closed jobs saved are charged: a run where nothing changed costs nothing per job.",
            "default": false
          },
          "stateStoreName": {
            "title": "Snapshot store name",
            "type": "string",
            "description": "Name of the key-value store holding company snapshots. Use different names to run independent monitors.",
            "default": "ats-jobs-monitor"
          },
          "notificationWebhookUrl": {
            "title": "Notification webhook URL",
            "type": "string",
            "description": "Optional. With change tracking on, post a short summary of new, updated and closed jobs to this URL after each run that finds changes. Slack incoming webhooks (hooks.slack.com), Discord webhooks (discord.com/api/webhooks/...) and Telegram bots (https://api.telegram.org/bot<token>/sendMessage?chat_id=<id>) get a chat message; any other URL receives JSON. Nothing is sent on a company's first monitoring run. A failed delivery is logged and never fails the run."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}