# We Work Remotely Jobs Scraper (`vaulted/remote-jobs-scraper`) Actor

Scrape every live remote job from We Work Remotely into structured JSON, CSV or Excel. Job title, company, headquarters, contract type, region and direct link.

- **URL**: https://apify.com/vaulted/remote-jobs-scraper.md
- **Developed by:** [Vault](https://apify.com/vaulted) (community)
- **Categories:** Jobs, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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?

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

## How to integrate an Actor?

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

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

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

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

# README

### What does We Work Remotely Jobs Scraper do?

**This Actor scrapes every live remote job listing from [We Work Remotely](https://weworkremotely.com), one of the largest remote job boards on the internet, and returns it as clean structured data.** For each job you get the title, company, company headquarters, contract type, eligible regions, whether it is a promoted listing, and a direct link to apply.

A full run takes a couple of seconds and returns around 180 live jobs. You can download the results as JSON, CSV, Excel, or HTML, pull them through the Apify API, or schedule the Actor to run daily and pipe new listings straight into your own system.

### Why use this scraper?

- **Build a job board** — power your own niche remote job site with fresh listings.
- **Recruitment intelligence** — see which companies are hiring, for what, and from where.
- **Lead generation** — companies actively hiring remote engineers are companies with budget.
- **Market research** — track remote hiring demand by role, contract type, and region over time.
- **Personal job hunting** — filter by keyword and get a clean spreadsheet instead of scrolling a web page.

We Work Remotely has no public API. This Actor is the fastest way to get its data programmatically.

### How to use it

1. Click **Start** to run it with the defaults — this returns every live job on the board.
2. To narrow the results, set **Filter by keyword** (for example `engineer`, `designer`, or `python`).
3. To restrict to a contract type, pick one from the **Contract type** dropdown.
4. Set **Maximum jobs** if you want to cap the run size.
5. When the run finishes, open the **Storage** tab and export in your preferred format.

To keep a dataset continuously fresh, open the **Schedule** tab and set the Actor to run once a day.

### Input

| Field | Type | Description |
|---|---|---|
| `maxItems` | integer | Maximum jobs to return. Default `200`. The board holds roughly 180 live listings. |
| `keyword` | string | Only return jobs whose title or company contains this text. Leave empty for everything. |
| `contractType` | select | `any`, `Full-Time`, `Part-Time`, `Contract`, or `Freelance`. |

Example input:

```json
{
    "maxItems": 200,
    "keyword": "engineer",
    "contractType": "Full-Time"
}
```

### Output

Each job becomes one dataset item:

```json
{
    "title": "Application Security Engineer II",
    "company": "Abnormal",
    "headquarters": "California, US",
    "contractType": "Full-Time",
    "region": "Anywhere in the World",
    "regions": ["Anywhere in the World"],
    "isPromoted": false,
    "isNew": true,
    "categories": ["Full-Time", "Anywhere in the World"],
    "url": "https://weworkremotely.com/remote-jobs/abnormal-application-security-engineer-ii",
    "scrapedAt": "2026-08-25T00:33:23.744Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data fields

| Field | Description |
|---|---|
| `title` | The job title. |
| `company` | Hiring company name. |
| `headquarters` | Where the company is based. |
| `contractType` | Full-Time, Part-Time, Contract, or Freelance. |
| `region` | Primary region the role is open to. |
| `regions` | Full list of eligible regions or countries. |
| `isPromoted` | Whether this is a paid placement (Featured, Boosted, or Top 100). |
| `isNew` | Whether the board flags the listing as new. |
| `categories` | Raw category chips exactly as shown on the site. |
| `url` | Direct link to the job posting. |
| `scrapedAt` | ISO timestamp of when the row was captured. |

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

This Actor is billed **per job returned**, so the cost scales exactly with the data you get. A run that matches nothing costs nothing. Use **Maximum jobs** to put a hard ceiling on any single run.

Because the Actor uses plain HTTP requests rather than a full browser, platform compute cost is very low — a complete run of the whole board finishes in about two seconds.

### Tips

- Run it on a daily schedule and diff against yesterday's dataset to detect brand-new postings.
- The `isPromoted` flag lets you separate organic listings from paid placements — useful if you're measuring genuine hiring demand.
- Use `regions` rather than `region` when you need full geographic eligibility; some listings cover 30+ countries.
- Connect a webhook on run completion to push new jobs into Slack, a spreadsheet, or your database automatically.

### FAQ, disclaimers, and support

**Is this legal?** This Actor collects only publicly visible job listings. We Work Remotely's `robots.txt` permits crawling of the job listing pages. You remain responsible for complying with the site's Terms of Service and applicable law in how you use the data.

**Why did I get fewer jobs than expected?** The board's live listing count fluctuates as roles are posted and filled. Around 180 is typical. If you set a `keyword` or `contractType` filter, you will naturally get fewer.

**Does it scrape the full job description?** Not currently — it captures the listing index. If you need full descriptions from each job page, open the **Issues** tab and let me know.

Found a bug or need a custom variant? Open an issue on the **Issues** tab.

# Actor input Schema

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

Stop after this many jobs. The board currently holds around 180 live listings.

## `keyword` (type: `string`):

Only return jobs whose title or company contains this text. Leave empty to get everything.

## `contractType` (type: `string`):

Only return jobs of this contract type.

## Actor input object example

```json
{
  "maxItems": 200,
  "keyword": "engineer",
  "contractType": "any"
}
```

# Actor output Schema

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

No description

# 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("vaulted/remote-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("vaulted/remote-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 '{}' |
apify call vaulted/remote-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vaulted/remote-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/QeDo6gNwYsOTsuTxt/builds/fMkcXFESB7tkafNlC/openapi.json
