# WeWorkRemotely Scraper - Remote Jobs & Company Data | $3/1K (`santamaria-automations/weworkremotely-scraper`) Actor

Extract remote job listings from WeWorkRemotely.com. Returns 26 fields: job title, company, salary (min/max), full description, category, location, apply URL, posting date, website and more. Covers programming, design, DevOps, marketing, product, etc. Pay-per-result: $3 per 1,000 extracted jobs.

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

## Pricing

from $3.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.

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

## WeWorkRemotely Scraper - Remote Jobs, Salaries & Companies

Extract remote job listings from [WeWorkRemotely.com](https://weworkremotely.com) — a remote job board. Search by keyword, browse categories, or filter by salary range. Get structured data including salaries, employment type, countries, company info (HQ, website), full descriptions, and apply URLs. No code needed.

***

### What data can you extract?

Every job listing includes:

**Job details**

- Job title and unique ID
- Full description (plain text + raw HTML)
- Category (Full-Stack Programming, Design, DevOps, etc.)
- Employment type (Full-Time, Contract, Part-Time)
- Salary: structured min/max + currency + display text
- Countries (extracted from listing badges)
- Posting date (ISO 8601)
- Apply URL

**Company details**

- Company name
- Company logo URL
- Company profile URL on WeWorkRemotely
- Company HQ location (with `includeCompanyInfo`)
- Company website (with `includeCompanyInfo`)
- Total jobs posted by company (with `includeCompanyInfo`)

**Location**

- Region (e.g. "Anywhere in the World", "US Only", "Europe")

**Meta**

- Source URL on WeWorkRemotely
- Which search query or category found the job
- Scrape timestamp

***

### Pricing

**$3 per 1,000 jobs** — simple, predictable pricing.

| Jobs | Cost |
|------|------|
| 10 jobs | **$0.03** |
| 100 jobs | **$0.30** |
| 1,000 jobs | **$3.00** |

Every job includes the full description, salary, and apply URL. No hidden fees, no monthly subscription.

***

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client — Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Apify MCP server URL:**

```
https://mcp.apify.com?tools=santamaria-automations/weworkremotely-scraper
```

**Example prompt once connected:**

> "Use `weworkremotely-scraper` to find remote software engineering jobs paying $100K+. Return the top 10 results as a table with title, company, salary, and country."

***

### How to use

The scraper supports three URL formats:

#### 1. Search URLs (recommended)

Search for any keyword, optionally filter by salary range. Go to [weworkremotely.com](https://weworkremotely.com), use the search bar, apply filters, and copy the URL.

```json
{
  "searchUrls": [
    "https://weworkremotely.com/remote-jobs/search?term=software",
    "https://weworkremotely.com/remote-jobs/search?term=engineer&salary_range%5B%5D=%24100%2C000%20or%20more%20USD"
  ]
}
```

#### 2. Category URLs

Browse entire job categories via RSS feeds. Fast and comprehensive.

```json
{
  "searchUrls": [
    "https://weworkremotely.com/categories/remote-programming-jobs",
    "https://weworkremotely.com/categories/remote-design-jobs",
    "https://weworkremotely.com/remote-full-time-jobs"
  ]
}
```

**Available category URLs:**

- `/categories/remote-programming-jobs` — All programming jobs
- `/categories/remote-full-stack-programming-jobs` — Full-stack
- `/categories/remote-front-end-programming-jobs` — Frontend
- `/categories/remote-back-end-programming-jobs` — Backend
- `/categories/remote-design-jobs` — Design
- `/categories/remote-devops-sysadmin-jobs` — DevOps & Sysadmin
- `/categories/remote-management-and-finance-jobs` — Management & Finance
- `/categories/remote-product-jobs` — Product
- `/categories/remote-customer-support-jobs` — Customer Support
- `/categories/remote-sales-and-marketing-jobs` — Sales & Marketing
- `/remote-full-time-jobs` — Full-time only
- `/remote-contract-jobs` — Contract only

#### 3. Search Keywords

Enter one or more keywords. Mapped queries use the matching category feed; unmapped queries use the search page.

```json
{
  "searchQueries": ["engineer", "design", "marketing"],
  "maxResultsPerQuery": 50
}
```

***

### Company enrichment

Enable `includeCompanyInfo` to fetch each company's profile page and extract:

- **HQ location** — company headquarters city/country
- **Website** — company website URL
- **Total jobs posted** — how many jobs the company has on WWR

Companies are deduplicated, so multiple jobs from the same company only trigger one extra request.

```json
{
  "searchUrls": ["https://weworkremotely.com/remote-jobs/search?term=python"],
  "includeCompanyInfo": true,
  "maxResults": 20
}
```

***

### Input reference

| Field | Type | Description |
|-------|------|-------------|
| `searchUrls` | string\[] | Search page or category page URLs from [weworkremotely.com](https://weworkremotely.com). |
| `searchQueries` | string\[] | One or more search keywords. |
| `postedWithinDays` | integer | Only return jobs posted within the last N days (default 0, no age filter). See "Filtering by recency" below. |
| `sortBy` | enum | Results are sorted newest-first by the actor (default). `relevance` is a legacy alias that behaves exactly like `newest`. Kept for fleet-convention compatibility; there is no alternative ordering to switch to. |
| `maxResultsPerQuery` | integer | Max results per category/keyword (default 100). |
| `maxResults` | integer | Total cap across all modes (default 10, 0 = unlimited). |
| `mode` | enum | `full` (default): fetches detail pages for logos and richer descriptions. `fast`: listing data only, completes in seconds. |
| `includeCompanyInfo` | boolean | Fetch company profile pages for HQ, website, total jobs (default false). |
| `maxConcurrency` | integer | Parallel detail/company page fetches (default 5). |

Proxy is handled internally; there is no `proxyConfiguration` input.

***

### Filtering by recency

Set `postedWithinDays` to only get jobs posted in the last N days:

```json
{
  "searchQueries": ["engineer"],
  "postedWithinDays": 7
}
```

WeWorkRemotely's own filter narrows to three windows: 1 day uses "Past 24 Hours", 2-7 days uses "Past Week", 8-14 days uses "Past 2 Weeks". This is applied server-side on search pages, then the actor trims the result to your exact day count afterward. For category and keyword feeds that use WeWorkRemotely's RSS feeds (which ignore this filter entirely), the actor applies the exact-day cutoff itself after fetching. Values over 14 days fetch everything and post-filter to your cutoff.

#### A note on sorting

Results are sorted newest-first by the actor. WeWorkRemotely's own HTML search page has no native date order; its default listing order is not chronological. So the actor fetches the matching jobs and sorts them by posting date itself before applying `maxResults` or `maxResultsPerQuery`. RSS-backed feeds (category pages, mapped keywords like "engineer" or "design") are already newest-first natively, since that's how WeWorkRemotely's own feed works. The `sortBy` input is kept for compatibility with other actors in this fleet; there is no alternative ordering to switch to. WWR "feature boosted" paid listings can appear out of strict date order, because WWR displays them that way.

***

### Output example

```json
{
  "id": "titan-ai-full-stack-developer-ai-applications",
  "title": "Full-Stack Developer, AI Applications",
  "company": "Titan Ai",
  "company_logo_url": "https://we-work-remotely.imgix.net/logos/0001/example.png",
  "company_hq": "San Francisco, CA",
  "company_website": "https://titan.ai",
  "company_total_jobs": 5,
  "company_profile_url": "https://weworkremotely.com/company/titan-ai",
  "location": "Anywhere in the World",
  "category": "Full-Stack Programming",
  "tags": ["Full-Stack Programming", "Full-Time"],
  "employment_type": "Full-Time",
  "countries": ["United States", "Canada"],
  "description_full": "Titan builds an AI platform for banking, seeking a Full-Stack Developer...",
  "description_html": "<p>Titan builds an AI platform for banking...</p>",
  "salary_min": 120000,
  "salary_max": 180000,
  "salary_currency": "USD",
  "salary_period": "year",
  "salary_text": "$120,000 - $180,000",
  "posted_at": "2026-04-08T20:32:08Z",
  "source_url": "https://weworkremotely.com/remote-jobs/titan-ai-full-stack-developer-ai-applications",
  "source_platform": "weworkremotely.com",
  "apply_url": "https://weworkremotely.com/remote-jobs/titan-ai-full-stack-developer-ai-applications",
  "search_query": "https://weworkremotely.com/remote-jobs/search?term=software",
  "scraped_at": "2026-05-04T14:30:00Z"
}
```

***

### Use cases

- **Job aggregation** — combine with other job scrapers to build a comprehensive remote job board
- **Salary benchmarking** — track salary ranges by role and region over time
- **Company intelligence** — monitor which companies are hiring and how many roles they post
- **Lead generation** — identify growing companies with multiple open positions
- **Market research** — track demand for specific skills and technologies in remote work

***

### Speed

| Mode | ~16 jobs | Fields | Memory |
|------|----------|--------|--------|
| **Fast** | **~2 seconds** | Listing data (title, company, salary, category, countries) | ~16 MB |
| **Full** (default) | **~30 seconds** | + company logos, richer descriptions | ~16 MB |
| **Full + Company Info** | **~45 seconds** | + HQ, website, total jobs | ~16 MB |

Fast mode is ideal for quick monitoring. Full mode adds company logos and richer job descriptions from detail pages. Company info mode adds HQ, website, and job count from company profile pages.

***

### Integrations

This actor works with all Apify integrations:

- **API** — trigger runs and download results programmatically
- **Webhooks** — get notified when a run completes
- **Zapier & Make** — connect to 5,000+ apps
- **Google Sheets** — export directly to a spreadsheet
- **Slack, Email** — get notifications with results

***

### Related actors

- [RemoteOK Scraper](https://apify.com/santamaria-automations/remoteok-scraper) — remote jobs with salary data
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper) — 60+ countries, salary & company enrichment
- [LinkedIn Jobs Scraper](https://apify.com/santamaria-automations/linkedin-jobs-scraper) — LinkedIn job listings
- [Welcome to the Jungle Scraper](https://apify.com/santamaria-automations/welcome-to-the-jungle-scraper) — European tech jobs

***

Something not working? [Create an issue](https://console.apify.com/actors/a7nwkvxQTPwU3q8dY/issues) and we'll fix it fast.

# Actor input Schema

## `sortBy` (type: `string`):

Results are sorted newest-first by the actor. WeWorkRemotely's own HTML search page has no native date order (its default listing order is not chronological), so the actor fetches the matching jobs and sorts them by posting date itself before applying maxResults. RSS-backed feeds (category pages, mapped keywords) are already newest-first natively. The relevance option is a legacy alias that behaves exactly like newest. This field is kept for fleet-convention compatibility; there is no alternative ordering to switch to. Use postedWithinDays to filter by recency.

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

Only return jobs posted within the last N days. WeWorkRemotely's own date-window filter supports 3 buckets: 1 uses 'Past 24 Hours', 2-7 uses 'Past Week', 8-14 uses 'Past 2 Weeks' (applied server-side on search pages; RSS-backed category/keyword feeds ignore it and are post-filtered instead). Any value narrows results to an exact cutoff afterward. Default: 0 (no age filter, Any Time).

## `searchUrls` (type: `array`):

Paste one or more WeWorkRemotely URLs. Supports search pages (e.g. /remote-jobs/search?term=software) and category pages (e.g. /categories/remote-programming-jobs).

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

One or more search keywords (e.g. 'engineer', 'design', 'marketing'). Maps to the best matching category feed or uses search page. Results are deduplicated across queries.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per category feed or keyword.

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

Total cap across all queries and search URLs. Set to 0 for unlimited.

## `mode` (type: `string`):

Full (default): fetches each job's detail page for company logo and richer description. Fast: listing data only — faster but fewer fields.

## `includeCompanyInfo` (type: `boolean`):

When enabled, fetches each company's profile page to extract HQ location, website URL, and total jobs posted. Adds extra requests per unique company.

## `maxConcurrency` (type: `integer`):

Number of detail/company pages fetched in parallel. Higher = faster. Default 5.

## Actor input object example

```json
{
  "sortBy": "newest",
  "postedWithinDays": 0,
  "searchUrls": [
    "https://weworkremotely.com/remote-jobs/search?term=software"
  ],
  "maxResultsPerQuery": 100,
  "maxResults": 10,
  "mode": "full",
  "includeCompanyInfo": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped remote job listings with company enrichment. Each record includes: job title, company name, company logo URL, company HQ, company website, total jobs posted, employment type, countries, location/region, category, tags, salary (min/max/currency/period/text), full description (plain text + HTML), posting date, apply URL, source URL. Set postedWithinDays on input to filter by recency (WeWorkRemotely applies it as a date window server-side where supported and as an exact post-filter everywhere else).

# 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 = {
    "sortBy": "newest",
    "postedWithinDays": 0,
    "searchUrls": [
        "https://weworkremotely.com/remote-jobs/search?term=software"
    ],
    "maxResultsPerQuery": 100,
    "maxResults": 10,
    "mode": "full",
    "includeCompanyInfo": false,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/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 = {
    "sortBy": "newest",
    "postedWithinDays": 0,
    "searchUrls": ["https://weworkremotely.com/remote-jobs/search?term=software"],
    "maxResultsPerQuery": 100,
    "maxResults": 10,
    "mode": "full",
    "includeCompanyInfo": False,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/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 '{
  "sortBy": "newest",
  "postedWithinDays": 0,
  "searchUrls": [
    "https://weworkremotely.com/remote-jobs/search?term=software"
  ],
  "maxResultsPerQuery": 100,
  "maxResults": 10,
  "mode": "full",
  "includeCompanyInfo": false,
  "maxConcurrency": 5
}' |
apify call santamaria-automations/weworkremotely-scraper --silent --output-dataset

```

## MCP server setup

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