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

Scrape remote job listings from We Work Remotely using their official public RSS feeds. Filter by category (programming, devops, design, product, marketing, finance, support). No proxy or authentication needed. Returns normalized job data with company info, location, description, and apply links.

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

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## We Work Remotely Jobs Scraper

Scrape remote job listings from [We Work Remotely](https://weworkremotely.com) — the world's largest remote work community — using their official public RSS feeds. No authentication, no proxies, no CAPTCHAs required. Outputs normalized job data (`NormalizedJob`) directly to an Apify Dataset and supports webhook delivery for job board pipelines. Works across 11 job category feeds covering programming, devops, design, product, marketing, finance, and more.

### ✨ Features

- Official WWR RSS feeds — no browser, no proxy, no CAPTCHAs
- 11 job category feeds + all-jobs feed
- Exclude location-restricted jobs (USA Only, Europe Only, etc.)
- Client-side keyword and location filters
- Non-tech role filter (optional)
- Company logo, website, and direct apply link extracted per listing
- Webhook delivery in batches of 50 for job board pipelines
- Same `NormalizedJob` output schema as other inlifeprojects Actors
- Extremely fast — pure RSS parsing, completes in seconds

### 🎯 Use Cases

- Job boards and aggregators
- Recruitment pipeline automation
- Remote work trend monitoring
- Tech hiring market research
- AI agent job search workflows

### 📥 Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `categories` | `string[]` | `["programming-all", "devops", "design", "product"]` | Category feed slugs to fetch. Leave empty to fetch ALL jobs. See available slugs below. |
| `keywordFilter` | `string` | `""` | Client-side keyword filter applied after fetching. Matches against job title, company name, and description. Case-insensitive. |
| `locationFilter` | `string` | `""` | Filter by region. E.g. `"Worldwide"` to exclude location-restricted jobs. Case-insensitive partial match. |
| `excludeLocationRestricted` | `boolean` | `false` | When `true`, excludes jobs with USA Only, North America Only, or other geographic restrictions. Only returns truly worldwide jobs. |
| `filterNonTech` | `boolean` | `false` | When `true`, removes clearly non-technical roles from results. |
| `maxResults` | `integer` | `0` | Maximum total jobs to return across all category feeds. Set to `0` for no limit. |
| `webhookUrl` | `string` | `""` | POST all results to this URL in batches of 50 on completion. |
| `webhookSecret` | `string` | `""` | Sent as `X-Scraper-Secret` header with webhook delivery. |

### 📤 Output Format

Each item in the Apify Dataset follows the `NormalizedJob` schema:

```json
{
  "id": "https://weworkremotely.com/remote-jobs/acme-corp-senior-full-stack-engineer",
  "source": "weworkremotely",
  "source_url": "https://weworkremotely.com/remote-jobs/acme-corp-senior-full-stack-engineer",
  "apply_url": "https://acmecorp.com/careers/senior-full-stack-engineer",
  "title": "Senior Full Stack Engineer",
  "description": "Acme Corp is looking for a Senior Full Stack Engineer to join our fully remote team. You will work across the entire stack building features used by millions of users worldwide...",
  "type": "full-time",
  "work_mode": "remote",
  "location": "Worldwide",
  "experience_level": "",
  "salary_min": null,
  "salary_max": null,
  "currency": "USD",
  "salary_period": "year",
  "company_name": "Acme Corp",
  "company_slug": "acme-corp",
  "company_url": "https://acmecorp.com",
  "company_logo_url": "https://weworkremotely.com/assets/logos/acme-corp.png",
  "tags": ["programming-full"],
  "markets": ["programming-full"],
  "posted_at": "2026-04-28T12:00:00.000Z",
  "expires_at": null,
  "scraped_at": "2026-04-30T09:15:42.000Z",
  "data_source": "We Work Remotely",
  "data_source_url": "https://weworkremotely.com"
}
````

### 🚀 Example Inputs

#### Fetch programming + devops jobs

```json
{
  "categories": ["programming-all", "devops"],
  "excludeLocationRestricted": true
}
```

#### Senior engineers worldwide only

```json
{
  "categories": ["programming-back", "programming-front", "programming-full"],
  "keywordFilter": "senior",
  "excludeLocationRestricted": true
}
```

#### Full tech stack for job board pipeline

```json
{
  "categories": [
    "programming-all", "devops", "design",
    "product", "sales-marketing"
  ],
  "excludeLocationRestricted": false,
  "webhookUrl": "https://yoursite.com/api/internal/scraper/ingest",
  "webhookSecret": "your-secret-here"
}
```

### ⚡ Performance & Cost

- Each RSS feed returns ~50–150 most recent jobs
- 4 category feeds = 4 HTTP requests, ~200–400 unique jobs after dedup
- Typical run: under 10 seconds
- Approximate Apify compute: 0.001–0.005 compute units per run
- Extremely cheap — well within Apify free tier

### 📋 Available Categories

| Slug | Description | Feed URL |
|---|---|---|
| `all` | All remote jobs across every category | `https://weworkremotely.com/remote-jobs.rss` |
| `programming-all` | All programming jobs | `https://weworkremotely.com/categories/remote-programming-jobs.rss` |
| `programming-full` | Full-stack programming jobs | `https://weworkremotely.com/categories/remote-full-stack-programming-jobs.rss` |
| `programming-back` | Back-end programming jobs | `https://weworkremotely.com/categories/remote-back-end-programming-jobs.rss` |
| `programming-front` | Front-end programming jobs | `https://weworkremotely.com/categories/remote-front-end-programming-jobs.rss` |
| `devops` | DevOps & SysAdmin jobs | `https://weworkremotely.com/categories/remote-devops-sysadmin-jobs.rss` |
| `design` | Design jobs | `https://weworkremotely.com/categories/remote-design-jobs.rss` |
| `product` | Product management jobs | `https://weworkremotely.com/categories/remote-product-jobs.rss` |
| `sales-marketing` | Sales & marketing jobs | `https://weworkremotely.com/categories/remote-sales-and-marketing-jobs.rss` |
| `management-finance` | Management & finance jobs | `https://weworkremotely.com/categories/remote-management-and-finance-jobs.rss` |
| `customer-support` | Customer support jobs | `https://weworkremotely.com/categories/remote-customer-support-jobs.rss` |
| `all-other` | All other remote jobs | `https://weworkremotely.com/categories/all-other-remote-jobs.rss` |

### ⚠️ Important Notes

- Salary data is **NOT** available in WWR RSS feeds — salary fields are always `null`
- Employment type defaults to `"full-time"` — not exposed in the RSS feed
- Each feed returns recent listings only — not a full historical archive
- Attribution: results include `source_url` links back to weworkremotely.com

### 🔗 Also by inlifeprojects

- **[Himalayas Remote Jobs Scraper](https://apify.com/inlifeprojects/himalayas-jobs-scraper)** — search remote jobs from [Himalayas.app](https://himalayas.app) by keyword, seniority, employment type, and country. Supports full pagination up to 500 results per keyword with automatic deduplication.
- **[RemoteOK Remote Jobs Scraper](https://apify.com/inlifeprojects/remoteok-jobs-scraper)** — scrape the most recent remote jobs from [RemoteOK.com](https://remoteok.com) by skill tag (javascript, python, react, devops, design and more). Uses RemoteOK's official public JSON API — no proxy, no auth, no browser. Completes in under 5 seconds.

All three Actors share the same `NormalizedJob` output schema — run them together and combine the results with zero extra normalization work for maximum remote job coverage.

### 🙏 Attribution

Data sourced from [We Work Remotely](https://weworkremotely.com) — the world's largest remote work community. Per WWR terms: results link directly back to the original job listing on weworkremotely.com.

### ⚠️ Limitations

- Recent listings only per category — no full historical archive
- No salary data in RSS feeds
- Keyword filtering is client-side — not server-side search
- Rate limiting: do not fetch more than a few times per day

### 📝 Changelog

#### 0.1.0

- Initial release

# Actor input Schema

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

Which WWR category feeds to fetch. Valid slugs: all, programming-all, programming-full, programming-back, programming-front, devops, design, product, sales-marketing, management-finance, customer-support, all-other. Leave empty for the default selection.

## `keywordFilter` (type: `string`):

Client-side keyword filter applied after fetching. Matches against job title, company name, and description. Case-insensitive.

## `locationFilter` (type: `string`):

Filter by region. E.g. 'Worldwide' to exclude location-restricted jobs. Case-insensitive partial match.

## `excludeLocationRestricted` (type: `boolean`):

When true, excludes jobs with USA Only, North America Only, or other geographic restrictions. Only returns truly worldwide jobs.

## `filterNonTech` (type: `boolean`):

When true, removes clearly non-technical roles from results.

## `maxResults` (type: `integer`):

Maximum total jobs to return across all category feeds. Set to 0 for no limit.

## `webhookUrl` (type: `string`):

POST all results to this URL in batches of 50 on completion.

## `webhookSecret` (type: `string`):

Sent as X-Scraper-Secret header with webhook delivery.

## Actor input object example

```json
{
  "categories": [
    "programming-all",
    "devops",
    "design",
    "product"
  ],
  "keywordFilter": "",
  "locationFilter": "",
  "excludeLocationRestricted": false,
  "filterNonTech": false,
  "maxResults": 0,
  "webhookUrl": ""
}
```

# Actor output Schema

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

Scraped remote job listings. Each item contains title, company, location, apply URL, tags, and metadata fields such as posted\_at and scraped\_at.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("inlifeprojects/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("inlifeprojects/weworkremotely-jobs-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 '{}' |
apify call inlifeprojects/weworkremotely-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "We Work Remotely Jobs Scraper",
        "description": "Scrape remote job listings from We Work Remotely using their official public RSS feeds. Filter by category (programming, devops, design, product, marketing, finance, support). No proxy or authentication needed. Returns normalized job data with company info, location, description, and apply links.",
        "version": "0.1",
        "x-build-id": "1Sg7liqBuuxu6eheR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/inlifeprojects~weworkremotely-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-inlifeprojects-weworkremotely-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/inlifeprojects~weworkremotely-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-inlifeprojects-weworkremotely-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/inlifeprojects~weworkremotely-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-inlifeprojects-weworkremotely-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "categories": {
                        "title": "Job categories",
                        "type": "array",
                        "description": "Which WWR category feeds to fetch. Valid slugs: all, programming-all, programming-full, programming-back, programming-front, devops, design, product, sales-marketing, management-finance, customer-support, all-other. Leave empty for the default selection.",
                        "default": [
                            "programming-all",
                            "devops",
                            "design",
                            "product"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywordFilter": {
                        "title": "Keyword filter (optional)",
                        "type": "string",
                        "description": "Client-side keyword filter applied after fetching. Matches against job title, company name, and description. Case-insensitive.",
                        "default": ""
                    },
                    "locationFilter": {
                        "title": "Location filter (optional)",
                        "type": "string",
                        "description": "Filter by region. E.g. 'Worldwide' to exclude location-restricted jobs. Case-insensitive partial match.",
                        "default": ""
                    },
                    "excludeLocationRestricted": {
                        "title": "Exclude location-restricted jobs",
                        "type": "boolean",
                        "description": "When true, excludes jobs with USA Only, North America Only, or other geographic restrictions. Only returns truly worldwide jobs.",
                        "default": false
                    },
                    "filterNonTech": {
                        "title": "Filter out non-tech roles",
                        "type": "boolean",
                        "description": "When true, removes clearly non-technical roles from results.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max total results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum total jobs to return across all category feeds. Set to 0 for no limit.",
                        "default": 0
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (optional)",
                        "type": "string",
                        "description": "POST all results to this URL in batches of 50 on completion.",
                        "default": ""
                    },
                    "webhookSecret": {
                        "title": "Webhook secret (optional)",
                        "type": "string",
                        "description": "Sent as X-Scraper-Secret header with webhook delivery."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
