{
  "openapi": "3.0.1",
  "info": {
    "title": "Ashby Jobs Scraper — Company Job Boards API",
    "description": "Scrape live jobs from any company's Ashby board (jobs.ashbyhq.com). Pass a slug OR just a company website — it auto-discovers the Ashby board for you. Clean JSON: title, location, remote, salary, apply URL, plus filters, delta mode & optional BYOK AI enrichment. Ashby powers OpenAI, Ramp & Linear.",
    "version": "0.1",
    "x-build-id": "JU8HsHxdL4JXZx6CQ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nomad-agent~ashby-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nomad-agent-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/nomad-agent~ashby-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-nomad-agent-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/nomad-agent~ashby-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-nomad-agent-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": "Companies (Ashby slugs)",
            "type": "array",
            "description": "Company slugs as used on their Ashby board — the <code>&lt;slug&gt;</code> in <code>jobs.ashbyhq.com/&lt;slug&gt;</code> (full board URLs also accepted). Don't know the slug, or not sure the company even uses Ashby? Use <b>Company websites</b> below instead and let the Actor find the board for you. Provide either or both.",
            "items": {
              "type": "string"
            }
          },
          "companyDomains": {
            "title": "Company websites (auto-discover the Ashby board)",
            "type": "array",
            "description": "Plain company websites or domains (e.g. <code>ramp.com</code>, <code>https://linear.app</code>) — no need to know the Ashby slug, or even that the company runs on Ashby. The Actor probes each site + its careers page and resolves the <code>jobs.ashbyhq.com</code> board automatically, then scrapes it. A website with no Ashby board is reported as a warning row (see README), never an error — the run continues.",
            "items": {
              "type": "string"
            }
          },
          "keyword": {
            "title": "Keyword filter",
            "type": "string",
            "description": "Optional case-insensitive substring match on the job title (e.g. <code>engineer</code>)."
          },
          "titleExclude": {
            "title": "Exclude titles containing",
            "type": "array",
            "description": "Drop postings whose title contains any of these substrings (case-insensitive). Example: [<code>intern</code>, <code>staffing</code>].",
            "items": {
              "type": "string"
            }
          },
          "locationFilter": {
            "title": "Location filter",
            "type": "string",
            "description": "Optional case-insensitive substring match on the location (e.g. <code>remote</code>, <code>london</code>)."
          },
          "descriptionSearch": {
            "title": "Description contains",
            "type": "string",
            "description": "Keep only postings whose description text contains this substring (case-insensitive, e.g. <code>kubernetes</code>). The description is fetched for filtering even when <b>Include description</b> is off."
          },
          "descriptionExclude": {
            "title": "Exclude descriptions containing",
            "type": "array",
            "description": "Drop postings whose description text contains any of these substrings (case-insensitive). Example: [<code>clearance</code>, <code>on-call</code>].",
            "items": {
              "type": "string"
            }
          },
          "companySearch": {
            "title": "Company name contains",
            "type": "string",
            "description": "Keep only postings whose resolved company display name contains this substring (case-insensitive). Handy when a domain resolves to a parent org with several brands."
          },
          "postedSince": {
            "title": "Posted in the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep postings first published within this many days. Leave empty (or 0) for no date filter. When this is set, postings the source didn't give a posting date for are dropped rather than guessed at."
          },
          "postedAfter": {
            "title": "Posted on or after (date)",
            "type": "string",
            "description": "Absolute lower date bound, <code>YYYY-MM-DD</code>. Keep only postings first published on or after this date. Postings with no posting date are dropped (never guessed). Combine with <b>Posted on or before</b> for a fixed window."
          },
          "postedBefore": {
            "title": "Posted on or before (date)",
            "type": "string",
            "description": "Absolute upper date bound, <code>YYYY-MM-DD</code>. Keep only postings first published on or before this date. Postings with no posting date are dropped (never guessed)."
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Keep only postings Ashby flags isRemote=true. Postings where Ashby doesn't state isRemote at all are treated as not-remote and excluded too.",
            "default": false
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only postings whose stated pay range reaches at least this amount (compared against the top of each posting's range). Only a minority of Ashby companies disclose pay — when this is set, postings with no numeric salary are dropped (never guessed). Same currency units as the posting; no currency conversion is done."
          },
          "maxSalary": {
            "title": "Maximum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only postings whose stated pay range starts at or below this amount (compared against the bottom of each posting's range). When set, postings with no numeric salary are dropped (never guessed). Same currency units as the posting; no currency conversion is done."
          },
          "includeDescription": {
            "title": "Include description",
            "type": "boolean",
            "description": "Include a plain-text description snippet per posting. Turn off for lighter, faster output.",
            "default": true
          },
          "outputProfile": {
            "title": "Output profile",
            "enum": [
              "full",
              "compact",
              "mini"
            ],
            "type": "string",
            "description": "Shape the output payload. <code>full</code> (default) returns every field. <code>compact</code> drops the heavy <code>snippet</code> description text. <code>mini</code> drops <code>snippet</code> and the structured salary breakdown (<code>salaryMin/Max/Currency/Period</code>), keeping just the core identity/link fields plus the <code>salary</code> display text — smallest rows for high-volume runs.",
            "default": "full"
          },
          "maxItemsPerCompany": {
            "title": "Max items per company",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap postings returned per company. Each posting returned is a billed result, so this keeps one large board from dominating the run's cost. 0 = no cap.",
            "default": 100
          },
          "maxItems": {
            "title": "Max items (total)",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Hard cap on total postings returned across all companies. Each posting returned is billed as a paid result — raise this only as high as you actually need. 0 = no cap (not recommended for large company lists).",
            "default": 200
          },
          "onlyNewSinceLastRun": {
            "title": "Only new since last run",
            "type": "boolean",
            "description": "Delta/monitoring mode: only output postings not seen in a previous run that also had this flag on. Already-seen postings are dropped before push (not billed), so this is the cheapest way to run this Actor on a cron schedule and only pay for genuinely new postings. State is tracked per Actor in a dedicated key-value store, keyed by each posting's globalId. See README “Delta mode / monitoring”.",
            "default": false
          },
          "aiEnrichment": {
            "title": "AI enrichment",
            "type": "boolean",
            "description": "Adds aiKeySkills / aiExperienceLevel / aiWorkArrangement / aiVisaSponsorship to every posting via the Anthropic or Mistral API (pick which below). Requires your own API key for the provider you pick — billed separately by that provider, not by this Actor (see README “AI enrichment”). If turned on without a matching key, enrichment is skipped (with a warning) and postings are still returned normally, without the ai* fields.",
            "default": false
          },
          "aiProvider": {
            "title": "AI provider",
            "enum": [
              "anthropic",
              "mistral",
              "openai"
            ],
            "type": "string",
            "description": "Which AI provider runs enrichment (only relevant when “AI enrichment” is on). <code>anthropic</code> (default) uses Claude via anthropicApiKey. <code>mistral</code> uses a Mistral model via mistralApiKey instead — pick this if you'd rather bring a Mistral key than an Anthropic one. <code>openai</code> uses a GPT model via openaiApiKey.",
            "default": "anthropic"
          },
          "anthropicApiKey": {
            "title": "Anthropic API key",
            "type": "string",
            "description": "Your Anthropic API key (sk-ant-…). Only used when “AI enrichment” is on and aiProvider is <code>anthropic</code>; billed separately by Anthropic. Not required unless aiEnrichment is on."
          },
          "aiModel": {
            "title": "AI enrichment model (Anthropic)",
            "enum": [
              "claude-haiku-4-5-20251001",
              "claude-sonnet-4-5"
            ],
            "type": "string",
            "description": "Claude model used for AI enrichment when aiProvider is <code>anthropic</code> (only relevant when “AI enrichment” is on). Haiku is fast and inexpensive; Sonnet gives higher-quality extraction on longer, more nuanced descriptions.",
            "default": "claude-haiku-4-5-20251001"
          },
          "mistralApiKey": {
            "title": "Mistral API key",
            "type": "string",
            "description": "Your Mistral API key. Only used when “AI enrichment” is on and aiProvider is <code>mistral</code>; billed separately by Mistral. Not required unless aiEnrichment is on with aiProvider=mistral."
          },
          "mistralModel": {
            "title": "AI enrichment model (Mistral)",
            "enum": [
              "mistral-small-latest",
              "mistral-medium-latest",
              "mistral-large-latest"
            ],
            "type": "string",
            "description": "Mistral model used for AI enrichment when aiProvider is <code>mistral</code> (only relevant when “AI enrichment” is on). Small is the default — testing found it matches larger Mistral models on this extraction task (small, well-scoped fields) at a fraction of the cost.",
            "default": "mistral-small-latest"
          },
          "openaiApiKey": {
            "title": "OpenAI API key",
            "type": "string",
            "description": "Your OpenAI API key (sk-…). Only used when “AI enrichment” is on and aiProvider is <code>openai</code>; billed separately by OpenAI. Not required unless aiEnrichment is on with aiProvider=openai."
          },
          "openaiModel": {
            "title": "AI enrichment model (OpenAI)",
            "type": "string",
            "description": "OpenAI model used for AI enrichment when aiProvider is <code>openai</code> (only relevant when “AI enrichment” is on). Defaults to <code>gpt-4.1-mini</code> — cheap, fast and ample for this extraction task. Any chat-completions model works, including the gpt-5 family (e.g. <code>gpt-5.4-mini</code>).",
            "default": "gpt-4.1-mini"
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "How many companies to fetch at the same time. Higher is faster but hits the source API harder — the default is a safe, fast setting for almost every run.",
            "default": 8
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}