{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Job Change Feed API - Greenhouse + 7 More",
    "description": "ATS job change feed and career page API for Greenhouse, Workday, Lever, Ashby, Workable, Personio, Recruitee and Teamtailor. Monitor normalized job postings and receive CREATED, UPDATED and CLOSED events while failed sources retain their last healthy state.",
    "version": "1.0",
    "x-build-id": "2q6dQtCcq3ytdjxkj"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kamerozkan~ats-job-change-feed/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kamerozkan-ats-job-change-feed",
        "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/kamerozkan~ats-job-change-feed/runs": {
      "post": {
        "operationId": "runs-sync-kamerozkan-ats-job-change-feed",
        "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/kamerozkan~ats-job-change-feed/run-sync": {
      "post": {
        "operationId": "run-sync-kamerozkan-ats-job-change-feed",
        "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": {
          "boards": {
            "title": "ATS career board URLs",
            "type": "array",
            "description": "Public Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Teamtailor, or Workday boards. Each array entry can be a URL string or an object with url plus optional company, ats, and slug fields. Billing is one job-result per dataset row; unchanged jobs write no rows in changes mode.",
            "default": [
              {
                "url": "https://job-boards.greenhouse.io/greenhouse",
                "company": "Greenhouse"
              }
            ]
          },
          "companyUrls": {
            "title": "Company career pages to discover",
            "uniqueItems": true,
            "type": "array",
            "description": "Company home or careers URLs. The Actor discovers supported ATS boards from a bounded set of public pages and preserves the discovery provenance.",
            "items": {
              "type": "string",
              "pattern": "^https?://"
            },
            "default": []
          },
          "catalog": {
            "title": "10K board catalog",
            "type": "object",
            "description": "Optionally bootstrap and process the bundled 10,000-board candidate catalog in deterministic chunks. Historical candidates become ACTIVE only after a live fetch succeeds.",
            "properties": {
              "enabled": {
                "title": "Enable catalog",
                "description": "Use persistent catalog lifecycle and chunk selection.",
                "type": "boolean",
                "default": false
              },
              "catalogId": {
                "title": "Catalog ID",
                "description": "User-chosen persistent label for this independent board catalog.",
                "type": "string",
                "default": "default",
                "minLength": 1,
                "maxLength": 120,
                "pattern": "^[a-zA-Z0-9._-]+$"
              },
              "bootstrapBundled": {
                "title": "Bootstrap bundled 10K",
                "type": "boolean",
                "description": "Merge the bundled, Common Crawl-derived 10,000 candidate boards into the named catalog.",
                "default": false
              },
              "process": {
                "title": "Process selected chunk",
                "type": "boolean",
                "description": "Fetch the selected chunk. Disable to initialize or inspect the catalog only.",
                "default": true
              },
              "chunkSize": {
                "title": "Boards per chunk",
                "description": "Fixed number of catalog slots assigned to each task.",
                "type": "integer",
                "default": 100,
                "minimum": 1,
                "maximum": 500
              },
              "chunkIndex": {
                "title": "Fixed chunk index",
                "type": "integer",
                "description": "Optional deterministic chunk override. When omitted, the exclusive-run cursor advances automatically.",
                "minimum": 0,
                "maximum": 100000
              },
              "staleAfterDays": {
                "title": "Stale after days",
                "description": "Mark an active board stale after this many days without success.",
                "type": "integer",
                "default": 7,
                "minimum": 1,
                "maximum": 365
              },
              "expireAfterDays": {
                "title": "Expire after days",
                "description": "Tombstone an old repeatedly failing board after this many days.",
                "type": "integer",
                "default": 30,
                "minimum": 2,
                "maximum": 730
              },
              "maxConsecutiveFailures": {
                "title": "Maximum consecutive failures",
                "description": "Failure count required before an old board can expire.",
                "type": "integer",
                "default": 5,
                "minimum": 1,
                "maximum": 100
              },
              "retryAfterMinutes": {
                "title": "Retry delay minutes",
                "description": "Cooldown applied after a failed board fetch.",
                "type": "integer",
                "default": 60,
                "minimum": 1,
                "maximum": 43200
              },
              "includeStatuses": {
                "title": "Eligible lifecycle states",
                "type": "array",
                "description": "Lifecycle states eligible for chunk selection.",
                "default": [
                  "PENDING",
                  "ACTIVE",
                  "RETRY",
                  "STALE"
                ],
                "items": {
                  "type": "string",
                  "pattern": "^(PENDING|ACTIVE|RETRY|STALE|EXPIRED)$"
                }
              }
            },
            "default": {
              "enabled": false,
              "catalogId": "default",
              "bootstrapBundled": false,
              "process": true,
              "chunkSize": 100,
              "staleAfterDays": 7,
              "expireAfterDays": 30,
              "maxConsecutiveFailures": 5,
              "retryAfterMinutes": 60
            }
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "jobs",
              "changes",
              "both"
            ],
            "type": "string",
            "description": "Output open jobs, change events, or both.",
            "default": "changes"
          },
          "watchlistId": {
            "title": "Watchlist ID",
            "pattern": "^[a-zA-Z0-9._-]+$",
            "minLength": 1,
            "maxLength": 120,
            "type": "string",
            "description": "User-chosen snapshot namespace used to compare scheduled runs. Keep it stable for one watchlist: the first run creates the baseline, later runs emit only real CREATED, UPDATED, and CLOSED events, and a failed board keeps its previous snapshot instead of producing false closures.",
            "default": "default"
          },
          "includeDescriptions": {
            "title": "Include descriptions",
            "type": "boolean",
            "description": "Include HTML and plain-text descriptions and detect description edits. Workday uses one additional detail request per open job.",
            "default": true
          },
          "includeCompensation": {
            "title": "Include compensation",
            "type": "boolean",
            "description": "Normalize structured compensation and parse plausible EUR/CHF salary ranges from descriptions.",
            "default": true
          },
          "emitInitialSnapshotChanges": {
            "title": "Emit CREATED on first run",
            "type": "boolean",
            "description": "Emit a CREATED event for every current job when no prior snapshot exists.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Maximum concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of career boards fetched in parallel.",
            "default": 10
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Timeout for each HTTP attempt.",
            "default": 30
          },
          "maxRequestRetries": {
            "title": "Request retries",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Retry count for rate limits, server errors, and network failures.",
            "default": 2
          },
          "failOnBoardError": {
            "title": "Fail on board error",
            "type": "boolean",
            "description": "Fail the whole run if any board cannot be fetched. Failed boards never generate false CLOSED events.",
            "default": false
          },
          "discoveryMaxPages": {
            "title": "Discovery pages per company",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum public pages scanned on each company website while looking for supported ATS links.",
            "default": 5
          },
          "failOnDiscoveryError": {
            "title": "Fail on unresolved company",
            "type": "boolean",
            "description": "Fail the whole run when any company URL fails or has no supported ATS board.",
            "default": false
          },
          "freshnessSlaMinutes": {
            "title": "Freshness SLA target",
            "minimum": 1,
            "maximum": 1440,
            "type": "integer",
            "description": "Target source-to-detection latency in minutes, measured after the baseline run when source timestamps are available.",
            "default": 10
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}