# We Work Remotely Jobs Scraper (`deriverge/weworkremotely-jobs-scraper`) Actor

Remote jobs from all ten We Work Remotely categories with the company's headquarters and website, skills and the countries candidates may live in. Filter by keyword, country, contract or posting date, and schedule the new-only mode for a daily list of fresh listings.

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

## Pricing

from $1.00 / 1,000 jobs

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## We Work Remotely Jobs Scraper

We Work Remotely is a job board that lists only remote work, sorted into ten categories from programming and design to customer support and sales. Each row is one listing: title, company, the company's headquarters and website, category, skills, full-time or contract, the countries candidates may live in, posting and expiry dates and the link. The form starts with three categories selected, so **Start** returns up to 50 jobs in a few seconds. The board's feeds have no pay field; where an employer states a salary, it is in the description. It costs $2.00 per 1,000 jobs on the Free plan ($1.00 on Business), and the $5 of monthly credit in Apify's Free plan covers about 2,500 jobs.

### Output fields

| Field | Description |
|---|---|
| `title`, `company` | Job title and company, split from the listing title, e.g. `Logicstics: Digital Marketing & Google Ads / AI Search Specialist`. |
| `companyHeadquarters` | Where the company is based, as the listing states it: `Philadelphia, PA, USA`, `Zurich, Switzerland` or just `Remote`. |
| `companyUrl`, `companyLogo` | Company website and logo, when the listing has them: 147 and 96 of 375 listings on 11 October 2026. |
| `category` | One of the ten categories, e.g. `Sales and Marketing` or `DevOps and Sysadmin`. |
| `tags` | Skills the employer picked, e.g. `SEO`, `AI Strategy` and `Google Ads`. Empty on 288 of the 375 listings. |
| `employmentType` | `full_time` or `contract`. |
| `locationRestriction` | Where candidates may live, in the board's words: a list of countries, a region such as `Europe` or `North America Only`, or `Anywhere in the World`. |
| `countries` | The same countries as a list, e.g. `["United States of America"]`. Empty when the listing names no country. |
| `postedAt`, `expiresAt` | When the listing was published and when it expires, in UTC. |
| `description` | The listing text without HTML. By default the first 300 characters, and the whole text with **Include the full description**. The headquarters and website lines move to their own fields. |
| `url`, `applyUrl`, `jobId`, `key` | The listing on weworkremotely.com, which is also the apply link and the job's ID; `key` adds the `weworkremotely:` prefix. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText`, `seniority`, `timezones`, `verified`, `companySlug` | Always empty here. The actor shares one table with our Remote Jobs Scraper, which reads six boards, and We Work Remotely provides none of these. `source` and `sourceName` are always `weworkremotely` and `We Work Remotely`. |

### How to scrape We Work Remotely

1. In **Categories**, choose any of Full-Stack, Back-End and Front-End Programming, Design, DevOps and Sysadmin, Management and Finance, Product, Customer Support, Sales and Marketing and All Other Remote. With none chosen, the actor reads the main feed and all ten categories.
2. Optionally keep only some of the jobs: **Keywords (any of)** looks in the title, company, category and skills; **Candidate countries (any of)** takes a name such as `Canada` or a code such as `CA`; **Employment types** picks full time or contract; **Posted within the last N days** drops older listings, and **Exclude keywords** drops listings whose title, company, category or skills contain a word you name.
3. Turn on **Include the full description** if you need the whole listing text. The price does not change.
4. Set **Maximum rows** and click **Start**. The listings land in the **Output** tab, and the export button there gives CSV, Excel or JSON.

For API users, Python and Django jobs open to candidates in Germany or Europe, posted in the last week:

```json
{
  "categories": ["full-stack-programming", "back-end-programming", "devops-sysadmin"],
  "keywords": ["python", "django"],
  "locations": ["DE", "Europe"],
  "postedWithinDays": 7,
  "includeDescription": true,
  "maxItems": 200
}
```

### Example output

One listing from a run with the default settings on 11 October 2026, so `description` holds its first 300 characters.

```json
{
  "key": "weworkremotely:https://weworkremotely.com/remote-jobs/logicstics-digital-marketing-google-ads-ai-search-specialist",
  "source": "weworkremotely",
  "sourceName": "We Work Remotely",
  "jobId": "https://weworkremotely.com/remote-jobs/logicstics-digital-marketing-google-ads-ai-search-specialist",
  "title": "Digital Marketing & Google Ads / AI Search Specialist",
  "company": "Logicstics",
  "companyLogo": "https://wwr-pro.s3.amazonaws.com/logos/0171/6146/logo.gif",
  "companySlug": null,
  "companyUrl": "https://logicstics.com",
  "companyHeadquarters": "Philadelphia, PA, USA",
  "category": "Sales and Marketing",
  "tags": [
    "SEO",
    "AI Strategy",
    "Google Ads"
  ],
  "employmentType": "full_time",
  "seniority": null,
  "locationRestriction": "Anywhere in the World",
  "countries": [],
  "timezones": [],
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryPeriod": null,
  "salaryText": null,
  "postedAt": "2026-10-07T21:47:34.000Z",
  "expiresAt": "2026-11-06T21:47:34.000Z",
  "verified": null,
  "description": "Remote | Full-Time Logicstics is looking for an experienced Digital Marketing & Google Ads / AI Search Specialist to take ownership of our online lead generation strategy. We are an international moving and logistics company serving customers relocating throughout the world. This is a hands-on posit",
  "url": "https://weworkremotely.com/remote-jobs/logicstics-digital-marketing-google-ads-ai-search-specialist",
  "applyUrl": "https://weworkremotely.com/remote-jobs/logicstics-digital-marketing-google-ads-ai-search-specialist"
}
```

