# Supported Job Boards Career-Ops scans job sources through provider modules in `providers/`. Each non-helper `*.mjs` file maps to one supported source. Files prefixed with `_` are shared helpers and are not loaded as providers. | Board | Type (API / Atom / RSS / parser) | Notes | | --- | --- | --- | | 4 Day Week | API | Reads the public `https://4dayweek.io/api/jobs` JSON feed (4-day-week / reduced-hours roles). Configure with `provider: 4dayweek`; paginates `?page=N` up to `max_pages` (default 3), drops expired postings, then scanner filters apply. | | a16z speedrun talent network | API | Board-wide aggregator for the a16z speedrun + wider a16z portfolio (~200 startups). Auto-detects `speedrun-talent-network.com` URLs and reads the public zero-auth `/api/v1/jobs` JSON feed (OpenAPI at `/api/v1/openapi.json`); paginates `?page=N` (0-indexed) up to `max_pages` (default 3). Optional `q:` (or `keywords:`) runs the feed's server-side full-text search with synonym expansion. Unannounced roles arrive pre-masked as "Stealth". Operated by the a16z speedrun program's talent team (provenance: the site links a16z.com's privacy/terms/disclosures; owner contact jmazer@a16z.com). Configure with `provider: a16z-speedrun-talent`. | | Agentic Engineering Jobs | API | Reads the site's public zero-auth REST API (`https://agentic-engineering-jobs.com/api/v1/jobs`, OpenAPI at `/api/v1/openapi.json`). Configure with `provider: agentic-jobs`; paginates `?page=N` (1-based, 50/page) up to 40 pages / 2000 postings, pacing requests under the documented 30 req/60s rate limit. Location uses the feed's human-readable string, falling back to decoded ISO country names; salary bounds attach when present. Job URLs point at `/jobs/{slug}` on the site. | | Alibaba Group Careers | API | Auto-detects `https://talent.alibaba.com` URLs (host-matched, HTTPS-only) and posts to the public zero-auth position/search JSON API (zh-CN group-wide listings with title, category, city, experience range, full JD text, publish date). Each `keywords:` entry is queried server-side separately and results are deduped; omit `keywords:` to pull the whole board. Paginates up to `max_pages` per keyword (default 50, 100 posts/page). The endpoint's stateless double-submit CSRF check is satisfied by a self-minted per-run token pair — no login or session. | | Amazon / AWS | API | Auto-detects `amazon.jobs` careers URLs and queries the public amazon.jobs search API. The board is one global endpoint, so narrow it with an `amazon:` config block (`loc_query`, `base_query`, `category`, …) whose keys pass through as query params. Configure with `provider: amazon`. | | Arbeitnow | API | Reads the public `https://www.arbeitnow.com/api/job-board-api` JSON feed (EU/DACH-heavy, newest-first). Configure with `provider: arbeitnow`; paginates `?page=N` up to `max_pages` (default 3), then scanner filters apply. | | Arbeitsagentur | API | Uses the public Bundesagentur fuer Arbeit Jobsuche REST API. Configure with `provider: arbeitsagentur`; title, location, and dedup filters run after fetch. | | Ashby | API | Auto-detects `https://jobs.ashbyhq.com/` boards and uses Ashby's public posting API. | | Avature | Parser | Auto-detects `.avature.net` career sites and parses the public server-rendered job list (`/careers/SearchJobs?jobOffset=N`, 6 results/page). A branded custom domain that proxies Avature needs `provider: avature` + `api:` pointing at the Avature origin. Paginates up to `max_pages` (default 50). | | BambooHR | API | Auto-detects `.bamboohr.com` careers pages, reads `/careers/list`, and follows public detail endpoints for job URLs. | | BeeSite | API | Auto-detects `.app.beesite.de` boards — the milch & zucker search backend behind branded portals like `jobs.mercedes-benz.com` — and reads their public no-auth JSON search endpoint. Point `careers_url`/`api` at the beesite host (or set `provider: beesite`). | | Breezy HR | API | Auto-detects `.breezy.hr` boards and reads the public JSON position feed. | | Comeet / Spark Hire Recruit | API | Uses Comeet's public careers API. Provide the full API URL with `api:` or `careers_url`; it cannot derive the endpoint from a branded careers page. | | Cornerstone OnDemand | API | Reads hosted CSOD career sites (`.csod.com/ux/ats/careersite/...`). The search API wants a bearer token, but the career-site home page embeds an anonymous JWT (no login), so each fetch bootstraps that token then pages the public search API. Point `careers_url` at the csod.com URL (or set `provider: csod`). | | Consider | API | VC "talent network" portfolio boards hosted on getconsider.com (Founderful, Creandum, Balderton, Lightspeed, Notion Capital, and others). Not auto-detected — the board id is opaque (e.g. Founderful's is `wingman`), so set `provider: consider` + `consider_board: ` + `careers_url: https:///jobs` in portals.yml. POSTs to `{board_origin}/api-boards/search-jobs` (public, no-auth) and returns up to `consider_size` jobs in a single request (default 500); the SSRF guard pins the target host to the `careers_url` origin. Job URLs are the ATS destination links (`applyUrl`), deduping with Ashby/Greenhouse providers. | | CryptocurrencyJobs | RSS | Curated Web3/crypto job board. Reads the public `https://cryptocurrencyjobs.co/index.xml` RSS feed (listings are 100% remote); the feed URL is hardcoded in the provider, so no `careers_url` or `api` field is needed. Configure with `provider: cryptocurrencyjobs`. | | Dassault Systèmes | Parser | Single-company provider for `www.3ds.com/careers/jobs` via the public Exalead card-search API (returns Exalead XML, not JSON). Global to 3ds.com, so no per-tenant config. Select with `provider: dassault`. | | Deutsche Bahn | Parser | Single-company provider for DB's `db.jobs` careers portal (an Avature front; `jobs.deutschebahngroup.careers` 302-redirects into it) via its server-rendered search endpoint, paginated over plain HTTP. Select with `provider: deutschebahn`. | | EchoJobs | **Retired (#2976, 2026-08-20)** | The board-wide `https://echojobs.io/api/jobs` feed this provider read is gone — both the feed and its `robots.txt` now answer with a Vercel bot-protection checkpoint (HTTP 429), and the site's own `robots.txt` disallows `/api`. career-ops does not work around bot protection, so this is not a provider to repair. `provider: echojobs` still resolves in `portals.yml` for backward compatibility, but `fetch()` throws immediately with an explanation naming the cause — remove the entry from your `portals.yml` when you see it. | | Eightfold AI | API | Auto-detects `.eightfold.ai` career sites and reads the public zero-auth `/api/apply/v2/jobs` per-tenant endpoint. `domain` is optional (the server infers it from the tenant host) but is forwarded when the entry sets `domain:`, since multi-brand tenants scope their board by it. **The server caps a page at 10 rows regardless of the requested `num`**, so a large board costs `count`/10 requests; `max_pages` (default 200) bounds the loop. A branded CNAME (`careers..com`) is deliberately not matched — point `careers_url`/`api` at the `eightfold.ai` host, or set `provider: eightfold`. | | Flowxtra | API | Reads the public, no-auth, cross-tenant `https://app.flowxtra.com/api/central/jobs` JSON feed (board-wide — every company hosted on Flowxtra, not one tenant). Configure with `provider: flowxtra`; paginates `?page=N` up to `max_pages` (default 3), filtered to `status=Live`, then scanner filters apply. Job URLs use the API's ready-made `urlJobApplay` apply link on flowxtra.com. | | Gem | API | Auto-detects `https://jobs.gem.com/` boards and batches the listing plus per-job detail queries into a single POST to Gem's public GraphQL endpoint. | | Getro | API | VC "talent network" portfolio job boards (Atomico, Cherry Ventures, HV Capital, Point Nine, b2venture, and other independently-hosted tenants — one vendor, no common host suffix to auto-detect against). Opt-in via `provider: getro` + `careers_url`; `collection_id` can be set explicitly with `getro_collection` or auto-resolved from the board page's own `__NEXT_DATA__` blob. Paginates the public zero-auth `POST api.getro.com/.../search/jobs` endpoint newest-first, stopping once postings cross `getro_max_age_days` (default 90) or `getro_max_pages` (default 40) is reached. | | Get on Board | API | Reads the public `https://www.getonbrd.com/api/v0/categories/programming/jobs` JSON:API feed (remote/LatAm-heavy tech roles). Configure with `provider: getonbrd`; paginates `?page=N` up to `max_pages` (default 3) over the programming category (`expand[]=company`), then scanner filters apply. | | getManfred | API | Reads the board-wide `https://www.getmanfred.com/api/v2/public/offers` JSON feed (Spanish/EU tech roles, salary ranges published). Configure with `provider: manfred` and an optional `lang: EN\|ES` (the API rejects a call without one); the whole catalogue arrives in a single request and only `status: ACTIVE` offers are kept. | | Glints | API | Uses Glints' public GraphQL job search endpoint. Configure with `provider: glints`; query and filters can be set on the portal entry. | | Greenhouse | API | Handles explicit `api:` URLs and auto-detects public Greenhouse board URLs for the boards API. | | Hacker News (Who is hiring?) | API | Finds the current monthly "Ask HN: Who is hiring?" thread via the Algolia HN search API and parses top-level comments as postings (the pipe-delimited "Company \| Role \| Location \| URL" convention is extracted defensively; free-form comments keep the first line as title). Configure with `provider: hackernews` in a `job_boards:` entry. | | Heckler & Koch | Parser | Single-company provider for `heckler-koch.com/…/Stellenangebote` — a Nuxt page that server-renders every posting in one bare-HTTP GET (small board); job links point at the `karriere.heckler-koch.com` apply backend. Select with `provider: hecklerkoch`. | | HigherEdJobs | RSS | Reads the public `https://www.higheredjobs.com/rss/categoryFeed.cfm?catID={catID}` feed and parses it in-process. Configure with `provider: higheredjobs` and optional `cat_id` (default 68 = Higher Education). Not auto-detected — requires explicit `provider:` config. | | Himalayas | API | Reads the board-wide `https://himalayas.app/jobs/api?limit=50` JSON remote-jobs feed. Configure with `provider: himalayas` in a `job_boards:` entry. | | IBM Careers | API | Posts to IBM's public careers search API and supports optional IBM facet filters in the portal entry. | | iCIMS | Parser | Auto-detects any `*.icims.com` HTTPS host from `careers_url`/`api` (canonical form `https://careers-.icims.com/jobs/search?ss=1`) and scrapes the public hosted-portal search pages. List pages carry no posted date; `enrichDate()` fetches the JD detail page's JSON-LD `datePosted` for jobs that already passed title/location filters. Paginates up to a fixed 30-page cap, warning if a tenant's postings exceed it. | | Interamt.de | Parser | Playwright-driven scanner for Germany's federal/state/municipal public-sector job portal. Interamt runs on Apache Wicket (stateful) with no REST API, so `scan-interamt.mjs` drives a real browser session instead of an HTTP client; run directly with `npm run scan:interamt`. Reads `interamt_searches` from `portals.yml`, falling back to a generic set of German IT keywords if that section is absent. | | JibeApply | API | Auto-detects `https://.jibeapply.com/jobs` careers URLs (rewriting `/jobs` to the public `/api/jobs` endpoint); paginates `?page=N` up to `max_pages` (default 50), warning if a tenant's postings exceed the cap. Also supports branded/iCIMS-hosted sites at their own `/jobs` path via an explicit `provider: jibeapply` + `api:` URL. | | Job Bank Canada | Atom | Canada's federal job-search service (jobbank.gc.ca, run by Employment and Social Development Canada) — a national employment service, same class as Arbeitsagentur. Reads the public zero-auth Atom feed at `/jobsearch/feed/jobSearchRSSfeed`. Configure with `provider: jobbankca`; nested `jobbankca.keywords` is an explicit override, otherwise it falls back to `config/profile.yml`'s target roles (same as VDAB). The feed's own `locationstring` filter is unreliable, so location filtering happens downstream. Paginates `?page=N` (100 results/page) up to `max_pages` (default 5), honouring the site's `robots.txt` `Crawl-delay: 5` between every request. | | Jobicy | API | Reads the board-wide `https://jobicy.com/api/v2/remote-jobs?count=50` JSON feed (remote-jobs aggregator). Configure with `provider: jobicy` in a `job_boards:` entry. | | Jobspresso | RSS | Reads the public WordPress `https://jobspresso.co/?feed=job_feed` XML job feed and parses it in-process. Configure with `provider: jobspresso` in a `job_boards:` entry. | | Jobstreet / SEEK | API | Uses the public SEEK chalice-search JSON API for Jobstreet and SEEK sites. Configure explicitly with `provider: jobstreet`. | | Jobvite | API | Auto-detects `https://jobs.jobvite.com/` boards and reads the public XML feed at `app.jobvite.com/CompanyJobs/Xml.aspx?c=`. The feed keys on an opaque `companyEId`, not the vanity slug, so set `company_eid:` alongside `careers_url:` to skip a request per scan; without it the provider scrapes the eId off the board page first. A tenant with no usable `careers_url` can skip the slug entirely with `provider: jobvite` + `api:` pointing at the feed URL — the eId is read from its `?c=` parameter. The feed inlines every full job description (1.9 MB for a large tenant) and `app.jobvite.com` answers `429 Retry-After: 30` from the second request onward, so fetches use an extended timeout and honour the retry header. A tenant with no open roles is reported as an empty board, not an error. | | join.com | Parser | Auto-detects `join.com/companies/` careers URLs and parses the `__NEXT_DATA__` JSON embedded in the server-rendered HTML (no separate API). Paginates `?page=N` up to `max_pages` (default 50), warning if a tenant's postings exceed the cap. | | joinup.ch | Parser | Auto-detects `joinup.ch` career URLs (Swiss startup job platform, Typesense-backed Next.js). Reads the SSR'd `__NEXT_DATA__` from `https://joinup.ch/browse/jobs` — the browse page renders the newest postings (created-DESC) in one bare-HTTP GET, no API key needed. Fails closed: a missing or unparseable `__NEXT_DATA__` block is treated as a scraper break, not an empty board. Configure with `provider: joinup` or point `careers_url` at `joinup.ch`. | | JustJoin.it | API | Auto-detects `justjoin.it/job-offers/...` URLs and reads the public `justjoin.it/api/candidate-api/offers` API (Polish/EU tech board); paginates up to `max_pages` (default 50). | | Landing.jobs | API | Reads the board-wide `https://landing.jobs/api/v1/jobs` JSON feed (tech, Europe). Configure with `provider: landingjobs`; company is derived from the posting URL slug. | | LaraJobs | RSS | Reads the board-wide `https://larajobs.com/feed` RSS feed (Laravel / PHP jobs) and parses it in-process. Configure with `provider: larajobs`; company and location come from the feed's `job:` namespace. | | Lever | API | Auto-detects `https://jobs.(eu.)?lever.co/` boards and uses Lever's public postings endpoint. | | Local parser | Parser | Runs an in-repo parser command from `portals.yml`. Use this for stable SSR or HTML pages that need a custom extractor. | | Meituan Careers | API | Auto-detects `https://zhaopin.meituan.com` URLs (host-matched, HTTPS-only) and posts to the public zero-auth getJobList JSON API (zh-CN social-hiring listings with title, department, city, JD text, refresh date). Each `keywords:` entry is queried server-side separately and results are deduped; omit `keywords:` to pull the whole board. Paginates up to `max_pages` per keyword (default 30, 100 posts/page), retrying empty mid-pagination pages (the board rate-limits sporadically). | | MyCareersFuture | API | Singapore's national job bank, run by Workforce Singapore (WSG) — a public employment service, same class as Arbeitsagentur/VDAB/Job Bank Canada. Reads the public zero-auth `POST /v2/search` JSON API. Configure with `provider: mycareersfuture`; nested `mycareersfuture.keywords` is an explicit override, otherwise it falls back to `config/profile.yml`'s target roles (same as VDAB/Job Bank Canada). Pagination is driven by the URL's `page` query param (confirmed live — the JSON body's own `page` field is ignored server-side). Paginates `?page=N` (up to 100 results/page) up to `max_pages` (default 5, capped at 20). | | No Fluff Jobs | API | Auto-detects `nofluffjobs.com` and reads its public `/api/search/posting` API (Polish/EU tech board); paginates up to `max_pages` (default 5). | | NoDesk | RSS | Reads the public `https://nodesk.co/remote-jobs/index.xml` feed and parses it in-process. Configure with `provider: nodesk`. | | Oracle Recruiting Cloud (ORC) | API | Auto-detects `.fa[.][.ocs].oraclecloud.com` careers URLs (e.g. JPMorgan Chase, BNY Mellon, American Express) and reads the public zero-auth `recruitingCEJobRequisitions` REST API. Paginates by offset up to a safety cap (25 pages / ~5,000 jobs); pagination is driven by returned list length and `TotalJobsCount`, not the unreliable `hasMore` flag some tenants always report `false`. | | Personio | Parser | Auto-detects `.jobs.personio.de` or `.com` hosts and parses the public XML jobs feed; falls back to scraping the careers page HTML for tenants that have disabled the XML feed. | | Phenom People | API | Not auto-detected — every tenant runs on its own branded domain (e.g. `careers.allianz.com`), so select with an explicit `provider: phenom`. Posts to the public, no-auth `/widgets` CareerConnect endpoint on that branded host; paginates via offset up to `max_pages` (default 20, 100 results/page, max 300), warning if a tenant's postings exceed the cap. | | Pinpoint | API | Auto-detects `.pinpointhq.com` boards and reads the public zero-auth `/postings.json` per-tenant feed. | | Radancy | Parser | Reads Radancy (TalentBrew) career sites (e.g. `careers.munichre.com`) via the server-rendered `/{lang}/search-jobs?p={N}` results page (1-based pagination). Select with `provider: radancy`. | | Recruitee | API | Auto-detects `.recruitee.com` boards and uses the public per-tenant offers API. | | RemoteOK | API | Reads the board-wide `https://remoteok.com/api` JSON feed; scanner filters decide which rows are relevant. | | Remotive | API | Reads the board-wide `https://remotive.com/api/remote-jobs` JSON feed, then applies local scanner filters. | | Remotli | API | **operator: `eliador90`** (declared per [Source Indexing Policy](../CONTRIBUTING.md#source-indexing-policy) rule 4 — the board is operated by the contributor who submitted this provider). Reads the board-wide `https://remotli.ch/api/jobs` JSON feed (remote roles at Swiss companies, paid in CHF). Select with `provider: remotli`; paginates `?page=N&limit=50&remote=all` (the server caps `limit` at 50) up to `max_pages` (default 20). `remote=all` is required for rule 3: without it the API serves its remote-first default view, ~43% of the board. Rows are a nested `{ jobs, companies }` join shape. Emits only `status: active` postings; the emitted URL is the employer's own `applyUrl` per rule 2, with the remotli page as fallback. Carries `publishedAt`, salary and the full description (the latter feeds the cross-listing fingerprint). | | Rheinmetall | Parser | Single-company provider for `www.rheinmetall.com//career/vacancies` — the Nuxt page server-renders its job cards, so plain `?page=N` pagination works over bare HTTP (no XHR API is exposed). Select with `provider: rheinmetall`. | | Rippling | API | Auto-detects `https://ats.rippling.com//jobs` careers pages and reads the public zero-auth board API (`api.rippling.com/platform/api/ats/v1/board//jobs`). | | SAP SuccessFactors | Parser | Reads SF Recruiting Marketing (RMK) career sites — branded boards like `jobs.sap.com`, `jobs.zf.com`, `jobs.schaeffler.com` — via the public no-auth `/tile-search-results/?startrow=N` HTML fragment. Branded hosts carry no "successfactors" string, so select with `provider: successfactors` + `api:` the board origin. | | Senjob | Parser | Reads the Senegalese board `https://senjob.com/offres-d-emploi.php` (Dakar and the regions) — the project's first African source. Configure with `provider: senjob`; paginates `?page=N` (10 pages by default, raise with `max_pages` up to 50), merges the sticky rows the board repeats on every page, and reads title, place and the hidden ISO publication date. Employer names are absent from the listing rows, so `company` is left empty rather than guessed. `robots.txt` disallows candidate CVs and employer pages; this parser reads neither. If the FIRST listing page still contains postings but parses to none, the provider throws, so a markup change surfaces as a broken board instead of an empty one; a later page that parses to nothing simply ends the pagination. | | SmartRecruiters | API | Auto-detects SmartRecruiters careers URLs or uses `provider: smartrecruiters` for branded custom domains. | | softgarden | Parser | Reads the hosted softgarden job widgets at `.softgarden.io//widgets/jobs` — a server-rendered page listing every posting (no auth, no JS, no pagination). Select with `provider: softgarden`. | | SolidJobs | API | Auto-detects `https://solid.jobs/public-api/offers/` and reads the public offers API. | | Teamtailor | RSS | Auto-detects `.teamtailor.com` career sites and reads the public zero-auth `/jobs.rss` per-tenant feed. For a branded careers domain, set `provider: teamtailor` and it reads `/jobs.rss` off that host. Job links may point at a branded custom domain; location comes from the `tt:` city/country tags, falling back to `Remote` when a posting carries no `tt:city`/`tt:country` but its `remoteStatus` is remote (`fully` or `temporary`). | | Tencent Careers | API | Auto-detects `https://careers.tencent.com` URLs (host-matched, HTTPS-only) and reads the public zero-auth Query JSON API (zh-CN listings with title, BG, category, JD text, last-update date). Each `keywords:` entry is queried server-side separately and results are deduped; omit `keywords:` to pull the whole board. Paginates up to `max_pages` per keyword (default 20, 100 posts/page). | | The Hub | API | Reads the board-wide `https://thehub.io/api/v2/jobsandfeatured` JSON feed (Nordic/EU startups). Configure with `provider: thehub`; paginates `?page=N` up to `max_pages` (default 3), then scanner filters apply. Every request also sends `countryCode` (default `EU`, override via a `thehub: { countryCode: ... }` config block) since the API scopes results to the caller's geo-IP when it's omitted. Set `thehub: { includeRemote: true }` to also run a separate `isRemote=true` pass and merge it in — the site's own "remote" filter is a distinct query mode, not combinable with `countryCode`. The v2 payload carries no publication date, so Hub postings have no `postedAt`: date filters (`--since`, `max_age_days`) never exclude them, and they sort last among dated results. | | The Muse | API | Reads the public `https://www.themuse.com/api/public/jobs?page={n}` JSON feed, fetching all pages sequentially before normalizing. Configure with `provider: themuse` in a `job_boards:` entry. | | TKMS (thyssenkrupp Marine Systems) | API | Single-employer provider for `jobs.tkmsgroup.com` via the public `POST /api/filter/query` endpoint; the `subclient` and locale come from a config block. Select with `provider: tkms`. | | VDAB | API | Reads VDAB's public `vindeenjob` search API for Flanders/Belgium roles. Configure with `provider: vdab`; nested `vdab.keywords` is an explicit override, otherwise falls back to `config/profile.yml`'s target roles. Optional `fetchDetails: true` follows bounded public detail JSON calls for descriptions (`detailLimit`, default 25). | | We Work Remotely | RSS | Reads the public `https://weworkremotely.com/remote-jobs.rss` feed and parses it in-process. | | Welcome to the Jungle | API | Queries WTTJ's public Algolia search index (`wttj_jobs_production_en`) — the same one the welcometothejungle.com jobs UI calls. The public app id + referer-locked client search key are fetched fresh from `https://www.welcometothejungle.com/api/env` on every run (they rotate), and every Algolia request sends a welcometothejungle.com Referer. The board is global, so an explicit `wttj: { queries: ["…"] }` config block is required (the provider throws without one); optional `max_hits` per query (default 100, cap 200). Salary attaches from `salary_yearly_minimum`/`salary_maximum`; ", Remote" is appended for fulltime-remote postings. Configure with `provider: wttj`. | | Workable | API | Auto-detects `https://apply.workable.com/` and reads the public no-auth widget API (`/api/v1/widget/accounts/?details=true`), which returns the account's full posting list in one request; falls back to the older, 30-row-capped markdown feed (`//jobs.md`) only if that request fails. Requests carry browser-like headers, retry transient failures with backoff (giving up early on a long `Retry-After` rather than stall the scan), and are serialized process-wide against the host. | | Workday | API | Auto-detects `..myworkdayjobs.com[/]/` careers URLs and posts to the public CXS jobs endpoint; paginates via offset up to `max_pages` (default 100), warning if a tenant's postings exceed the cap. | | Working Nomads | API | Reads the board-wide `https://www.workingnomads.com/api/exposed_jobs/` JSON feed, then applies scanner filters. | | Yourator | API | **operator: 友睿資訊股份有限公司 (Yourator)** — declared per [Source Indexing Policy](../CONTRIBUTING.md#source-indexing-policy) rule 4; the submitting contributor is not affiliated with the board (provenance: the operating entity is named on the site's own [privacy page](https://www.yourator.co/privacy)). Taiwanese job board for startup and digital roles (1,760 listings across 151 employers when sampled on 2026-08-18). Reads the board-wide zero-auth `https://www.yourator.co/api/v4/jobs?page=N` JSON feed (20/page; no key, cookie or `Referer` required). Select with `provider: yourator`. The API exposes no free-text search parameter — `q`/`keyword`/`search`/`term`/`query`/`title` are accepted and silently ignored — and no filter parameter is needed for full coverage, so the provider walks every page until `payload.hasMore` turns false and lets `title_filter` gate the results (rule 5); `max_pages` (default 120) is a safety bound above the observed 88 pages, not a coverage setting. Per rule 2 the emitted URL is each row's `thirdPartyUrl` — the employer's own ATS (teamdoor.io, Greenhouse, Lever, BambooHR, Breezy, self-hosted) — with the board's `utm_*` ad parameters stripped, falling back to the Yourator posting page on the 63.9% of rows that carry none. No absolute timestamp is published (only a relative `lastActiveAt` string), so `postedAt` is always omitted. | When adding a new provider, add a new non-helper module under `providers/` and update this table in the same PR.