Ashby Jobs Scraper: $0.10 per Company, Up to 1,000 Jobs avatar

Ashby Jobs Scraper: $0.10 per Company, Up to 1,000 Jobs

Pricing

from $70.00 / 1,000 company lookups

Go to Apify Store
Ashby Jobs Scraper: $0.10 per Company, Up to 1,000 Jobs

Ashby Jobs Scraper: $0.10 per Company, Up to 1,000 Jobs

Get every open job from the Ashby boards you name, such as Linear and Replit, read live: title, team, location, salary, apply link. $0.10 per company with up to 1,000 jobs included. Schedule it for new-job alerts. No login, no API key, MCP-ready.

Pricing

from $70.00 / 1,000 company lookups

Rating

0.0

(0)

Developer

Don Mangu

Don Mangu

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Share

Ashby jobs API without a key: get every open job from any company's Ashby job board, with salary when published, as JSON, CSV or Excel.

Ashby Jobs Scraper & API gets every open job on the Ashby job boards of the companies you name, read live during your run: title, department, team, location, remote, job type, salary when published, posted date and apply link. Paste board links, company names or websites. You pay $0.10 per company, with up to 1,000 jobs included, and there is no API key or login.

You pay $0.10 per company, including up to 1,000 jobs ($0.09 on the Scale plan, $0.07 on Business). Per job, that is $2 per 1,000 jobs for a company with 50 open jobs, $0.50 for one with 200, and $0.10 for one with 1,000. No API key, proxy or login. It does not search all Ashby jobs by keyword: you bring the list of companies.

What the Ashby jobs scraper returns

  • Salary. Ashby pay comes in tiers, such as one per region or level. salaryRanges has one range per tier, and salaryMin and salaryMax span the tiers in the currency of the job's country when a tier has it, else in the first tier's salaryCurrency and salaryPeriod. With Include job description, pay written in the text fills the salary when a job has none (salarySource is text, else board).
  • Department and team. department and team as the company names them, and departmentPath joins them, such as Customer Success > High Touch Customer Success.
  • Workplace type. workplaceType is Ashby's remote, hybrid or on-site, and remote is true only for fully remote jobs.
  • Every location. locations lists the job's location and its secondary locations, and countryCodes their countries. country, countryCode, city and region come from the address Ashby gives, else the location text.
  • Job type. employmentType is Ashby's FullTime, PartTime, Intern, Contract or Temporary.
  • Links and dates. url is the job page and applyUrl Ashby's form. postedAt is when the job was published. Unlisted jobs are left out.

How to scrape Ashby jobs, step by step

  1. In Companies (companies), paste Ashby board links (jobs.ashbyhq.com/<name>), company names or websites, up to 500. A job link reads the whole board. Or pick a list in Ready-made company lists (companyLists), such as ai-companies (107 on Ashby).
  2. Set filters if you need them, such as Title includes, Location or Posted since, and turn on Include job description for the full text.
  3. Run it. Each company costs $0.10, with up to 1,000 jobs included, also when the name is not on Ashby. Descriptions are free.
  4. Open the Jobs view of the results. Set Rows to return (outputMode) to companies for one summary row per company instead.
  5. To repeat it, save the input as a task and schedule it, as in Get only new and closed Ashby jobs on a schedule.

If a job's address on the company's careers page starts with jobs.ashbyhq.com/<name>, paste it: a job link reads the whole board. Board names ignore case. Or paste the company's website, or type the name, such as replit.

A plain name can belong to another company, and Ashby gives no company name to compare, so warning flags common words, short names and boards with no jobs. matchedBy says how the board was found, and companySlug is its name.

Fields on every job

jobId, jobKey (the same in every run), seniority and jobFunction from the title, employmentTypeNormalized (such as full_time), language (read from the description, else the title), and salaryAnnualMin and salaryAnnualMax (pay per year). With Include job description: description without email addresses, phone numbers or profile links, the tools it names, experienceYearsMin, experienceYearsMax, experienceLevel, educationMin, educationRequired, visaSponsorship, visaSponsorshipText and securityClearance. Rows also have the city's latitude, longitude and timeZone, remoteRegions, and ukVisaSponsor with ukSponsorRoutes.

Filters

Filters lower the price only above 1,000 jobs.

  • Words and places: titleIncludes and titleExcludes (whole words), department (department or team), location (a country name or code, else whole words), locationExcludes, remoteOnly, remoteRegions (where remote work may be done), and near with radiusKm (distance from one city).
  • Values: workplaceTypes, employmentTypes, seniorities, jobFunctions and languages. Ashby gives no language, so turn on includeDescription with languages.
  • Pay and dates: hasSalary, minAnnualSalary in minAnnualSalaryCurrency (no exchange rates), postedSince and postedBefore (a date or a period such as 7 days).
  • From the description: descriptionIncludes, skills (sets matchedSkills), maxExperienceYears and visaSponsorship turn on includeDescription and its price. descriptionFormat picks text, html or markdown.
  • Size: maxJobsPerCompany keeps the newest jobs.

