Workable Jobs API - Search 66 Boards, No Company List avatar

Workable Jobs API - Search 66 Boards, No Company List

Pricing

from $2.00 / 1,000 job records

Go to Apify Store
Workable Jobs API - Search 66 Boards, No Company List

Workable Jobs API - Search 66 Boards, No Company List

Query an index of 66 verified Workable boards — 1,116 open roles — with no account slugs of your own. Filter by title, location, remote and posting date, or name your own boards. Deduped so scheduled runs return only new roles. Free sync to Notion, HubSpot or Airtable.

Pricing

from $2.00 / 1,000 job records

Rating

0.0

(0)

Developer

K O

K O

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Workable Jobs Scraper — Description, Requirements and Benefits, Split Out

The only one of our ATS board scrapers that returns a posting's requirements and benefits as their own fields, instead of folding everything into one description blob. Turn on includeDescription and you get descriptionHtml, requirementsHtml and benefitsHtml back separately, each pulled from Workable's per-job detail endpoint.

Pain points

  • Workable's public widget API lists jobs, but the full description, requirements and benefits live on a separate per-job detail endpoint you have to call individually — there's no bulk detail fetch.
  • Multi-country postings need flattening; most scrapers keep only one location string and lose the rest.
  • Most job scrapers that do fetch the full posting body hand it back as one undifferentiated blob — you have to re-parse it yourself if you actually want "requirements" separate from "description."
  • Watching a list of accounts for genuinely new roles means storing what you already pulled and diffing every run yourself.

What we solve

  • Three-way structured content. With includeDescription on, each posting's detail call is split into descriptionHtml, requirementsHtml and benefitsHtml — three fields, not one blob.
  • Deduplicated country coverage. countries is a deduplicated array of every country a posting is open to, built from Workable's per-location list.
  • Multi-board in one run. Pass a list of companies; an account slug that fails or was renamed is skipped with a logged warning, not a fatal error — the rest of your list still comes back.
  • Dedup built in. onlyNewSinceLastRun (default on) persists the last 20,000 posting ids seen, so a recurring schedule only bills for postings that are genuinely new.

Who uses it

Recruiters and sourcers, job-board and ATS aggregators, sales teams tracking a target account's hiring, labor-market analysts, and anyone building a "new roles at companies I follow" alert.

Search every board we know - no company list at all

Turn on Search every board we know and you do not supply companies, slugs or bundles. The run queries our index of 66 verified workable boards - 1,116 open roles at the last check on 2026-08-24 - and applies your title, location and remote filters across all of them.

Ask it things a company list cannot answer:

  • every remote senior backend role posted this week
  • everything matching "machine learning" across every board in the index
  • new postings only, across the whole index, on a daily schedule
ATSBoards
workable66

Every board in the index answered its ATS with at least one open role when the index was built. Boards are fetched most-active first and capped by Maximum boards to search (default 200), because each board is one request. The index is rebuilt on a refresh sweep; a board that stops answering three sweeps running is retired from it, and anything that fails during your run is reported in FAILED_TARGETS rather than silently shrinking your results.

Input

FieldWhat it does
searchIndexNo company list at all. Query every board in the shipped index and apply your filters across all of them. See the section above.
maxBoardsOnly used with searchIndex. Each board is one request, so this caps run length. Boards are searched most-active first.
companiesOne or more Workable account slugs — the slug in apply.workable.com/<slug> (e.g. walter-careers, welcome-jobs).
maxPerCompanyStop after this many jobs from each board, so one large employer cannot fill the whole result. Recommended with index search. Empty = no cap.
titleIncludesKeep only jobs whose title contains one of these keywords (case-insensitive). Empty = all. Applied before billing.
locationIncludesKeep only jobs whose location contains one of these keywords. Empty = all. Applied before billing.
remoteOnlyKeep only remote-flagged roles (or locations mentioning remote). Applied before billing.
postedWithinDaysKeep only postings published in the last N days — 7 gives you this week's roles. Postings on boards that publish no date are left out, because they cannot be shown to be recent. Applied before billing.
includeDescriptionFetch each posting's full HTML description, requirements and benefits (one extra request per job). Off by default for lean records.
onlyNewSinceLastRunRecommended for schedules — skips jobs already returned by a previous run, so you're only charged for genuinely new postings. Default true.
maxItemsStop after this many normalized records.
syncEnabledOptional, off by default. Also send each new job straight to a connected app — see Sync below.
syncDestination, syncWriteTool, syncFieldMap, syncExtraArgsOnly used when syncEnabled is on.

