Ashby Jobs Scraper: Public Job Board Export avatar

Ashby Jobs Scraper: Public Job Board Export

Pricing

from $0.53 / 1,000 useful job rows

Go to Apify Store
Ashby Jobs Scraper: Public Job Board Export

Ashby Jobs Scraper: Public Job Board Export

Export current jobs from public Ashby boards to track hiring at target companies, feed a job site or benchmark pay. Get titles, descriptions, locations, apply links and employer-published salaries, with a run summary per board.

Pricing

from $0.53 / 1,000 useful job rows

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Security

Limited permissions

Share

Export current jobs from public Ashby boards to track hiring at target companies, feed a job site or compare published pay. Each job is one structured row: title, description, locations, apply link and employer-published pay. Add a board name such as ramp; no Ashby login or API key is needed. A typical 10-job run costs under one cent.

The Input form saves up to 10 jobs for a first run, and RUN_SUMMARY explains empty or partial results for every board.

Ashby Jobs Scraper: public job boards to structured data, with descriptions, multiple locations and published pay

Table of contents

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

  • Exporting the open roles of companies whose Ashby board you know.
  • Hiring research: roles, departments, locations and published pay across several boards.
  • Comparing scheduled snapshots by boardSlug + id in your own system.

πŸ‘‰ Try it now: open the input form

How it works

  1. You list Ashby board names or board URLs, such as ramp or https://jobs.ashbyhq.com/linear.
  2. The Actor reads each board's public job feed once, removes duplicates and applies your optional filters for title, location, department, team, work model, employment type and dates.
  3. It saves one row per job to the Dataset and writes RUN_SUMMARY with counts and a status for every board, so an empty board, a wrong board name and a source error look different.

πŸ‘‰ Try it now: open the input form

Quick start

Input form: box 1 is the Ashby board list with ramp, box 2 the pay and description switches, box 3 the optional filters, box 4 the 10-job limit

  1. Open the Input tab. The board ramp is already in Ashby boards or job URLs (box 1 in the picture). Replace it with your own board names or jobs.ashbyhq.com board URLs.

  2. Keep pay and full descriptions on, or switch them off (box 2). Add title, location or team filters only if you need them (box 3).

  3. Keep Maximum output rows at 10 for a first run, or raise it for a full board (box 4).

  4. Click Start.

  5. Open the Output tab. Each row is one job with title, department, team, location, workplace, type, date and link; switch to All fields for descriptions, pay and the apply link.

    Output table: one row per Ramp job with board, title, department, team, location, workplace, employment type, date and job URL

Expected result: up to 10 current Ramp jobs in the Dataset, and a RUN_SUMMARY record in the Key-value store with counts and a status for every board. A full board may contain more jobs than the demo saves. A limit produces result_limit, rather than a complete-board claim.

πŸ‘‰ Try it now: open the input form

Use cases

TaskInputUseful fieldsNext step
Track hiring at target companies (sales and recruiting leads)boards with your target companies, a daily scheduletitle, department, location, publishedAtFlag companies that open new roles in your niche.
Feed a job board or newsletterboards, filters.titleContains, filters.workplaceTypestitle, descriptionHtml, jobUrl, applyUrlPublish matching jobs with a link to apply.
Benchmark salariesfilters.onlyWithCompensation: true, filters.titleContainscompensation, location, employmentTypeCompare employer-published pay ranges by role and city.
Research a company's team growthboards, mode: "all"department, team, location, workplaceTypeSee which teams and locations are hiring.
Check one known postingmode: "exact", a canonical job URLid, descriptions, applyUrlConfirm the posting is still open.

πŸ‘‰ Try it now: open the input form

Input

Input fields

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.

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
modeModestringnoallall, exactall reads whole boards; exact picks one job from its board feed"all"Use exact only with hosted job URLs
boardsAshby boards or job URLsarray of stringsyes (see above)prefill ["ramp"]1–50 board slugs or https://jobs.ashbyhq.com/<board> URLs; job URLs in exactWhich boards to read["ramp", "linear"]Use the name from the board URL, not a company's own careers domain
includeCompensationInclude published compensationbooleannotruetrue, falseAsks the source for employer-published paytrueNo salary is inferred when a job has none
includeUnlistedInclude direct-only postingsbooleannofalsetrue, falseIn all, adds jobs the source marks as not listedfalseLeave off for what candidates see on the board
includeDescriptionsInclude job descriptionsbooleannotruetrue, falsefalse saves descriptionHtml and descriptionPlain as nullfalseTurn off for smaller rows; the price per row is the same
filtersLocal filtersobjectno{}fields in the next table; null is invalidFilters jobs after the board is fetched{"titleContains": ["engineer"]}Run once without filters to see the board's values
maxResultsPerBoardMaximum rows per boardinteger or nullnonull1–10,000Caps saved jobs per board, after filters20Use it to spread a run evenly over many boards
maxOutputItemsMaximum output rowsintegerno11446; prefill 101–11,446Caps saved jobs across the run1000Raise it after a first 10-job run
concurrencyConcurrencyintegerno41–8Board requests at once2Higher values do not raise 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. Repeated boards are fetched once.

