# We Work Remotely Scraper (`goat255/weworkremotely-scraper`) Actor

Scrape remote job listings from We Work Remotely without a login. Pull the all-jobs feed or specific categories, with company, role, region, job type, skills, apply link, logo, and full description. Optional keyword filter across every field.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

Scrape remote job listings from We Work Remotely (role, company, category, region, skills, salary-relevant tags, listing URL, company logo, and the full job description) with no login and no API key required. Pull the all-jobs feed or any set of categories, cap the volume, and filter by keyword across every field.

### What it does

- Extracts every open remote job from the all-jobs feed (the most recent listings across all categories) or from any specific categories you choose.
- Returns a clean, structured row per job: role, company, listing URL, category, job type, region, skills, full description (plain text and HTML), company logo, published date, and expiry date.
- Optional keyword filter keeps only jobs whose title, company, skills, region, category, or description matches your terms.
- Fetches multiple categories in parallel and applies your per-category cap.
- No account, no cookies, no API key. Runs straight out of the box.

### Use cases

- **Job-board aggregation**: feed fresh remote roles into your own job site, newsletter, or Slack/Discord channel.
- **Recruiting and sourcing**: monitor which companies are hiring for specific skills (Python, React, design, customer support) and how often.
- **Market and hiring research**: track remote-hiring trends by category, region, and job type over time.
- **Lead generation**: build a list of companies actively hiring remotely as outbound prospects.
- **Talent-pool alerts**: watch a category for new postings matching a keyword and notify candidates the moment a match appears.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `categories` | array | `["remote-jobs"]` | Category slugs to fetch. `remote-jobs` is the all-jobs feed (most recent across every category). Pass specific slugs to target a niche. |
| `searchQueries` | array | `[]` | Optional keywords. When set, only jobs matching at least one term (across title, company, skills, region, category, or description) are kept. Empty keeps every job. |
| `maxItemsPerCategory` | integer | `100` | Cap on jobs returned per category before keyword filtering. |
| `concurrency` | integer | `5` | How many categories to fetch in parallel. |
| `proxyConfig` | object | `{ "useApifyProxy": false }` | Optional proxy. Not required for this source. |

#### Example input

