# Remote Jobs Scraper - RemoteOK, We Work Remotely, Himalayas (`bar-lab/remote-jobs-scraper`) Actor

Aggregate remote jobs from RemoteOK, We Work Remotely, Himalayas, Jobicy and Arbeitnow in one run. Normalized output with salary, location restrictions, tags and full description. Filter by keyword, location and date. Pay per job.

- **URL**: https://apify.com/bar-lab/remote-jobs-scraper.md
- **Developed by:** [Bartosz Golis](https://apify.com/bar-lab) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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.

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 — RemoteOK, We Work Remotely, Himalayas, Jobicy, Arbeitnow

Get fresh remote jobs from **five popular remote job boards in a single run**, in one clean format. The scraper uses each board's public API or RSS feed — no browser, no proxy — so runs are fast, cheap and reliable.

| Board | What it covers |
|---|---|
| RemoteOK | Tech, marketing, support — worldwide remote |
| We Work Remotely | One of the largest remote boards, all categories |
| Himalayas | 100k+ remote jobs with salary and location restrictions |
| Jobicy | Remote jobs with seniority and industry |
| Arbeitnow | European jobs (remote and on-site, visa sponsorship) |

### What you get

One normalized record per job: title, company, source board, location / allowed regions, remote flag, employment type, seniority, tags, posting date (ISO 8601), salary range and currency when published, full description (text + HTML), and the link to the original posting.

### How to use

1. Pick boards (all by default).
2. Filter by title keywords, excluded words, locations and how recent the job is.
3. Run, then export to JSON / CSV / Excel or connect via API, Make, Zapier, n8n or Google Sheets.

**Daily alerts:** schedule the actor once a day with `postedWithinDays: 1` and connect the dataset to email or Slack.

#### Example input

```json
{
  "keywords": ["python", "data engineer"],
  "excludeKeywords": ["senior"],
  "locations": ["Europe", "Worldwide"],
  "postedWithinDays": 7
}
```

#### Example output

```json
{
  "source": "himalayas",
  "title": "Data Engineer",
  "company": "Acme",
  "location": "Europe, United Kingdom",
  "remote": true,
  "employmentType": "Full Time",
  "seniority": ["Mid-level"],
  "postedAt": "2026-10-30T09:12:00+00:00",
  "salaryMin": 70000,
  "salaryMax": 90000,
  "salaryCurrency": "EUR",
  "url": "https://himalayas.app/companies/acme/jobs/data-engineer"
}
```

### Use cases

- Remote job boards, newsletters and Telegram/Discord job channels
- Job alerts for yourself or your community
- Salary and hiring-trend research for remote roles

### Pricing

Pay per result — you pay only for jobs saved to the dataset. Use **Max jobs in total** to cap the cost.

### Attribution

Each record links to the original posting. The boards ask that you credit them and send applicants to the original URL — please keep the `url` field when you republish jobs.

### FAQ

**Why is a board missing results?** Boards publish different volumes; the run summary (key-value store → `RUN_SUMMARY`) shows how many jobs came from each board and any errors.

**Need another board or field?** Open an issue on the Issues tab.

# Actor input Schema

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

Which job boards to scrape. All by default.

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

Keep only jobs whose title contains at least one of these words (case-insensitive). Leave empty for all jobs.

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

Drop jobs whose title contains any of these words, e.g. `senior`, `sales`.

## `searchInDescription` (type: `boolean`):

Also match keywords against the full job description.

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

Keep only jobs whose location / allowed regions contain one of these strings, e.g. `Europe`, `Worldwide`, `Germany`.

## `remoteOnly` (type: `boolean`):

Arbeitnow also lists on-site jobs; keep this on to drop them.

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

Keep only jobs posted in the last N days.

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

Include the full description as plain text and HTML.

## `maxItemsPerSource` (type: `integer`):

Stop after this many matching jobs from one board.

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

Stop the whole run after this many jobs. Useful to cap cost.

## `maxScanPerSource` (type: `integer`):

Himalayas has 100k+ jobs; scanning stops after this many (newest first) even if fewer matched.

## Actor input object example

```json
{
  "sources": [
    "remoteok",
    "weworkremotely",
    "himalayas",
    "jobicy",
    "arbeitnow"
  ],
  "keywords": [
    "python",
    "data"
  ],
  "searchInDescription": false,
  "remoteOnly": true,
  "postedWithinDays": 7,
  "includeDescription": true,
  "maxItemsPerSource": 500,
  "maxScanPerSource": 3000
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "keywords": [
        "python",
        "data"
    ],
    "postedWithinDays": 7
};

// Run the Actor and wait for it to finish
const run = await client.actor("bar-lab/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 = {
    "keywords": [
        "python",
        "data",
    ],
    "postedWithinDays": 7,
}

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

```

## MCP server setup

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