{
  "data": {
    "id": "yzfUD4dKeKLHXPa89",
    "actId": "uLc5okVRk3hoaiEtP",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-04T09:49:47.316Z",
    "finishedAt": "2026-11-04T09:49:55.871Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 8488,
      "runTimeSecs": 8.488,
      "computeUnits": 0.00943111111111111,
      "imageSizeBytes": 319029760
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Ashby Job Board Scraper Input\",\n  \"description\": \"List jobs across Ashby job boards, fetch specific job postings by URL or ID, or summarize a company's board.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to collect. `byOrg` lists jobs from one or more companies; `jobDetail` fetches specific postings by URL or ID; `boardSummary` returns one departments/locations/compensation summary per company. The legacy values are kept so saved tasks continue to run.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"byOrg\",\n        \"jobDetail\",\n        \"boardSummary\",\n        \"companies\",\n        \"job\",\n        \"detail\",\n        \"summary\"\n      ],\n      \"enumTitles\": [\n        \"List jobs across companies\",\n        \"Fetch specific jobs by URL or ID\",\n        \"Summarize company job boards\",\n        \"Legacy: companies (same as list jobs)\",\n        \"Legacy: job (same as fetch jobs)\",\n        \"Legacy: detail (same as fetch jobs)\",\n        \"Legacy: summary (same as board summary)\"\n      ],\n      \"default\": \"byOrg\",\n      \"prefill\": \"byOrg\"\n    },\n    \"orgSlugs\": {\n      \"title\": \"Companies (mode=byOrg, boardSummary)\",\n      \"type\": \"array\",\n      \"description\": \"Ashby board slugs, company names, or board URLs. Examples: `Ramp`, `Neko Health`, `https://jobs.ashbyhq.com/Ramp`. Names are matched to the closest live board automatically.\",\n      \"editor\": \"stringList\",\n      \"default\": [\n        \"Ramp\"\n      ],\n      \"prefill\": [\n        \"Ramp\"\n      ]\n    },\n    \"jobUrls\": {\n      \"title\": \"Job URLs (mode=jobDetail)\",\n      \"type\": \"array\",\n      \"description\": \"Public Ashby job posting URLs, e.g. `https://jobs.ashbyhq.com/Ramp/<job-id>`. The `/application` suffix and query strings are accepted.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"orgSlug\": {\n      \"title\": \"Company slug (mode=jobDetail)\",\n      \"type\": \"string\",\n      \"description\": \"Used with `jobId` when you do not have a full job URL. Example: `Ramp`.\",\n      \"editor\": \"textfield\"\n    },\n    \"jobId\": {\n      \"title\": \"Job ID (mode=jobDetail)\",\n      \"type\": \"string\",\n      \"description\": \"The Ashby posting UUID or a full job URL. Used alone or with `orgSlug`.\",\n      \"editor\": \"textfield\"\n    },\n    \"searchQuery\": {\n      \"title\": \"Search text (mode=byOrg, boardSummary)\",\n      \"type\": \"string\",\n      \"description\": \"Case-insensitive text match over title, department, team, location, and description. Descriptions are searched even when `includeDescriptionPlain` is off and in `boardSummary` mode. Examples: `engineer`, `payments`, `München`.\",\n      \"editor\": \"textfield\"\n    },\n    \"department\": {\n      \"title\": \"Department or team (mode=byOrg, boardSummary)\",\n      \"type\": \"string\",\n      \"description\": \"Case-insensitive text match over department and team. Examples: `Engineering`, `Sales`, `Design`.\",\n      \"editor\": \"textfield\"\n    },\n    \"location\": {\n      \"title\": \"Location (mode=byOrg, boardSummary)\",\n      \"type\": \"string\",\n      \"description\": \"Case-insensitive text match over the primary location, secondary locations, city, region, and country. Examples: `New York`, `Remote`, `London`.\",\n      \"editor\": \"textfield\"\n    },\n    \"workplaceType\": {\n      \"title\": \"Workplace type (mode=byOrg, boardSummary)\",\n      \"type\": \"string\",\n      \"description\": \"Keep only fully remote, hybrid, or on-site jobs. Unlike `isRemoteOnly`, this separates Remote from Hybrid. Jobs with no workplace type are excluded when a specific value is chosen.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"Remote\",\n        \"Hybrid\",\n        \"OnSite\"\n      ],\n      \"enumTitles\": [\n        \"Any workplace type\",\n        \"Fully remote\",\n        \"Hybrid\",\n        \"On-site\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"employmentType\": {\n      \"title\": \"Employment type (mode=byOrg, boardSummary)\",\n      \"type\": \"string\",\n      \"description\": \"Keep only one employment type.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"FullTime\",\n        \"PartTime\",\n        \"Contract\",\n        \"Intern\",\n        \"Temporary\"\n      ],\n      \"enumTitles\": [\n        \"Any employment type\",\n        \"Full time\",\n        \"Part time\",\n        \"Contract\",\n        \"Internship\",\n        \"Temporary\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"isRemoteOnly\": {\n      \"title\": \"Remote-friendly only (mode=byOrg, boardSummary)\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep jobs the board marks as remote. Ashby sets this for both Remote and Hybrid roles; use `workplaceType=Remote` for fully remote jobs.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"publishedAfter\": {\n      \"title\": \"Published after (mode=byOrg, boardSummary)\",\n      \"type\": \"string\",\n      \"description\": \"Only jobs published on or after this date. Accepts `YYYY-MM-DD`, an ISO datetime, or a relative window such as `24h`, `7d`, or `2w`.\",\n      \"editor\": \"textfield\"\n    },\n    \"publishedBefore\": {\n      \"title\": \"Published before (mode=byOrg, boardSummary)\",\n      \"type\": \"string\",\n      \"description\": \"Only jobs published on or before this date. Accepts `YYYY-MM-DD`, an ISO datetime, or a relative window.\",\n      \"editor\": \"textfield\"\n    },\n    \"minAnnualSalary\": {\n      \"title\": \"Minimum annual salary (mode=byOrg, boardSummary)\",\n      \"type\": \"integer\",\n      \"description\": \"Keep jobs whose published annual salary range overlaps this minimum. Hourly, monthly, and weekly ranges are annualized. Jobs with no published salary are kept unless `hasSalaryOnly` is on.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"maxAnnualSalary\": {\n      \"title\": \"Maximum annual salary (mode=byOrg, boardSummary)\",\n      \"type\": \"integer\",\n      \"description\": \"Keep jobs whose published annual salary range overlaps this maximum. Use with `minAnnualSalary` for a range.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"salaryCurrency\": {\n      \"title\": \"Salary currency (mode=byOrg, boardSummary)\",\n      \"type\": \"string\",\n      \"description\": \"Only compare salaries in this currency. `any` compares the numeric range as published (currencies are not converted).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"USD\",\n        \"EUR\",\n        \"GBP\",\n        \"CAD\",\n        \"AUD\",\n        \"SGD\",\n        \"PLN\",\n        \"SEK\",\n        \"CNY\",\n        \"MXN\",\n        \"KRW\",\n        \"BRL\",\n        \"SAR\",\n        \"DKK\",\n        \"ALL\",\n        \"INR\",\n        \"JPY\",\n        \"CHF\",\n        \"NZD\",\n        \"ZAR\",\n        \"AED\",\n        \"NOK\",\n        \"HKD\",\n        \"ILS\",\n        \"TRY\",\n        \"CZK\",\n        \"HUF\",\n        \"RON\",\n        \"UAH\"\n      ],\n      \"enumTitles\": [\n        \"Any currency\",\n        \"US dollar\",\n        \"Euro\",\n        \"British pound\",\n        \"Canadian dollar\",\n        \"Australian dollar\",\n        \"Singapore dollar\",\n        \"Polish zloty\",\n        \"Swedish krona\",\n        \"Chinese yuan\",\n        \"Mexican peso\",\n        \"South Korean won\",\n        \"Brazilian real\",\n        \"Saudi riyal\",\n        \"Danish krone\",\n        \"Albanian lek\",\n        \"Indian rupee\",\n        \"Japanese yen\",\n        \"Swiss franc\",\n        \"New Zealand dollar\",\n        \"South African rand\",\n        \"UAE dirham\",\n        \"Norwegian krone\",\n        \"Hong Kong dollar\",\n        \"Israeli shekel\",\n        \"Turkish lira\",\n        \"Czech koruna\",\n        \"Hungarian forint\",\n        \"Romanian leu\",\n        \"Ukrainian hryvnia\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"hasSalaryOnly\": {\n      \"title\": \"Only jobs with a published salary (mode=byOrg, boardSummary)\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop jobs where the employer did not publish a salary range.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"sortBy\": {\n      \"title\": \"Sort results (mode=byOrg)\",\n      \"type\": \"string\",\n      \"description\": \"Order of the returned job records. `default` keeps the board's own order.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"default\",\n        \"newest\",\n        \"oldest\",\n        \"title\"\n      ],\n      \"enumTitles\": [\n        \"Board order\",\n        \"Newest first\",\n        \"Oldest first\",\n        \"Title A-Z\"\n      ],\n      \"default\": \"default\",\n      \"prefill\": \"default\"\n    },\n    \"includeUnlisted\": {\n      \"title\": \"Include unlisted jobs\",\n      \"type\": \"boolean\",\n      \"description\": \"Include jobs marked `isListed:false` (direct-link-only postings that are not shown on the public board). Applies to every mode: `jobDetail` returns a `job_not_listed` error for an unlisted job unless this is on. Off by default.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeCompanyInfo\": {\n      \"title\": \"Include company name and logo\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch each company's public board page once for its display name, logo, and timezone. Adds one request per company. Off in the daily test prefill.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"includeDetails\": {\n      \"title\": \"Include job-page details (mode=byOrg, jobDetail)\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch each returned job's public page for all team names, confidentiality, compensation philosophy, direct-apply flag, and remote-eligible countries. Adds one request per job; slower on large runs.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeDescriptionPlain\": {\n      \"title\": \"Include plain-text description (mode=byOrg, jobDetail)\",\n      \"type\": \"boolean\",\n      \"description\": \"Add `descriptionPlain` to each job. On by default; turn it off for compact metadata-only rows.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"includeDescriptionHtml\": {\n      \"title\": \"Include HTML description (mode=byOrg, jobDetail)\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the original `descriptionHtml` to each job. Increases dataset size.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxItemsPerOrg\": {\n      \"title\": \"Max jobs per company (mode=byOrg)\",\n      \"type\": \"integer\",\n      \"description\": \"Cap the number of job records from each company after filters. `0` means no per-company cap.\",\n      \"minimum\": 0,\n      \"maximum\": 5000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"maxItems\": {\n      \"title\": \"Max records\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on the number of job records (or company summaries) pushed to the dataset. Error records for invalid inputs are additional diagnostics and do not count.\",\n      \"minimum\": 1,\n      \"maximum\": 5000,\n      \"default\": 100,\n      \"prefill\": 1\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Ashby Job Board Compensation & Openings Scraper\n\nScrape public **Ashby job boards** for any company hiring on `jobs.ashbyhq.com`. Get every open role with its department, team, structured location, remote or hybrid type, the employer's own salary range, full description, and apply link. Filter by keyword, workplace type, employment type, publish date, or pay. **No login, no API key, no proxy.**\n\nAshby powers the careers pages of thousands of modern companies. This actor reads the same public job-board data those pages use, so every run reflects the employer's current postings rather than an old index.\n\n## What this actor does\n\n- **Three modes:** `byOrg` lists jobs across companies, `jobDetail` fetches specific postings by URL or ID, and `boardSummary` returns one company-level overview.\n- **Accepts what you have:** board slugs (`Ramp`), company names (`Neko Health`), board URLs, or full job URLs.\n- **Structured pay:** numeric salary minimum and maximum, currency, pay period, annualized values, equity percentage, and bonus/commission flags, plus the original human-readable summaries.\n- **Precise remote data:** separates fully remote from hybrid, keeps secondary locations with their city/region/country, and can add remote-eligible countries.\n- **Useful filters:** keyword, department/team, location, workplace type, employment type, publish date or relative window (`24h`, `7d`, `2w`), annual salary range, salary currency, and salary-only.\n- **Company and job detail:** optional company name/logo/timezone, all team names, confidentiality flag, compensation philosophy, and direct-apply flag.\n- **Clean output:** empty fields are omitted; there are no `null`, blank, or placeholder values.\n\n## Modes\n\n| Mode | What it returns | Typical use |\n|---|---|---|\n| `byOrg` | One record per job across the companies you name | Job feeds, recruiting intelligence, compensation research |\n| `jobDetail` | The exact postings you point at, by public URL or ID | Refresh a saved job, verify a posting, build a watchlist |\n| `boardSummary` | One record per company with job counts and department, team, location, workplace, and pay breakdowns | Compare hiring across companies without downloading every description |\n\n## Output per job\n\n- `id` — Ashby posting UUID\n- `title`\n- `department`, `team`\n- `employmentType` — `FullTime`, `PartTime`, `Contract`, `Intern`, or `Temporary`\n- `location` — primary location label\n- `locationCity`, `locationRegion`, `locationCountry` — structured primary address when published\n- `isRemote` — the employer's remote flag; true for both Remote and Hybrid\n- `workplaceType` — `Remote`, `Hybrid`, or `OnSite`\n- `secondaryLocations[]` — additional location labels\n- `secondaryLocationDetails[]` — each secondary location with its city, region, and country\n- `isListed` — false for direct-link-only postings\n- `publishedAt` — ISO timestamp\n- `jobUrl`, `applyUrl`, `sourceUrl`\n- `compensationSummary` — the employer's own pay summary, e.g. `$147K – $262K • Offers Equity`\n- `salarySummary` — the employer's salary-only summary, e.g. `$147K – $262K`\n- `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval` — numeric salary range as published\n- `annualSalaryMin`, `annualSalaryMax` — the same range annualized (hourly, weekly, monthly, yearly)\n- `hasSalary`, `hasEquity`, `hasBonus`, `hasCommission` — pay-component flags\n- `equityPercentMin`, `equityPercentMax` — equity percentage range when published\n- `compensationTiers[]` — every published tier with its title, summary, notes, and components\n- `compensationComponents[]` — the flattened salary/equity/bonus/commission components\n- `descriptionPlain` — full plain-text description\n- `descriptionHtml` — full HTML description when enabled\n- `organization` — the company's Ashby board slug\n- `organizationName`, `organizationLogoUrl`, `organizationTimezone` — optional company metadata\n- `teamNames[]` — all team names when job-page details are enabled\n- `isConfidential`, `compensationPhilosophyHtml`, `remoteEligibleCountries[]`, `directApply` — optional job-page details\n- `recordType: \"job\"`, `scrapedAt`\n\n## Output per company summary\n\n`boardSummary` mode returns one record per company:\n\n- `organization`, `organizationName`, `organizationLogoUrl`, `organizationTimezone`, `sourceUrl`\n- `jobsOnBoard` — public jobs on the board before filters\n- `jobsMatched` — jobs after the filters you set\n- `departments[]`, `teams[]`, `locations[]` — up to 50 values each, with counts\n- `workplaceTypes`, `employmentTypes` — counts by value, including `Unknown` where the board omits it\n- `jobsWithCompensation`, `jobsWithSalary` — pay coverage\n- `salaryCurrencies[]`\n- `publishedAtMin`, `publishedAtMax`\n- `recordType: \"boardSummary\"`, `scrapedAt`\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `byOrg` | `byOrg` / `jobDetail` / `boardSummary` |\n| `orgSlugs` | array | `[\"Ramp\"]` | Slugs, company names, or board URLs (mode=byOrg, boardSummary) |\n| `jobUrls` | array | `[]` | Public job URLs (mode=jobDetail) |\n| `orgSlug` | string | – | Company slug for `orgSlug` + `jobId` lookups (mode=jobDetail) |\n| `jobId` | string | – | Posting UUID or full job URL (mode=jobDetail) |\n| `searchQuery` | string | – | Text match over title, department, team, location, description (descriptions are searched even when their output is off and in `boardSummary`) |\n| `department` | string | – | Text match over department and team |\n| `location` | string | – | Text match over primary/secondary location and address |\n| `workplaceType` | string | `any` | `any` / `Remote` / `Hybrid` / `OnSite` |\n| `employmentType` | string | `any` | `any` / `FullTime` / `PartTime` / `Contract` / `Intern` / `Temporary` |\n| `isRemoteOnly` | bool | `false` | Remote-friendly jobs (Remote and Hybrid) |\n| `publishedAfter` | string | – | ISO date/datetime or `24h` / `7d` / `2w` |\n| `publishedBefore` | string | – | ISO date/datetime or relative window |\n| `minAnnualSalary` | int | – | Minimum annualized salary (0–10,000,000) |\n| `maxAnnualSalary` | int | – | Maximum annualized salary (0–10,000,000) |\n| `salaryCurrency` | string | `any` | Compare salaries in one currency |\n| `hasSalaryOnly` | bool | `false` | Drop jobs without a published salary |\n| `sortBy` | string | `default` | `default` / `newest` / `oldest` / `title` |\n| `includeUnlisted` | bool | `false` | Include direct-link-only jobs in every mode; `jobDetail` returns `job_not_listed` unless enabled |\n| `includeCompanyInfo` | bool | `true` | Add company name, logo, timezone |\n| `includeDetails` | bool | `false` | Add all team names, confidentiality, compensation philosophy, remote-eligible countries, direct-apply |\n| `includeDescriptionPlain` | bool | `true` | Include the plain-text description |\n| `includeDescriptionHtml` | bool | `false` | Include the HTML description |\n| `maxItemsPerOrg` | int | `0` | Per-company cap after filters (0 = no cap) |\n| `maxItems` | int | `100` | Cap on job/summary records (1–5000); error diagnostics are extra |\n\n### Example: every open role at one company\n\n```json\n{\n  \"mode\": \"byOrg\",\n  \"orgSlugs\": [\"Ramp\"],\n  \"maxItems\": 500\n}\n```\n\n### Example: engineering roles across several companies\n\n```json\n{\n  \"mode\": \"byOrg\",\n  \"orgSlugs\": [\"Ramp\", \"Notion\", \"Linear\"],\n  \"department\": \"Engineering\",\n  \"includeCompanyInfo\": true,\n  \"maxItems\": 200\n}\n```\n\n### Example: fully remote roles published in the last two weeks\n\n```json\n{\n  \"mode\": \"byOrg\",\n  \"orgSlugs\": [\"Notion\", \"Linear\", \"Supabase\"],\n  \"workplaceType\": \"Remote\",\n  \"publishedAfter\": \"2w\",\n  \"hasSalaryOnly\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: well-paid product roles in US dollars\n\n```json\n{\n  \"mode\": \"byOrg\",\n  \"orgSlugs\": [\"Ramp\", \"Plaid\", \"Cohere\"],\n  \"searchQuery\": \"product\",\n  \"minAnnualSalary\": 150000,\n  \"salaryCurrency\": \"USD\",\n  \"sortBy\": \"newest\",\n  \"maxItems\": 50\n}\n```\n\n### Example: specific postings by URL\n\n```json\n{\n  \"mode\": \"jobDetail\",\n  \"jobUrls\": [\n    \"https://jobs.ashbyhq.com/Ramp/09a9381c-677b-40a5-9ff1-027bd4302c13\",\n    \"https://jobs.ashbyhq.com/Linear/453f1ba0-a35e-4ed2-8215-1514e0a30b92\"\n  ],\n  \"includeDetails\": true\n}\n```\n\n### Example: compare hiring across companies\n\n```json\n{\n  \"mode\": \"boardSummary\",\n  \"orgSlugs\": [\"Ramp\", \"Notion\", \"Linear\", \"Harvey\"]\n}\n```\n\n## Use cases\n\n- **Job boards and aggregators** — keep a live feed of openings from every Ashby-powered company you track.\n- **Recruiting and sourcing** — find engineering, design, sales, or operations roles by team, location, and workplace type.\n- **Compensation benchmarking** — collect the employer's own salary ranges as numbers, with currency and pay period.\n- **Remote-work feeds** — build a daily feed of fully remote roles with remote-eligible countries.\n- **Hiring intelligence** — compare departments, teams, locations, and pay coverage across competitors.\n- **Market research** — track which companies are hiring and where over time.\n\n## FAQ\n\n**What is Ashby?** Ashby is an applicant-tracking and recruiting platform. Many companies host their public careers page at `jobs.ashbyhq.com/{company}`. This actor reads the public job-board data behind those pages.\n\n**How do I find a company's slug?** It is the path segment in the board URL. For `https://jobs.ashbyhq.com/Ramp`, the slug is `Ramp`. You can also paste the board URL or the company name, and the actor matches it to the closest live board.\n\n**Do I need an API key, login, or proxy?** No. The Ashby job-board endpoint is public. No credentials, cookies, or proxy setup are needed.\n\n**Why is `isRemote` true for a hybrid job?** Ashby's remote flag means \"remote-friendly\", not \"fully remote\". Use `workplaceType: \"Remote\"` for fully remote roles and `workplaceType: \"Hybrid\"` for hybrid roles.\n\n**Why do some jobs have no salary?** Companies choose whether to publish compensation. When they do not, the salary fields are omitted. This actor never guesses or fabricates a range.\n\n**What do `salaryMin` and `salaryMax` mean when a job has several pay tiers?** They are the lowest and highest values across every published salary component, so a multi-location or multi-level posting reports its full range. `compensationTiers` keeps the individual tiers.\n\n**What is the difference between `salaryMin` and `annualSalaryMin`?** `salaryMin` is the number exactly as published, with `salaryInterval` telling you whether it is yearly, monthly, weekly, or hourly. `annualSalaryMin` converts it to a yearly figure so you can compare roles with different pay periods.\n\n**Why are unlisted jobs missing?** Ashby can return jobs marked `isListed:false`, which are reachable by direct link but are not shown on the public board. They are excluded by default in `byOrg`, `boardSummary`, and `jobDetail`. Set `includeUnlisted: true` to include them; a `jobDetail` lookup for an unlisted job otherwise emits a `job_not_listed` error with the fix in its message.\n\n**Can I get only new postings?** Yes. Set `publishedAfter` to `24h`, `7d`, `2w`, or an ISO date. No saved state is needed between runs.\n\n**Why does the run finish with fewer records than the board has?** `maxItems` is a hard cap and filters run first. Ashby returns a company's whole board at once, so a large board is downloaded even when you save fewer records. Raise `maxItems` or narrow the filters to control the result size.\n\n**Are company websites included?** No. Company names, logos, and timezones are included, but website links are omitted because some employers block automated access to them.\n\n**Is this affiliated with Ashby?** No. This is a third-party actor that reads Ashby's public job-board data.\n\n## Limitations\n\n- Ashby does not publish a directory of every company on its platform. You need a board slug, board URL, job URL, or a company name that resolves to a live board.\n- Salary ranges are shown only when the employer publishes them; equity and bonus details follow the same rule.\n- Currencies are not converted. Use `salaryCurrency` to compare one currency at a time.\n- A board larger than 5,000 jobs would be truncated by the `maxItems` ceiling.\n- Markdown descriptions, seniority scores, and LinkedIn or AI enrichment are not produced. Descriptions are available as plain text and HTML.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "ashby-job-board-compensation-and-openings-scraper",
      "title": "Ashby Job Board Compensation & Openings Scraper",
      "description": "Scrape Ashby job boards for any company on jobs.ashbyhq.com. Get openings with salary ranges, departments, locations, remote/hybrid type, descriptions, and apply links. Filter by keyword, workplace, date, or pay. No login or API key.",
      "version": "1.0",
      "buildTag": "latest",
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 1024,
      "dockerfile": "./Dockerfile",
      "readme": "# Ashby Job Board Compensation & Openings Scraper\n\nScrape public **Ashby job boards** for any company hiring on `jobs.ashbyhq.com`. Get every open role with its department, team, structured location, remote or hybrid type, the employer's own salary range, full description, and apply link. Filter by keyword, workplace type, employment type, publish date, or pay. **No login, no API key, no proxy.**\n\nAshby powers the careers pages of thousands of modern companies. This actor reads the same public job-board data those pages use, so every run reflects the employer's current postings rather than an old index.\n\n## What this actor does\n\n- **Three modes:** `byOrg` lists jobs across companies, `jobDetail` fetches specific postings by URL or ID, and `boardSummary` returns one company-level overview.\n- **Accepts what you have:** board slugs (`Ramp`), company names (`Neko Health`), board URLs, or full job URLs.\n- **Structured pay:** numeric salary minimum and maximum, currency, pay period, annualized values, equity percentage, and bonus/commission flags, plus the original human-readable summaries.\n- **Precise remote data:** separates fully remote from hybrid, keeps secondary locations with their city/region/country, and can add remote-eligible countries.\n- **Useful filters:** keyword, department/team, location, workplace type, employment type, publish date or relative window (`24h`, `7d`, `2w`), annual salary range, salary currency, and salary-only.\n- **Company and job detail:** optional company name/logo/timezone, all team names, confidentiality flag, compensation philosophy, and direct-apply flag.\n- **Clean output:** empty fields are omitted; there are no `null`, blank, or placeholder values.\n\n## Modes\n\n| Mode | What it returns | Typical use |\n|---|---|---|\n| `byOrg` | One record per job across the companies you name | Job feeds, recruiting intelligence, compensation research |\n| `jobDetail` | The exact postings you point at, by public URL or ID | Refresh a saved job, verify a posting, build a watchlist |\n| `boardSummary` | One record per company with job counts and department, team, location, workplace, and pay breakdowns | Compare hiring across companies without downloading every description |\n\n## Output per job\n\n- `id` — Ashby posting UUID\n- `title`\n- `department`, `team`\n- `employmentType` — `FullTime`, `PartTime`, `Contract`, `Intern`, or `Temporary`\n- `location` — primary location label\n- `locationCity`, `locationRegion`, `locationCountry` — structured primary address when published\n- `isRemote` — the employer's remote flag; true for both Remote and Hybrid\n- `workplaceType` — `Remote`, `Hybrid`, or `OnSite`\n- `secondaryLocations[]` — additional location labels\n- `secondaryLocationDetails[]` — each secondary location with its city, region, and country\n- `isListed` — false for direct-link-only postings\n- `publishedAt` — ISO timestamp\n- `jobUrl`, `applyUrl`, `sourceUrl`\n- `compensationSummary` — the employer's own pay summary, e.g. `$147K – $262K • Offers Equity`\n- `salarySummary` — the employer's salary-only summary, e.g. `$147K – $262K`\n- `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval` — numeric salary range as published\n- `annualSalaryMin`, `annualSalaryMax` — the same range annualized (hourly, weekly, monthly, yearly)\n- `hasSalary`, `hasEquity`, `hasBonus`, `hasCommission` — pay-component flags\n- `equityPercentMin`, `equityPercentMax` — equity percentage range when published\n- `compensationTiers[]` — every published tier with its title, summary, notes, and components\n- `compensationComponents[]` — the flattened salary/equity/bonus/commission components\n- `descriptionPlain` — full plain-text description\n- `descriptionHtml` — full HTML description when enabled\n- `organization` — the company's Ashby board slug\n- `organizationName`, `organizationLogoUrl`, `organizationTimezone` — optional company metadata\n- `teamNames[]` — all team names when job-page details are enabled\n- `isConfidential`, `compensationPhilosophyHtml`, `remoteEligibleCountries[]`, `directApply` — optional job-page details\n- `recordType: \"job\"`, `scrapedAt`\n\n## Output per company summary\n\n`boardSummary` mode returns one record per company:\n\n- `organization`, `organizationName`, `organizationLogoUrl`, `organizationTimezone`, `sourceUrl`\n- `jobsOnBoard` — public jobs on the board before filters\n- `jobsMatched` — jobs after the filters you set\n- `departments[]`, `teams[]`, `locations[]` — up to 50 values each, with counts\n- `workplaceTypes`, `employmentTypes` — counts by value, including `Unknown` where the board omits it\n- `jobsWithCompensation`, `jobsWithSalary` — pay coverage\n- `salaryCurrencies[]`\n- `publishedAtMin`, `publishedAtMax`\n- `recordType: \"boardSummary\"`, `scrapedAt`\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `byOrg` | `byOrg` / `jobDetail` / `boardSummary` |\n| `orgSlugs` | array | `[\"Ramp\"]` | Slugs, company names, or board URLs (mode=byOrg, boardSummary) |\n| `jobUrls` | array | `[]` | Public job URLs (mode=jobDetail) |\n| `orgSlug` | string | – | Company slug for `orgSlug` + `jobId` lookups (mode=jobDetail) |\n| `jobId` | string | – | Posting UUID or full job URL (mode=jobDetail) |\n| `searchQuery` | string | – | Text match over title, department, team, location, description (descriptions are searched even when their output is off and in `boardSummary`) |\n| `department` | string | – | Text match over department and team |\n| `location` | string | – | Text match over primary/secondary location and address |\n| `workplaceType` | string | `any` | `any` / `Remote` / `Hybrid` / `OnSite` |\n| `employmentType` | string | `any` | `any` / `FullTime` / `PartTime` / `Contract` / `Intern` / `Temporary` |\n| `isRemoteOnly` | bool | `false` | Remote-friendly jobs (Remote and Hybrid) |\n| `publishedAfter` | string | – | ISO date/datetime or `24h` / `7d` / `2w` |\n| `publishedBefore` | string | – | ISO date/datetime or relative window |\n| `minAnnualSalary` | int | – | Minimum annualized salary (0–10,000,000) |\n| `maxAnnualSalary` | int | – | Maximum annualized salary (0–10,000,000) |\n| `salaryCurrency` | string | `any` | Compare salaries in one currency |\n| `hasSalaryOnly` | bool | `false` | Drop jobs without a published salary |\n| `sortBy` | string | `default` | `default` / `newest` / `oldest` / `title` |\n| `includeUnlisted` | bool | `false` | Include direct-link-only jobs in every mode; `jobDetail` returns `job_not_listed` unless enabled |\n| `includeCompanyInfo` | bool | `true` | Add company name, logo, timezone |\n| `includeDetails` | bool | `false` | Add all team names, confidentiality, compensation philosophy, remote-eligible countries, direct-apply |\n| `includeDescriptionPlain` | bool | `true` | Include the plain-text description |\n| `includeDescriptionHtml` | bool | `false` | Include the HTML description |\n| `maxItemsPerOrg` | int | `0` | Per-company cap after filters (0 = no cap) |\n| `maxItems` | int | `100` | Cap on job/summary records (1–5000); error diagnostics are extra |\n\n### Example: every open role at one company\n\n```json\n{\n  \"mode\": \"byOrg\",\n  \"orgSlugs\": [\"Ramp\"],\n  \"maxItems\": 500\n}\n```\n\n### Example: engineering roles across several companies\n\n```json\n{\n  \"mode\": \"byOrg\",\n  \"orgSlugs\": [\"Ramp\", \"Notion\", \"Linear\"],\n  \"department\": \"Engineering\",\n  \"includeCompanyInfo\": true,\n  \"maxItems\": 200\n}\n```\n\n### Example: fully remote roles published in the last two weeks\n\n```json\n{\n  \"mode\": \"byOrg\",\n  \"orgSlugs\": [\"Notion\", \"Linear\", \"Supabase\"],\n  \"workplaceType\": \"Remote\",\n  \"publishedAfter\": \"2w\",\n  \"hasSalaryOnly\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: well-paid product roles in US dollars\n\n```json\n{\n  \"mode\": \"byOrg\",\n  \"orgSlugs\": [\"Ramp\", \"Plaid\", \"Cohere\"],\n  \"searchQuery\": \"product\",\n  \"minAnnualSalary\": 150000,\n  \"salaryCurrency\": \"USD\",\n  \"sortBy\": \"newest\",\n  \"maxItems\": 50\n}\n```\n\n### Example: specific postings by URL\n\n```json\n{\n  \"mode\": \"jobDetail\",\n  \"jobUrls\": [\n    \"https://jobs.ashbyhq.com/Ramp/09a9381c-677b-40a5-9ff1-027bd4302c13\",\n    \"https://jobs.ashbyhq.com/Linear/453f1ba0-a35e-4ed2-8215-1514e0a30b92\"\n  ],\n  \"includeDetails\": true\n}\n```\n\n### Example: compare hiring across companies\n\n```json\n{\n  \"mode\": \"boardSummary\",\n  \"orgSlugs\": [\"Ramp\", \"Notion\", \"Linear\", \"Harvey\"]\n}\n```\n\n## Use cases\n\n- **Job boards and aggregators** — keep a live feed of openings from every Ashby-powered company you track.\n- **Recruiting and sourcing** — find engineering, design, sales, or operations roles by team, location, and workplace type.\n- **Compensation benchmarking** — collect the employer's own salary ranges as numbers, with currency and pay period.\n- **Remote-work feeds** — build a daily feed of fully remote roles with remote-eligible countries.\n- **Hiring intelligence** — compare departments, teams, locations, and pay coverage across competitors.\n- **Market research** — track which companies are hiring and where over time.\n\n## FAQ\n\n**What is Ashby?** Ashby is an applicant-tracking and recruiting platform. Many companies host their public careers page at `jobs.ashbyhq.com/{company}`. This actor reads the public job-board data behind those pages.\n\n**How do I find a company's slug?** It is the path segment in the board URL. For `https://jobs.ashbyhq.com/Ramp`, the slug is `Ramp`. You can also paste the board URL or the company name, and the actor matches it to the closest live board.\n\n**Do I need an API key, login, or proxy?** No. The Ashby job-board endpoint is public. No credentials, cookies, or proxy setup are needed.\n\n**Why is `isRemote` true for a hybrid job?** Ashby's remote flag means \"remote-friendly\", not \"fully remote\". Use `workplaceType: \"Remote\"` for fully remote roles and `workplaceType: \"Hybrid\"` for hybrid roles.\n\n**Why do some jobs have no salary?** Companies choose whether to publish compensation. When they do not, the salary fields are omitted. This actor never guesses or fabricates a range.\n\n**What do `salaryMin` and `salaryMax` mean when a job has several pay tiers?** They are the lowest and highest values across every published salary component, so a multi-location or multi-level posting reports its full range. `compensationTiers` keeps the individual tiers.\n\n**What is the difference between `salaryMin` and `annualSalaryMin`?** `salaryMin` is the number exactly as published, with `salaryInterval` telling you whether it is yearly, monthly, weekly, or hourly. `annualSalaryMin` converts it to a yearly figure so you can compare roles with different pay periods.\n\n**Why are unlisted jobs missing?** Ashby can return jobs marked `isListed:false`, which are reachable by direct link but are not shown on the public board. They are excluded by default in `byOrg`, `boardSummary`, and `jobDetail`. Set `includeUnlisted: true` to include them; a `jobDetail` lookup for an unlisted job otherwise emits a `job_not_listed` error with the fix in its message.\n\n**Can I get only new postings?** Yes. Set `publishedAfter` to `24h`, `7d`, `2w`, or an ISO date. No saved state is needed between runs.\n\n**Why does the run finish with fewer records than the board has?** `maxItems` is a hard cap and filters run first. Ashby returns a company's whole board at once, so a large board is downloaded even when you save fewer records. Raise `maxItems` or narrow the filters to control the result size.\n\n**Are company websites included?** No. Company names, logos, and timezones are included, but website links are omitted because some employers block automated access to them.\n\n**Is this affiliated with Ashby?** No. This is a third-party actor that reads Ashby's public job-board data.\n\n## Limitations\n\n- Ashby does not publish a directory of every company on its platform. You need a board slug, board URL, job URL, or a company name that resolves to a live board.\n- Salary ranges are shown only when the employer publishes them; equity and bonus details follow the same rule.\n- Currencies are not converted. Use `salaryCurrency` to compare one currency at a time.\n- A board larger than 5,000 jobs would be truncated by the `maxItems` ceiling.\n- Markdown descriptions, seniority scores, and LinkedIn or AI enrichment are not produced. Descriptions are available as plain text and HTML.\n",
      "input": {
        "title": "Ashby Job Board Scraper Input",
        "description": "List jobs across Ashby job boards, fetch specific job postings by URL or ID, or summarize a company's board.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to collect. `byOrg` lists jobs from one or more companies; `jobDetail` fetches specific postings by URL or ID; `boardSummary` returns one departments/locations/compensation summary per company. The legacy values are kept so saved tasks continue to run.",
            "editor": "select",
            "enum": [
              "byOrg",
              "jobDetail",
              "boardSummary",
              "companies",
              "job",
              "detail",
              "summary"
            ],
            "enumTitles": [
              "List jobs across companies",
              "Fetch specific jobs by URL or ID",
              "Summarize company job boards",
              "Legacy: companies (same as list jobs)",
              "Legacy: job (same as fetch jobs)",
              "Legacy: detail (same as fetch jobs)",
              "Legacy: summary (same as board summary)"
            ],
            "default": "byOrg",
            "prefill": "byOrg"
          },
          "orgSlugs": {
            "title": "Companies (mode=byOrg, boardSummary)",
            "type": "array",
            "description": "Ashby board slugs, company names, or board URLs. Examples: `Ramp`, `Neko Health`, `https://jobs.ashbyhq.com/Ramp`. Names are matched to the closest live board automatically.",
            "editor": "stringList",
            "default": [
              "Ramp"
            ],
            "prefill": [
              "Ramp"
            ]
          },
          "jobUrls": {
            "title": "Job URLs (mode=jobDetail)",
            "type": "array",
            "description": "Public Ashby job posting URLs, e.g. `https://jobs.ashbyhq.com/Ramp/<job-id>`. The `/application` suffix and query strings are accepted.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "orgSlug": {
            "title": "Company slug (mode=jobDetail)",
            "type": "string",
            "description": "Used with `jobId` when you do not have a full job URL. Example: `Ramp`.",
            "editor": "textfield"
          },
          "jobId": {
            "title": "Job ID (mode=jobDetail)",
            "type": "string",
            "description": "The Ashby posting UUID or a full job URL. Used alone or with `orgSlug`.",
            "editor": "textfield"
          },
          "searchQuery": {
            "title": "Search text (mode=byOrg, boardSummary)",
            "type": "string",
            "description": "Case-insensitive text match over title, department, team, location, and description. Descriptions are searched even when `includeDescriptionPlain` is off and in `boardSummary` mode. Examples: `engineer`, `payments`, `München`.",
            "editor": "textfield"
          },
          "department": {
            "title": "Department or team (mode=byOrg, boardSummary)",
            "type": "string",
            "description": "Case-insensitive text match over department and team. Examples: `Engineering`, `Sales`, `Design`.",
            "editor": "textfield"
          },
          "location": {
            "title": "Location (mode=byOrg, boardSummary)",
            "type": "string",
            "description": "Case-insensitive text match over the primary location, secondary locations, city, region, and country. Examples: `New York`, `Remote`, `London`.",
            "editor": "textfield"
          },
          "workplaceType": {
            "title": "Workplace type (mode=byOrg, boardSummary)",
            "type": "string",
            "description": "Keep only fully remote, hybrid, or on-site jobs. Unlike `isRemoteOnly`, this separates Remote from Hybrid. Jobs with no workplace type are excluded when a specific value is chosen.",
            "editor": "select",
            "enum": [
              "any",
              "Remote",
              "Hybrid",
              "OnSite"
            ],
            "enumTitles": [
              "Any workplace type",
              "Fully remote",
              "Hybrid",
              "On-site"
            ],
            "default": "any",
            "prefill": "any"
          },
          "employmentType": {
            "title": "Employment type (mode=byOrg, boardSummary)",
            "type": "string",
            "description": "Keep only one employment type.",
            "editor": "select",
            "enum": [
              "any",
              "FullTime",
              "PartTime",
              "Contract",
              "Intern",
              "Temporary"
            ],
            "enumTitles": [
              "Any employment type",
              "Full time",
              "Part time",
              "Contract",
              "Internship",
              "Temporary"
            ],
            "default": "any",
            "prefill": "any"
          },
          "isRemoteOnly": {
            "title": "Remote-friendly only (mode=byOrg, boardSummary)",
            "type": "boolean",
            "description": "Keep jobs the board marks as remote. Ashby sets this for both Remote and Hybrid roles; use `workplaceType=Remote` for fully remote jobs.",
            "default": false,
            "prefill": false
          },
          "publishedAfter": {
            "title": "Published after (mode=byOrg, boardSummary)",
            "type": "string",
            "description": "Only jobs published on or after this date. Accepts `YYYY-MM-DD`, an ISO datetime, or a relative window such as `24h`, `7d`, or `2w`.",
            "editor": "textfield"
          },
          "publishedBefore": {
            "title": "Published before (mode=byOrg, boardSummary)",
            "type": "string",
            "description": "Only jobs published on or before this date. Accepts `YYYY-MM-DD`, an ISO datetime, or a relative window.",
            "editor": "textfield"
          },
          "minAnnualSalary": {
            "title": "Minimum annual salary (mode=byOrg, boardSummary)",
            "type": "integer",
            "description": "Keep jobs whose published annual salary range overlaps this minimum. Hourly, monthly, and weekly ranges are annualized. Jobs with no published salary are kept unless `hasSalaryOnly` is on.",
            "minimum": 0,
            "maximum": 10000000
          },
          "maxAnnualSalary": {
            "title": "Maximum annual salary (mode=byOrg, boardSummary)",
            "type": "integer",
            "description": "Keep jobs whose published annual salary range overlaps this maximum. Use with `minAnnualSalary` for a range.",
            "minimum": 0,
            "maximum": 10000000
          },
          "salaryCurrency": {
            "title": "Salary currency (mode=byOrg, boardSummary)",
            "type": "string",
            "description": "Only compare salaries in this currency. `any` compares the numeric range as published (currencies are not converted).",
            "editor": "select",
            "enum": [
              "any",
              "USD",
              "EUR",
              "GBP",
              "CAD",
              "AUD",
              "SGD",
              "PLN",
              "SEK",
              "CNY",
              "MXN",
              "KRW",
              "BRL",
              "SAR",
              "DKK",
              "ALL",
              "INR",
              "JPY",
              "CHF",
              "NZD",
              "ZAR",
              "AED",
              "NOK",
              "HKD",
              "ILS",
              "TRY",
              "CZK",
              "HUF",
              "RON",
              "UAH"
            ],
            "enumTitles": [
              "Any currency",
              "US dollar",
              "Euro",
              "British pound",
              "Canadian dollar",
              "Australian dollar",
              "Singapore dollar",
              "Polish zloty",
              "Swedish krona",
              "Chinese yuan",
              "Mexican peso",
              "South Korean won",
              "Brazilian real",
              "Saudi riyal",
              "Danish krone",
              "Albanian lek",
              "Indian rupee",
              "Japanese yen",
              "Swiss franc",
              "New Zealand dollar",
              "South African rand",
              "UAE dirham",
              "Norwegian krone",
              "Hong Kong dollar",
              "Israeli shekel",
              "Turkish lira",
              "Czech koruna",
              "Hungarian forint",
              "Romanian leu",
              "Ukrainian hryvnia"
            ],
            "default": "any",
            "prefill": "any"
          },
          "hasSalaryOnly": {
            "title": "Only jobs with a published salary (mode=byOrg, boardSummary)",
            "type": "boolean",
            "description": "Drop jobs where the employer did not publish a salary range.",
            "default": false,
            "prefill": false
          },
          "sortBy": {
            "title": "Sort results (mode=byOrg)",
            "type": "string",
            "description": "Order of the returned job records. `default` keeps the board's own order.",
            "editor": "select",
            "enum": [
              "default",
              "newest",
              "oldest",
              "title"
            ],
            "enumTitles": [
              "Board order",
              "Newest first",
              "Oldest first",
              "Title A-Z"
            ],
            "default": "default",
            "prefill": "default"
          },
          "includeUnlisted": {
            "title": "Include unlisted jobs",
            "type": "boolean",
            "description": "Include jobs marked `isListed:false` (direct-link-only postings that are not shown on the public board). Applies to every mode: `jobDetail` returns a `job_not_listed` error for an unlisted job unless this is on. Off by default.",
            "default": false,
            "prefill": false
          },
          "includeCompanyInfo": {
            "title": "Include company name and logo",
            "type": "boolean",
            "description": "Fetch each company's public board page once for its display name, logo, and timezone. Adds one request per company. Off in the daily test prefill.",
            "default": true,
            "prefill": false
          },
          "includeDetails": {
            "title": "Include job-page details (mode=byOrg, jobDetail)",
            "type": "boolean",
            "description": "Fetch each returned job's public page for all team names, confidentiality, compensation philosophy, direct-apply flag, and remote-eligible countries. Adds one request per job; slower on large runs.",
            "default": false,
            "prefill": false
          },
          "includeDescriptionPlain": {
            "title": "Include plain-text description (mode=byOrg, jobDetail)",
            "type": "boolean",
            "description": "Add `descriptionPlain` to each job. On by default; turn it off for compact metadata-only rows.",
            "default": true,
            "prefill": false
          },
          "includeDescriptionHtml": {
            "title": "Include HTML description (mode=byOrg, jobDetail)",
            "type": "boolean",
            "description": "Add the original `descriptionHtml` to each job. Increases dataset size.",
            "default": false,
            "prefill": false
          },
          "maxItemsPerOrg": {
            "title": "Max jobs per company (mode=byOrg)",
            "type": "integer",
            "description": "Cap the number of job records from each company after filters. `0` means no per-company cap.",
            "minimum": 0,
            "maximum": 5000,
            "default": 0,
            "prefill": 0
          },
          "maxItems": {
            "title": "Max records",
            "type": "integer",
            "description": "Hard cap on the number of job records (or company summaries) pushed to the dataset. Error records for invalid inputs are additional diagnostics and do not count.",
            "minimum": 1,
            "maximum": 5000,
            "default": 100,
            "prefill": 1
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Ashby Job Board Compensation & Openings Scraper Output",
        "description": "Jobs and company board summaries from public Ashby job boards - titles, departments, teams, structured locations, workplace types, compensation ranges, descriptions, apply links, and optional company metadata.",
        "properties": {
          "jobs": {
            "type": "string",
            "title": "Ashby jobs",
            "description": "Dataset containing scraped Ashby job postings in byOrg and jobDetail modes.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "boardSummaries": {
            "type": "string",
            "title": "Ashby board summaries",
            "description": "Dataset containing one departments/locations/compensation summary per company in boardSummary mode.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Jobs",
              "transformation": {
                "fields": [
                  "title",
                  "organizationName",
                  "department",
                  "location",
                  "workplaceType",
                  "compensationSummary",
                  "jobUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "d56694801f147607350555eb34ee169ced32cf1e30ec81f02e857696cf939284",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.00943111111111111
    }
  }
}