WeWorkRemotely Jobs + Expiry History
Pricing
$3.00 / 1,000 results
WeWorkRemotely Jobs + Expiry History
The complete WeWorkRemotely board — every posting, not the 100-item RSS most scrapers stop at — kept after it closes, with when and why each role ended (filled early vs ran to expiry). Employer name, logo, category and full description, typed and served at database speed.
Not just another WeWorkRemotely scraper. The complete WeWorkRemotely board — every posting, not the 100-item RSS most scrapers stop at — kept after it closes, with the one thing a live scrape can never give you: when each job ended and why (filled early vs ran to expiry). Served at database speed.
Why this archive, not a live scrape
- Postings that are gone, with the reason.
status=gonereturns removed listings andgone_reasonsplits filled-early from ran-to-expiry — WeWorkRemotely publishes each posting's expiry date, so the two are actually distinguishable. A live scrape can't produce this: it only sees what's open right now. - The whole board, not a capped feed. Most WeWorkRemotely scrapers read the public RSS (100 items) or a single category page. This is the complete live board — every category, deduplicated — enumerated in full and archived daily.
- Change history, not a snapshot. Deadline and posting changes are recorded as dated transitions rather than overwritten, so you can see when a role was extended or reposted.
- Clean and typed. Employer name and logo, category tags, employment type, location and the full description as structured fields — not raw HTML you have to post-process.
- Database speed, and unblockable. You read our maintained archive, not weworkremotely.com, so a run answers as a query and can never be rate-limited or Cloudflare-challenged.
Who it's for
- Recruiters & talent researchers — time-to-fill by role, repost patterns, which employers churn the same position — read straight off the filled/expired history.
- Labor-market & trend researchers — a clean panel of the entire remote board with open-and-close dates — measure hiring velocity and role churn, not just what's live today.
- Job-board & SaaS builders — a normalized, complete remote-jobs feed with logos and categories and an archive envelope (status + gone_reason) to build on.
- Market & competitive analysts — track which companies and categories are hiring over time, and how long postings stay open before they fill.
Quick start
Basic — newest postings
{"maxItems": 10}
Filtered
{"keyword": "engineer","remoteOnly": true,"maxItems": 50}
Notification mode — only what appeared since the last run
{"postedSince": ""}
Output
One record per posting:
| field | meaning |
|---|---|
job_id | Stable unique key for the posting, <source>:<id>. Deduplicate across runs and join to your own data on this. |
url | Canonical posting URL. |
title | Job title. |
company | Employer name as the board lists it. |
company_slug | The board's identifier for the employer. |
company_logo_url | Employer logo, when the board provides one. |
location_restriction | Where the posting says the role may be based. |
employment_type | Full time, contract, and so on, as declared by the employer. |
categories | Category tags the board assigned to the posting. |
description | Full posting description. |
salary_currency | ISO currency of the advertised band. |
salary_unit | Period the band refers to (e.g. YEAR, HOUR). |
posted_at | When the posting first appeared. |
first_seen_at | When our archive first captured it. |
expires_at | The board's own expiry date, when it exposes one. |
status | live while listed, gone once removed. |
gone_reason | filled if removed before its expiry date, expired if it ran to term. |
gone_at | The date the posting was first observed gone. Null while it is live. Naukri overwrites its expired list nightly, so this is only knowable to whoever was watching that day. |
apply_url | Where to apply for the role. |
enriched | Whether employment type, category and logo have been resolved yet — a posting is returned as soon as it is found, enriched or not. |
Example record:
{"job_id": "wwr_jobs:remote-jobs/common-room-commercial-account-executive","url": "https://weworkremotely.com/remote-jobs/common-room-commercial-account-executive","title": "Commercial Account Executive","company": "Common Room","company_slug": "common-room","company_logo_url": "https://wwr-pro.s3.amazonaws.com/logos/0171/5957/logo.gif","location_restriction": "Anywhere in the World","employment_type": "Full-Time","categories": ["Customer Support"],"description": "<img src=\"https://we-work-remotely.imgix.net/logos/0171/5957/logo.gif?ixlib=rails-4.0.0&w=50&h=50&dpr=2&fit=fill&auto=compress\" />\n\n<p>\n <strong …(truncated for display)","salary_currency": "USD","salary_unit": "YEAR","posted_at": "2026-07-23 13:29:13+00","first_seen_at": "2026-07-26 19:21:54.171467+00","expires_at": "2026-08-22 13:29:13+00","status": "live","gone_reason": null,"gone_at": null,"apply_url": null,"enriched": true}
Pricing
$0.003 per result — pay only for the postings a run returns, with no start fee. Above the $0.001 commodity scrapers because you get the whole board (not a 100-item RSS feed) plus the archive: postings kept after they close, each tagged filled-early vs ran-to-expiry. A rung below the Himalayas archive ($0.004), which also carries salary and the employer's real domain.
Usage patterns
- What closed, and why — Set
status=goneto study removals;gone_reasonsplits filled-early from ran-to-expiry — a hiring signal you can't get from a live board. - The complete board — Leave filters open and you get every current posting on WeWorkRemotely, not the latest 100 an RSS scrape returns.
- Incremental sync — Leave
postedSinceempty; each run continues from the previous one's cursor — no duplicates, nothing skipped.
Input configuration
| field | type | default | what it does |
|---|---|---|---|
keyword | string | Matches job title or category. | |
company | string | Employer name as the board lists it. Partial matches work. | |
postedSince | string | ISO timestamp. Leave empty and the Actor remembers where it stopped, returning only new postings each run. | |
goneSince | string | Only postings observed dead at or after this ISO timestamp. The query this archive exists to answer. | |
status | live / gone / any | "live" | 'Gone' returns postings that have been removed, with why — the part no live scraper can give you. |
location | string | Substring match on the posting's location. | |
remoteOnly | boolean | false | Only postings the employer marks as remote. |
descriptionSearch | string | Substring match inside the job description. | |
excludeTitle | string | Drop postings whose title contains this. | |
maxItems | integer | 500 | Upper bound on results returned in a single run. |
fullRefresh | boolean | false | By default each run returns only what appeared since your last one, so a schedule never re-delivers the same page. Tick this to ignore that bookmark and re-pull the full result set for your filters — and it clears the stored cursor, so your next ordinary run starts clean. |
enrichedOnly | boolean | false | Return only postings whose salary, employment type and description have been parsed. Off by default: an unenriched record still carries title, company, location and dates, and withholding it trades a real answer for a slower better one. |
FAQ
How is this different from other WeWorkRemotely scrapers?
Two ways. It returns the complete board rather than the 100-item RSS most scrapers read, and it's a maintained archive: postings are kept after they close (status=gone) with gone_reason splitting filled-early from ran-to-expiry — history a live scrape structurally cannot produce.
Does it include salary or the employer's website?
No. WeWorkRemotely doesn't publish a salary on most postings, and its pages link back to weworkremotely.com rather than the employer's own domain — so this Actor doesn't invent either. You get employer name, logo, category, employment type, location, the full description, and the archive envelope. If you need salary and the employer's real domain, that's the Himalayas archive Actor.
I get no results.
Filters combine with AND. Loosen keyword, or set status=any to include gone postings.
Will I see the same job twice?
Not in notification mode — leave postedSince empty and each run continues where the last one stopped.
Is this live?
It is a continuously maintained archive: the full board is re-enumerated daily, new postings appear within a day of going up, and closed ones stay with their disappearance recorded.
Integration
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('hyperbach/weworkremotely-jobs-history').call({"maxItems": 10});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('hyperbach/weworkremotely-jobs-history').call(run_input={'maxItems': 10})items = client.dataset(run['defaultDatasetId']).list_items().items
CLI
$apify call hyperbach/weworkremotely-jobs-history --input '{"maxItems": 10}'
REST
curl -X POST "https://api.apify.com/v2/acts/hyperbach~weworkremotely-jobs-history/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H 'Content-Type: application/json' -d '{"maxItems": 10}'
Support
This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.