```json
{
  "categories": [
    "remote-full-stack-programming-jobs",
    "remote-design-jobs"
  ],
  "searchQueries": ["python", "react"],
  "maxItemsPerCategory": 100
}
````

To pull everything recent, run with the default `["remote-jobs"]`.

#### Common category slugs

- `remote-jobs` (all jobs)
- `remote-programming-jobs`
- `remote-back-end-programming-jobs`
- `remote-front-end-programming-jobs`
- `remote-full-stack-programming-jobs`
- `remote-devops-sysadmin-jobs`
- `remote-design-jobs`
- `remote-product-jobs`
- `remote-customer-support-jobs`
- `remote-sales-and-marketing-jobs`
- `remote-management-and-finance-jobs`

### Output

Each job is one dataset row, with keys ordered by importance (identity, then attributes, then content, then media, then dates):

```json
{
  "type": "job",
  "role": "Senior Backend Engineer",
  "company": "Acme Co",
  "url": "https://weworkremotely.com/remote-jobs/acme-co-senior-backend-engineer",
  "category": "Back-End Programming",
  "jobType": "Full-Time",
  "region": "Anywhere in the World",
  "skills": ["Python", "PostgreSQL", "Django"],
  "title": "Acme Co: Senior Backend Engineer",
  "descriptionText": "About Acme Co. We are hiring a Senior Backend Engineer...",
  "descriptionHtml": "<p>About Acme Co...</p>",
  "companyLogo": "https://example.com/logo.png",
  "publishedAt": "2026-06-17T17:33:39.000Z",
  "expiresAt": "2026-07-17T17:33:39.000Z",
  "scrapedAt": "2026-06-18T09:00:00.000Z"
}
```

#### Key fields

- **`role`** and **`company`** are split out of the listing title for easy filtering and dedup.
- **`url`** is the canonical listing page, which is where candidates apply.
- **`skills`** is an array of tags parsed from the listing (present on most, but not all, jobs).
- **`region`** is the human-readable location (for example "Anywhere in the World", "USA Only", or a specific state).
- **`descriptionText`** is the full posting as clean plain text; **`descriptionHtml`** keeps the original formatting.
- **`publishedAt`** / **`expiresAt`** are ISO 8601 timestamps for filtering by freshness.

### FAQ

**Is it free? How is it priced?**
The actor runs on Apify's standard pay-per-use model. There is no per-run start fee. You pay per job returned, so a small run costs very little and you only pay for what you extract.

**Do I need a login, account, or API key for the source?**
No. The listings are public, so there is nothing to log in to and no key to provide. Just set your input and run.

**How many jobs can I get?**
The all-jobs feed carries up to the 100 most recent listings across all categories. Each category feed carries its own current openings (typically a few dozen). To widen coverage, request several categories at once. `maxItemsPerCategory` caps each category before keyword filtering.

**How fast is it?**
Each category is a single request, and categories run in parallel, so a typical multi-category run finishes in seconds.

**Can I filter to only the jobs I care about?**
Yes. Use `searchQueries` to keep only jobs that match your keywords (skills, role, company, region, or any text in the description). Or target specific `categories` to narrow by job type up front.

**Why is `skills` or `companyLogo` sometimes empty?**
Those values are optional on the source listing. When a posting does not include skill tags or a logo, the field is returned empty rather than guessed. Core fields (role, company, url, category, region, dates) are always present.

# Actor input Schema

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

Which remote-job categories to pull. Leave the default to fetch the all-jobs feed (most recent listings across every category). You may also pass specific category slugs, for example remote-full-stack-programming-jobs, remote-design-jobs, remote-customer-support-jobs.

## `searchQueries` (type: `array`):

Optional keywords. When set, only jobs whose title, company, skills, region, category, or description contains one of these terms are kept. Leave empty to keep every job. Example: python, react, customer support.

## `maxItemsPerCategory` (type: `integer`):

Cap on jobs returned per category before keyword filtering. The all-jobs feed holds up to 100 recent listings; category feeds are smaller. A higher cap simply returns whatever the feed currently has.

## `concurrency` (type: `integer`):

How many categories to fetch in parallel.

## `proxyConfig` (type: `object`):

Optional proxy. The public job feeds do not require a proxy, but you may route through one if you wish.

## Actor input object example

```json
{
  "categories": [
    "remote-jobs"
  ],
  "searchQueries": [],
  "maxItemsPerCategory": 100,
  "concurrency": 5,
  "proxyConfig": {
    "useApifyProxy": false
  }
}
```

# 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": [
        "remote-jobs"
    ],
    "searchQueries": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("goat255/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 = {
    "categories": ["remote-jobs"],
    "searchQueries": [],
}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "We Work Remotely Scraper",
        "description": "Scrape remote job listings from We Work Remotely without a login. Pull the all-jobs feed or specific categories, with company, role, region, job type, skills, apply link, logo, and full description. Optional keyword filter across every field.",
        "version": "0.1",
        "x-build-id": "35vgDWCKB3hFdMn33"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/goat255~weworkremotely-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-goat255-weworkremotely-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/goat255~weworkremotely-scraper/runs": {
            "post": {
                "operationId": "runs-sync-goat255-weworkremotely-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/goat255~weworkremotely-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-goat255-weworkremotely-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": "Categories",
                        "type": "array",
                        "description": "Which remote-job categories to pull. Leave the default to fetch the all-jobs feed (most recent listings across every category). You may also pass specific category slugs, for example remote-full-stack-programming-jobs, remote-design-jobs, remote-customer-support-jobs.",
                        "default": [
                            "remote-jobs"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search queries (keyword filter)",
                        "type": "array",
                        "description": "Optional keywords. When set, only jobs whose title, company, skills, region, category, or description contains one of these terms are kept. Leave empty to keep every job. Example: python, react, customer support.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItemsPerCategory": {
                        "title": "Max items per category",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on jobs returned per category before keyword filtering. The all-jobs feed holds up to 100 recent listings; category feeds are smaller. A higher cap simply returns whatever the feed currently has.",
                        "default": 100
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many categories to fetch in parallel.",
                        "default": 5
                    },
                    "proxyConfig": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxy. The public job feeds do not require a proxy, but you may route through one if you wish.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
