Jobs API for Greenhouse, Lever and Ashby job boards (JSON)
By the RoleDawn team · Published · Updated
RoleDawn Jobs API returns every open job on a company's Greenhouse, Lever or Ashby job board as JSON, with the same fields for all three: title, location, department, remote, job URL and posting date. Send one GET request to https://roledawn.com/api/v1/jobs?ats=greenhouse&company=stripe. No API key is needed for the public demo (50 requests per IP per day); for production volume, subscribe on RapidAPI.
- One schema for three ATS. No per-ATS parsing: Greenhouse, Lever and Ashby jobs come back with identical fields.
- Any company with a public board. You choose the company; the board is read live, so there is no waiting for a database to add it.
- Filters and paging built in. Remote only, title text, location text, up to 500 jobs per page.
- Fast repeat calls. Boards are cached at the Cloudflare edge for up to 15 minutes;
X-Cache: HITtells you when. - OpenAPI 3 spec at /api/openapi.json, CORS enabled, JSON errors with stable codes.
How do I get all jobs from a Greenhouse job board as JSON?
Take the slug from the company's Greenhouse careers URL (boards.greenhouse.io/stripe or job-boards.greenhouse.io/stripe) and call:
curl "https://roledawn.com/api/v1/jobs?ats=greenhouse&company=stripe&limit=2"
Real response, captured 2026-10-07 (733 matching jobs on the board that day; limit=2 keeps the example short):
{
"ats": "greenhouse",
"company": "stripe",
"company_name": "Stripe",
"board_url": "https://job-boards.greenhouse.io/stripe",
"fetched_at": "2026-10-07T09:32:29.178Z",
"total": 733,
"count": 2,
"limit": 2,
"offset": 0,
"next_offset": 2,
"jobs": [
{
"id": "8241345",
"title": "Account Executive, Velocity Scaled Grower (Italian or Spanish fluency)",
"company": "stripe",
"company_name": "Stripe",
"ats": "greenhouse",
"location": "Dublin",
"department": "1185 Account Executives (EMEA)",
"remote": false,
"url": "https://stripe.com/jobs/search?gh_jid=8241345",
"posted_at": "2026-10-07T09:23:16.000Z"
},
{
"id": "8257892",
"title": "Security Engineer, New Grad",
"company": "stripe",
"company_name": "Stripe",
"ats": "greenhouse",
"location": "Dublin",
"department": "5112 General University",
"remote": false,
"url": "https://stripe.com/jobs/search?gh_jid=8257892",
"posted_at": "2026-10-07T08:45:47.000Z"
}
]
}
Step by step, with remote filtering and paging: How to Get Greenhouse Job Postings via API (No Harvest API Key).
How do I get Lever job postings through an API?
Lever boards live at jobs.lever.co/slug. Use that slug with ats=lever:
curl "https://roledawn.com/api/v1/jobs?ats=lever&company=palantir&limit=2"
Real response, captured 2026-10-07 (314 matching jobs on the board that day; limit=2 keeps the example short):
{
"ats": "lever",
"company": "palantir",
"company_name": null,
"board_url": "https://jobs.lever.co/palantir",
"fetched_at": "2026-10-07T09:32:34.518Z",
"total": 314,
"count": 2,
"limit": 2,
"offset": 0,
"next_offset": 2,
"jobs": [
{
"id": "2bc07b65-3f3a-4565-8d7c-d015bed92166",
"title": "Contract Operations",
"company": "palantir",
"company_name": null,
"ats": "lever",
"location": "Washington, D.C.",
"department": "Legal",
"remote": false,
"url": "https://jobs.lever.co/palantir/2bc07b65-3f3a-4565-8d7c-d015bed92166",
"posted_at": "2026-09-25T15:29:56.130Z"
},
{
"id": "2a41a2e2-55a4-4641-a3bf-101b7616dd63",
"title": "Contract Operations",
"company": "palantir",
"company_name": null,
"ats": "lever",
"location": "Palo Alto, CA",
"department": "Legal",
"remote": false,
"url": "https://jobs.lever.co/palantir/2a41a2e2-55a4-4641-a3bf-101b7616dd63",
"posted_at": "2026-09-25T15:29:37.738Z"
}
]
}
Is there an API for Ashby job postings?
Yes. Ashby boards live at jobs.ashbyhq.com/slug. This example also asks for remote jobs only:
curl "https://roledawn.com/api/v1/jobs?ats=ashby&company=ramp&remote=true&limit=2"
Real response, captured 2026-10-07 (144 matching jobs on the board that day; limit=2 keeps the example short):
{
"ats": "ashby",
"company": "ramp",
"company_name": null,
"board_url": "https://jobs.ashbyhq.com/ramp",
"fetched_at": "2026-10-07T09:32:39.033Z",
"total": 144,
"count": 2,
"limit": 2,
"offset": 0,
"next_offset": 2,
"jobs": [
{
"id": "b599c5a9-9c9d-4826-b67a-ca5e012faaad",
"title": "Partner Development Representative | Reseller",
"company": "ramp",
"company_name": null,
"ats": "ashby",
"location": "New York, NY (HQ); Remote (US)",
"department": "Sales / Channel Sales",
"remote": true,
"url": "https://jobs.ashbyhq.com/ramp/b599c5a9-9c9d-4826-b67a-ca5e012faaad",
"posted_at": "2026-10-06T19:25:07.450Z"
},
{
"id": "cc0af88a-2a19-493d-93cf-c5090f986f1f",
"title": "AI Partnerships Manager",
"company": "ramp",
"company_name": null,
"ats": "ashby",
"location": "San Francisco, CA",
"department": "Business Development",
"remote": true,
"url": "https://jobs.ashbyhq.com/ramp/cc0af88a-2a19-493d-93cf-c5090f986f1f",
"posted_at": "2026-10-06T12:46:25.219Z"
}
]
}
Where do I find a company's board slug?
Open the company's careers page and click any job. The address shows the ATS and the slug:
| ATS | Careers URL | Request |
|---|---|---|
greenhouse | boards.greenhouse.io/stripe | ats=greenhouse&company=stripe |
lever | jobs.lever.co/palantir | ats=lever&company=palantir |
ashby | jobs.ashbyhq.com/ramp | ats=ashby&company=ramp |
Some companies show jobs on their own domain but still use an ATS underneath: Greenhouse links usually contain gh_jid=, and the board slug appears in the "Apply" link.
What fields does the API return?
The response has ats, company, company_name, board_url, fetched_at, total (jobs matching your filters), count, limit, offset, next_offset and jobs. Every job has:
| Field | Type | Meaning |
|---|---|---|
id | string | The job's ID in the ATS |
title | string | Job title as posted |
company | string | The board slug you requested |
company_name | string | null | Company name when the ATS provides it (Greenhouse) |
ats | string | greenhouse, lever or ashby |
location | string | null | Location text; several locations joined with "; " |
department | string | null | Department, or "Department / Team" when the ATS has both |
remote | boolean | true when the ATS marks the job remote or the location says Remote |
url | string | null | Public job post (apply page) |
posted_at | string | null | First published (Greenhouse, Ashby) or created (Lever), ISO 8601 UTC |
How do I filter remote jobs, search titles or page through a big board?
| Parameter | Use | |
|---|---|---|
ats | required | greenhouse, lever or ashby |
company | required | Board slug from the careers URL, e.g. stripe |
remote | optional | true = only remote jobs, false = only on-site/hybrid |
q | optional | Text that must appear in the title, e.g. engineer |
location | optional | Text that must appear in the location, e.g. London |
limit | optional | Jobs per page, 1–500 (default 100) |
offset | optional | Skip this many jobs; use next_offset from the previous page |
curl "https://roledawn.com/api/v1/jobs?ats=greenhouse&company=stripe&q=engineer&location=dublin"
curl "https://roledawn.com/api/v1/jobs?ats=greenhouse&company=stripe&limit=100&offset=100"
Jobs are sorted newest first. Filters and paging run on the cached board, so walking through a large board does not slow down.
How fresh is the data, and is there a rate limit?
- The first request for a board reads it live from the ATS (
X-Cache: MISS); later requests within 15 minutes are served from the edge cache (X-Cache: HIT).fetched_atis the time of the live read. - Direct calls to roledawn.com are a demo tier: 50 requests per IP per day (all RoleDawn APIs together, reset at 00:00 UTC) and 60 per minute. Responses carry
X-RateLimit-Daily-RemainingplusX-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset. - The Hiring Signals API also takes a free personal key (
X-RoleDawn-Key, 50 requests per key per day) for callers on shared IPs such as Clay or hosted AI agents; see Hiring Signals limits. The key does not change the Jobs and App Reviews limits. - Making many calls? Use RapidAPI. The ATS Jobs API on RapidAPI gives you an API key, monthly quotas from a free plan up, and usage dashboards. Same endpoints and fields.
- CORS is open (
Access-Control-Allow-Origin: *), so you can call it from a browser.
What do the error codes mean?
Errors are JSON with a stable code, a readable message and, for bad input, the param at fault.
| HTTP | code | When |
|---|---|---|
400 | missing_parameter | ats or company is missing |
400 | invalid_parameter | A parameter has a wrong value or is unknown; param names it |
404 | company_not_found | No public board with this slug on this ATS — check the careers URL |
429 | rate_limited | More than 60 requests in a minute; wait Retry-After seconds |
502 | upstream_error | The ATS returned an error; retry later |
503 | upstream_unavailable | The ATS is temporarily unavailable or throttling requests; wait Retry-After seconds |
503 | source_blocked | The ATS host's robots.txt does not allow the request right now |
504 | upstream_timeout | The ATS did not answer within 30 seconds; retry later |
Real response for an unknown board (HTTP 404), captured 2026-10-07:
{
"error": {
"code": "company_not_found",
"message": "No public greenhouse job board found for \"this-board-does-not-exist-123\". Check the slug in the company's careers-page URL.",
"param": "company",
"docs": "https://roledawn.com/api#errors"
}
}
How is the data collected?
Only from the public job-board endpoints that Greenhouse, Lever and Ashby offer for companies' own careers pages. Before any request to a host, the API reads that host's robots.txt and follows it; requests are rate-limited per ATS domain (Lever 1 per second, others 2 per second) and identify themselves as RoleDawnBot. No logins, no candidate data, no personal contact details. RoleDawn is not affiliated with Greenhouse, Lever or Ashby.
Is there also an API for App Store and Google Play reviews?
Yes. The RoleDawn App Reviews API returns app ratings, star histograms, versions and the reviews shown on the public store page for any App Store or Google Play app, in the same JSON fields for both stores: GET /api/v1/app?store=apple&id=324684580 and GET /api/v1/app-reviews?store=google&id=com.duolingo. Same host, same fair-use limit, same error format; every RoleDawn API is in /api/openapi.json.
Is there an API for companies that just started hiring a new team?
Yes. GET /api/v1/signals returns the companies that just posted their first role in a role family on their own careers page (type=first_hire, for example a first SDR or first RevOps hire) or are hiring clearly more in it than before (type=surge), each with the public job post. It is the same data and ranking as the free Weekly List sample: up to 20 companies per query, no API key needed to start.
curl "https://roledawn.com/api/v1/signals?family=sdr&since=7d&limit=2"
Real response, captured 2026-10-07 (39 matching companies that day; limit=2 keeps the example short):
{
"family": "sdr",
"since": "7d",
"type": "first_hire",
"window_start": "2026-09-30T10:44:43.779Z",
"generated_at": "2026-10-07T10:44:43.779Z",
"total": 39,
"count": 2,
"limit": 2,
"offset": 0,
"next_offset": 2,
"free_rows": 20,
"truncated": true,
"signals": [
{
"company": "SwiftConnect",
"company_key": "swiftconnect",
"company_url": "https://roledawn.com/companies/swiftconnect",
"title": "Sales Development Representative",
"family": "sdr",
"type": "first_hire",
"signal": "New SDR/BDR team",
"evidence": "New on their board",
"founding": true,
"location": "United States",
"job_url": "https://jobs.lever.co/swiftconnect/3305b93a-6112-4334-a4f5-cb0a36f5eeed",
"posted": "2026-10-06T18:58:48.406Z",
"detected": "2026-10-07T06:30:17.442Z",
"roles_last_30d": null,
"roles_prior_30d": null
},
{
"company": "Coperniq",
"company_key": "coperniq",
"company_url": "https://roledawn.com/companies/coperniq",
"title": "Founding BDR",
"family": "sdr",
"type": "first_hire",
"signal": "New SDR/BDR team",
"evidence": "Likely new team · inferred",
"founding": true,
"location": "Remote",
"job_url": "https://jobs.ashbyhq.com/coperniq/d89d3086-b05a-4fd4-adad-c8f44b11be07",
"posted": "2026-09-22T05:03:19.128Z",
"detected": "2026-10-05T19:07:14.382Z",
"roles_last_30d": null,
"roles_prior_30d": null
}
]
}
| Parameter | Use | |
|---|---|---|
family | required | Role family id, e.g. sdr, sales, revops; up to 5 comma-separated |
since | optional | 7d, 14d, 30d (default 7d): when the signal was detected |
type | optional | first_hire (default), surge or all |
limit | optional | Companies per page, 1–20 (default 20) |
offset | optional | Skip this many companies within the top 20; use next_offset |
Every company in signals has:
| Field | Type | Meaning |
|---|---|---|
company, company_key | string | Company name and RoleDawn company id |
company_url | string | RoleDawn company page with all open roles |
title | string | Title of the job post behind the signal |
family, type | string | Role family id; first_hire or surge |
signal | string | Readable signal, e.g. "New SDR/BDR team" |
evidence | string | "New on their board", "Likely new team · inferred", or role counts for a surge |
founding | boolean | The post calls the role "founding" or "first" |
location | string | null | Location text of the job post |
job_url | string | The company's own public job post |
posted, detected | ISO 8601 | When the job was posted and when RoleDawn detected the signal |
roles_last_30d, roles_prior_30d | integer | null | Surges only: roles in the family in the last 30 days and the 30 days before |
The response also has total (all matching companies), count, next_offset, free_rows (20) and truncated (true when more than 20 companies match). Results are cached at the edge for up to 15 minutes.
Limits. Without a key: 50 requests per IP per day (shared with the other RoleDawn APIs) and 60 per minute; repeat queries answered from the cache (X-Cache: HIT) do not count. Calling from a shared IP such as Clay or a hosted AI agent? Get a free personal API key (email only, shown right away) and send it as X-RoleDawn-Key: 50 requests per key per day, counted for you instead of the IP. An unknown key returns 401 invalid_key. Optionally name your integration in an X-Client header (letters, digits, / _ -, up to 64), e.g. X-Client: clay-http-column; it is used for usage stats only. Spec alone: /api/signals/openapi.json. Using Clay? How to pull hiring signals into Clay with an HTTP API column.
Role family ids: revops, sales-enablement, marketing-ops, sales, sdr, sales-engineering, partnerships, customer-success, account-management, support, professional-services, marketing, product-marketing, growth-marketing, content, devrel, community, software-engineering, frontend, mobile, platform-sre, security, compliance, qa, engineering-management, hardware, it, data-engineering, data-analytics, ml-ai, product-management, design, ux-research, technical-writing, finance, legal, people, recruiting, bizops, workplace, executive, clinical, supply-chain.
Can AI agents like Claude call these APIs directly (MCP)?
Yes. RoleDawn runs a remote Model Context Protocol server at https://roledawn.com/mcp (Streamable HTTP, no key, no sign-up) with four read-only tools: list_hiring_signals (companies that just started hiring in a role family), list_company_jobs (one company's Greenhouse, Lever or Ashby board), get_app and list_app_reviews (App Store and Google Play). Each tool call is one API request and shares the demo tier above (50 per IP per day). Hosted clients call from shared IPs, so for list_hiring_signals add your free key: as an X-RoleDawn-Key header, or as ?key= on the server URL for clients that only take a URL. It then counts 50 calls per day for your key instead of the IP.
claude mcp add --transport http roledawn https://roledawn.com/mcp
claude mcp add --transport http roledawn https://roledawn.com/mcp --header "X-RoleDawn-Key: rd_your_key"
In Claude Desktop or claude.ai, add it as a custom connector with the same URL (with your key: https://roledawn.com/mcp?key=rd_your_key). Clients that only run local (stdio) servers can bridge to it with npx mcp-remote https://roledawn.com/mcp. Step-by-step setup for Claude Code, Claude Desktop, Cursor and VS Code, with a real result from each tool: Hiring Signals MCP Server for Claude, Cursor and VS Code.
FAQ
Is there a free API for Greenhouse, Lever or Ashby job postings?
Yes. Direct calls to roledawn.com are a free demo with no API key or sign-up: 50 requests per IP per day and 60 per minute. For higher volume, use the RapidAPI listing (https://rapidapi.com/PENGCHENGLI/api/ats-jobs-api-greenhouse-lever-ashby-job-listings), which has a free plan and paid plans with API keys.
Do I need the company's ATS API key?
No. The API reads the public job board that the company publishes for candidates. It never logs in and never touches candidate data.
How fresh are the jobs?
Each board is read live from the ATS and cached for up to 15 minutes. The fetched_at field tells you exactly when the board was read.
Which applicant tracking systems are supported?
Greenhouse, Lever and Ashby. Pass ats=greenhouse, ats=lever or ats=ashby.
Is there an OpenAPI spec?
Yes: https://roledawn.com/api/openapi.json (OpenAPI 3.0). Import it into Postman, Insomnia or a code generator.
Related: OpenAPI spec · App Reviews API · Hiring signals in Clay · MCP server setup · Greenhouse job postings via API · RoleDawnBot crawler rules · Companies that just started hiring a new team · Contact us