Ashby is where venture-backed hiring lives
If you're tracking hiring at startups and scale-ups, Ashby shows up constantly. It's become one of the default ATS choices for venture-backed companies, and its careers pages (jobs.ashbyhq.com/{orgSlug}) tend to publish more than most — real team names, workplace type (remote/hybrid/on-site), and often a compensation band, since a chunk of Ashby's customer base operates in markets with pay-transparency requirements.
That combination — startup hiring signal plus actual comp data — is exactly why I built a dedicated Ashby jobs scraper under the Devil Scrapes banner, separate from the Ashby coverage baked into our broader multi-ats-jobs-scraper. Ashby's board endpoint is different enough (its own GraphQL host, its own field set) to justify a purpose-built Actor rather than folding it into a generic multi-ATS tool.
What the data looks like
A single row from a real run:
{
"posting_id": "7af121a1-d29a-4745-84c1-ef1b58a3b840",
"title": "3P Silicon Architect",
"org_slug": "openai",
"team_name": null,
"location_name": "San Francisco",
"workplace_type": "Hybrid",
"employment_type": "FullTime",
"secondary_locations": ["Seattle"],
"compensation_summary": "$342K – $555K • Offers Equity",
"apply_url": "https://jobs.ashbyhq.com/openai/7af121a1-d29a-4745-84c1-ef1b58a3b840",
"scraped_at": "2026-07-26T15:00:00Z"
}
compensation_summary is the field most scrapers skip because it requires trusting the org actually published one — we surface it exactly as given, null when it wasn't, never a guess.
The naive approach and why it stalls
Ashby's board data lives behind an internal GraphQL endpoint (jobs.ashbyhq.com/api/non-user-graphql?op=ApiJobBoardWithTeams) rather than a documented public API, which means the honest starting point for most people is opening devtools, watching the careers page load, and copying the request. That gets you a proof of concept in twenty minutes. It gets messier once you try to run it against more than one org reliably:
-
GraphQL isn't a stable public contract. There's no versioned docs page — you're reverse-engineering the operation name and payload shape from network traffic, and you need to handle the response's nested
teamshierarchy correctly to get real department-style groupings instead of guessing. -
Team names require a join, not a lookup.
team_nameisn't sitting flat on each posting — it's referenced by ID against a separateteamsarray in the same response, and getting that join wrong silently produces blank team fields. - A batch across many orgs needs resilience. One org having zero open roles, or a slug that doesn't exist at all, shouldn't take down the rest of a 20-org run.
The Actor
Ashby Jobs Scraper fetches an org's entire board in one GraphQL call — no pagination — joins the team hierarchy into a clean team_name field, and constructs a guaranteed-live apply_url without a second HTTP request. We rotate browser TLS fingerprints and retry transient 429/5xx responses with backoff so a multi-org batch finishes even when one org's board hiccups mid-run.
from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("DevilScrapes/ashby-jobs-scraper").call(run_input={
"orgSlugs": ["openai", "ramp"],
"maxResultsPerOrg": 100,
"locationFilter": None,
"proxyConfiguration": {"useApifyProxy": True},
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["team_name"], item["compensation_summary"])
Or drop the same JSON straight into the Apify Console input form for a one-off pull.
What you'd actually use this for
- Recruiting & sourcing against startups — track what a target company is hiring for, on which team, at what comp band, all normalized.
- Hiring-intent signal for GTM/SDR teams — a burst of open reqs at a funded startup is a leading indicator worth watching before a headcount announcement goes public.
- Job-board aggregation — Ashby coverage slots next to our Workday, SmartRecruiters, and Multi-ATS scrapers.
- Compensation benchmarking — a structured feed of published comp bands across companies that use Ashby, useful for comp-research and market-rate studies.
- HR-tech pipelines — wire rows straight into a CRM, dashboard, or n8n/Make workflow on a schedule.
Pricing, honestly
$0.005 per run flat, plus $0.0015 per posting written. A 1,000-posting run costs $1.505 total. An org with zero open roles costs nothing beyond the warm-up fee. Apify's $5 free credit for new accounts covers roughly 3,300 postings before you spend anything yourself.
Why this is more interesting than it looks
The genuinely tricky part isn't the fetch — Ashby returns a full board in one response, which is a gift compared to paginated APIs. It's building the apply_url reliably without a second request. Ashby's schema doesn't hand you a ready-made canonical link on every posting; constructing one that's guaranteed to resolve, across arbitrary orgs you've never scraped before, without an extra round-trip per posting, is where the real work went.
Honest limitations
This Actor covers Ashby only — Greenhouse, Lever, Workday, and SmartRecruiters live in sibling Actors. There's no first-class department field in Ashby's schema; team_name is the closest real grouping signal it exposes. There's no org-name enrichment either — org_slug is exactly the input slug you gave us, since the endpoint itself doesn't expose a display name. And it reflects the board's current, live state only — no historical or removed postings.
Try it
Ashby Jobs Scraper is live on the Apify Store at $1.50 per 1,000 results, with Apify's standard $5 free trial credit and no card needed to start. It's part of a growing ATS-coverage fleet under Devil Scrapes — BambooHR, Recruitee, Personio, and Breezy HR are all covered too.
What's the trickiest Ashby board you've tried to scrape? Drop it in the comments — genuinely curious what edge cases are out there.
Top comments (0)