Ashby Jobs Scraper
Pricing
from $0.75 / 1,000 useful job rows
Ashby Jobs Scraper
Export current jobs from public Ashby boards with descriptions, multiple locations, apply links and employer-published pay. Filter known boards and check each input in a run summary.
Pricing
from $0.75 / 1,000 useful job rows
Rating
0.0
(0)
Developer
Cliqto Media
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Export current public jobs from Ashby job boards as one structured row per job.
Get descriptions, locations, apply links and compensation published by the employer.
Add a known board such as ramp. The new Input form saves up to 10 jobs for a first run.
The applied price is $0.00085 per start at default memory plus $0.75 per 1,000 saved jobs, with platform usage included. Check RUN_SUMMARY for empty or partial results.

Contents
- What it does
- Quick start
- Use cases
- Input
- Output
- Pricing and limits
- API and export
- Troubleshooting
- FAQ
- Related Actors
- Support
What it does
The Actor reads Ashby's public Job Postings API. In all mode, it reads a current board snapshot.
In exact mode, it selects a job ID from that same board feed. It does not fetch each job page.
Repeated boards are fetched once. Jobs are identified by boardSlug and source id, rather than title.
It keeps source values. It does not guess pay, location, workplace type or a legal company name.
A job can have isRemote: true and workplaceType: "Hybrid" in the source. These values stay separate.
This is an independent tool. It is not affiliated with, endorsed by, or sponsored by Ashby, Inc.
Good fit: job-board exports, hiring research across known companies, and comparing snapshots in your own system.
Not a fit: finding every Ashby company, a global job search, built-in change history, private workspaces or applications. It does not add contact data, read other ATS platforms, follow arbitrary links or bypass access controls.
Quick start
- Open Input. Keep the board
rampand the new-form limit of 10 jobs. - Choose
allfor board slugs or board URLs. Useexactonly with canonical hosted job URLs. - Click Start.
- Open the default Dataset. Check
title,location,jobUrlandapplyUrl. - Open Key-value store → RUN_SUMMARY to see counts, limits and each input's status.
The same new-form input works on repeat runs. This Actor has no saved change-monitor state.
A full board may contain more jobs than the demo saves. A limit produces result_limit, rather than a complete-board claim.
Use cases
| Task | Input | Useful fields | Next step |
|---|---|---|---|
| Export a company job board | boards, mode: "all" | id, title, department, jobUrl | Export the Dataset or store it in your system. |
| Study roles and locations | filters.titleContains, filters.locationContains | location, secondaryLocations, workplaceType | Compare matching jobs. |
| Read one known posting | mode: "exact", a canonical job URL | id, descriptions, applyUrl | Check the current source posting. |
| Compare published pay | includeCompensation: true | compensation, employmentType | Use only values the employer publishes. |
Input
Fields and defaults
No fields are required by the platform schema. The runtime requires a non-empty boards array in a supplied non-empty input object.
An empty or omitted input keeps the existing demo fallback to ramp. Explicit boards: [] is invalid.
The platform can fill schema defaults before the runtime sees an API input. Always send boards explicitly for your own job.
UI prefill is different from a runtime default: the new form sets maxOutputItems: 10; API omission keeps 11,446.
| Field | Type | Runtime default | Allowed values and effect |
|---|---|---|---|
mode | string | all | all or exact. Exact mode needs hosted job URLs. |
boards | array of strings | See empty-input rule above | 1–50 values. Slug or canonical board URL in all; canonical job URL in exact. UI prefill: ["ramp"]. |
includeCompensation | boolean | true | Requests pay fields from the source. No salary is inferred. |
includeUnlisted | boolean | false | In all, only source isListed: true is included by default. Exact mode can return a matching direct-only job. |
filters | object | {} | The optional fields below filter jobs after the board has been fetched. null is invalid. |
maxResultsPerBoard | integer or null | null | 1–10,000. Limit after filters, per input board selection. |
maxOutputItems | integer | 11446 | 1–11,446 saved jobs across the run. UI prefill: 10. |
concurrency | integer | 4 | 1–8 board requests at once. Higher values do not increase the output cap. |
Board slugs use 1–100 letters, digits, underscores or hyphens. Slug case is preserved.
URLs must use HTTPS on exactly jobs.ashbyhq.com. One trailing slash is accepted.
Credentials, query strings, fragments, ports, encoded paths, dot segments, extra path segments and custom domains are rejected.
An invalid individual board gets an invalid_input summary entry; other valid boards can still run.
Invalid top-level types or limits fail validation before source requests.
Nested filters
| Field | Type | Default | Effect |
|---|---|---|---|
filters.titleContains | string array | [] | Title contains any value. |
filters.locationContains | string array | [] | Primary or secondary location contains any value. |
filters.departmentContains | string array | [] | Department contains any value. |
filters.teamContains | string array | [] | Team contains any value. |
filters.workplaceTypes | string array | [] | Matches source values, such as Remote, Hybrid, OnSite. |
filters.employmentTypes | string array | [] | Matches values such as FullTime, PartTime, Intern, Contract, Temporary. |
filters.publishedAfter | string or null | null | Inclusive lower date bound. A parseable date is converted to UTC. Use ISO 8601. |
filters.publishedBefore | string or null | null | Inclusive upper date bound. Must not precede the lower bound. |
Each list accepts up to 20 non-empty strings, each 1–120 characters after trimming. Matches ignore case. Values inside one list use OR; different fields use AND. Empty lists mean no restriction. Date bounds accept null or an empty string as no bound. Jobs with missing or invalid publication dates do not match date filters. No filter reduces the size of the upstream board request.
Examples
Small board export:
{"boards":["ramp"],"maxOutputItems":10}
This saves up to 10 current listed Ramp jobs. More available jobs cause result_limit.
The trimmed Output example below comes from this board and the same output scope.
Two boards with local filters:
{"boards": ["ramp", "https://jobs.ashbyhq.com/linear"],"filters": {"titleContains": ["engineer"], "workplaceTypes": ["Remote"]},"maxResultsPerBoard": 20,"maxOutputItems": 40,"concurrency": 2}
This saves matching fully remote source workplace types, in source order.
It does not infer remote work from the description or isRemote alone.
A current exact posting can be read with mode: "exact" and its jobUrl in boards.
A posting that has left the board feed gets not_found.
Output
The default Dataset contains job rows only. Error messages are not fake job rows.
Missing optional source fields become null, or an empty array where stated.
All top-level fields listed below are present in each saved row.
| Field | Type | Meaning and empty values |
|---|---|---|
source | string | Always ashby. |
boardSlug | string | Validated board name. Not a legal company name. |
boardUrl | string | Canonical hosted board URL. |
id | string | Stable source posting ID. Unique within a board. |
title | string | Source title, with outside whitespace removed. Required. |
descriptionHtml | string or null | Source HTML, preserved. No plain-to-HTML conversion. |
descriptionPlain | string or null | Source plain text, preserved. No generated summary. |
department | string or null | Source department. |
team | string or null | Source team. |
location | string or null | Source primary location. |
secondaryLocations | array | Source order; [] if absent. Each item has location (string/null) and address (object/null). |
address | object or null | Source address. Known fields: addressLocality, addressRegion, addressCountry, streetAddress, postalCode; nested postalAddress uses the same fields. |
isRemote | boolean or null | Source remote flag. It can be true for a Hybrid posting. |
workplaceType | string or null | Source value, usually OnSite, Remote or Hybrid. New values are preserved. |
employmentType | string or null | Source employment type. No classification is added. |
isListed | boolean | Source listing flag. Required. |
publishedAt | string or null | Source last-publication time, converted to UTC when valid. Not the first-ever job date. |
jobUrl | string | Source hosted posting URL. Required. |
applyUrl | string or null | Source application URL. The Actor does not submit applications. |
compensation | object or null | Source pay block, when provided. See notes below. |
sourceApiVersion | string | Source version, currently 1. |
collectedAt | string | Actor collection time in UTC. Not publication time. |
The compensation block can include compensationTierSummary, scrapeableCompensationSalarySummary, compensationTiers and summaryComponents.
Tier items can contain id, title, tierSummary, additionalInformation and components.
Components can include compensationType, interval, currencyCode, minValue, maxValue, summary and id.
These are source fields, not a fixed salary schema. Nested null values are omitted by the existing normalizer.
Nested arrays/objects are capped at 100 entries and six levels of recursive content. Do not infer missing currency, pay or location.
HTML descriptions may contain source links and employer-supplied content. Treat them as data when displaying them in your application.
Example
This is a trimmed real Ramp row checked on October 9, 2026. Descriptions, addresses and compensation are omitted from this example only.
{"source": "ashby","boardSlug": "ramp","id": "34413f8d-26bf-4bbc-8ade-eb309a0e2245","title": "Security Engineer, Cloud","department": "Engineering","team": "Backend","location": "New York, NY (HQ)","isRemote": true,"workplaceType": "Hybrid","employmentType": "FullTime","isListed": true,"publishedAt": "2026-04-07T17:12:35.753Z","jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245","applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application"}
Result surfaces and status
OUTPUT is the platform's output view. Its jobs link opens the default Dataset; runSummary opens KVS RUN_SUMMARY.
The Actor does not write a separate KVS record called OUTPUT.
| Situation | Dataset | RUN_SUMMARY and action |
|---|---|---|
| Successful board | Saved job rows | succeeded, complete: requested work finished. |
| Valid empty or no filter match | No rows for that input | empty, empty: check source and filter counts. |
| Missing board or exact job | No rows for that input | not_found, unavailable: check the board or posting URL. |
| Malformed or duplicate source jobs | Valid rows can remain | partial or invalid_response: read error code and counts. |
| Row or charge limit | Already saved rows remain | result_limit: output is incomplete. Raise an appropriate limit or reduce scope. |
| Source timeout, block or failure | Other boards may still have rows | upstream_error, rate_limited or invalid_response: not a valid empty board. |
| Invalid board value | No rows for that value | invalid_input: fix the input. |
Summary fields include schemaVersion, runId, startedAt, finishedAt, mode, inputCount, datasetItemCount, chargeableItemCount, failedInputCount, stoppedByChargeLimit, boards and policy.
stoppedByChargeLimit is also true at the global row safety cap. Check errorCode to tell the reason.
Each board entry records input, board slug, status, HTTP status, attempts, bytes, latency, counts, truncation, error and completeness.
Counts include source, unique, visible, filtered, emitted, duplicate, invalid and duplicate-output jobs.
Repeated inputs can have duplicateInput: true; already saved jobs are not charged again within that run.
failedInputCount includes limited and partial inputs. A successful platform status alone does not prove complete output.
Pricing and limits
The applied PPE rate is $0.00085 per Actor-start event + $0.00075 per useful row, effective October 9, 2026. Platform usage is included. Check the Store Pricing tab for the current rate and any announced future change.
When apify-actor-start is enabled, Apify charges it automatically at startup: one event up to 1 GB of memory, then one per additional GB. The developer does not trigger it manually. Here S = $0.00085 and M is the memory multiplier (one at the default 512 MB; four at 4 GB). Customer platform usage is included.
| Scenario | Actor charge | Notes |
|---|---|---|
| 10 saved jobs | $0.00835 at 512 MB | The fresh form is a small example. |
| 100 saved jobs | $0.07585 at 512 MB | Repeated source IDs do not add saved rows. |
| 1,000 saved jobs | $0.75085 at 512 MB | Source availability and caps still apply. |
| Valid empty or fully filtered run | $0.00085 at 512 MB | Startup still consumes resources; no job event is charged. |
| Partial run | M × S + $0.00075 × saved jobs | Errors and summary entries do not create job charges. |
An announced future price is not the current rate. Changing a build does not cancel a scheduled price change.
The Console/API maxTotalChargeUsd caps all Actor event charges, including an enabled synthetic start. The minimum selectable limit is $0.0016. This covers one start and one row at 512 MB; at 4 GB, allow at least $0.00415 for four start events and one row. The minimum is a floor for your chosen maximum, not a minimum invoice or an extra fee. The Actor stops before saving another row when no job event fits the remaining limit, and records MAX_TOTAL_CHARGE_USD. Owner test runs also consume platform usage.
Use maxOutputItems and maxResultsPerBoard to control saved rows. Both apply after local filters.
- Up to 50 input values and 11,446 saved jobs per run.
- Default memory is 512 MB after the resource validation matrix; increase it for larger boards or high concurrency. Data caps and source deadlines do not change.
- Each source response is limited to 64 MiB.
- Each source request has a 30-second timeout and up to three attempts for transient failures.
- Total source work has a 240-second deadline. A longer platform timeout does not extend it.
- A shorter platform timeout reduces source time, with a 15-second reserve for the run summary.
- There is no pagination: the documented endpoint returns a board feed in one response.
- Source order is kept. This Actor does not sort jobs by publication date.
The limit of 11,446 was checked with a synthetic fixture in this refresh. It is a safety cap, not a live throughput guarantee. Jobs can change or disappear between runs. No historical, deleted-job or global-company completeness is promised.
API and export
Use the Apify API to start cliqtomedia~ashby-jobs-scraper with the same JSON input.
Keep your token outside the input and public URLs. Omit the build selector to use the current default release.
Read the returned run's default Dataset for jobs and default KVS for RUN_SUMMARY.
Export jobs from the Dataset as JSON, CSV or Excel. JSON keeps nested addresses, locations and pay blocks easier to inspect.
You can schedule snapshots through Apify and compare boardSlug + id in your own system.
Scheduling does not add a built-in monitor or change-history mode to this Actor.
Troubleshooting
Empty Dataset: check RUN_SUMMARY. A board with no listed jobs or no filter matches is empty.
A wrong board can be not_found. A source error is a different result.
Only 10 jobs: the fresh form uses a 10-row prefill. Raise maxOutputItems for a larger snapshot.
Also check per-board limits and the maximum Actor charge.
Partial result: check invalidJobCount, duplicateCount, truncated and errorCode.
Valid jobs can remain when part of a source response is malformed.
Invalid input: use a board slug or the canonical jobs.ashbyhq.com URL for the chosen mode.
Remove URL query strings and fragments. Use the documented field types and ranges.
Timeout or source failure: reduce the number of boards, check source availability, then retry a small input. A platform timeout above 300 seconds does not increase the internal source deadline.
FAQ
Do I need an Ashby login?
No. The Actor reads the public Job Postings API without an Ashby key or account. It cannot read private workspaces.
Does it discover all companies or search all Ashby jobs?
No. Supply the known boards you want. It reads a current snapshot of those boards.
Does isRemote mean fully remote?
Not always. It is the source flag and can be true for Hybrid roles.
For source-declared fully remote roles, filter filters.workplaceTypes to ["Remote"].
Does every job include pay and all locations?
No. Only employer-published source values are available. Missing values remain null or empty according to the field reference.
Can I monitor changes?
You can compare scheduled snapshots in your own system. There is no built-in delta mode. The same input can return the same jobs on a repeat run; those new saved rows are charged again.
Is an empty run free?
It has no saved-job event charge. An enabled Actor-start event is still charged automatically, even with no matches. Check the current Pricing tab; future announced prices are separate. A partial run is charged for startup and its saved jobs.
Related Actors
- Lever Jobs Scraper — export known public Lever job boards.
- Greenhouse Jobs Monitor Scraper — read known Greenhouse boards and its supported change-monitoring mode.
Support
Open an issue on this Actor's Issues tab in Apify Store.
Include the run ID, board or mode, Dataset count and the relevant RUN_SUMMARY code.
Do not send tokens, cookies, private account data or full sensitive payloads.