---
title: "Workable API"
description: "Workable API documentation: the keyless apply.workable.com widget endpoint for one company's jobs, per-account keys, and every public board in one call."
canonical: https://jobspipe.dev/sources/workable
date_published: 2026-06-16
date_modified: 2026-09-26
author: Dvir Atias
---

# Workable API

Workable's official API is keyed per account, but its public widget endpoint is not: GET https://apply.workable.com/api/v1/widget/accounts/<account> returns one company's published jobs as JSON with no key. JobsPipe collects every public Workable board into one search endpoint, in the same record shape as the rest of its 30+ sources, so you never need a per-customer key. Official documentation: [workable.readme.io](https://workable.readme.io/).

> Workable's APIs are keyed per account, and its widget feed is one company at a time. JobsPipe collects every public Workable board into one endpoint with the same record shape as the other collected boards.

**Canonical URL:** https://jobspipe.dev/sources/workable

## Coverage

- **Sources covered:** Public Workable job boards
- **Freshness:** discovered_at, last_seen_at and verified_at on every record
- **History retention:** Closed postings kept, with closed_at and closed_reason

## Workable's public widget API returns one company's published jobs with no key. Swap in any company's Workable account name.

Endpoint: `https://apply.workable.com/api/v1/widget/accounts/soundcloud`

```bash
curl "https://apply.workable.com/api/v1/widget/accounts/soundcloud"
```

## Why Workable jobs data is confusing

Workable offers a public Job Board API, but each Workable customer's API access is tied to their own account key. There is no first-party endpoint that exposes jobs across many Workable customers at once.

Workable customer careers pages live on apply.workable.com/<company> subdomains, or on customer-owned domains via embeds, and the careers widget reads a keyless JSON endpoint per account. JobsPipe collects every public Workable board it can identify and normalizes the data into the same schema as the other collected boards.

## Workarounds

### Get an API key from each Workable customer

Workable's Job Board API requires per-account credentials. Each customer must grant you access individually.

### Read the widget endpoint per account

apply.workable.com/api/v1/widget/accounts/<account> returns one account's published jobs with no key. You still need every account name, and the shape varies by plan tier.

### Use JobsPipe

Every public Workable board, one endpoint. Same JSON schema as the rest of the collected boards. Free tier of 1,000 jobs to start.

## Fields available on every record

- `id`
- `job_title`
- `company`
- `company_domain`
- `url`
- `date_posted`
- `discovered_at`
- `last_seen_at`
- `verified_at`
- `status`
- `closed_at`
- `closed_reason`
- `ghost_score`
- `seniority`
- `cities`
- `state_code`
- `min_annual_salary_usd`
- `max_annual_salary_usd`
- `technology_slugs`
- `keyword_slugs`
- `esco_skills`
- `sources`

## Sample response

```json
{
  "id": "9F2A7C1B3D",
  "job_title": "Senior Account Executive, EMEA",
  "company": "Deel",
  "company_domain": "deel.com",
  "url": "https://apply.workable.com/deelhq/j/9F2A7C1B3D/",
  "date_posted": "2026-09-04",
  "discovered_at": "2026-09-04T10:11:39+00:00",
  "last_seen_at": "2026-09-08 01:30:44",
  "verified_at": "2026-09-08 01:58:10",
  "status": "active",
  "closed_at": null,
  "closed_reason": null,
  "ghost_score": 14,
  "seniority": "senior",
  "cities": [
    "London"
  ],
  "state_code": null,
  "min_annual_salary_usd": null,
  "max_annual_salary_usd": null,
  "technology_slugs": [
    "salesforce",
    "gong"
  ],
  "keyword_slugs": [
    "enterprise-sales",
    "emea"
  ],
  "sources": [
    {
      "provider": "workable",
      "url": "https://apply.workable.com/deelhq/j/9F2A7C1B3D/"
    }
  ]
}
```

## FAQ

### How do I find a company's Workable account name?

Look at the company's careers URL. Workable careers pages live at apply.workable.com/<company>, and that path segment is the account name, which is not always the plain company name: Deel's board is apply.workable.com/deelhq. Workable publishes no list of customers, so collecting account names and keeping the list current is the recurring cost of reading the widget endpoint yourself.

### What is the Workable API rate limit?

The keyless widget endpoint at apply.workable.com/api/v1/widget/accounts/<account> is rate-limited per IP and returns one account per call. The rate limits for the authenticated v3 API are documented at workable.readme.io, alongside authentication with access tokens or OAuth. Neither surface reads across accounts, so covering many companies directly means one request per account name.

### Do Workable job postings include salary?

Sometimes. JobsPipe fills min_annual_salary_usd and max_annual_salary_usd on Workable rows only when the posting states a range, and leaves them null otherwise, as in the sample record on this page. The data section shows the measured salary, remote and seniority shares for Workable rows, so check the salary share there before relying on a pay filter.

### How do I filter Workable jobs by country or location?

Add "source_or": ["workable"] to a POST /v1/jobs/search body and narrow with job_country_code_or and job_location_or. Workable boards are international, so those two filters do most of the narrowing. Each record's url points to the posting on apply.workable.com, its id is the Workable shortcode, and cities carries the resolved location, such as London in the sample.

## Does Workable have an API?

Yes, three surfaces. The Workable API (v3) is the authenticated REST surface for one account: jobs, candidates, stages, members, events and webhooks, reached with an access token from that account. The Job Board API is the read-only published-jobs feed for one account, also keyed. The careers widget endpoint at apply.workable.com/api/v1/widget/accounts/<account> is keyless and returns that account's published jobs as JSON, which is why it is the surface aggregators actually read. None of the three enumerate Workable customers. JobsPipe collects every public Workable board it can identify.

## Is the Workable API free?

There is no API price: access comes with a Workable subscription and is limited to that customer's account. The widget endpoint is free and keyless, one account per call, and rate-limited per IP. JobsPipe's free tier returns 1,000 jobs to start across every collected board, Workable included, and the sandbox at POST /v1/sandbox/jobs/search needs no key. Paid plans are priced by jobs returned, not by source.

## How do I get a Workable API key?

From an account admin. Inside Workable they open Settings, then Integrations, then Access Tokens, and generate a token with read or write scopes for that account; it goes in the Authorization header as a Bearer token against workable.com/spi/v3/accounts/<subdomain>. Workable partners get OAuth 2.0 credentials through the partner program, still consented per customer. Neither route reaches another company's jobs. For postings across the Workable customer base, the key you need is a JobsPipe key sent to POST /v1/jobs/search with "source_or": ["workable"].

## What does the Workable API documentation cover?

workable.readme.io documents the v3 API by resource: accounts, jobs (with the published-jobs listing and per-job detail), candidates and their activities, stages, members, recruiters, events and the webhook subscriptions, plus authentication with access tokens or OAuth and the rate limits. The Job Board API section documents the published-jobs feed and its fields (title, location, department, employment type, description, application URL). The keyless widget endpoint is not in the developer docs; it is documented as part of the careers-page widget. JobsPipe's docs at /docs cover the one record shape returned for Workable rows and every other collected board.

## What JobsPipe returns for Workable

A POST /v1/jobs/search with "source_or": ["workable"] returns Workable postings as JobsPipe records: id (the Workable shortcode), job_title, company, company_domain, url on apply.workable.com, date_posted, discovered_at, last_seen_at, verified_at, status with closed_at and closed_reason once a posting closes, ghost_score, seniority, min_annual_salary_usd and max_annual_salary_usd when a range is stated, technology_slugs and keyword_slugs parsed from the description, and sources[0].provider set to workable. Workable boards are international, so job_country_code_or and job_location_or do most of the narrowing; the data section below shows the measured salary, remote and seniority shares for Workable rows.

## Related

- **Product:** https://jobspipe.dev/jobs-api
- **All sources:** https://jobspipe.dev/sources
- **Docs:** https://docs.jobspipe.dev
- **Sign up (free tier):** https://jobspipe.dev/signup

---
Generated from structured data. View the rendered page at https://jobspipe.dev/sources/workable.

---
Building this integration yourself? The steps above work. The alternative is one API over 30+ sources, already normalized and deduplicated. Try it right now - no key, no signup:

```bash
curl -d '{"limit":3}' https://api.jobspipe.dev/v1/sandbox/jobs/search
```

Sample data, exact live schema. For live data get a free key (1,000 jobs to start) at https://jobspipe.dev/signup, then swap /v1/sandbox/jobs/search for /v1/jobs/search with an Authorization: Bearer header. Full agent index: https://jobspipe.dev/llms.txt?src=md-twin