Filter fields

FieldTypeDefaultEffect
filters.titleContainsstring array[]Title contains any value.
filters.titleExcludesstring array[]Skips jobs whose title contains any value, such as senior or intern.
filters.locationContainsstring array[]Primary or secondary location contains any value.
filters.departmentContainsstring array[]Department contains any value.
filters.teamContainsstring array[]Team contains any value.
filters.workplaceTypesstring array[]Matches source values, such as Remote, Hybrid, OnSite.
filters.employmentTypesstring array[]Matches values such as FullTime, PartTime, Intern, Contract, Temporary.
filters.publishedAfterstring or nullnullInclusive lower date bound. A parseable date is converted to UTC. Use ISO 8601.
filters.publishedBeforestring or nullnullInclusive upper date bound. Must not precede the lower bound.
filters.postedWithinDaysinteger or nullnull1–3,650. Keeps jobs published in the last N days before the run started. With publishedAfter, the later bound wins.
filters.onlyWithCompensationbooleanfalseKeeps jobs with employer-published pay (non-empty compensation summary or tiers). Requires includeCompensation: true.

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, including postedWithinDays. No filter reduces the size of the upstream board request.

Interacting settings

WhenInput AInput BEffective behaviorExampleCost/result effect
Both caps are setmaxResultsPerBoardmaxOutputItemsEach board stops at its own cap; the run stops at the total cap3 boards Γ— 20, total 40At most 40 saved jobs; boards over a cap get result_limit
Filters and capsfiltersmaxResultsPerBoard, maxOutputItemsFilters run first; caps count matching jobs only3 matching jobs, cap 10You pay for 3 rows
Pay filter without payfilters.onlyWithCompensationincludeCompensation: falseInvalid combination: input is rejectedβ€”No source requests
Two date boundsfilters.postedWithinDaysfilters.publishedAfterThe later lower bound wins7 days and a date a month agoFewer rows
Run cost limitmaxOutputItemsConsole/API maxTotalChargeUsdThe run stops before a row that does not fit the limitlimit $0.0016 at 512 MBOne start and one row; MAX_TOTAL_CHARGE_USD in RUN_SUMMARY
Exact modemode: "exact"includeUnlistedincludeUnlisted is not needed: a matching direct-only job is returned anywaya direct job URLOne row or not_found

Input examples

Small board export

{"boards":["ramp"],"maxOutputItems":10}

Expected behavior: saves up to 10 current listed Ramp jobs. More available jobs cause result_limit. Expected output: job rows with title, location, jobUrl, applyUrl; the Output example below comes from this input. Limit or cost note: about $0.00835 on the FREE tier at 512 MB.

Remote engineering jobs from two boards

{
"boards": ["ramp", "https://jobs.ashbyhq.com/linear"],
"filters": {"titleContains": ["engineer"], "workplaceTypes": ["Remote"]},
"maxResultsPerBoard": 20,
"maxOutputItems": 40,
"concurrency": 2
}

Expected behavior: saves matching jobs whose source workplace type is Remote, in source order. It does not infer remote work from the description or isRemote alone. Expected output: up to 20 rows per board with title, workplaceType, location, jobUrl.

Check one known posting

{"mode":"exact","boards":["https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245"]}

Expected behavior: returns that job while it is in the board feed; a posting that has left the feed gets not_found. Limit or cost note: one row, or only the start fee.

πŸ‘‰ Try it now: open the input form

Output

Output fields

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.

FieldTypeMeaning and empty values
sourcestringAlways ashby.
boardSlugstringValidated board name. Not a legal company name.
boardUrlstringCanonical hosted board URL.
idstringStable source posting ID. Unique within a board.
titlestringSource title, with outside whitespace removed. Required.
descriptionHtmlstring or nullSource HTML, preserved. No plain-to-HTML conversion.
descriptionPlainstring or nullSource plain text, preserved. No generated summary.
departmentstring or nullSource department, with outside whitespace removed.
teamstring or nullSource team, with outside whitespace removed.
locationstring or nullSource primary location, with outside whitespace removed. A blank value becomes null.
secondaryLocationsarraySource order; [] if absent. Each item has location (string/null) and address (object/null).
addressobject or nullSource address. Known fields: addressLocality, addressRegion, addressCountry, streetAddress, postalCode; nested postalAddress uses the same fields.
isRemoteboolean or nullSource remote flag. It can be true for a Hybrid posting.
workplaceTypestring or nullSource value, usually OnSite, Remote or Hybrid. New values are preserved.
employmentTypestring or nullSource employment type. No classification is added.
isListedbooleanSource listing flag. Required.
publishedAtstring or nullSource last-publication time, converted to UTC when valid. Not the first-ever job date.
jobUrlstringSource hosted posting URL. Required.
applyUrlstring or nullSource application URL. The Actor does not submit applications.
compensationobject or nullSource pay block, when provided. See notes below.
sourceApiVersionstringSource version, currently 1.
collectedAtstringActor 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.

