{
  "openapi": "3.0.1",
  "info": {
    "title": "Careers Page Scraper: Greenhouse Jobs, Lever & Workday Jobs",
    "description": "Careers page scraper and career site jobs API: Greenhouse jobs, Lever, Ashby and Workday jobs, plus Workable, SmartRecruiters, Recruitee, Personio, Teamtailor, softgarden and d.vinci. Give domains or careers URLs. Filter by title, location, remote and posted date before you pay. Alerts for new jobs.",
    "version": "0.1",
    "x-build-id": "aBB2p6LS9lkFLHSum"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yourevenings~careers-jobs-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yourevenings-careers-jobs-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/yourevenings~careers-jobs-api/runs": {
      "post": {
        "operationId": "runs-sync-yourevenings-careers-jobs-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/yourevenings~careers-jobs-api/run-sync": {
      "post": {
        "operationId": "run-sync-yourevenings-careers-jobs-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",
        "required": [
          "companies"
        ],
        "properties": {
          "companies": {
            "title": "Companies (domains, careers URLs or board tokens)",
            "minItems": 1,
            "maxItems": 5000,
            "type": "array",
            "description": "One company per line. Accepted forms: a domain such as <code>figma.com</code>; a careers page URL such as <code>https://www.notion.so/careers</code>; a job-board URL on boards.greenhouse.io, job-boards.greenhouse.io, jobs.lever.co, jobs.eu.lever.co, jobs.ashbyhq.com, apply.workable.com, jobs.smartrecruiters.com, *.recruitee.com or a Workday career site (*.myworkdayjobs.com) or a Personio career page (*.jobs.personio.de, *.jobs.personio.com) or a Teamtailor career site (*.teamtailor.com) or a d.vinci job portal (*.dvinci-hr.com) or a softgarden career site (*.career.softgarden.de); or an explicit token in the form <code>ats:token</code>, where ats is greenhouse, lever, lever-eu, ashby, workable, smartrecruiters, recruitee, workday, personio, teamtailor, dvinci or softgarden (for example <code>greenhouse:stripe</code> or <code>workday:nvidia.wd5/NVIDIAExternalCareerSite</code>). Explicit tokens and board URLs are the fastest and most reliable. Companies whose board can't be found are returned as a row with status <code>not_found</code> and are not charged. A Workday site that answers HTTP 403, keeps answering HTTP 429 after 3 retries, or answers with a page that isn't a job list is not retried further: it gets a row with status <code>error</code> saying which (<code>fetch_failed</code> in monitor mode if it happens partway through the board), and is not charged. A board whose robots.txt can't be read cleanly (any answer other than the file itself or HTTP 404, or a timeout) is skipped with an <code>error</code> row and not charged. Personio boards can only be read when the employer has switched on Personio's public XML job feed; otherwise the row has status <code>feed_disabled</code> (or <code>not_found</code> for a guessed board) and is not charged. d.vinci portals can only be read when the employer has switched on d.vinci's public JSON job list; otherwise the row has status <code>feed_disabled</code> and is not charged. Older softgarden career sites on *.softgarden.io have no public job feed: they get a row with status <code>unsupported</code> and are not charged.",
            "default": [
              "figma.com",
              "discord.com",
              "https://jobs.lever.co/spotify",
              "linear.app",
              "ashby:ramp"
            ],
            "items": {
              "type": "string"
            }
          },
          "includeDescription": {
            "title": "Include job description text",
            "type": "boolean",
            "description": "Add a plain-text <code>descriptionText</code> field to every job. Email addresses and phone numbers are removed from the text. Off by default because descriptions make the dataset much larger and runs slower.",
            "default": false
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "type": "integer",
            "description": "Limit the number of job rows returned for each company. 0 means no limit (all open jobs). Ignored in monitor mode, where every change is reported.",
            "default": 0
          },
          "titleKeywords": {
            "title": "Title keywords (match any)",
            "type": "array",
            "description": "Keep only jobs whose title contains at least one of these words or phrases. Ignores case and accents; whole words: <code>engineer</code> matches \"Software Engineer\" but not \"Engineering Manager\", so add <code>engineering</code> too if you want both. A single word of 5+ letters also matches at the end of a compound word and with German -in/-innen endings: <code>entwickler</code> matches \"Softwareentwickler\" and \"Entwicklerin\". Examples: <code>engineer</code>, <code>product manager</code>, <code>data scientist</code>. Jobs removed by any filter are never returned or charged.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Drop jobs whose title contains any of these words or phrases (same matching as title keywords: ignores case and accents, whole words, compound endings for words of 5+ letters). Examples: <code>intern</code>, <code>manager</code>, <code>senior</code>.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations (match any)",
            "type": "array",
            "description": "Keep only jobs whose location contains one of these places (whole words, ignoring case and accents). Examples: <code>London</code>, <code>United Kingdom</code>, <code>München</code>, <code>Remote</code>. About 50 groups of place names are matched together, e.g. Munich/München, Cologne/Köln, Zurich/Zürich, Vienna/Wien, NYC/New York, UK/United Kingdom/England, USA/US, Germany/Deutschland. Cities aren't matched to countries. <code>Remote</code> also matches jobs the board flags as remote (including local words like Homeoffice). Jobs with no location on the board are dropped when this filter is set.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only jobs with <code>isRemote: true</code> or <code>workplaceType: \"remote\"</code>. Hybrid jobs are not included. <code>isRemote</code> comes from the board's remote flag or, when the board has none, the word \"remote\" in the job's location or title, or a local remote word in the location (Homeoffice, télétravail, teletrabajo, remoto, thuiswerk and similar).",
            "default": false
          },
          "departments": {
            "title": "Departments (match any)",
            "type": "array",
            "description": "Keep only jobs whose department or team contains one of these texts (ignores case and accents, partial match: <code>eng</code> matches \"Engineering\"). Examples: <code>Engineering</code>, <code>Sales</code>, <code>Data</code>. Department names are whatever each employer uses on its board. Jobs with no department or team are dropped when this filter is set.",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep only jobs whose <code>postedAt</code> is within this many days of the run (0 or empty = any date). Counts back from each run, so a scheduled run always looks at the latest days. Example: <code>1</code> for the last 24 hours, <code>7</code> for the last week. Workday listings show only relative dates (\"Posted 3 Days Ago\"); those are converted to a date accurate to about a day and get one extra day of leeway."
          },
          "keepJobsWithoutPostedDate": {
            "title": "Keep jobs with no posted date",
            "type": "boolean",
            "description": "Some boards don't publish a posted date for every job. With <b>Posted within the last N days</b> set, those jobs are kept by default and flagged <code>postedAtUnknown: true</code>. Turn this off to drop them instead.",
            "default": true
          },
          "monitorMode": {
            "title": "Monitor mode (only new and removed jobs)",
            "type": "boolean",
            "description": "When on, the Actor compares each company's board with the previous run and returns only jobs that are new (<code>changeType: \"new\"</code>) or have been removed (<code>changeType: \"removed\"</code>). Companies with no changes return one summary row with status <code>no_change</code>. Schedule the Actor daily or weekly with the same input to get a hiring-signal feed. The previous job lists are kept in the named key-value store set below.",
            "default": false
          },
          "emitBaselineOnFirstRun": {
            "title": "Return all jobs on the first monitor run",
            "type": "boolean",
            "description": "In monitor mode, the first run for a company has nothing to compare with. When on, all current jobs are returned as <code>new</code> (and charged as jobs). When off, the first run only saves the baseline and returns one <code>baseline_saved</code> row per company.",
            "default": true
          },
          "stateStoreName": {
            "title": "State key-value store name",
            "type": "string",
            "description": "Name of the key-value store in your account that remembers previously seen jobs (for monitor mode and the firstSeenAt field) and which board each company uses. Use a different name for each separate monitoring list.",
            "default": "careers-jobs-api-state"
          },
          "persistState": {
            "title": "Remember jobs between normal runs",
            "type": "boolean",
            "description": "In normal (non-monitor) mode, save the jobs seen in this run so <code>firstSeenAt</code> stays accurate across runs. Monitor mode always saves state.",
            "default": true
          },
          "scanCareersPage": {
            "title": "Scan the company website for job-board links",
            "type": "boolean",
            "description": "If guessing the board from the domain fails, fetch up to 4 pages of the company website (the careers URL you gave, /careers, /jobs and the homepage) and look for links to a supported job board.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Maximum number of HTTP requests in flight at once, across all companies. The default is deliberately polite to the job-board APIs.",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 60,
            "type": "integer",
            "description": "Timeout for each request to a job-board API. Failed or timed-out requests are retried up to 3 times with backoff.",
            "default": 15
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}