{
  "openapi": "3.0.1",
  "info": {
    "title": "Greenhouse Jobs Scraper: All 5 ATS Boards",
    "description": "Scrape job postings from Greenhouse, Lever, Ashby, Workable and Recruitee boards into one row shape for a list of companies, at $0.45 per 1,000 ($0.20 on Gold) with the full description. Title, location, department, pay when published, apply link. Get only new jobs, and the ones that closed.",
    "version": "0.1",
    "x-build-id": "SHStAo3gEenbwFppw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/pradio~greenhouse-lever-ashby-job/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-pradio-greenhouse-lever-ashby-job",
        "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/pradio~greenhouse-lever-ashby-job/runs": {
      "post": {
        "operationId": "runs-sync-pradio-greenhouse-lever-ashby-job",
        "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/pradio~greenhouse-lever-ashby-job/run-sync": {
      "post": {
        "operationId": "run-sync-pradio-greenhouse-lever-ashby-job",
        "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": {
          "company": {
            "title": "Companies",
            "type": "array",
            "description": "One entry per company: a slug (ramp), a tagged slug (greenhouse:stripe, lever:spotify, workable:nuvei, recruitee:bunq), a public job-board URL, the company's own careers-page URL (https://careers.bunq.com), or a company name (Hugging Face). A slug, careers-page URL or name is tried on Ashby, Greenhouse, Lever, Workable and Recruitee in that order until one answers.",
            "items": {
              "type": "string"
            }
          },
          "preset": {
            "title": "Preset company list",
            "enum": [
              "",
              "ai-startups",
              "fintech",
              "devtools",
              "top-tech"
            ],
            "type": "string",
            "description": "Add a bundled list of well-known companies whose boards were checked on each vendor. ai-startups: 21 AI companies (OpenAI, Anthropic, Cohere, ElevenLabs and more). fintech: 12 fintech companies (Stripe, Ramp, Plaid, Coinbase and more). devtools: 16 developer-tool companies (Vercel, Supabase, Datadog, Cloudflare and more). top-tech: 14 large tech companies (Airbnb, Figma, Notion, Spotify and more). Combined with Companies when both are set.",
            "default": ""
          },
          "titleKeyword": {
            "title": "All of these words",
            "type": "string",
            "description": "Keep only postings whose title contains this text (case-insensitive). Applied before any description is read, so filtered-out postings cost nothing."
          },
          "keywords": {
            "title": "Any of these words",
            "type": "array",
            "description": "Keep only postings whose title contains at least one of these words or phrases (case-insensitive). They filter job content: roles, skills and technologies, e.g. engineer, designer, data. Works together with Title contains: when both are set, a posting must pass both.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "None of these words",
            "type": "array",
            "description": "Drop postings whose title contains any of these words or phrases (case-insensitive), e.g. senior, intern, manager.",
            "items": {
              "type": "string"
            }
          },
          "searchDescription": {
            "title": "Also search the description",
            "type": "boolean",
            "description": "Let Title contains any of match the posting text as well as the title, so a skill such as Python or Kubernetes finds the postings that ask for it. It is a job-content filter for skills, titles and technologies, not a search for people. On Workable this reads each posting's description first, one request per posting.",
            "default": false
          },
          "departments": {
            "title": "Department contains any of",
            "type": "array",
            "description": "Keep only postings whose department contains at least one of these words (case-insensitive), e.g. Engineering, Sales. A posting the board gives no department for is dropped.",
            "items": {
              "type": "string"
            }
          },
          "locationKeyword": {
            "title": "Location contains",
            "type": "string",
            "description": "Keep only postings whose location text, city, region, country or structured address contains this text (case-insensitive), e.g. London, Remote, US. A posting with no location is dropped."
          },
          "excludeLocationKeywords": {
            "title": "Location contains none of",
            "type": "array",
            "description": "Drop postings whose location text, city, region, country or structured address contains any of these (case-insensitive), e.g. India, Remote. A posting with no location is kept.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Keep only postings the vendor marks remote — on Greenhouse the flag is inferred from the word Remote in the location. A posting with no remote answer is dropped.",
            "default": false
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 1,
            "type": "integer",
            "description": "Keep only postings published in the last N days, by the posting date the board states. A posting with no date is dropped. Leave empty for any date."
          },
          "employmentTypes": {
            "title": "Employment type",
            "type": "array",
            "description": "Keep only postings of these employment types, read from the vendor's own wording (FullTime, Full-time and fulltime_permanent are all full time). A posting the vendor gives no type for is dropped; Greenhouse publishes none. Leave empty for every type.",
            "items": {
              "type": "string",
              "enum": [
                "full_time",
                "part_time",
                "contract",
                "intern",
                "temporary"
              ],
              "enumTitles": [
                "Full time",
                "Part time",
                "Contract",
                "Internship",
                "Temporary or fixed term"
              ]
            }
          },
          "onlyWithPay": {
            "title": "Only postings with published pay",
            "type": "boolean",
            "description": "Keep only postings that publish pay: in the vendor's pay fields, or as a range the posting text states next to a pay word. On Workable this reads each posting's description first, one request per posting.",
            "default": false
          },
          "memoryName": {
            "title": "Memory name",
            "pattern": "^[A-Za-z0-9-]{0,20}$",
            "type": "string",
            "description": "Give a schedule its own memory for Only new and Report closed postings: a short name (up to 20 letters, digits or hyphens) added to the names of both stores, e.g. weekly-sales. Leave empty to share one memory across all your runs."
          },
          "reportClosed": {
            "title": "Report closed postings",
            "type": "boolean",
            "description": "Add a free row for each posting on a board's last run that is no longer listed: status posting_closed, the posting URL in subject, and the title, department, team and location it carried. With onlyNew on, a re-opened or re-posted role shows as one closed row and one new row, so a daily run reads as the board's diff.",
            "default": false
          },
          "onlyNew": {
            "title": "Only new since my last run",
            "type": "boolean",
            "description": "Skip postings an earlier run of this Actor under your account already returned. The memory is a named key-value store in your own account (greenhouse-lever-ashby-job-seen) holding only the URLs of the postings actually returned.",
            "default": false
          },
          "includeDescription": {
            "title": "Include the full description",
            "type": "boolean",
            "description": "Workable publishes descriptions on a separate per-posting endpoint; reading it is one extra request per kept posting. Turn off for a cheaper title-and-link run on Workable. The other four vendors include the description in the board response either way.",
            "default": true
          },
          "maxItemsPerCompany": {
            "title": "Max postings per company",
            "minimum": 1,
            "type": "integer",
            "description": "Most posting rows returned for each company in the list. Each board is capped on its own, so a big board never starves the next one.",
            "default": 100
          },
          "maxItems": {
            "title": "Max postings in total",
            "minimum": 1,
            "type": "integer",
            "description": "An overall cap across the whole run, on top of the per-company cap. Leave empty for no overall cap."
          },
          "postingUrls": {
            "title": "Postings by address",
            "type": "array",
            "description": "Posting page addresses to return one row each, as listed — the list filters above do not apply to them. Paste a posting link from jobs.ashbyhq.com, boards.greenhouse.io, jobs.lever.co, apply.workable.com, a company.recruitee.com page or a company.jobs.personio.de page. An address whose board does not list the posting answers with a free posting_not_found row naming it.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "detectReposts": {
            "title": "Flag reposted postings",
            "type": "boolean",
            "description": "Mark a posting is_repost true when its title and location match an earlier posting the board memory holds under a different job id. Every row is kept; the flag is a mark, not a drop. Uses the same memory as reportClosed, so the flag only works from the second run of a board on.",
            "default": false
          },
          "structuredDescription": {
            "title": "Split description into sections",
            "type": "boolean",
            "description": "Add a sections field parsed from the posting text: responsibilities, qualifications, benefits and skills, each a string or null. A heading heuristic — employers use different headings, so a bucket the posting does not name stays null rather than being guessed. The description itself is never rewritten.",
            "default": false
          },
          "omitEmptyFields": {
            "title": "Drop empty fields",
            "type": "boolean",
            "description": "Drop the fields a row carries null — a slimmer row instead of one shape for every vendor. Off by default: every row then carries every column.",
            "default": false
          },
          "translateTo": {
            "title": "Translate description to English",
            "enum": [
              "",
              "en"
            ],
            "type": "string",
            "description": "Add an English machine translation of the posting text as translation, made inside the run by an Opus-MT model — no outside service. The posted text stays on the row unchanged. A row whose language is not detected or has no bundled model gets translation null and a translation_note saying why; translation_language names what was detected.",
            "default": ""
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}