# WeWorkRemotely Scraper · Remote Jobs, Companies & Categories (`reapx/weworkremotely-scraper`) Actor

Scrape WeWorkRemotely listings across all 11 job categories: hiring company, role, category, region, job type, skill tags and the full description text. Filter by keyword, region, company, type and date. No login, no API key.

- **URL**: https://apify.com/reapx/weworkremotely-scraper.md
- **Developed by:** [Tarek Etman](https://apify.com/reapx) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.32 / 1,000 job listing returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![reapX — public sources in, addressable records out](https://reapx.dev/reapx.gif)

## WeWorkRemotely Scraper · Remote Jobs, Companies & Categories

**WeWorkRemotely scraper** that pulls every live remote job from the WeWorkRemotely board - all 11 categories, with the hiring company, the role, the region, the job type, the skill tags and the full listing text on every row. No login, no API key, no browser.

> Maintained by **reapX**. Every row cites the Apify run that produced it — nothing is
> inferred, modelled or filled in, and a field absent from the source is absent from the row.
> The extracted archive for this source is browsable at
> [reapx.dev/data/weworkremotely-scraper/](https://reapx.dev/data/weworkremotely-scraper/) and mirrored as an open dataset on
> [Hugging Face](https://huggingface.co/datasets/reapxdev/weworkremotely-scraper) and
> [Kaggle](https://www.kaggle.com/datasets/reapxdev/weworkremotely-scraper). Questions: reapxdev@proton.me

WeWorkRemotely is one of the oldest and largest remote-only job boards. This Actor reads its public category feeds, so what you get is exactly what a candidate sees, usually within minutes of a listing going up.

### What you get

One row per listing, with a stable `jobId` you can use as a primary key:

| Field | Example |
|---|---|
| `company` / `role` | Doximity / Data Engineering Manager |
| `category` | Full-Stack Programming |
| `jobType` | Full-Time |
| `region` / `country` / `state` / `isWorldwide` | Anywhere in the World / - / - / true |
| `skills` | \["Python", "SQL"] |
| `publishedAt` / `expiresAt` | 2026-08-02T07:31:05Z / 2026-09-01T07:31:05Z |
| `description` | full listing text, HTML stripped |
| `jobUrl` | direct link to the posting |

Four named views ship with the dataset: **Jobs overview**, **Worldwide roles**, **Companies hiring** and **Full text**.

### All 11 categories

Programming (all), Full-Stack Programming, Front-End Programming, Back-End Programming, DevOps and Sysadmin, Design, Product, Customer Support, Sales and Marketing, Management and Finance, and All Other Remote. Pick as many as you like - the results are merged and de-duplicated. Leave the field empty to read the whole board in a single request.

### Narrow it down

WeWorkRemotely's own search endpoint is not open to API clients, so the Actor applies your narrowing to the feed rows instead. **Listings removed by a filter are never charged.**

- **Keywords** - matched against title, description, skills and category
- **Regions** - matched against region, country and state
- **Job type** - Full-Time, Part-Time or Contract
- **Companies** - partial company-name match
- **Posted within the last N days** - for a feed that stays fresh on a schedule

### Input configuration

Every field is optional. The prefilled values below are what runs if you press Start without changing anything.

#### Which part of the board

WeWorkRemotely publishes one feed per category. Pick as many as you like and the results are merged and de-duplicated.

| Field | Type | Accepts | What it does |
| --- | --- | --- | --- |
| `categories` | list | one value per line | Which WeWorkRemotely category feeds to read. Leave empty to read the whole board in one request. |

#### Narrow it down

WeWorkRemotely's own search is not open to API clients, so these filters are applied to the feed rows. Listings removed here are never charged.

| Field | Type | Accepts | What it does |
| --- | --- | --- | --- |
| `searchTerms` | list | one value per line | Words to match against the title, description, skills and category, one per line. A job is kept if it matches at least one. Examples: python, react, senior, healthcare. |
| `regions` | list | one value per line | Match against the listing's region, country or state, one per line. Examples: Anywhere in the World, USA, Europe, Canada. |
| `jobTypes` | list | one value per line | Contract shape of the role. Leave empty for all types. |
| `companies` | list | one value per line | Keep only listings from these companies, matched as a partial name, one per line. Examples: Doximity, Cloudflare. |
| `postedWithinDays` | integer | 1 to 365 | Return only listings published in the last N days, recomputed on every run. Use 1 for a daily feed or 7 for a weekly one. Leave empty for no date limit. |

#### Size and detail

How many rows to return and how much of each listing to carry.

| Field | Type | Accepts | What it does |
| --- | --- | --- | --- |
| `maxJobs` | integer | 1 to 20000 | Hard stop on how many jobs are returned and charged. Each job returned costs $0.002. 100 jobs finishes in seconds. Prefilled with `100`. |
| `includeDescription` | true/false | checkbox | Carry the full listing text on every row, converted from HTML to plain text. Turn off for a smaller, faster dataset that is just the job facts. Prefilled with `true`. |
| `requestDelaySecs` | integer | 1 to 60 | Seconds to wait between feed requests. 1 is the minimum this Actor allows; raise it if you are running several jobs at once. Prefilled with `2`. |

### Pricing

Pay per event. The primary event is **Job listing returned** (`job-listing`), charged at **$0.002 per event** on the free plan, falling to $0.00084 on the highest tier.

Charged once for each WeWorkRemotely listing delivered as a complete row: company, role, category, region, job type, skill tags, publication date and full description text. Listings removed by your keyword, region, company, type or date filters, feeds that return nothing and blocked requests are never charged.

Other charged events: `apify-actor-start` (Actor Start).

Minimum charge cap per run: $0.005.

Tiered discounts apply automatically on every paid Apify plan. Platform usage is absorbed by the Actor, so the per-event price is the whole price.

### Usage examples

#### The prefilled run, which is what Start does with nothing changed

```json
{
  "maxJobs": 100,
  "includeDescription": true,
  "requestDelaySecs": 2
}
```

#### Filter by job categories

```json
{
  "maxJobs": 100,
  "includeDescription": true,
  "requestDelaySecs": 2,
  "categories": [
    "remote-programming-jobs",
    "remote-devops-sysadmin-jobs"
  ]
}
```

#### Filter by keywords

```json
{
  "maxJobs": 100,
  "includeDescription": true,
  "requestDelaySecs": 2,
  "searchTerms": [
    "python",
    "kubernetes"
  ]
}
```

#### Filter by regions

```json
{
  "maxJobs": 100,
  "includeDescription": true,
  "requestDelaySecs": 2,
  "regions": [
    "Anywhere in the World"
  ]
}
```

#### Filter by job type

```json
{
  "maxJobs": 100,
  "includeDescription": true,
  "requestDelaySecs": 2,
  "jobTypes": [
    "Contract"
  ]
}
```

### Output example

One row, exactly as the actor wrote it to the dataset:

```json
{
  "jobId": "gitlab-area-vice-president-financial-services",
  "jobUrl": "https://weworkremotely.com/remote-jobs/gitlab-area-vice-president-financial-services",
  "title": "GitLab: Area Vice President - Financial Services",
  "role": "Area Vice President - Financial Services",
  "company": "GitLab",
  "category": "Customer Support",
  "jobType": "Full-Time",
  "region": "Anywhere in the World",
  "country": null,
  "state": null,
  "skills": [],
  "isWorldwide": true,
  "publishedAt": "2026-07-31T07:31:03Z",
  "publishedDate": "2026-07-31",
  "expiresAt": "2026-08-30T07:31:03Z",
  "description": "Headquarters: Remote, US\n\nGitLab is the intelligent orchestration platform for DevSecOps. GitLab enables organizations to increase developer productivity, improve operational efficiency, reduce security and compliance...",
  "sourceFeed": "remote-customer-support-jobs",
  "sourceQuery": "categories=remote-customer-support-jobs/remote-sales-and-marketing-jobs, terms=success/account manager"
}
```

That row carries 19 fields in total; 18 are shown.

#### Fields on every row

| Field | Type | What it is |
| --- | --- | --- |
| `jobId` | string | Stable WeWorkRemotely slug for this listing, taken from its URL. Unique per posting and safe to use as a primary key. |
| `jobUrl` | string | Public WeWorkRemotely page for this listing. |
| `title` | string | The listing title exactly as published, in WeWorkRemotely's "Company: Role" form. |
| `role` | string | The role on its own, with the company prefix removed. |
| `company` | string | The hiring company, taken from the title prefix. |
| `category` | string | WeWorkRemotely category the listing is filed under. |
| `jobType` | string | Contract shape of the role as published. |
| `region` | string | Where the role may be worked from. Most WeWorkRemotely listings are open worldwide. |
| `country` | string | Country restriction, when the employer sets one. |
| `state` | string | State or province restriction, when the employer sets one. |
| `skills` | list | Skill tags the employer attached to the listing. |
| `isWorldwide` | true/false | True when the role is open to candidates anywhere in the world. |
| `publishedAt` | string | When the listing was published, ISO 8601. |
| `publishedDate` | string | Publication date only, YYYY-MM-DD, for grouping and filtering. |
| `expiresAt` | string | When the listing comes off the board, ISO 8601, when the employer sets it. |
| `description` | string | Full listing text as plain text, converted from the feed's HTML. Null when 'Include the full job description' is turned off. |
| `sourceFeed` | string | Which WeWorkRemotely feed the row came from. |
| `sourceQuery` | string | The resolved query that produced this row, so a merged dataset stays traceable. |
| `scrapedAt` | string | When this Actor read the row from WeWorkRemotely, ISO 8601. |

4 named dataset views ship with it: **Jobs overview**, **Worldwide roles**, **Companies hiring**, **Full text**. They drive the Output tab in Console and the Output block on the Actor's `.md` page.

### FAQ

#### How many jobs are on the board at once?

Around 700 live listings across the 11 categories. The whole-board feed serves the newest 100; reading the category feeds gets you the rest.

#### Are these jobs really remote?

Yes - WeWorkRemotely is a remote-only board. Use `isWorldwide` and `region` to tell globally open roles from ones restricted to a country or state.

#### How do I get only brand-new postings?

Set **Posted within the last N days** to 1 and schedule the run daily. Every row carries `publishedAt`.

#### Why is the company in the title?

WeWorkRemotely publishes titles as "Company: Role". The Actor splits them for you into `company` and `role`, and keeps the original in `title`.

#### Can I use this from an AI agent?

Yes. The dataset schema types and documents every field, so the output chains directly into agent workflows through the Apify MCP server.

***

Unofficial - not affiliated with WeWorkRemotely. Collects public data only. reapx. Contact reapxdev@proton.me.

### The full published archive

- **[weworkremotely scraper archive](https://reapx.dev/data/weworkremotely-scraper/)** — every entity this Actor has observed
- **[All reapx datasets](https://reapx.dev/data/)** — 20 sources, tens of thousands of pages
- **[llms.txt](https://reapx.dev/llms.txt)** · **[feed.json](https://reapx.dev/feed.json)** ·
  **[feed.xml](https://reapx.dev/feed.xml)** — the machine-readable index, for agents

Each archive page carries Dataset JSON-LD, a canonical URL and the identifiers used, so an agent
can resolve an entity without running anything. Nothing on those pages is estimated or modelled.

### 🧪 Example input

A real, runnable configuration — this is an actual input this Actor has run with.

```json
{
  "includeDescription": true,
  "requestDelaySecs": 2,
  "categories": [
    "remote-customer-support-jobs",
    "remote-sales-and-marketing-jobs"
  ],
  "searchTerms": [
    "success",
    "account manager"
  ],
  "maxJobs": 200
}
```

### 📄 Sample output

One real row from a real run of this Actor, unedited.

```json
{
  "jobId": "gitlab-area-vice-president-financial-services",
  "jobUrl": "https://weworkremotely.com/remote-jobs/gitlab-area-vice-president-financial-services",
  "title": "GitLab: Area Vice President - Financial Services",
  "role": "Area Vice President - Financial Services",
  "company": "GitLab",
  "category": "Customer Support",
  "jobType": "Full-Time",
  "region": "Anywhere in the World",
  "country": null,
  "state": null,
  "skills": [],
  "isWorldwide": true,
  "publishedAt": "2026-07-31T07:31:03Z",
  "publishedDate": "2026-07-31",
  "expiresAt": "2026-08-30T07:31:03Z",
  "description": "Headquarters: Remote, US\n\nGitLab is the intelligent orchestration platform for DevSecOps. GitLab enables organizations to increase developer productivity, improve operational efficiency, reduce security and compliance risk, and accelerate digital transformation. More than 50 million registered users and more than 50% of the Fortune 100* trust GitLab to ship better, more secure software faster.\n\nThe same principles built into our products are reflected in how our team works: we embrace AI as a core productivity multiplier, with all team members expected to incorporate AI into their daily workflows to drive efficiency, innovation, and impact. GitLab is where careers accelerate, innovation flourishes, and every voice is valued. Our high-performance culture is driven by our values and continuous knowledge exchange, enabling our team members to reach their full potential while collaborating with industry leaders to solve complex problems. Co-create the future with us as we build technology that transforms how the world develops software.\n\n* Fortune 500® is a registered trademark of Fortune Media IP Limited, used under license. Claim based on GitLab data. Fortune 100 refers to the top 20% ranked companies in the 2025 Fortune 500 list, published in June 2025. Fortune and Fortune Media IP Limited are not affiliated with, and do not endorse products or services of GitLab.\n\nAn overview of this role\n\nAs Area Vice President, you'll lead GitLab's Financial Services sales organization and shape how we win new customers, expand existing relationships, and deliver predictable growth. You'll build and develop a team of Regional Sales Directors who lead Enterprise and Commercial Account Executives, helping financial services customers improve how they build, secure, and deliver software with GitLab's DevSecOps platform.\n\nReporting to the Vice President of Sales, AMER, you'll set the strategy for the area while staying close to customers, leaders, and day-to-day execution. This is an opportunity to build a high-performing sales organization, strengthen key customer and partner relationships, and work across GitLab to create lasting customer value.\n\nWhat you'll do\n\n\nEstablish and deliver a strategy to win new customers, expand existing accounts with purpose, and create a shared vision for long-term growth.\n\nDrive customer success and predictable year-over-year annual recurring revenue growth for GitLab.\n\nRecruit, develop, and retain a diverse and effective sales organization of Regional Sales Directors and Strategic Account Executives.\n\nBuild and
```

### How it works

1. You set the filters below, or none at all.
2. The Actor calls the source's own public endpoint and pages through the results.
3. Every row is pushed to the dataset **as it is built**, not buffered to the end — so a
   run that hits its time limit still returns everything it collected up to that point.
4. You are charged per row returned, so the maximum-results field is also your cost cap.

### 💬 Your feedback

Found a bug, or need a field this does not return yet? Open an issue on the Actor's **Issues**
tab, or write to **reapxdev@proton.me**. Bugs get fixed and reasonable field requests get
added.

# Actor input Schema

## `categories` (type: `array`):

Which WeWorkRemotely category feeds to read. Leave empty to read the whole board in one request.

## `searchTerms` (type: `array`):

Words to match against the title, description, skills and category, one per line. A job is kept if it matches at least one. Examples: python, react, senior, healthcare.<br><br>Leave this field empty to include every option.

## `regions` (type: `array`):

Match against the listing's region, country or state, one per line. Examples: Anywhere in the World, USA, Europe, Canada.<br><br>Leave this field empty to include every option.

## `jobTypes` (type: `array`):

Contract shape of the role. Leave empty for all types.

## `companies` (type: `array`):

Keep only listings from these companies, matched as a partial name, one per line. Examples: Doximity, Cloudflare.<br><br>Leave this field empty to include every option.

## `postedWithinDays` (type: `integer`):

Return only listings published in the last N days, recomputed on every run. Use 1 for a daily feed or 7 for a weekly one. Leave empty for no date limit.<br><br>The higher the number, the longer the run takes and the more you are charged, because you pay per row returned.

## `maxJobs` (type: `integer`):

Hard stop on how many jobs are returned and charged. Each job returned costs $0.002. 100 jobs finishes in seconds.<br><br>The higher the number, the longer the run takes and the more you are charged, because you pay per row returned.

## `includeDescription` (type: `boolean`):

Carry the full listing text on every row, converted from HTML to plain text. Turn off for a smaller, faster dataset that is just the job facts.

## `requestDelaySecs` (type: `integer`):

Seconds to wait between feed requests. 1 is the minimum this Actor allows; raise it if you are running several jobs at once.

## Actor input object example

```json
{
  "categories": [
    "remote-programming-jobs",
    "remote-devops-sysadmin-jobs"
  ],
  "searchTerms": [
    "python",
    "kubernetes"
  ],
  "regions": [
    "Anywhere in the World"
  ],
  "jobTypes": [
    "Contract"
  ],
  "companies": [
    "Cloudflare"
  ],
  "postedWithinDays": 7,
  "maxJobs": 500,
  "includeDescription": true,
  "requestDelaySecs": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

Company, role, category and region - the columns most runs are read for.

## `worldwide` (type: `string`):

Listings open to candidates anywhere, with no country restriction.

## `companies` (type: `string`):

Company-level columns, for lead lists and remote-hiring market maps.

## `full` (type: `string`):

Description and skills, for analysis and LLM pipelines.

## `results` (type: `string`):

Every record this run produced, with all fields and no view applied. Field-level titles, types, descriptions and examples are declared in the dataset schema.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxJobs": 100,
    "includeDescription": true,
    "requestDelaySecs": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("reapx/weworkremotely-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxJobs": 100,
    "includeDescription": True,
    "requestDelaySecs": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("reapx/weworkremotely-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxJobs": 100,
  "includeDescription": true,
  "requestDelaySecs": 2
}' |
apify call reapx/weworkremotely-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=reapx/weworkremotely-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/B60RE4TVT4GPgcyAI/builds/V5FdRiHZk3VSaSL9e/openapi.json
