ATS New Jobs Monitor
Pricing
from $1.50 / 1,000 job results
Go to Apify Store
ATS New Jobs Monitor
Monitor Greenhouse, Lever, Ashby, Workable, and SmartRecruiters boards and output only NEW and REMOVED job postings since the previous run.
ATS New Jobs Monitor
Pricing
from $1.50 / 1,000 job results
Monitor Greenhouse, Lever, Ashby, Workable, and SmartRecruiters boards and output only NEW and REMOVED job postings since the previous run.
You can access the ATS New Jobs Monitor programmatically from your own applications by using the Apify API. You can also choose the language preference from below. To use the Apify API, you’ll need an Apify account and your API token, found in API & Integrations in Apify Console.
{ "openapi": "3.0.1", "info": { "version": "1.0", "x-build-id": "IRRecpQXUril8AMea" }, "servers": [ { "url": "https://api.apify.com/v2" } ], "paths": { "/acts/looped_warp~ats-new-jobs-monitor/run-sync-get-dataset-items": { "post": { "operationId": "run-sync-get-dataset-items-looped_warp-ats-new-jobs-monitor", "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/looped_warp~ats-new-jobs-monitor/runs": { "post": { "operationId": "runs-sync-looped_warp-ats-new-jobs-monitor", "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/looped_warp~ats-new-jobs-monitor/run-sync": { "post": { "operationId": "run-sync-looped_warp-ats-new-jobs-monitor", "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 to monitor", "minItems": 1, "type": "array", "description": "Each item can be a company name, careers URL, ATS board URL, or board token. Leave ATS blank to auto-detect among Greenhouse, Lever, Ashby, Workable, and SmartRecruiters using public JSON APIs. The default is a small live Greenhouse board so empty Store auto-tests still return rows.", "items": { "type": "object", "additionalProperties": false, "required": [ "identifier" ], "properties": { "identifier": { "title": "Company, URL, or board token", "type": "string", "description": "Examples: `stripe`, `OpenAI`, `https://jobs.lever.co/palantir`, `https://jobs.ashbyhq.com/notion`, `huggingface`, `DeliveryHero`.", "editor": "textfield" }, "name": { "title": "Display name", "type": "string", "description": "Optional company name used in the output. If omitted, the Actor uses the name returned by the ATS or the identifier.", "editor": "textfield" }, "ats": { "title": "ATS (optional)", "type": "string", "description": "Skip auto-detection when you already know the board. Leave empty to probe public endpoints.", "editor": "select", "enum": [ "greenhouse", "lever", "ashby", "workable", "smartrecruiters" ], "enumTitles": [ "Greenhouse", "Lever", "Ashby", "Workable", "SmartRecruiters" ] }, "token": { "title": "Board token override", "type": "string", "description": "Optional board slug / company identifier if it differs from the identifier field.", "editor": "textfield" } } }, "default": [ { "identifier": "https://boards.greenhouse.io/airtable", "name": "Airtable", "ats": "greenhouse" } ] }, "monitorId": { "title": "Monitor ID", "type": "string", "description": "Set this to enable incremental NEW/REMOVED diffs across scheduled runs. Leave empty (the Store auto-test / Try Actor default) for a stateless run that always outputs current jobs (`outputMode=all`, capped). Do not reuse an empty ID for a daily monitor — that would skip the snapshot." }, "snapshotStoreName": { "title": "Snapshot Key-Value Store name", "type": "string", "description": "Named Key-Value Store used to persist snapshots across runs. Use a dedicated store per environment (dev/prod).", "default": "ats-new-jobs-monitor-snapshots" }, "incremental": { "title": "Incremental mode", "type": "boolean", "description": "When a Monitor ID is set, diff against the previous snapshot and (with changesOnly) output only NEW and REMOVED jobs. Ignored when Monitor ID is empty — those runs are always stateless.", "default": true }, "outputMode": { "title": "Output mode", "enum": [ "changesOnly", "all" ], "type": "string", "description": "For scheduled monitors (Monitor ID set): `changesOnly` is what you want — only NEW and REMOVED rows. `all` also pushes EXISTING open jobs. Empty Monitor ID always behaves as `all`.", "default": "changesOnly" }, "firstRunMode": { "title": "First run behavior", "enum": [ "emitAllAsNew", "baselineSilent" ], "type": "string", "description": "What to do when no snapshot exists yet. `emitAllAsNew` outputs every current job as NEW. `baselineSilent` saves the snapshot and outputs nothing, so the next run only reports true changes.", "default": "emitAllAsNew" }, "includeKeywords": { "title": "Include keywords", "type": "array", "description": "Keep a job if its title, department, team, or location contains any of these phrases (case-insensitive). Leave empty to keep all.", "items": { "type": "string" } }, "excludeKeywords": { "title": "Exclude keywords", "type": "array", "description": "Drop a job if its title, department, team, or location contains any of these phrases (case-insensitive).", "items": { "type": "string" } }, "locations": { "title": "Location contains", "type": "array", "description": "Keep jobs whose location string contains any of these values (case-insensitive). Remote jobs still pass when Remote only is enabled.", "items": { "type": "string" } }, "departments": { "title": "Departments", "type": "array", "description": "Keep jobs whose department or team contains any of these values (case-insensitive).", "items": { "type": "string" } }, "remoteOnly": { "title": "Remote only", "type": "boolean", "description": "When enabled, only jobs marked remote (or whose location text looks remote) are kept.", "default": false }, "includeDescription": { "title": "Include job description text", "type": "boolean", "description": "Adds a plain-text `descriptionText` field. Greenhouse and Workable fetch richer payloads; SmartRecruiters requires one extra request per job. Leave off unless you need descriptions.", "default": false }, "maxJobs": { "title": "Max jobs to output", "minimum": 0, "type": "integer", "description": "Safety cap on dataset items pushed this run. `0` means no cap when a Monitor ID is set. Stateless runs (empty Monitor ID) cap at 25 unless you set a positive value, so Store auto-tests stay small and cheap.", "default": 0 }, "webhookUrl": { "title": "Webhook URL", "type": "string", "description": "Optional URL that receives a JSON POST with new/removed counts and a truncated list of changes. Ignored when empty." }, "slackWebhookUrl": { "title": "Slack incoming webhook URL", "type": "string", "description": "Optional Slack incoming webhook. The Actor posts a short summary of NEW and REMOVED jobs. Ignored when empty." } } }, "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 } } } } } } } } }}OpenAPI is a standard for designing and describing RESTful APIs, allowing developers to define API structure, endpoints, and data formats in a machine-readable way. It simplifies API development, integration, and documentation.
OpenAPI is effective when used with AI agents and GPTs by standardizing how these systems interact with various APIs, for reliable integrations and efficient communication.
By defining machine-readable API specifications, OpenAPI allows AI models like GPTs to understand and use varied data sources, improving accuracy. This accelerates development, reduces errors, and provides context-aware responses, making OpenAPI a core component for AI applications.
You can download the OpenAPI definitions for ATS New Jobs Monitor from the options below:
If you’d like to learn more about how OpenAPI powers GPTs, read our blog post.
You can also check out our other API clients: