Skip to main content
Use Workable through Corsair: one client, typed API calls, local DB sync. Workable needs two things from each tenant: an API access token and the account subdomain (the acme in https://acme.workable.com). Generate the token in Workable under Settings, Integrations, “Generate new token”, and pick the scopes you need. The token is shown once. Corsair asks for both on the first call that needs them. Self-hosted setups can pass them to the factory instead:
Things to know:
  • Scopes. Each endpoint needs its own scope (r_jobs, r_candidates, r_account, w_departments, w_members, r_employees, w_employees, r_timeoff and so on). A token without it gets a 403. r_employees grants access to confidential employee data.
  • Public job board. publicJobs.list and publicLocations.list call Workable’s public careers API and need no token. Pass any subdomain to read another company’s open roles; without one they use the connected account’s.
  • Subdomain. Only letters, digits and hyphens are accepted, so requests always go to <subdomain>.workable.com.
  • Paging. jobs.list, candidates.list, members.list, requisitions.list and events.list take limit (up to 100) with since_id / max_id. paging.next in a response is the next page’s URL; pass its since_id back to fetch it. employees.list pages with limit (10, 20, 50 or 100 only) and offset instead.
  • Rate limit. Workable allows 10 requests per token in a rolling 10 seconds. A read that gets a 429 waits until the reset time Workable sends, then retries.
  • Writes are not retried. Workable has no idempotency keys, so creates, updates, invites and deletes fail fast on a 429 or a network error rather than risk running twice.
  • Department deletes and merges. Workable answers 409 unless you pass force: true, sometimes even when nothing else uses the department.
  • Time-off balances. timeoffBalances.list needs employee_id when the token is an account token.
What you get:
  • 35 typed API operations
  • 5 synced entities (candidates, departments, employees, jobs, members) for fast .search() / .list()

Setup

1

Install

2

Add the plugin

corsair.ts
Multi-tenancy is the default — scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.
3

Choose authentication

4

Connect a tenant

Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.

Example API calls

List jobs
Create a department
See the full list on the API page.

Query synced data

Candidates fetched by candidates.list are kept locally.
Synced entities: candidates, departments, employees, jobs, members. See Database for filters and operators.

What’s next

API reference

Every workable.api.* operation with input and output types.

Database

Synced entities, search filters, and operators.

Connect / OAuth

createLink, Hub delivery, and tenant connect flows.

Use with agents

Expose this plugin’s operations as MCP tools.