A job without the value a filter needs is left out, and warning counts them. startUrls and urls are other names for companies. excludeCompanies leaves companies out. ukVisaSponsorOnly keeps companies on the UK visa sponsor register. companyLists adds ready-made lists of companies, such as ai-companies (107 on Ashby), and fills companyName. Rows of list companies also end with their industry, headquarters country and size, in companyIndustry, companyCountry and companySizeBand, when known.

Input example

This is the input the form is filled in with when you open the Actor, as JSON. Paste it into the JSON tab of the input, or send it as the run input through the API. Fields you leave out keep their defaults. It reads the Ashby jobs of the companies listed in companies.

{
"companies": [
"https://jobs.ashbyhq.com/ashby",
"https://jobs.ashbyhq.com/linear",
"https://jobs.ashbyhq.com/replit"
]
}

How much does the Ashby jobs API cost?

EventPriceWhat you get
Company lookup (company-lookup)$0.10 (Scale $0.09, Business $0.07)One company's job list, up to 1,000 jobs, including the first check with Only new jobs
Extra 1,000 jobs (extra-1000-jobs)$0.045 (see the Store page)Each further 1,000 job rows of the same company, or part of them
New jobs check (new-jobs-check)$0.002A later check with Only new jobs, per started 1,000 open jobs on the board

So 100 companies cost $10 ($7 on the Business plan). A daily Only new jobs check of them then costs $0.20.

A website that links no job board, and whose name is not on Ashby, costs the company price. A company over your spending limit is neither delivered nor charged.

Get only new and closed Ashby jobs on a schedule

Turn on Only new jobs since my last check (onlyNewJobs), save the input as a task, and schedule it. The first check of a company returns its full list for the company price. Later checks return new and closed jobs, with change set to new or closed and an alert line (alertText), for $0.002 per started 1,000 open jobs on the board.

Alert webhook URL (alertWebhookUrl) posts to Slack, Discord, Teams, Make, Zapier or n8n after a check with changes, not on quiet days (alertMaxJobs, alertOnFirstCheck).

Rows have firstSeenAt, closed rows closedAt and daysOpen. reposted marks a new job matching one closed within 30 days; skipReposts leaves those out, counted in skippedRepostsCount and skippedReposts. With includeUpdatedJobs, changed jobs come back as updated, with changedFields and previous values.

Each monitorName and filter set keeps its own memory in your Apify account.

Job board feed (XML)

This is for feeding a job board that imports XML or JSON feeds, or any tool that reads one. Set Output profile (outputProfile) to jobBoardFeed. Each job row then has the same flat fields in every run, and the description is turned on for you at no cost. The price does not change: it is still the company price, and no new events are added.

Fields of a feed row: guid (the job key, such as ashby:<company>:<job id>, the same in every run), title, company, location, url (the public job page), applyUrl (the apply link, else the job page), datePosted and dateUpdated (ISO 8601), descriptionHtml, descriptionText, employmentType, remote (true, false or null when unknown), workplaceType, department, country, salaryMin, salaryMax, salaryCurrency and salaryPeriod. A value the board does not give is null. Company and status rows are not changed, so a company with no jobs still gets its status row. Status rows have no guid, so skip rows without one when you import. With the default standard profile nothing changes.

Read the results of a run as XML with the dataset items endpoint. format=xml returns XML, xmlRoot names the root element (default items) and xmlRow names the element around each row (default item):

https://api.apify.com/v2/datasets/<datasetId>/items?format=xml&xmlRoot=jobs&xmlRow=job&clean=1&token=<YOUR_API_TOKEN>

To always read the newest run of this Actor, use the last run variant:

https://api.apify.com/v2/acts/<actorId>/runs/last/dataset/items?status=SUCCEEDED&format=xml&xmlRoot=jobs&xmlRow=job&clean=1&token=<YOUR_API_TOKEN>

Replace <datasetId> or <actorId> with your own, and <YOUR_API_TOKEN> with your own Apify API token from Console, Settings, API & Integrations. Never post a feed link with your real token in it where others can read it. clean=1 leaves out empty rows and hidden fields. For JSON, use format=json in the same URL.