Output 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"
}

Output entities and surfaces

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.

SituationDatasetRUN_SUMMARY and action
Successful boardSaved job rowssucceeded, complete: requested work finished.
Valid empty or no filter matchNo rows for that inputempty, empty: check source and filter counts.
Missing board or exact jobNo rows for that inputnot_found, unavailable: check the board or posting URL.
Malformed or duplicate source jobsValid rows can remainpartial or invalid_response: read error code and counts.
Row or charge limitAlready saved rows remainresult_limit: output is incomplete. Raise an appropriate limit or reduce scope.
Source timeout, block or failureOther boards may still have rowsupstream_error, rate_limited or invalid_response: not a valid empty board.
Invalid board valueNo rows for that valueinvalid_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.

πŸ‘‰ Try it now: open the input form

Pricing

Pricing unit

You pay per saved job plus a small start fee. Platform usage is included: you do not pay separately for compute or traffic.

EventFREEBRONZESILVERGOLD
Saved job (per 1,000)$0.75$0.675$0.60$0.525
Actor start (per GB of memory)$0.00085$0.00085$0.00085$0.00085

Your Apify plan sets the column. The start fee grows with run memory: Apify charges one start event per GB, rounded up, so the default 512 MB costs one event and 4 GB costs four. The Actor never triggers it manually. Check the Store Pricing tab for the current rate.

A valid empty board or a filter with no matches pays only the start fee. Errors and summary entries are never charged as jobs. A partial run pays the start fee plus the jobs it saved.

Cost examples

ScenarioSaved jobsFREE price at 512 MBNotes
First run from the new form10$0.00835Default 10-job prefill.
One mid-size board100$0.07585Repeated source IDs do not add saved rows.
Several boards1,000$0.75085Source availability and caps still apply.
Valid empty or fully filtered run0$0.00085Start fee only.

The Console/API maxTotalChargeUsd caps all event charges. The minimum selectable limit is $0.0016: one start and one row at 512 MB. At 4 GB, allow at least $0.00415. The Actor stops before saving another row when no job event fits the remaining limit and records MAX_TOTAL_CHARGE_USD. Use maxOutputItems and maxResultsPerBoard to control saved rows. Both apply after local filters.

πŸ‘‰ Try it now: open the input form

Limits

  • Known boards only: it does not discover every Ashby company or search all Ashby jobs.
  • Public boards only: no private workspaces, applications, candidate data or contact enrichment.
  • Ashby only: no other ATS platforms, custom career domains or arbitrary links.
  • No built-in change history or delta mode; compare snapshots in your own system.
  • Up to 50 input values and 11,446 saved jobs per run. A live test with 50 large boards saved 11,117 jobs in about 2 minutes at the default 512 MB. The row cap is a safety cap, not a throughput guarantee.
  • Default memory is 512 MB; increase it for very large boards or high concurrency.
  • Each source response is limited to 64 MiB; each request has a 30-second timeout and up to three attempts for transient failures.
  • Fetching boards has a 200-second deadline. Boards not downloaded by then get upstream_error with SOURCE_DEADLINE; jobs from boards already downloaded are still saved. A longer platform timeout does not extend the deadline; a shorter one keeps a 15-second reserve for the run summary.
  • No pagination: the source returns a whole board feed in one response. Source order is kept; jobs are not sorted by date.
  • Jobs can change or disappear between runs. No historical, deleted-job or global-company completeness is promised.

πŸ‘‰ Try it now: open the input form

API, export and integrations

  • API: use the Apify API to start cliqtomedia~ashby-jobs-scraper with the same JSON input. Keep your token outside the input and public URLs. Read the run's default Dataset for jobs and default KVS for RUN_SUMMARY.
  • Export: download the Dataset as JSON, CSV or Excel. JSON keeps nested addresses, locations and pay blocks easier to inspect.
  • Scheduling: schedule snapshots in Apify and compare boardSlug + id in your own system. Scheduling does not add a monitor mode.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/ashby-jobs-scraper.
  • Smallest useful input: {"boards":["ramp"],"maxOutputItems":10}.
  • Key output fields: title (job title), location and workplaceType (where and how), jobUrl (posting link), compensation (employer-published pay or null).
  • A 10-job run finishes in about 3–4 seconds and costs $0.00835 on the FREE tier.
  • An agent must pass known board names; the Actor does not search all of Ashby. Up to 50 boards per run.

πŸ‘‰ Try it now: open the input form

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.

πŸ‘‰ Try it now: open the input form

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.

πŸ‘‰ Try it now: open the input form

πŸ‘‰ Try it now: open the input form

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.

πŸ‘‰ Try it now: open the input form