# We Work Remotely Scraper — Remote Jobs (`haketa/weworkremotely-scraper`) Actor

Scrape remote jobs from We Work Remotely: company, job title, region, category, full description, headquarters and apply link. Paste one or more WWR category URLs.

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

## Pricing

from $2.75 / 1,000 results

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 Scraper — Remote Jobs

> **Extract remote jobs from We Work Remotely: company, job title, region, category, full job description, company headquarters and apply link.** Paste one or more WWR category URLs and get clean, structured JSON/CSV/Excel in seconds. Built for job boards, remote-work aggregators, recruiters and researchers.

[![Remote Jobs](https://img.shields.io/badge/Remote-Jobs-1aa06d)]()
[![Full Description](https://img.shields.io/badge/Includes-Full%20Descriptions-8250df)]()
[![Categories](https://img.shields.io/badge/All-Categories-2f7bbf)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%2F%20CSV%20%2F%20Excel-fb8500)]()

***

### What This Actor Does

**We Work Remotely** is one of the largest remote-only job boards. This Actor turns any WWR category into a structured dataset. For every job it returns:

- **Company & role** — hiring company, job title, category (e.g. Full-Stack Programming, Design)
- **Remote details** — allowed region (Anywhere in the World / USA Only / Europe Only …) and company headquarters
- **Full description** — the complete job description as clean text
- **Links & dates** — the apply / company URL, the WWR posting URL, and the published date

Point it at one or many category feeds and it returns every job in each, deduped across categories.

***

### Why Use This

- **Remote-only, curated.** WWR is 100% remote roles from real companies — a high-signal source without the on-site noise of general job boards.
- **Complete job data.** Each record includes the full description, region and company HQ — not just a title and a link.
- **All categories, one run.** Programming, design, devops, support, sales & marketing, product, finance and more — mix and match.
- **Fast and cheap.** Pure-HTTP with a browser-grade fingerprint — no headless browser — so it stays quick and inexpensive.

***

### Quick Start

#### Run it in the console (no code)

1. On **weworkremotely.com**, open a category (e.g. Remote Programming Jobs).
2. Copy the URL, e.g. `https://weworkremotely.com/categories/remote-programming-jobs`.
3. Paste it into **WWR category URLs** (add as many categories as you like), set **Max jobs**, and click **Start**.
4. Export as **JSON, CSV, Excel or HTML**, or push to Google Sheets, a webhook or a database.

#### Run it via API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "startUrls": [
        "https://weworkremotely.com/categories/remote-programming-jobs",
        "https://weworkremotely.com/categories/remote-design-jobs",
    ],
    "maxItems": 200,
}

run = client.actor("YOUR_USERNAME/weworkremotely-scraper").call(run_input=run_input)

for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["company"], "·", job["jobTitle"], "·", job["region"])
```

#### Filter to worldwide-remote roles (Python)

```python
run = client.actor("YOUR_USERNAME/weworkremotely-scraper").call(run_input={
    "startUrls": ["https://weworkremotely.com/categories/remote-programming-jobs"],
    "maxItems": 300,
})
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
worldwide = [r for r in rows if "anywhere" in (r.get("region") or "").lower()]
print(len(worldwide), "roles open worldwide")
```

#### Build a remote job feed (Node.js)

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const CATEGORIES = [
  'remote-programming-jobs', 'remote-design-jobs', 'remote-devops-sysadmin-jobs',
  'remote-customer-support-jobs', 'remote-sales-and-marketing-jobs',
];
const run = await client.actor('YOUR_USERNAME/weworkremotely-scraper').call({
  startUrls: CATEGORIES.map(c => `https://weworkremotely.com/categories/${c}`),
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'remote jobs across', CATEGORIES.length, 'categories');
```

***

### Input Parameters

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | We Work Remotely category URLs. One or many categories. |
| `maxItems` | integer | Max jobs across all categories. `0` = no limit. |
| `proxyConfiguration` | object | Apify Proxy. Datacenter is enough and enabled by default. |

**Categories:** `remote-programming-jobs`, `remote-design-jobs`, `remote-devops-sysadmin-jobs`, `remote-customer-support-jobs`, `remote-sales-and-marketing-jobs`, `remote-management-and-finance-jobs`, `remote-product-jobs`, `remote-copywriting-jobs`, `remote-business-exec-management-jobs`.

***

### Output

Each job is one record:

```json
{
  "company": "Flexport",
  "jobTitle": "Senior Systems Engineer (Identity and Access)",
  "region": "Anywhere in the World",
  "category": "Full-Stack Programming",
  "headquarters": "U.S. Remote",
  "companyUrl": "https://www.click2apply.net/...",
  "description": "About Flexport: At Flexport, we believe global trade can move the human race forward…",
  "jobId": "flexport-senior-systems-engineer-identity-and-access",
  "url": "https://weworkremotely.com/remote-jobs/flexport-senior-systems-engineer-identity-and-access",
  "publishedDate": "Thu, 10 Sep 2026 07:30:45 +0000",
  "scrapedAt": "2026-09-25T11:35:00.000Z"
}
```

***

### Use Cases

#### 1. Remote job boards & aggregators

Power a niche remote job board or newsletter with a clean, complete, deduped feed of remote roles across every category.

#### 2. Recruiting & sourcing

Track which companies are hiring remotely, in which regions and functions — time outreach and map remote talent demand.

#### 3. Remote-work market research

Quantify remote hiring by category, region (worldwide vs country-restricted) and company over time.

#### 4. Lead generation

Companies actively hiring remotely — with their HQ and site — are a targeted lead source for tools, staffing and services.

#### 5. Content & analytics

Full descriptions make a ready corpus for skills analysis, salary/keyword mining, or trend reporting on remote work.

***

### Tips

- **Add every category** you care about to `startUrls` — the Actor dedupes jobs that appear in more than one.
- **`region`** tells you where a role is open (e.g. "Anywhere in the World", "USA Only", "Europe Only") — filter on it for eligibility.
- **`maxItems: 0`** returns all jobs in the provided categories.
- **Schedule it** with Apify Schedules to keep a fresh remote-jobs feed.

***

### Frequently Asked Questions

**Do I need a We Work Remotely account?**
No. The Actor reads publicly available job postings — no login required.

**Does it include the full job description?**
Yes — each record carries the complete description as clean text, plus company HQ and region.

**Which categories are supported?**
All WWR categories — just paste their URLs. See the list above.

**Can I scrape multiple categories at once?**
Yes — add several category URLs; jobs are deduped across them and each row carries its `category`.

**What export formats are supported?**
JSON, CSV, Excel, HTML, or via API — plus Google Sheets, webhooks, Make and Zapier.

***

### Legal & Responsible Use

This Actor collects only publicly available job-posting information for research, recruiting and analytics. You are responsible for how you use the data. Please:

- Respect We Work Remotely's Terms of Service and robots directives.
- Comply with applicable data-protection laws when handling any personal data.
- Do not use the data for spam, harassment, or any unlawful purpose.
- Use reasonable request volumes and scheduling.

This project is an independent tool and is not affiliated with, endorsed by, or sponsored by We Work Remotely.

# Actor input Schema

## `startUrls` (type: `array`):

We Work Remotely category URLs, e.g. https://weworkremotely.com/categories/remote-programming-jobs . Categories include: remote-programming-jobs, remote-design-jobs, remote-devops-sysadmin-jobs, remote-customer-support-jobs, remote-sales-and-marketing-jobs, remote-management-and-finance-jobs, remote-product-jobs, remote-copywriting-jobs, remote-business-exec-management-jobs.

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

Maximum number of jobs across all categories. 0 = no limit.

## `proxyConfiguration` (type: `object`):

Apify Proxy. Datacenter is enough for We Work Remotely and is enabled by default; add residential only if you hit rate limits.

## Actor input object example

```json
{
  "startUrls": [
    "https://weworkremotely.com/categories/remote-programming-jobs",
    "https://weworkremotely.com/categories/remote-design-jobs"
  ],
  "maxItems": 40,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `company` (type: `string`):

Hiring company

## `jobTitle` (type: `string`):

Job title

## `region` (type: `string`):

Allowed region (e.g. Anywhere / USA Only)

## `category` (type: `string`):

Job category

## `headquarters` (type: `string`):

Company HQ location

## `companyUrl` (type: `string`):

Company / apply URL

## `description` (type: `string`):

Full job description (text)

## `jobId` (type: `string`):

Job slug / ID

## `url` (type: `string`):

Job posting URL

## `publishedDate` (type: `string`):

Posted date

## `scrapedAt` (type: `string`):

ISO timestamp

# 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 = {
    "startUrls": [
        "https://weworkremotely.com/categories/remote-programming-jobs",
        "https://weworkremotely.com/categories/remote-design-jobs"
    ],
    "maxItems": 40,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/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 = {
    "startUrls": [
        "https://weworkremotely.com/categories/remote-programming-jobs",
        "https://weworkremotely.com/categories/remote-design-jobs",
    ],
    "maxItems": 40,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/weworkremotely-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 '{
  "startUrls": [
    "https://weworkremotely.com/categories/remote-programming-jobs",
    "https://weworkremotely.com/categories/remote-design-jobs"
  ],
  "maxItems": 40,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/weworkremotely-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/weworkremotely-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/WYBmC8o2plkWjrlHm/builds/48DRwEawXYdIDKUnj/openapi.json