To refresh the feed every day:

  1. Save the input you want as a task: open the Actor, fill in the companies, set Output profile to jobBoardFeed, and click Save as a new task.
  2. In Apify Console, open Schedules, click Create new, set the cron (for example 0 6 * * * for 06:00 every day), and add your task under Actors/Tasks.
  3. Point your job board's import at the last run URL of the task, or of this Actor, from above.

What it does not do: it does not post to any job board for you, and it does not check the import rules of any particular platform. Check what your board accepts for its feed and map the fields to it.

For AI agents

Use it to answer "is company X hiring for Y right now?" for companies on Ashby. Input (give companies or companyLists, up to 500 companies in all):

{"companies": ["https://jobs.ashbyhq.com/linear", "replit"], "jobFunctions": ["engineering"], "postedSince": "7 days", "maxJobsPerCompany": 50}

Output, one row per job: company, companyStatus, title, team, location, workplaceType, employmentType, jobFunction, salaryMin, salaryMax, salaryCurrency, salaryRanges, postedAt, url and more, plus description with includeDescription. A company with nothing to return gets a status row saying why.

Price: $0.10 per company with up to 1,000 jobs, also when the name is not on Ashby. Descriptions are free. More in How much does the Ashby jobs API cost?.

Many companies, or companies on different job boards? ATS Jobs API reads Ashby and 21 other job boards in one run for $0.045 per company.

Use it from Claude, Cursor or another AI agent (MCP)

The Apify MCP server lets an AI agent run this Actor as a tool. Add it to your MCP client with this address:

https://mcp.apify.com?tools=conserving_celerytop/ashby-jobs-api

For example, in .cursor/mcp.json for Cursor:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=conserving_celerytop/ashby-jobs-api"
}
}
}

Claude Desktop and other clients take the same url. You need an Apify account: sign in with OAuth when your client asks, or use the token header described in the Apify MCP server docs. The agent can also find this Actor with search-actors and run it with call-actor.

Then ask in plain words, for example: "Is Replit hiring engineers right now? Use ashby-jobs-api." The agent fills the input, such as:

{"companies": ["replit"], "jobFunctions": ["engineering"], "postedSince": "7 days", "maxJobsPerCompany": 50}

Useful fields: companies (board links, names or websites, up to 500) or companyLists, titleIncludes, jobFunctions, workplaceTypes, location, postedSince (for example 7 days), hasSalary, includeDescription, maxJobsPerCompany, outputMode and onlyNewJobs. It returns one row per job with title, team, location, workplaceType, salaryMin, salaryMax, salaryCurrency, postedAt and url.

Runs are charged to your Apify account at $0.10 per company, including up to 1,000 jobs. This Actor does not search all Ashby jobs by keyword, so tell the agent which companies to check. More in How much does the Ashby jobs API cost?.

Output

A job row from a real run, shortened. Unknown values are null.

{
"rowType": "job",
"company": "https://jobs.ashbyhq.com/ashby",
"ats": "ashby",
"companyStatus": "ok",
"charged": true,
"title": "Mid-Market Customer Success Manager - EMEA",
"team": "High Touch Customer Success",
"location": "Remote - European Union",
"countryCodes": ["GB", "IE", "NL"],
"workplaceType": "remote",
"employmentType": "FullTime",
"salaryMin": 45000,
"salaryMax": 105000,
"salaryCurrency": "EUR",
"postedAt": "2026-09-18T19:59:44.600Z",
"applyUrl": "https://jobs.ashbyhq.com/ashby/62d4f71e-f56c-447a-a965-a9c2ea8eac5e/application"
}

Set Rows to return (outputMode) to companies for one summary row per company, or both. rowType is job, company or status. Summary rows have boardUrl, openJobs, jobsPostedLast7Days, jobsPostedLast30Days, jobsOpenOver90Days, newestPostedAt, oldestPostedAt, remoteJobs, remoteShare, engineeringShare, salesShare, salaryCoverage, salaryMedians, medianSalaryMin, medianSalaryMax, medianSalaryCurrency, medianSalaryPeriod, topDepartments, topLocations, countries, seniorityCounts, functionCounts, functionCountsLast30Days, leadershipRoles and firstHireRoles. Descriptions add topTools, toolCoverage, visaSponsorshipShare and medianExperienceYearsMin. Only new jobs adds newJobs, closedJobs, updatedJobs, repostedJobs, medianDaysOpen, newFunctions, newCountries and previousCheckAt.

The COMPANIES record has each company's status, with inputDomain, careerPageSource, fetchedAt, error, chargedEvent, chargedEventCount, extraJobBlocksCharged, upstreamCalls, companyTotalOpenJobs, companyMatchedJobs, companyJobsReturned, companyJobsWithoutDate, newJobsCount, closedJobsCount, updatedJobsCount and firstCheck.

