# Remote Jobs Scraper: Six Boards in One Table (`deriverge/remote-jobs-scraper`) Actor

Scrape remote jobs from Himalayas, Remote OK, Remotive, Jobicy, Working Nomads and We Work Remotely in one table: title, company, category, type, seniority, candidate location, salary as numbers and date. Filter by keyword, location and salary; new jobs only.

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

## Pricing

from $0.50 / 1,000 job returneds

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

## Remote Jobs Scraper

Scrape remote jobs from six boards in one table: **Himalayas**, **Remote OK**, **Remotive**, **Jobicy**, **Working Nomads** and **We Work Remotely**. Every row has the title, company, category and tags, employment type, where candidates may be based, the salary as numbers with a currency, the posting date and the link, in the same schema for all six boards. Filter by keyword, location, type and salary, and schedule it with **new jobs only** to get a daily job alert.

You pay only for jobs returned, from $0.50 per 1,000, with no start fee. The $5 of monthly credit in Apify's Free plan covers about 5,000 jobs, so you can try it for free.

### Why use Remote Jobs Scraper?

- **Six boards, one schema.** Each board writes salary, type and location its own way. Here every row uses the same fields: `salaryMin` and `salaryMax` as numbers, `employmentType` as `full_time` or `contract`, `postedAt` as a timestamp.
- **Keywords search Himalayas itself.** Your keywords go to the Himalayas search, so matches come from its whole list of about 100,000 jobs, not just the newest page. The other boards are filtered as they are read.
- **Location by name or code.** `locations` accepts `Germany` or `DE`, `USA` or `US`. Jobs open anywhere always pass, and a region such as North America Only matches the United States, Canada and Mexico.
- **Filters are free.** Jobs removed by a filter, duplicates and expired listings are never charged.
- **Only new jobs, on a schedule.** In new-only mode each run returns just the jobs you have not received before, and you pay only for those.

### What data does Remote Jobs Scraper extract?

| Field | What it contains |
|---|---|
| `title` | Job title |
| `company` | Hiring company |
| `sourceName` | Board the job comes from |
| `category` | Main category on the board |
| `tags` | Skills, tags or role categories the board attaches |
| `employmentType` | `full_time`, `part_time`, `contract`, `freelance`, `internship` or `temporary` |
| `seniority` | Seniority level (Himalayas and Jobicy) |
| `locationRestriction` | Where candidates may be based, in the board's words |
| `countries` | Candidate countries as a list (Himalayas and We Work Remotely) |
| `salaryMin` | Bottom of the pay range as a number |
| `salaryMax` | Top of the pay range as a number |
| `salaryCurrency` | Currency code, for example USD |
| `salaryPeriod` | `yearly`, `monthly` or `hourly` |
| `salaryText` | Pay as the board wrote it, where it only gives text |
| `postedAt` | When the job was published (UTC) |
| `expiresAt` | When the listing expires, where the board says |
| `description` | Description as plain text, 300 characters or in full |
| `url` | Link to the job on its board |

We Work Remotely rows also carry the company's headquarters and website, Himalayas rows the candidate time zones, and Remote OK rows whether the listing is verified.

### Which boards are included?

| Board | What it adds | Jobs per run |
|---|---|---|
| Himalayas | The largest list, with salaries, seniority, candidate countries and time zones | Up to **Maximum jobs per board** (500 by default) |
| Remote OK | Tags and yearly salaries in USD | The 100 newest |
| Remotive | Categories and pay as text | The small selection its public feed carries, about 20 |
| Jobicy | Industries, seniority and salaries | The 100 newest |
| Working Nomads | Categories and tags | The newest, about 60 |
| We Work Remotely | All ten categories, company headquarters and website, candidate countries | Every live listing, about 250 |

### Who uses Remote Jobs Scraper?

- **Job seekers:** get one daily list of new remote jobs from six boards, filtered to your skills, country and salary floor.
- **Recruiters and sourcers:** see who is hiring remotely for a role, across boards, in one table.
- **Job boards and newsletters:** fill a niche remote job board or a weekly jobs email, linking back to each original listing.
- **Analysts:** compare remote hiring and salaries by role, board and country.

### How much does it cost to scrape remote jobs?

You pay per result. There is no start fee and no charge for compute time or proxies.

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 jobs | $1.00 | $0.80 | $0.65 | $0.50 |

