{
  "openapi": "3.0.1",
  "info": {
    "title": "Greenhouse Jobs Feed + Lever, Ashby & Workable: New & Closed",
    "description": "Greenhouse jobs plus Lever, Ashby, Workable and Personio postings from public job boards in one flat schema with salary, location and remote fields. Change mode returns only new, changed or closed postings since your last run. No recruiter fields; emails and phone numbers removed from descriptions.",
    "version": "0.1",
    "x-build-id": "PTcf7Echw3MhL7chf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/madrasco~ats-job-postings-feed/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-madrasco-ats-job-postings-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/madrasco~ats-job-postings-feed/runs": {
      "post": {
        "operationId": "runs-sync-madrasco-ats-job-postings-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/madrasco~ats-job-postings-feed/run-sync": {
      "post": {
        "operationId": "run-sync-madrasco-ats-job-postings-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": "Job boards",
            "type": "array",
            "description": "One board per line: 'greenhouse:<board>', 'lever:<company>', 'ashby:<board>', 'workable:<account>', 'personio:<company>', or a board URL such as https://boards.greenhouse.io/stripe, https://jobs.lever.co/spotify (EU-hosted Lever boards on jobs.eu.lever.co work too), https://jobs.ashbyhq.com/ramp https://apply.workable.com/skroutz or https://thermondo.jobs.personio.de. Up to 500 boards per run. Also accepted as 'startUrls', 'urls' or 'companies'. Not supported: EU-hosted Greenhouse boards (boards.eu.greenhouse.io), single Workable job links (apply.workable.com/j/...) and Workable or Personio careers sites on a company's own domain.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "full",
              "changes"
            ],
            "type": "string",
            "description": "'full' (default): every open posting on every run, each marked new/changed/unchanged, plus closed ones. 'changes': only postings that are new, changed or closed since the previous run with the same boards (the first run returns every open posting as new); use this for scheduled runs.",
            "default": "full"
          },
          "maxRows": {
            "title": "Maximum rows",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many dataset rows (each row is one charged job-row event). The form starts at 10 so a first try costs about US$0.015; clear it or set 0 for no limit. Also accepted as 'maxItems'. A run also stops cleanly when your maximum cost per run is reached. Either way the postings not yet written are kept in the history and reported by a later run."
          },
          "includeDescription": {
            "title": "Include job descriptions",
            "type": "boolean",
            "description": "Add the plain-text job description (email addresses and phone numbers removed). Off by default: descriptions made the output about 5–7 times larger in our tests. Switching this on or off does not mark postings as changed.",
            "default": false
          },
          "titleIncludes": {
            "title": "Title keywords",
            "type": "array",
            "description": "Keep postings whose title contains any of these words or phrases (case-insensitive, matched at the start of a word: 'engineer' matches 'Engineering Manager'; 'ML' matches 'MLOps' but not 'HTML'). Leave empty for all titles.",
            "items": {
              "type": "string"
            }
          },
          "titleExcludes": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Leave out postings whose title contains any of these words or phrases (same matching as title keywords), e.g. 'intern', 'senior'.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Keep postings whose location, any of their locations, or country contains any of these (same matching: 'US' matches 'US' and 'USA' but not 'Austin'; 'Berlin', 'Germany', 'DE'). Country is a code on Lever and Workable (e.g. 'US', 'GB'), usually a name on Ashby, and absent on Greenhouse and Personio, where only the location text is searched.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Keep only postings marked remote (remote = true). Greenhouse and Personio boards have no remote field; there a posting counts as remote when its location says 'Remote'.",
            "default": false
          },
          "workplaceTypes": {
            "title": "Workplace types",
            "type": "array",
            "description": "Keep postings with one of these workplace types. Lever and Ashby state it; Workable states only 'remote'; Greenhouse and Personio don't state it, so there only postings with 'Remote' in the location count (as remote).",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "onsite"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On-site"
              ]
            }
          },
          "hasSalary": {
            "title": "Only postings with a salary",
            "type": "boolean",
            "description": "Keep only postings where the employer publishes a pay range.",
            "default": false
          },
          "minSalary": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep postings whose pay range reaches at least this much per year, in the currency below. The top of the employer's own range is compared, converted to a year from the stated period (hour x 2,080, day x 260, week x 52, month x 12). Postings with no range, another currency or no stated period are left out; no salary is guessed from text."
          },
          "salaryCurrency": {
            "title": "Salary currency",
            "type": "string",
            "description": "Three-letter code for the minimum salary, e.g. USD, EUR, GBP. Required with a minimum salary; amounts in other currencies are not converted."
          },
          "salaryPeriodUnknownAsYear": {
            "title": "Treat pay ranges with no period as yearly",
            "type": "boolean",
            "description": "Greenhouse never says whether a pay range is per year or per hour, so with a minimum salary Greenhouse postings are left out. Switch this on to treat a range with no stated period as yearly (true for most Greenhouse ranges in our tests, but not all).",
            "default": false
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep postings the employer published at most this many days ago (by published_at; postings without a date are left out). Closed postings are still reported when they match the other filters. Leave empty or 0 for no limit."
          },
          "maxDaysOpen": {
            "title": "Maximum days open",
            "minimum": 0,
            "type": "integer",
            "description": "Leave out postings that have been open more than this many days (by published_at; postings without a date are left out). Closed postings are still reported. Leave empty or 0 for no limit."
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store in your account that remembers previous runs (one record per board list). Set your existing store name explicitly, usually ats-job-feed-state, to keep its history and let Apify request read/write access. If blank, tries ats-job-feed-state; if opening it is denied with HTTP 403, uses ats-job-feed-state-limited, a separate history whose first run reports every open posting as new. Keep the same store name and boards on later runs."
          },
          "resetState": {
            "title": "Start over",
            "type": "boolean",
            "description": "Ignore the stored history for these boards: every open posting is returned as new and the history is rebuilt.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}