{
  "openapi": "3.0.1",
  "info": {
    "title": "Ashby Jobs Scraper: Salary, Equity & Job Alerts",
    "description": "Scrape any company's Ashby job board through Ashby's official public API: salary, equity and bonus tiers, every location, remote/hybrid. Schedule it to get only new, updated and closed jobs. $1.50 per 1,000 jobs. Unofficial; not affiliated with Ashby.",
    "version": "0.1",
    "x-build-id": "JMvJOuesMj0CRrDgx"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tallowlanelabs~ashby-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tallowlanelabs-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/tallowlanelabs~ashby-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-tallowlanelabs-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/tallowlanelabs~ashby-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-tallowlanelabs-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": {
          "boards": {
            "title": "Company job boards",
            "type": "array",
            "description": "One entry per company. Accepts an Ashby job-board URL (jobs.ashbyhq.com/ramp), a board name (ramp) or ashby:ramp, or a company careers-page URL (the Actor loads it once and looks for an embedded Ashby board). Optional: leave empty to run a quick 5-job demo from a public example board (snapshot mode).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Output mode",
            "enum": [
              "changes",
              "snapshot"
            ],
            "type": "string",
            "description": "\"changes\" (default, monitor) returns only jobs that are new, updated or removed since the last run for each board; the first run for a board returns the full baseline. \"snapshot\" returns every current job on every run (each record still says whether it is new, updated or unchanged).",
            "default": "changes"
          },
          "changeTypes": {
            "title": "Change types to report",
            "type": "array",
            "description": "Which changes to output in \"changes\" mode.",
            "items": {
              "type": "string",
              "enum": [
                "new",
                "updated",
                "removed"
              ],
              "enumTitles": [
                "New jobs",
                "Updated jobs",
                "Removed (closed) jobs"
              ]
            },
            "default": [
              "new",
              "updated",
              "removed"
            ]
          },
          "emitBaseline": {
            "title": "Output the full board on the first run",
            "type": "boolean",
            "description": "In \"changes\" mode, the first run for a board has nothing to compare against. If on, all current jobs are output (charged as job items) with changeType \"baseline\". If off, the first run only stores the baseline silently (nothing output, nothing charged) and alerts start on the next run.",
            "default": true
          },
          "keywords": {
            "title": "Title keywords (any)",
            "type": "array",
            "description": "Only output jobs whose title contains at least one of these (case-insensitive). Leave empty for all.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Skip jobs whose title contains any of these.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations (any)",
            "type": "array",
            "description": "Only output jobs whose location, city, region or country contains one of these strings, e.g. \"New York\", \"Germany\", \"remote\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Departments / teams (any)",
            "type": "array",
            "description": "Only output jobs whose department or team contains one of these strings, e.g. \"Engineering\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "workplaceTypes": {
            "title": "Workplace types",
            "type": "array",
            "description": "Only output these workplace types. Empty = all. \"unknown\" covers postings that do not say.",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "onsite",
                "unknown"
              ]
            },
            "default": []
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Only output jobs first published within this many days (where the ATS gives a date)."
          },
          "salaryOnly": {
            "title": "Only jobs with posted pay",
            "type": "boolean",
            "description": "Only output jobs where Ashby publishes a pay range.",
            "default": false
          },
          "minSalary": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Only output jobs whose posted yearly pay range reaches at least this amount (top of the range, in the posting's own currency). Jobs without a posted range, or with an hourly or monthly range, are skipped when this is set."
          },
          "maxJobsPerBoard": {
            "title": "Max jobs output per board",
            "minimum": 1,
            "type": "integer",
            "description": "Cap the number of records output per board per run (after filters). Change detection still sees the whole board."
          },
          "includeDescriptions": {
            "title": "Include job descriptions",
            "type": "boolean",
            "description": "Include the full description. Turning this off makes runs faster and the dataset smaller.",
            "default": true
          },
          "descriptionFormats": {
            "title": "Description formats",
            "type": "array",
            "description": "Formats to include when descriptions are on.",
            "items": {
              "type": "string",
              "enum": [
                "text",
                "markdown",
                "html"
              ]
            },
            "default": [
              "text",
              "markdown"
            ]
          },
          "redactContactInfo": {
            "title": "Mask emails and phone numbers in descriptions",
            "type": "boolean",
            "description": "Some employers put a recruiter email or phone in the public job text. Turn on to replace them with [email removed] / [phone removed].",
            "default": false
          },
          "includeUnlisted": {
            "title": "Include unlisted Ashby postings",
            "type": "boolean",
            "description": "Ashby marks some postings isListed=false (meant to be reachable only by direct link). They are skipped by default.",
            "default": false
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store that keeps each board's last-seen jobs between runs. Use a different name (or a key prefix) to run independent monitors.",
            "default": "ashby-jobs-scraper-state"
          },
          "stateKeyPrefix": {
            "title": "State key prefix",
            "type": "string",
            "description": "Optional prefix so several saved tasks can monitor the same board independently.",
            "default": ""
          },
          "resetState": {
            "title": "Reset state (start a new baseline)",
            "type": "boolean",
            "description": "Ignore stored state for the boards in this run and treat it as a first run.",
            "default": false
          },
          "detectFromCareerPages": {
            "title": "Detect ATS from careers-page URLs",
            "type": "boolean",
            "description": "For URLs that are not a Ashby domain, load the page once and look for an embedded Ashby job board.",
            "default": true
          },
          "boardConcurrency": {
            "title": "Boards in parallel",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "How many boards to process at once. Request spacing still applies. Memory depends on the jobs on these boards: 512 MB (default) fits up to 3,000 live jobs across the boards processed at once (no single board over 2,000); use 1024 MB above that, or set this to 1 for very large boards.",
            "default": 3
          },
          "maxConcurrency": {
            "title": "Max parallel HTTP requests",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Global cap on in-flight requests across all ATS APIs.",
            "default": 4
          },
          "removalSafetyMinJobs": {
            "title": "Removal safety threshold",
            "minimum": 1,
            "type": "integer",
            "description": "If a board that had at least this many jobs suddenly returns zero, removals are not reported that run (it is usually an API hiccup).",
            "default": 5
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}