For example, a batch of 1,000 remote jobs costs $1.00 on the Free plan and $0.50 on the Business plan. The $5 of monthly credit in Apify's Free plan covers about 5,000 jobs.

Jobs removed by your filters, duplicates across boards and jobs already returned in new-only mode are never charged.

### How to scrape remote jobs

1. Click **Try for free** (or **Start** if you are signed in) to open the actor in Apify Console.
2. Pick the **Sources** (all six by default).
3. Optionally add **Keywords**, **Candidate locations**, **Employment types** or a **Minimum salary**.
4. Click **Start**. Rows appear in the **Output** tab within seconds.
5. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

### Input example

```json
{
  "sources": [
    "himalayas",
    "remoteok",
    "remotive",
    "jobicy",
    "workingnomads",
    "weworkremotely"
  ],
  "keywords": [
    "engineer",
    "developer"
  ],
  "locations": [
    "US",
    "Europe"
  ],
  "employmentTypes": [
    "full_time",
    "contract"
  ],
  "minSalary": 80000,
  "postedWithinDays": 14,
  "maxJobsPerSource": 500,
  "newOnly": true,
  "watchName": "engineering"
}
```

### Output example

A real row from a run in September 2026 (description cut to 300 characters, as by default). In the **Output** tab the **Overview** view shows the same data as a table.

```json
{
  "key": "himalayas:https://himalayas.app/companies/steno/jobs/senior-software-engineer",
  "source": "himalayas",
  "sourceName": "Himalayas",
  "jobId": "https://himalayas.app/companies/steno/jobs/senior-software-engineer",
  "title": "Senior Software Engineer",
  "company": "Steno",
  "companyLogo": "https://cdn-images.himalayas.app/2dks9nvdxphcor9np8z12uz9ext8",
  "companySlug": "steno",
  "companyUrl": null,
  "companyHeadquarters": null,
  "category": "Developer",
  "tags": [
    "Software Engineer",
    "Fullstack Development",
    "Web Development",
    "Backend Development",
    "Senior Software Engineer Jobs",
    "Senior Engineer"
  ],
  "employmentType": "full_time",
  "seniority": "Senior",
  "locationRestriction": "United States",
  "countries": [
    "United States"
  ],
  "timezones": [
    -10,
    -9,
    -8,
    -7,
    -6,
    -5,
    14
  ],
  "salaryMin": 175000,
  "salaryMax": 215000,
  "salaryCurrency": "USD",
  "salaryPeriod": "yearly",
  "salaryText": null,
  "postedAt": "2026-08-20T19:21:15.000Z",
  "expiresAt": "2026-10-19T19:21:13.000Z",
  "verified": null,
  "description": "Senior Software Engineer, Engineering (Full-stack) Full-Time, Remote / Salary, Exempt Includes Exceptional Benefits, Flexible PTO, Flexible Schedule, Equity Steno is growing! We’re looking for a Senior Software Engineer to join our winning team, which is revolutionizing the court reporting industry ",
  "url": "https://himalayas.app/companies/steno/jobs/senior-software-engineer",
  "applyUrl": "https://himalayas.app/companies/steno/jobs/senior-software-engineer"
}
```

### Get a daily alert of new jobs

Turn on **Return only jobs new since the last run** (`newOnly`), give the run a **Watch name** or save it as a task, and schedule it daily. Each run returns only jobs that were not in any earlier run, so every job reaches you once and you pay only for new ones. Send the results to Slack, email or Google Sheets from the **Integrations** tab.

### Tips and limitations

- Each board has its own reach: see the table above. For one board in full, our Himalayas, Remote OK and We Work Remotely scrapers add that board's own filters, such as Himalayas search by country, seniority and company, Remote OK tags and We Work Remotely categories (links below).
- Salary fields are `null` where a board publishes no pay; the **Minimum salary** filter keeps those jobs, because an absent salary is not a low one.
- The `SUMMARY` record shows how many jobs each board returned and how many each filter dropped, so you can see which filter to loosen.

### Integrations and API

