{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Board Scraper & Change Tracker",
    "description": "Find jobs at companies you follow and track new, updated, and removed postings across 38 hiring platforms. Filter by title, location, or remote status. Export results to CSV, Excel, or JSON.",
    "version": "0.1",
    "x-build-id": "i6Xm7jzhHb09Hs3jX"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dstyx~ats-job-feed-actor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dstyx-ats-job-feed-actor",
        "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/dstyx~ats-job-feed-actor/runs": {
      "post": {
        "operationId": "runs-sync-dstyx-ats-job-feed-actor",
        "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/dstyx~ats-job-feed-actor/run-sync": {
      "post": {
        "operationId": "run-sync-dstyx-ats-job-feed-actor",
        "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 names. Each is looked up on Greenhouse first, then Lever. A pasted careers-page URL also works. Names found on neither platform are listed in the run summary, never billed. If a board token differs from the company name, use 'Boards by platform' below.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "title_keywords": {
            "title": "Job title contains any of",
            "type": "array",
            "description": "Case-insensitive substrings. A job is kept if its title contains at least one. Leave empty for no title filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "first_run_mode": {
            "title": "First run behavior",
            "enum": [
              "emit_all_as_new",
              "baseline_only"
            ],
            "type": "string",
            "description": "What to do when there is no stored baseline yet. 'emit_all_as_new' returns every open job tagged 'new' (and bills for them). 'baseline_only' returns nothing, records the baseline, and starts reporting real changes on the next run.",
            "default": "emit_all_as_new"
          },
          "greenhouse_boards": {
            "title": "Companies on Greenhouse",
            "type": "array",
            "description": "Company board tokens from Greenhouse job board URLs. For https://boards.greenhouse.io/airbnb the token is 'airbnb'.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "lever_boards": {
            "title": "Companies on Lever",
            "type": "array",
            "description": "Company slugs from Lever job board URLs. For https://jobs.lever.co/spotify the slug is 'spotify'.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "exclude_title_keywords": {
            "title": "Job title does NOT contain",
            "type": "array",
            "description": "Case-insensitive substrings. A job is dropped if its title contains any of these. Applied before the include filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Location contains any of",
            "type": "array",
            "description": "Case-insensitive substrings matched against the job's locations.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Department or team contains any of",
            "type": "array",
            "description": "Case-insensitive substrings. Note: enabling this makes Greenhouse requests heavier, because Greenhouse only returns department data on its detailed payload.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "remote_only": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only postings the source explicitly marks remote. Jobs with no remote signal are excluded rather than guessed at.",
            "default": false
          },
          "emit_unchanged": {
            "title": "Also emit unchanged jobs",
            "type": "boolean",
            "description": "Include jobs that did not change. Never billed as a change event. Turns this into a full dump plus change labels.",
            "default": false
          },
          "include_description": {
            "title": "Include job description",
            "type": "boolean",
            "description": "Add the plain-text description to each output record. Makes Greenhouse responses substantially larger.",
            "default": false
          },
          "hash_description": {
            "title": "Detect description changes",
            "type": "boolean",
            "description": "Fold the description into the change hash so description edits count as updates. Increases sensitivity and request size. Changing this resets your baseline.",
            "default": false
          },
          "detect_timestamp_only": {
            "title": "Report vendor-timestamp-only updates (noisy)",
            "type": "boolean",
            "description": "Report a job as 'updated' when the vendor's updated_at advanced but nothing in the content hash changed. Off by default: measured on real Greenhouse boards, this signal is dominated by occasional bulk re-stamps that touch nearly every job at once with no visible change - each would be billed as an update. To catch description edits, enable 'Detect description changes' instead. Greenhouse only; Lever publishes no updated_at.",
            "default": false
          },
          "state_store_name": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store holding your baseline between runs. Must be a named store: Apify gives every run a fresh default store, so a baseline there would never survive.",
            "default": "ats-job-feed-state"
          },
          "state_key": {
            "title": "State key (optional)",
            "type": "string",
            "description": "Pin the baseline to a fixed key. By default the key reflects your hashing options only, so adding a board keeps every other board's history while changing what is hashed starts a clean baseline."
          },
          "reset_state": {
            "title": "Reset baseline",
            "type": "boolean",
            "description": "Discard the stored baseline and treat this run as a first run.",
            "default": false
          },
          "removal_alarm_ratio": {
            "title": "Mass-removal alarm threshold",
            "minimum": 0.01,
            "maximum": 1,
            "type": "number",
            "description": "Fraction of a board's tracked jobs that vanishing in one run is treated as suspicious rather than real. Guards against a truncated but successful response wiping your feed.",
            "default": 0.5
          },
          "suppress_mass_removals": {
            "title": "Withhold suspicious mass removals",
            "type": "boolean",
            "description": "When the alarm trips, keep the baseline and emit no removals for that board, so a genuine mass close-out is reported only once a second run corroborates it.",
            "default": true
          },
          "max_concurrency": {
            "title": "Max concurrent board requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "These are free public endpoints; keep this polite.",
            "default": 5
          },
          "request_timeout": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "Per-request timeout for a single board fetch.",
            "default": 30
          },
          "max_retries": {
            "title": "Max retries per board",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Retries use exponential backoff with jitter and honor Retry-After.",
            "default": 4
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}