{
  "openapi": "3.0.1",
  "info": {
    "title": "Ashby Jobs Scraper: Salary, Equity & Correct Remote Flags",
    "description": "Scrapes job postings from any Ashby job board (jobs.ashbyhq.com) through Ashby's public API. Reads compensation correctly, including the salary ranges a naive parse silently drops. Separates genuinely remote roles from hybrid ones, and ships a verified list of live Ashby boards.",
    "version": "1.0",
    "x-build-id": "3ax9jYMbVZxa6sb9A"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/firstpartydata~ashby-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-firstpartydata-ashby-jobs-scraper",
        "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/firstpartydata~ashby-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-firstpartydata-ashby-jobs-scraper",
        "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/firstpartydata~ashby-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-firstpartydata-ashby-jobs-scraper",
        "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": "Ashby boards (URLs or company names)",
            "type": "array",
            "description": "One or more Ashby job boards. A full URL such as https://jobs.ashbyhq.com/openai works, and so does the bare board identifier (openai) or the company domain. The identifier is the last path segment of the board URL. Leave empty and switch on the built-in list below to read the bundled Ashby boards instead.",
            "items": {
              "type": "string"
            }
          },
          "useBuiltInCorpus": {
            "title": "Search the built-in company list",
            "type": "boolean",
            "description": "Read the bundled list of verified live Ashby boards instead of, or as well as, the companies above. Ordered largest first. Ashby returns a whole board in one request, so this is fast even across hundreds of them.",
            "default": false
          },
          "corpusSample": {
            "title": "How many boards from the built-in list",
            "minimum": 0,
            "type": "integer",
            "description": "How many bundled Ashby boards to read, largest first. Because boards are size-ordered, a few hundred already covers most postings in the list. 0 means every board.",
            "default": 300
          },
          "withSalaryOnly": {
            "title": "Only jobs with published pay",
            "type": "boolean",
            "description": "Keep only postings with a real compensation range. Ashby is unusually generous here: 38.4% of postings across a 19,267-posting sample publish one, far more than any other applicant tracking system. This actor reads the pay component correctly rather than taking the first one, which alone recovers 30% of the ranges on offer.",
            "default": false
          },
          "offersEquityOnly": {
            "title": "Only jobs advertising equity",
            "type": "boolean",
            "description": "Keep only postings with an equity component. Ashby publishes equity as a separate compensation line carrying no numbers; 24.1% of postings across a 19,267-posting sample had one. Useful for startup compensation research.",
            "default": false
          },
          "workplaceTypes": {
            "title": "Work arrangement",
            "type": "array",
            "description": "Keep only postings matching Ashby's own workplaceType, the field that is actually correct. Choose Hybrid on its own if that is what you want, which a remote/not-remote boolean cannot express. Postings where the employer left it unset (about 16%) are excluded rather than guessed at.",
            "items": {
              "type": "string",
              "enum": [
                "Remote",
                "Hybrid",
                "OnSite"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On-site"
              ]
            },
            "default": []
          },
          "remoteOnly": {
            "title": "Remote roles only",
            "type": "boolean",
            "description": "A shortcut for work arrangement = Remote. Note this is genuinely remote: Ashby's raw isRemote field is true for hybrid roles too and overstates remote work by 2.1x, so this filter deliberately disagrees with it.",
            "default": false
          },
          "titleInclude": {
            "title": "Job title must contain",
            "type": "array",
            "description": "Keep only postings whose title contains one of these, case-insensitively. Example: engineer, designer.",
            "items": {
              "type": "string"
            }
          },
          "titleExclude": {
            "title": "Job title must NOT contain",
            "type": "array",
            "description": "Drop postings whose title contains any of these. Example: intern, staff, director.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords in title or description",
            "type": "array",
            "description": "Keep only postings containing one of these anywhere in the title or description. Ashby returns full descriptions with every posting at no extra cost, so this is cheap here. Example: kubernetes, rust.",
            "items": {
              "type": "string"
            }
          },
          "keywordsMatchAll": {
            "title": "Require every keyword",
            "type": "boolean",
            "description": "When on, a posting must contain all of the keywords rather than any one of them.",
            "default": false
          },
          "location": {
            "title": "Location contains",
            "type": "array",
            "description": "Keep only postings whose location contains one of these. Ashby postings can carry several locations and all of them are matched, not just the primary. Example: Berlin, Remote - US.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Country",
            "type": "array",
            "description": "Keep only postings in these countries. Ashby publishes a structured address on almost every posting, so this is exact rather than a string match against the location text. Accepts an ISO code or a name: DE and Germany both work.",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "0 disables the filter. Ashby publishes a real publication timestamp on every posting, so this filter is reliable here, unlike on systems that only give a relative date.",
            "default": 0
          },
          "includeDescriptions": {
            "title": "Include full job descriptions",
            "type": "boolean",
            "description": "Return the description as both HTML and plain text. Ashby includes it in the same response, so turning this off saves payload size but not time. Leave it on unless you are building a listings table.",
            "default": true
          },
          "onlyNewOrChanged": {
            "title": "Only new or changed jobs (incremental)",
            "type": "boolean",
            "description": "Return only postings that are new or that have changed since the last run with the same settings: a changed title, pay range or work arrangement. Unchanged rows are skipped and not billed. The first run establishes the baseline and returns everything.",
            "default": false
          },
          "stateKey": {
            "title": "Incremental state name",
            "type": "string",
            "description": "Names the history incremental mode reads and writes. Leave blank and one is derived from your settings, so two differently-filtered feeds never contaminate each other.",
            "default": ""
          },
          "maxItems": {
            "title": "Maximum jobs to return",
            "minimum": 0,
            "type": "integer",
            "description": "Hard ceiling on results, so an over-broad filter cannot produce a surprise bill. 0 means no limit.",
            "default": 1000
          },
          "maxPerCompany": {
            "title": "Maximum jobs from any one job board",
            "minimum": 0,
            "type": "integer",
            "description": "Stops a single large board filling the whole result. Leave at 0 and a market-wide run with a ceiling spreads it over at least 40 boards on its own: without that, the bare default returned 1,000 rows from one or two companies, because one Greenhouse board arrives in a single page and takes the whole ceiling. Counted per board, not per employer, so a company that runs two boards can return twice this. It is never applied when you name companies yourself, or when \"maxItems\" is 0.",
            "default": 0
          },
          "concurrency": {
            "title": "Parallel boards",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many Ashby boards to read at once. Ashby is fast and tolerant, so the default is higher than for other systems.",
            "default": 25
          },
          "atsPlatforms": {
            "title": "ATS platform",
            "type": "array",
            "description": "Fixed to Ashby for this Actor.",
            "items": {
              "type": "string",
              "enum": [
                "ashby"
              ],
              "enumTitles": [
                "Ashby"
              ]
            },
            "default": [
              "ashby"
            ]
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}