Connect the actor to **Make**, **Zapier**, **n8n**, **Google Sheets**, **Slack** or any webhook, or call it from your own code. With the Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("deriverge/remote-jobs-scraper").call(run_input={"keywords": ["python"], "locations": ["Europe"], "maxItems": 200})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["company"], job["sourceName"], job.get("salaryMin"))
```

The **API** tab on this page has the same call for Node.js and cURL, and AI agents can run the actor through the Apify MCP server.

### Is it legal to scrape remote job boards?

The actor reads job listings that the boards publish openly for candidates, through their public feeds and interfaces, and collects no personal data. Several boards ask that you link back to the original listing and name them as the source when you republish; every row has the listing's `url` for that.

### FAQ

#### Which boards are covered?

Himalayas, Remote OK, Remotive, Jobicy, Working Nomads and We Work Remotely. Pick any of them in **Sources**.

#### How are duplicates handled?

Each job is keyed by board and ID and returned once per run. A vacancy posted on two boards appears once per board, each with its own link.

#### Why do some boards return few jobs?

That is what their public feeds carry: Remote OK and Jobicy serve the 100 newest, Remotive a small selection. Himalayas and We Work Remotely return far more.

#### Do I need an API key or proxies?

No. The actor reads the board's public data over plain HTTP, so a run takes seconds.

### Related scrapers

- [Career Site Jobs Scraper](https://apify.com/deriverge/greenhouse-lever-workday-jobs-scraper): jobs straight from company career sites

### Support and feedback

Missing a field or found something that does not work? Open an issue in the **Issues** tab and it will be answered, usually within a day. If the actor saves you time, a short review helps other people find it.

# Actor input Schema

## `sources` (type: `array`):

Which boards to read: himalayas, remoteok, remotive, jobicy, workingnomads, weworkremotely. Leave empty for all six.

## `keywords` (type: `array`):

Keep only jobs whose title, company, category or tags contain at least one of these words, case-insensitive. On Himalayas the words are also searched on the site, so matches come from its whole list, not just the newest jobs. Leave empty to keep everything.

## `excludeKeywords` (type: `array`):

Drop jobs whose title, company, category or tags contain any of these words.

## `locations` (type: `array`):

Keep only jobs open to candidates in one of these places, as a country name or two-letter code ("Germany", "DE", "USA") or a region ("Europe"). Jobs open to anyone anywhere always pass.

## `employmentTypes` (type: `array`):

Keep only these types: full\_time, part\_time, contract, freelance, internship. Jobs where the board gives no type always pass.

## `minSalary` (type: `integer`):

Drop jobs whose published top of range is below this number, in the currency the board publishes. Jobs with no published salary are kept, because an absent salary is not a low one.

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

Drop jobs older than this. Filtered jobs are never charged.

## `maxJobsPerSource` (type: `integer`):

Cap per board before filtering. Himalayas alone lists about 100,000 jobs, so this is what keeps a broad query affordable.

## `includeDescription` (type: `boolean`):

Adds the full job description as plain text. Off, each row carries the first 300 characters.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only jobs that were not there before. Schedule it daily and you have a job alert that bills only for new postings.

## `watchName` (type: `string`):

Name of the snapshot used by the new-only mode, for example "python-europe". Runs from a saved task get a snapshot automatically even without a name.

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

Hard cap on returned jobs across all boards in the run. The run stops reading as soon as it has this many.

## Actor input object example

```json
{
  "sources": [
    "himalayas",
    "remoteok",
    "remotive",
    "jobicy",
    "workingnomads",
    "weworkremotely"
  ],
  "keywords": [
    "engineer",
    "developer"
  ],
  "maxJobsPerSource": 500,
  "includeDescription": false,
  "newOnly": false,
  "maxItems": 50
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per job with the title, company, category, tags, employment type, candidate location, salary as numbers, posting date and links, in one schema across six boards.

## `changes` (type: `string`):

Jobs that appeared and jobs that disappeared compared with the previous snapshot of the same watch name or task.

## `summary` (type: `string`):

Per-board counts, how many jobs each filter dropped, and totals.

# 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 = {
    "sources": [
        "himalayas",
        "remoteok",
        "remotive",
        "jobicy",
        "workingnomads",
        "weworkremotely"
    ],
    "keywords": [
        "engineer",
        "developer"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/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 = {
    "sources": [
        "himalayas",
        "remoteok",
        "remotive",
        "jobicy",
        "workingnomads",
        "weworkremotely",
    ],
    "keywords": [
        "engineer",
        "developer",
    ],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("deriverge/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 '{
  "sources": [
    "himalayas",
    "remoteok",
    "remotive",
    "jobicy",
    "workingnomads",
    "weworkremotely"
  ],
  "keywords": [
    "engineer",
    "developer"
  ],
  "maxItems": 50
}' |
apify call deriverge/remote-jobs-scraper --silent --output-dataset

```

## MCP server setup

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