Statuses and charges

companyStatusMeaningCharged
ok, no_matching_jobs, no_open_jobsThe board was readYes
not_foundAshby has no board by this nameYes
source_errorAshby failed or did not answerYes
no_job_board_foundThe website links no job board, and its name is not on AshbyYes
unsupported_job_boardAnother job board, linked or found on the website. error says whyNo
website_unavailableWe could not read the website, and its name is not on AshbyNo
invalid_input, duplicateNot a link, website or name, or the same board as another entryNo
skipped_time_limit, skipped_spending_limitOut of time, or over your spending limitNo
skipped_client_disconnectedOnly in Live Jobs HTTP API. Your client disconnected firstNo
internal_errorSomething failed on our sideOnly if it happened after we read the board

Other job boards: ATS Jobs API and more

This Actor reads only Ashby. The same list of companies works in our other job Actors:

Closest to this one:

More Actors from the same developer:

Job data

Company and salary research

Content, media and research

FAQ

Is this an official Ashby API? No. It reads Ashby's public job posting API, with no login. It is not affiliated with or endorsed by Ashby, a trademark of its owner. It is built for job data, not personal data: descriptions come without email addresses, phone numbers or profile links. We cannot give legal advice, so check that your use follows the laws and terms that apply to you.

How fresh are the jobs, and can I get alerts? Every run reads each company's Ashby board at the time you run it, so you get the jobs the board shows at that moment. fetchedAt is when the lookup started and postedAt is when the job was published on Ashby. Ashby gives no update time, so updatedAt is always null. Jobs the company has unlisted are left out. For new jobs every day, turn on Only new jobs since my last check (onlyNewJobs), save the input as a task and schedule it. The first check of a company returns its full list for the company price. Later checks return new and closed jobs for $0.002 per started 1,000 open jobs on the board, and alertWebhookUrl can post them to Slack, Discord, Teams, Make, Zapier or n8n. More in Get only new and closed Ashby jobs on a schedule.

Will I get duplicates or reposted jobs? A board you enter twice, or once in Companies and once in a ready-made list, is read and charged once, and the second entry gets the status duplicate. Every job has a jobKey that stays the same in every run. With Only new jobs, a job comes once as new, and once more as closed when it is taken down. A job put up again under a new id comes as new with reposted set to true when a job with the same title and location closed in the last 30 days. Turn on Skip reposted jobs (skipReposts) to leave those out.

How many jobs does one company return, and what does it cost? One company lookup is $0.10 and includes up to 1,000 jobs, so a board with 700 open jobs still costs $0.10. Each further block of up to 1,000 jobs costs $0.045. To stay at the base price, set Max jobs per company (maxJobsPerCompany) to 1,000 or less: it keeps the newest jobs. Without it you get all jobs, up to 10,000 per company. Filters lower the price only above 1,000 jobs. Rows to return set to companies gives one summary row per company and never adds the extra charge.

Can I search all Ashby jobs by keyword? No. You bring the companies: Ashby board links, company names or websites, up to 500 per run, or a ready-made list in Ready-made company lists such as ai-companies (107 on Ashby). Filters like Title includes, Department, Location and Posted since then pick jobs inside those companies. Each company costs the company price, also when no job matches. To search the open jobs of 824 companies by keyword, use Tech Jobs Search.

Why did a name return not_found, and what does a result with no jobs mean? Board names often differ from brand names. Open any job on the company's careers page: if its address starts with jobs.ashbyhq.com/<name>, paste that link, which reads the whole board. Or paste the company's website. The company's companyStatus says what happened: no_open_jobs means the board was read and has no open jobs, no_matching_jobs means it has jobs but none pass your filters, and not_found means Ashby has no board by that name. A company with nothing to return gets one row with rowType status. These three are charged, because the board was contacted. A link to another job board is unsupported_job_board, free. warning flags common words, short names and boards with no jobs, since a plain name can belong to another company. All statuses are in Statuses and charges.

Why is the salary empty? A job has pay only when the company adds a pay range to it on Ashby. Ashby pay comes in tiers, such as one per region or level: salaryRanges has one range per tier, and salaryMin, salaryMax, salaryCurrency and salaryPeriod span them. Turn on Include job description to also read pay written in the job text when a job has no range, at no extra price. salarySource says whether the pay came from the board or from the text. To keep only jobs with pay, turn on Only jobs with a salary (hasSalary).

Found a problem? Open an issue on the Issues tab.

Related Actors. Live Jobs HTTP API returns jobs in one HTTP response, at its own prices plus platform usage. Tech Jobs Search searches the open jobs of 824 companies by keyword.