RoleDawn

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: HIT tells 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:

ATSCareers URLRequest
greenhouseboards.greenhouse.io/stripeats=greenhouse&company=stripe
leverjobs.lever.co/palantirats=lever&company=palantir
ashbyjobs.ashbyhq.com/rampats=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:

FieldTypeMeaning
idstringThe job's ID in the ATS
titlestringJob title as posted
companystringThe board slug you requested
company_namestring | nullCompany name when the ATS provides it (Greenhouse)
atsstringgreenhouse, lever or ashby
locationstring | nullLocation text; several locations joined with "; "
departmentstring | nullDepartment, or "Department / Team" when the ATS has both
remotebooleantrue when the ATS marks the job remote or the location says Remote
urlstring | nullPublic job post (apply page)
posted_atstring | nullFirst published (Greenhouse, Ashby) or created (Lever), ISO 8601 UTC

How do I filter remote jobs, search titles or page through a big board?

ParameterUse
atsrequiredgreenhouse, lever or ashby
companyrequiredBoard slug from the careers URL, e.g. stripe
remoteoptionaltrue = only remote jobs, false = only on-site/hybrid
qoptionalText that must appear in the title, e.g. engineer
locationoptionalText that must appear in the location, e.g. London
limitoptionalJobs per page, 1–500 (default 100)
offsetoptionalSkip 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_at is 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-Remaining plus X-RateLimit-Limit, X-RateLimit-Remaining and X-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.

HTTPcodeWhen
400missing_parameterats or company is missing
400invalid_parameterA parameter has a wrong value or is unknown; param names it
404company_not_foundNo public board with this slug on this ATS — check the careers URL
429rate_limitedMore than 60 requests in a minute; wait Retry-After seconds
502upstream_errorThe ATS returned an error; retry later
503upstream_unavailableThe ATS is temporarily unavailable or throttling requests; wait Retry-After seconds
503source_blockedThe ATS host's robots.txt does not allow the request right now
504upstream_timeoutThe 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
    }
  ]
}
ParameterUse
familyrequiredRole family id, e.g. sdr, sales, revops; up to 5 comma-separated
sinceoptional7d, 14d, 30d (default 7d): when the signal was detected
typeoptionalfirst_hire (default), surge or all
limitoptionalCompanies per page, 1–20 (default 20)
offsetoptionalSkip this many companies within the top 20; use next_offset

Every company in signals has:

FieldTypeMeaning
company, company_keystringCompany name and RoleDawn company id
company_urlstringRoleDawn company page with all open roles
titlestringTitle of the job post behind the signal
family, typestringRole family id; first_hire or surge
signalstringReadable signal, e.g. "New SDR/BDR team"
evidencestring"New on their board", "Likely new team · inferred", or role counts for a surge
foundingbooleanThe post calls the role "founding" or "first"
locationstring | nullLocation text of the job post
job_urlstringThe company's own public job post
posted, detectedISO 8601When the job was posted and when RoleDawn detected the signal
roles_last_30d, roles_prior_30dinteger | nullSurges 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