### How much does it cost to scrape We Work Remotely?

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 jobs | $2.00 | $1.60 | $1.30 | $1.00 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

On 11 October 2026 the main feed and the ten category feeds held 375 different jobs, and returning all of them costs $0.75 on the Free plan or $0.375 on Business. A job that sits in two feeds is returned once, and listings your filters drop or the new-only mode skips are not charged.

### Limits

- The actor reads the board's RSS feeds: the main feed and one feed per category. The board's web pages answered our requests with HTTP 403 in October 2026, so anything the feeds do not carry cannot be returned. The category feeds held between 4 jobs (Back-End Programming) and 100 (Sales and Marketing) on 11 October 2026, and an exact 100 may mean that feed is capped.
- 279 of the 375 jobs were open `Anywhere in the World` and pass every **Candidate countries** filter. 84 named countries, 64 of them the United States, and 12 named a region or a city.
- The keyword filter does not search the description, and only 87 of the 375 listings had skills, so a keyword mostly has to appear in the title.
- Skills are split at commas. Two skills that the board joins with "and" stay one tag, e.g. `Technical Support and Customer Support`.
- `postedAt` is the date the listing first went up. Most listings expire 30 days later, but some run much longer: one listing still live in October 2026 was first posted in June 2023.

### A daily feed of new remote jobs

Turn on **Return only jobs new since the last run**, give the run a **Watch name** such as `python-europe` or save it as a task, and add a daily schedule. The actor remembers every job it read under that name while the job stays in the feeds and for 60 days after it leaves them, so each run returns only listings that were not there before. A job that passed your filters but did not fit under **Maximum rows** is not marked as seen and comes with the next run.

### FAQ

#### Is it legal to scrape We Work Remotely?

The actor reads the RSS feeds that We Work Remotely publishes for anyone to subscribe to. It does not open the job pages and collects nothing about applicants. Employers write the listings, and `url` leads back to the original on weworkremotely.com. What you do with the listings, including republishing them, is your responsibility.

#### How fresh are the jobs?

Each run reads the feeds at that moment. Of the 375 jobs listed on 11 October 2026, half had been posted in the previous 11 days and 340 were set to expire 30 days after posting.

### Related scrapers

- [Remote Jobs Scraper](https://apify.com/deriverge/remote-jobs-scraper)
- [Himalayas Jobs Scraper](https://apify.com/deriverge/himalayas-jobs-scraper)
- [Remote OK Jobs Scraper](https://apify.com/deriverge/remoteok-jobs-scraper)
- [Career Site and ATS Jobs API](https://apify.com/deriverge/career-site-jobs-search)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/deriverge/weworkremotely-jobs-scraper/changelog.md

# Actor input Schema

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

We Work Remotely categories to read. Leave empty for every category.

## `keywords` (type: `array`):

Keep only jobs whose title, company, category or skills contain at least one of these words, case-insensitive. Leave empty to keep everything.

## `locations` (type: `array`):

Keep only jobs open to candidates in one of these places, as a name ("Canada") or a two-letter code ("CA"). Jobs open anywhere in the world always pass.

## `employmentTypes` (type: `array`):

Keep only these types. Leave empty for both.

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

Drop jobs older than this. Filtered jobs are never charged.

## `excludeKeywords` (type: `array`):

Drop jobs whose title, company, category or tags contain any of these words, for example "senior" or "sales".

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

Adds the full job description as plain text. Off, each row carries the first 300 characters.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only jobs that were not there before. Schedule it daily and you have a job alert that bills only for new postings.

## `watchName` (type: `string`):

Name of the snapshot used by the new-only mode, for example "python-europe". Runs from a saved task get a snapshot automatically even without a name.

## `maxItems` (type: `integer`):

Hard cap on returned jobs in the run. The run stops reading as soon as it has this many.

## Actor input object example

```json
{
  "categories": [
    "full-stack-programming",
    "devops-sysadmin",
    "design"
  ],
  "includeDescription": false,
  "newOnly": false,
  "maxItems": 50
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per We Work Remotely job with the title, company, salary as numbers, candidate location, posting date and links.

## `changes` (type: `string`):

Jobs that appeared and jobs that disappeared compared with the previous snapshot of the same watch name or task.

## `summary` (type: `string`):

How many jobs were read, how many each filter dropped, warnings about searches that found nothing, and totals.

# 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 = {
    "categories": [
        "full-stack-programming",
        "devops-sysadmin",
        "design"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/weworkremotely-jobs-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 = {
    "categories": [
        "full-stack-programming",
        "devops-sysadmin",
        "design",
    ],
    "maxItems": 50,
}

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

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

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

```

## CLI example

```bash
echo '{
  "categories": [
    "full-stack-programming",
    "devops-sysadmin",
    "design"
  ],
  "maxItems": 50
}' |
apify call deriverge/weworkremotely-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deriverge/weworkremotely-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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