Jobs API endpoint
Lists an organization's public Ashby board postings with inline detail (description, compensation when include_compensation=true). The org is the Ashby slug from its careers URL. An unknown org returns an empty board (Ashby does not 404).
/jobs/ashby/boardQuery parameters:
org (required) — the Ashby org slug from its careers URL (e.g. openai).include_compensation (optional, bool) — include the compensation summary.Returns provider, company, count, total, and jobs[] (provider, id, title, company, department, team, location, locations[], remote, workplace_type, employment_type, url, apply_url, req_id, posted_at, posted_age_text, description_html, description_text, compensation, compensation_min, compensation_max, compensation_currency, compensation_period) plus source_url. Ashby does not provide a per-job company/org display name, so each job's company is the org slug. compensation is Ashby's raw free-text summary (only present when include_compensation=true); compensation_min/compensation_max/compensation_currency are parsed from it when it contains a recognizable pay range/amount, and compensation_period (one of hourly, daily, weekly, monthly, yearly) is set when the summary states an explicit pay period — most single-figure ranges don't state one and leave it empty rather than assuming yearly. When the compensation summary is blank or unparseable, the compensation_* fields fall back to a pay figure stated inline in the description, when present.
| Field | Filled in, of 164 checked | Values in the sample |
|---|---|---|
| provider | 164 | ashby in all 164 |
| id | 164 | |
| title | 164 | “Security Engineer, Cloud” and 162 other values |
| company | 164 | RAMP in all 164 |
| department | 164 | “Engineering” and 14 other values |
| team | 164 | “Backend” and 41 other values |
| location | 164 | New York, NY (HQ) (128), London, UK (12), Remote (US) (10) and 2 more |
| locations | 96 | median 2 entries |
| remote | 147 | true in 147 of 147 |
| workplace_type | 164 | Hybrid (133), OnSite (17), Remote (14) |
| employment_type | 164 | FullTime (156), Intern (5), Temporary (3) |
| url | 164 | jobs.ashbyhq.com |
| apply_url | 164 | jobs.ashbyhq.com |
| posted_at | 164 | 2023-03-09 to 2026-10-13 |
| description_html | 164 | median 9,179 characters |
| description_text | 164 | median 6,151 characters |
| compensation | 14 | “USD 108000 – 148000” and 9 other values |
| compensation_min | 14 | 10 to 600,000, median 60,000 |
| compensation_max | 14 | 12,500 to 600,000, median 70,000 |
| compensation_currency | 14 | USD (13), GBP (1) |
| compensation_period | 6 | monthly (3), weekly (2), yearly (1) |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| org | string | Yes | Ashby org slug (careers URL) | openai | |
| include_compensation | boolean | No | Include compensation summary | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/jobs/ashby/board?org=openai&include_compensation=true" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"provider": "ashby",
"company": "ramp",
"count": 127,
"total": 127,
"jobs": [
{
"provider": "ashby",
"id": "e1",
"title": "Technical Consultant",
"company": "ramp",
"department": "GTM",
"location": "New York",
"remote": false,
"employment_type": "FullTime",
"url": "https://jobs.ashbyhq.com/ramp/e1",
"compensation": "$151K – $231K • Offers Equity",
"compensation_min": 151000,
"compensation_max": 231000,
"compensation_currency": "USD",
"posted_at": "2026-07-05T00:00:00Z"
}
],
"source_url": "https://api.ashbyhq.com/posting-api/job-board/ramp?includeCompensation=true"
}
}Request schema
No body schema
Response schema
#/definitions/jobs.boardResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | jobs.BoardResponse | No | ||||
| data.company | string | No | Company or board name the postings belong to. | |||
| data.count | integer | No | Number of jobs returned in this response. | |||
| data.jobs | array | No | Job postings on the board, one item per posting. | |||
| data.jobs[].ai_tools_mentioned | array | No | AITools lists canonical AI tool and platform names mentioned in the job title or description, such as "ChatGPT" or "GitHub Copilot". | |||
| data.jobs[].apply_url | string | No | Link to the application page for the job. | |||
| data.jobs[].benefits_mentioned | array | No | Benefits, Clearance, and Education contain canonical requirements and offerings mentioned in the job title or description. | |||
| data.jobs[].company | string | No | Name of the hiring company. | |||
| data.jobs[].company_logo_url | string | No | URL of the company's logo. | |||
| data.jobs[].compensation | string | No | Compensation is the raw provider summary; the *Min/*Max/*Currency fields are parsed from it when the summary contains a recognizable pay range/amount. CompensationPeriod is the pay period ("hourly", "daily", "weekly", "monthly", "yearly") when the summary states one explicitly; empty when no period is stated (most single "$150K – $190K"-style ranges are implicitly annual but that is never asserted here). | |||
| data.jobs[].compensation_currency | string | No | Currency code of the pay range, for example `USD`. | |||
| data.jobs[].compensation_max | number | No | Upper end of the pay range stated in the posting. | |||
| data.jobs[].compensation_min | number | No | Lower end of the pay range stated in the posting. | |||
| data.jobs[].compensation_period | string | No | Pay period the posting states: `hourly`, `daily`, `weekly`, `monthly` or `yearly`. Omitted when the posting names none. | |||
| data.jobs[].department | string | No | Department the job belongs to. | |||
| data.jobs[].description_html | string | No | Job description as HTML. | |||
| data.jobs[].description_text | string | No | Job description as plain text. | |||
| data.jobs[].education_level_required | array | No | Education levels mentioned in the job title or description. | |||
| data.jobs[].employment_type | string | No | Employment type the provider lists, such as full-time or contract. | |||
| data.jobs[].id | string | No | Posting id within the provider. Use it with the provider's job endpoint. | |||
| data.jobs[].location | string | No | Primary job location as the provider shows it. | |||
| data.jobs[].location_city | string | No | LocationCity/State/Country are the structured components behind Location when the provider exposes them (or once the geo-enrich worker has resolved them from the free-text Location string) -- present only for the primary/first location, matching Location itself. | |||
| data.jobs[].location_country | string | No | Country of the primary location. | |||
| data.jobs[].location_state | string | No | State or region of the primary location. | |||
| data.jobs[].locations | array | No | All locations listed for the job. | |||
| data.jobs[].posted_age_text | string | No | Workday relative age ("Posted Today") | |||
| data.jobs[].posted_at | string | No | RFC3339 / date when the provider gives one | |||
| data.jobs[].provider | string | No | Applicant tracking system the posting comes from, for example `greenhouse` or `lever`. | |||
| data.jobs[].remote | boolean | No | True when the posting is marked as remote. | |||
| data.jobs[].req_id | string | No | Requisition id the company uses for the job. | |||
| data.jobs[].security_clearance_required | array | No | Security clearances mentioned in the job title or description. | |||
| data.jobs[].skills_mentioned | array | No | Skills lists canonical ESCO skill labels mentioned in the job title or description. | |||
| data.jobs[].team | string | No | Team the job belongs to. | |||
| data.jobs[].title | string | No | Job title as the company posted it. | |||
| data.jobs[].url | string | No | Link to the job posting page. | |||
| data.jobs[].workplace_type | string | No | Workplace arrangement the provider lists, such as remote, hybrid or on-site. | |||
| data.provider | string | No | Applicant tracking system the board was read from, for example `greenhouse` or `lever`. | |||
| data.source_url | string | No | URL the data was read from. | |||
| data.total | integer | No | Total number of open postings on the board, when the provider reports it. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/jobs/ashby/board?org=openai&include_compensation=true" \
-H "x-api-key: $CRAWLORA_API_KEY"