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

Scrape remote jobs from We Work Remotely: titles, companies, logos, categories, job types, regions, countries, skills, salary bands, posting dates, and full descriptions. Paste the home page, a category, a search, or a job URL and get clean JSON. No login, no API key, no proxy.

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

## Pricing

from $2.50 / 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

![banner](https://anyx.solutions/banners/weworkremotely-jobs-scraper.png)

## We Work Remotely Jobs Scraper

**Remote jobs from We Work Remotely — with companies, logos, categories, regions, skills, salary bands and full descriptions — as clean JSON.**

[We Work Remotely](https://weworkremotely.com/) is one of the largest and longest-running boards for
remote work, with jobs in programming, design, DevOps, customer support, sales and marketing,
product, management and finance. This Actor reads We Work Remotely's listings and returns every
job: title, company with its logo, headquarters and website, category, job type, the region and
countries it hires from, skills, the salary band when the employer gives one, the posting and
expiry dates, and the full description as HTML and plain text. Paste a category page, the home page,
a search, or a single job URL; there is no login, no API key, and no proxy to configure. Built for
job aggregators, remote-work newsletters, recruiting and talent-intelligence teams, and hiring-signal
research.

All data comes from [We Work Remotely](https://weworkremotely.com/), and every job keeps its link
back to its page there.

### ⚡ Quick start

```json
{
  "startUrls": [
    {
      "url": "https://weworkremotely.com/categories/remote-full-stack-programming-jobs"
    }
  ],
  "maxItems": 5
}
```

### 🧩 Input

| Field                | Type    | Required | Default                      | Description                                                                                                                                                                                                                  |
| -------------------- | ------- | -------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | yes      | —                            | We Work Remotely pages: a category (`weworkremotely.com/categories/remote-<category>-jobs`), the home page (the newest jobs in every category), a search (`/remote-jobs/search?term=…`), or a single job (`/remote-jobs/…`). |
| `maxItems`           | integer | no       | —                            | Maximum number of jobs per start URL. The input form starts at 5; leave it empty to get every job We Work Remotely lists for the page.                                                                                       |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": false }` | Proxy settings. We Work Remotely's public job listings need no proxy.                                                                                                                                                        |

**Choosing a page.** Open [weworkremotely.com](https://weworkremotely.com/), pick a category such as
*Design*, *DevOps and Sysadmin* or *Customer Support*, and copy the address bar — for example
`https://weworkremotely.com/categories/remote-design-jobs`. The home page returns the newest jobs
of every category. A search returns the jobs, across all categories, that contain every word of the
search term, newest first.

### 📤 Output

Each job is one dataset row.

#### Fields

| Field             | Type   | Description                                                                         |
| ----------------- | ------ | ----------------------------------------------------------------------------------- |
| `id`              | string | The job's address on We Work Remotely.                                              |
| `title`           | string | Job title, without the company name.                                                |
| `company`         | string | Company name.                                                                       |
| `companyLogo`     | string | Company logo image URL. `null` when the company has none.                           |
| `companyUrl`      | string | The company's website. `null` when the employer doesn't list one.                   |
| `category`        | string | We Work Remotely category, such as `Design` or `Full-Stack Programming`.            |
| `employmentType`  | string | Job type, such as `Full-Time` or `Contract`.                                        |
| `region`          | string | Where the employer hires from, such as `Anywhere in the World` or `USA Only`.       |
| `countries`       | array  | Countries the job is open to, when the employer names them.                         |
| `state`           | string | State or region of the company's address. `null` when not given.                    |
| `headquarters`    | string | The company's headquarters, as the employer writes it.                              |
| `skills`          | array  | Skills the employer tagged the job with.                                            |
| `salary`          | string | Salary band, such as `$100,000 or more USD`. `null` when no salary is given.        |
| `postedAt`        | string | When the job was posted (ISO 8601).                                                 |
| `expiresAt`       | string | When the listing expires (ISO 8601).                                                |
| `descriptionHtml` | string | Full job description as HTML.                                                       |
| `descriptionText` | string | Full job description as plain text.                                                 |
| `applyUrl`        | string | Where to apply: the job's page on We Work Remotely, which links on to the employer. |
| `url`             | string | The job's page on We Work Remotely.                                                 |

<details><summary>Example output</summary>

```json
{
  "id": "samsara-staff-software-engineer",
  "title": "Staff Software Engineer",
  "company": "Samsara",
  "companyLogo": "https://we-work-remotely.imgix.net/logos/0154/3705/logo.gif",
  "companyUrl": "https://www.samsara.com/",
  "category": "Full-Stack Programming",
  "employmentType": "Full-Time",
  "region": "Anywhere in the World",
  "countries": ["United States of America"],
  "state": "California",
  "headquarters": "Remote",
  "skills": [],
  "salary": "$100,000 or more USD",
  "postedAt": "2026-08-17T13:57:14.000Z",
  "expiresAt": "2026-10-16T13:57:14.000Z",
  "descriptionHtml": "<p><strong>About the role:</strong></p>\n<p>Samsara (NYSE: IOT) sits at the center of hardware, softw …",
  "descriptionText": "About the role:\n\nSamsara (NYSE: IOT) sits at the center of hardware, software, AI, and the physical  …",
  "applyUrl": "https://weworkremotely.com/remote-jobs/samsara-staff-software-engineer",
  "url": "https://weworkremotely.com/remote-jobs/samsara-staff-software-engineer"
}
```

</details>

### 💡 Use cases

- **Remote job aggregation** — feed job boards, newsletters and community channels with fresh remote jobs by category.
- **Hiring signals** — watch which companies are hiring remotely, in which functions and regions, for sales prospecting or market research.
- **Salary research** — collect the salary bands employers give for remote roles, by category.
- **Recruiting intelligence** — track demand for skills such as TypeScript, Python or Go across remote employers.

### ❓ FAQ

- **Do I need an API key or a We Work Remotely account?** No. The Actor reads the same public listings any visitor sees.
- **Do I need a proxy?** No. It runs without one by default.
- **How many jobs does a page return?** A category returns every job it currently lists, typically 5 to 100. The home page returns the newest jobs of each category, about 90 in all. Run the Actor on a schedule to build a longer history.
- **How does search work?** A search URL returns the jobs, across every category, whose title, company, skills or description contain every word of the search term. Other search filters on the URL are not applied.
- **Why are some salaries or logos empty?** Employers choose whether to give a salary band and a logo. Salary bands, and the most complete logos, come with category pages: jobs from the home page, a search or a single job URL have `salary` set to `null`, and a logo only when the employer attached one to the job itself. For the fullest rows, start from category pages.
- **Can I scrape a job that has closed?** No. A closed job leaves We Work Remotely's listings, and the log says when a job URL is no longer listed.
- **Why did a run return fewer jobs than expected?** The category may have few current jobs, or the category in the URL may be misspelled; the log says when a page lists no jobs. Open an issue if something looks off.

### 🔗 More scrapers by Anyx

- [Remote OK Jobs Scraper](https://apify.com/anyxsolutions/remoteok-jobs-scraper)
- [Greenhouse Jobs Scraper](https://apify.com/anyxsolutions/greenhouse-jobs-scraper)
- [Lever Jobs Scraper](https://apify.com/anyxsolutions/lever-jobs-scraper)
- [Workday Jobs Scraper](https://apify.com/anyxsolutions/workday-jobs-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

### 🖼 Image credit

Image credit: [weworkremotely.com](https://weworkremotely.com/)

# Actor input Schema

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

We Work Remotely pages, such as a category https://weworkremotely.com/categories/remote-design-jobs, the home page https://weworkremotely.com/ (the newest jobs in every category), a search https://weworkremotely.com/remote-jobs/search?term=python, or a single job URL (https://weworkremotely.com/remote-jobs/…).

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

Maximum number of jobs to return per start URL. Leave empty to get every job We Work Remotely lists for the page.

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

Proxy settings. We Work Remotely's public job listings need no proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://weworkremotely.com/categories/remote-full-stack-programming-jobs"
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://weworkremotely.com/categories/remote-full-stack-programming-jobs"
        }
    ],
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/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 = {
    "startUrls": [{ "url": "https://weworkremotely.com/categories/remote-full-stack-programming-jobs" }],
    "maxItems": 5,
}

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

```

## MCP server setup

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