Output

FieldDescription
jobIdWorkable's posting shortcode.
codeEmployer-assigned requisition code, when set.
companyAccount display name (falls back to the slug you queried).
titleJob title.
locationBuilt from city/state/country, or "Remote" when telecommuting and no location is set.
countriesArray, deduplicated — every country this posting is open to.
remoteBoolean, from Workable's telecommuting flag.
departmentDepartment, when Workable provides one.
employmentTypee.g. Full-time.
publishedOnPublish date.
createdAtCreation date.
urlPublic posting URL.
applicationUrlDirect apply-form URL.
descriptionHtmlFull HTML description — only when includeDescription is on; otherwise null.
requirementsHtmlRequirements, as its own HTML field — only when includeDescription is on; otherwise null.
benefitsHtmlBenefits, as its own HTML field — only when includeDescription is on; otherwise null.
sourceAlways "Workable".
jobFunctionWorkable's job-function tag, where the account sets one.
industryWorkable's industry tag, where the account sets one.
experienceLevelWorkable's experience tag, where the account sets one.
educationWorkable's education tag, where the account sets one.
workplaceWorkable's workplace label, from the job detail.
salaryMin / salaryMaxPay range as plain numbers, so you can sort and filter on it. null when the posting does not state pay — never a guess.
salaryCurrencyISO code (USD, EUR, GBP, …) where the posting makes it clear.
salaryIntervalYEAR, MONTH, WEEK, DAY or HOUR.
salaryTextThe pay exactly as the posting worded it, kept so you can audit the parse.
salarySourceats when the board published structured pay, ats-summary or description when it was read out of the posting text. null when no pay was found.
cityDerived / regionDerived / countryDerived / countryCodeDerivedThe location string split into parts, so "Austin, TX" is filterable by state and country instead of by substring.
locationTypeREMOTE, HYBRID or ONSITE.
seniorityLevelINTERN, JUNIOR, SENIOR, STAFF, PRINCIPAL, MANAGER, DIRECTOR, VP or EXECUTIVE, read from the title. null when the title carries no signal.
employmentTypeNormalizedFULL_TIME, PART_TIME, CONTRACT, INTERN, APPRENTICESHIP or VOLUNTEER — one enum across every ATS, so records are comparable.
daysSincePostedWhole days since the posting went live, precomputed.
organizationUrlThe public careers board this posting came from.

Pay coverage. Workable's job list carries no pay field, so pay can only be read from the job detail — meaning salaryMin/salaryMax populate only when includeDescription is on, and only for postings that state pay in the text.

This is a real record, captured live from the walter-careers account on 08/21/2026 — not a placeholder:

{
"jobId": "E53A5AB739",
"code": null,
"company": "Walter",
"title": "Talent Sourcer",
"location": "Brazil",
"countries": [
"Brazil"
],
"remote": true,
"department": "Arc Dev",
"employmentType": "Full-time",
"publishedOn": "2026-05-08",
"createdAt": "2026-05-08",
"url": "https://apply.workable.com/j/E53A5AB739",
"applicationUrl": "https://apply.workable.com/j/E53A5AB739/apply",
"descriptionHtml": "<h3><strong>Talent Sourcer @ Arc.Dev</strong></h3><p><strong>Job Title:</strong> Talent Sourcer</p><p><strong>Locatio...",
"requirementsHtml": "<ul><li>0–2 years of experience in sourcing, recruiting, sales, or a similar role</li></ul><ul><li>Interest in tech r...",
"benefitsHtml": "<p><strong>What We Offer</strong></p><ul><li>Fully remote team and flexible working setup</li></ul><ul><li>Onboarding...",
"source": "Workable",
"salaryMin": 600,
"salaryMax": 900,
"salaryCurrency": null,
"salaryInterval": null,
"salaryText": "600-900",
"salarySource": "description",
"cityDerived": null,
"regionDerived": null,
"countryDerived": "Brazil",
"countryCodeDerived": "BR",
"locationType": "REMOTE",
"seniorityLevel": null,
"employmentTypeNormalized": "FULL_TIME",
"daysSincePosted": 105,
"organizationUrl": "https://apply.workable.com/walter-careers/",
"jobFunction": "Human Resources",
"industry": "Staffing and Recruiting",
"experienceLevel": "Entry level",
"education": null,
"workplace": "remote"
}

Which actor do I want?

  • Tracking Workable boards specifically, and want requirements/benefits split from the description, or full country coverage? You're in the right place.
  • Tracking companies across Workable and Greenhouse, Lever, Ashby, SmartRecruiters or Recruitee in one feed? Use Job Postings Aggregator — one schema, one dedup layer, across all six ATS platforms. Its unified schema doesn't carry requirementsHtml, benefitsHtml, countries or code — pull from here directly if you need those.
  • Need a different single board? Greenhouse Jobs Scraper (multi-department/office tagging) · Lever Jobs Scraper (remote/hybrid/onsite detail) · Ashby Jobs Scraper (published salary)

Sync to your CRM, Notion, HubSpot, Airtable or Supabase (optional)

Turn on syncEnabled to also send each new job straight to a connected app — free, with no extra charge. Connect the app under Integrations in Apify Console, pick it as syncDestination, and set syncWriteTool to the name of the tool that creates one record there (run the dataset-sync-connector Actor in list-tools mode against the same connector if you don't know the name). A sync failure is logged as a warning and never blocks the dataset — your jobs always land here first regardless of what the destination does.

Pricing (Pay-Per-Event)

  • query — charged once per run for the board poll, regardless of how many companies you list.
  • job-record — charged per normalized job pushed (after dedup). This is the primary event.
  • apify-actor-start (Apify-managed) — covers baseline compute per run.
  • Sync to a connected app (optional) — free. No event is charged for records sent to a destination; it's an added convenience on top of the dataset you already paid for.

A daily monitor of a handful of companies returns a few new roles for pennies; a full-board pull of a large employer is a larger one-time run you control with maxItems.

Source & reliability

Data comes from Workable's public apply.workable.com careers API. No API key, no proxy needed. An account slug that 404s or fails is skipped with a logged warning — it doesn't fail the rest of your run. Run npm test for the offline self-test covering the normalizer and its edge cases.

FAQ

How am I charged?

A flat query event once per run, plus one job-record event per normalized job actually pushed to the dataset. With onlyNewSinceLastRun on (the default), a posting already returned in a previous run (tracked by id, for the most recent 20,000 seen) is skipped and not re-charged.

Where does the data come from?

Workable's public careers widget API (apply.workable.com) — the same data Workable's own hosted careers pages are built from. No API key or proxy required.

How fresh is it?

Live at request time — there's no bundled or cached dataset behind this actor, it calls Workable directly on every run. Schedule it (daily or weekly) to keep catching new postings; onlyNewSinceLastRun means a recurring schedule only bills for roles you haven't seen yet.

Can I get full job descriptions?

Yes — set includeDescription to true and each record includes the HTML description, requirements and benefits as three separate fields (one extra request per job).

Which actor do I want?

See Which actor do I want? above — short version: single Workable boards with the description/requirements/benefits split, stay here; multiple ATS platforms in one feed, use jobs-aggregator.


SEO keywords: Workable jobs scraper, Workable careers API, job posting scraper, ATS scraper, new jobs feed, hiring signals, recruiting data API, job board aggregator