# Remote Jobs Scraper - 5 Job Boards, Salaries & Countries (`dataspace/remote-jobs-scraper`) Actor

Scrape remote jobs from Himalayas, We Work Remotely, Remote OK, Jobicy and Arbeitnow in one run: deduplicated, salary, seniority, which countries can apply, time zones and full description. Only-new-jobs mode for job alerts.

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

## Pricing

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

## Remote Jobs Scraper

Scrape **remote jobs from five job boards in one run — Himalayas, We Work Remotely, Remote OK, Jobicy and Arbeitnow** — as one clean, deduplicated list. Every job comes with **who can apply (worldwide, countries, regions, time zones), salary range with a yearly equivalent, seniority, employment type, full description, company details** and the link to the original listing. Filter by the country you live in, level, job type, salary and date — and turn on **Only new jobs** for daily job alerts.

- ✅ **5 remote job boards, no duplicates** — the same job posted on several boards is saved once, with `alsoListedOn` showing where else it appears
- ✅ **Can I apply from my country?** — set *I live in* to `Germany`, `US`, `Brazil`, `Türkiye`… Regions are understood: a job open to *EMEA* or *Europe* matches Germany, *LATAM* matches Brazil
- ✅ **Salaries you can compare** — `salaryMin`, `salaryMax`, currency and period, plus `salaryMinYearly` / `salaryMaxYearly` (hourly × 2,080, monthly × 12)
- ✅ **Relevant results** — *Smart* keyword matching keeps `data engineer` searches to real data engineering jobs; the most relevant jobs come first, newest first within each group
- ✅ **Job alerts** — *Only new jobs since the last run* remembers what you've already received; schedule it daily and get just the new jobs
- ✅ **Clean data** — plain-text descriptions, broken characters fixed (`fÃ¼r` → `für`), recruiter e-mails and phone numbers masked
- ✅ **$1.50 per 1,000 jobs** — descriptions included, no extra fees

### What data do you get?

| Group | Fields |
|---|---|
| Job | `title`, `employmentType` (Full-time, Part-time, Contract, Temporary, Internship…), `seniority` (Entry-level … Executive), `categories`, `tags` |
| Who can apply | `isWorldwide`, `countries`, `countryCodes`, `regions` (Europe, EMEA, LATAM, APAC, DACH…), `timezones` (UTC offsets), `location` (as written by the board) |
| Salary | `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` (hour / month / year…), `salaryMinYearly`, `salaryMaxYearly` |
| Company | `companyName`, `companyLogo`, `companyUrl` (company page on the board), `companyWebsite`, `companyHeadquarters` |
| Content | `summary`, `description` (full text) |
| Dates | `postedAt`, `expiresAt` |
| Links | `url` (original listing), `applyUrl`, `alsoListedOn` (same job on other boards) |
| Run info | `jobId`, `source`, `sourceJobId`, `searchQuery`, `rank`, `scrapedAt` |

A field is `null` or `[]` when the board doesn't provide it — e.g. Arbeitnow and We Work Remotely don't publish salaries, only We Work Remotely lists company headquarters. The dataset has three ready-made views: **Jobs**, **Who can apply** and **Salaries**.

### Job boards

| Board | What you get | Search |
|---|---|---|
| **Himalayas** | 100,000+ remote jobs with salary, seniority, countries and time zones | Keywords, country, level and type are searched on Himalayas itself |
| **We Work Remotely** | All current jobs (~350) with company headquarters and website | Filtered by this Actor |
| **Remote OK** | The latest ~100 jobs with salary | Filtered by this Actor |
| **Jobicy** | Jobs from the last 7 days with salary | Keyword search on Jobicy |
| **Arbeitnow** | Remote jobs from the newest listings, mostly Germany | Filtered by this Actor |

### How to use

1. Enter **search keywords** (`react developer`, `customer support`, `data analyst`) — or leave empty for the newest remote jobs.
2. Optionally set **I live in** (country), **seniority**, **employment type**, **posted in the last N days** or **only jobs with a salary**.
3. Click **Start** and download the results as JSON, CSV, Excel or via API.

### Example input

```json
{
  "searchQueries": ["python developer", "product designer"],
  "candidateCountry": "Germany",
  "seniority": ["senior"],
  "employmentTypes": ["fullTime"],
  "postedWithinDays": 14,
  "maxItemsPerSearch": 100
}
```

### Example output (real result, texts shortened)

```json
{
  "jobId": "himalayas:audience-connections-strategist",
  "source": "Himalayas",
  "sourceJobId": "audience-connections-strategist",
  "title": "Audience & Connections Strategist",
  "companyName": "Wpromote",
  "companyLogo": "https://cdn-images.himalayas.app/me4parzh6rjb2vjk3o2tvq49sjqz",
  "companyUrl": "https://himalayas.app/companies/wpromote",
  "companyWebsite": null,
  "companyHeadquarters": null,
  "employmentType": "Full-time",
  "seniority": [
    "Mid-level"
  ],
  "categories": [
    "Marketing"
  ],
  "tags": [
    "Marketing Strategist",
    "Brand Strategist",
    "Audience Strategist",
    "Digital Strategist"
  ],
  "location": "United States",
  "isWorldwide": false,
  "countries": [
    "United States"
  ],
  "countryCodes": [
    "US"
  ],
  "regions": [],
  "timezones": [
    "UTC-10",
    "UTC-9",
    "UTC-8"
  ],
  "salaryText": "$68,000 – 78,000 / year",
  "salaryMin": 68000,
  "salaryMax": 78000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryMinYearly": 68000,
  "salaryMaxYearly": 78000,
  "postedAt": "2026-10-08T15:56:14Z",
  "expiresAt": "2026-12-07T15:56:13Z",
  "summary": "Great strategy starts with asking better questions. As an Audience & Connections Strategist on our Strategy & Insights team, you’ll dig into audience behavior, culture, competition, and market trends to uncover the insights that help our enterprise clients make smarter decisions.",
  "description": "The Role\n\nGreat strategy starts with asking better questions. As an Audience & Connections Strategist on our Strategy & Insights team, you’ll dig into audience behavior, culture, competition, and market trends to …",
  "url": "https://himalayas.app/companies/wpromote/jobs/audience-connections-strategist",
  "applyUrl": "https://himalayas.app/companies/wpromote/jobs/audience-connections-strategist",
  "alsoListedOn": [
    {
      "source": "Jobicy",
      "url": "https://jobicy.com/jobs/154786-audience-connections-strategist"
    }
  ],
  "searchQuery": "(latest remote jobs)",
  "rank": 50,
  "scrapedAt": "2026-10-08T21:32:38Z"
}
```

### Pricing

Pay per job: **$1.50 per 1,000 jobs**, plus a tiny start fee of $0.00005 per run. Full descriptions are included at no extra cost, and platform usage (compute and proxies) is included. The same job found on several boards or by several keywords is saved and charged only once; jobs removed by your filters are not charged.

| Example | Cost |
|---|---|
| 100 jobs | $0.15 |
| 5,000 jobs from 10 searches | $7.50 |
| Daily alert: ~40 new jobs a day | ~$0.06 per day |

### Use cases

- **Job seekers and job alert tools** — new remote jobs you can actually apply for from your country, every morning.
- **Remote job boards and newsletters** — a deduplicated feed with salaries, regions and company logos (credit the source board — see below).
- **Recruiters and HR tech** — who is hiring remotely, for which roles, levels and salary ranges.
- **Salary and labour-market research** — remote salaries by role, seniority and region with yearly equivalents.
- **AI agents and automations** — structured remote job data for Make, Zapier, n8n or your own agent.

### Notes

- **Who can apply.** `countries` and `regions` come from the board's location field. `isWorldwide: true` means the job hires from anywhere; `null` means the board didn't say (often just "Remote"). When you set *I live in*, such jobs are skipped so you only get jobs you can really apply for.
- **Keyword match.** *Smart* (default): a single word like `python` may appear anywhere in the job, including the requirements; a phrase like `data engineer` must be in the title, tags or category. Choose *Job title only* for the strictest results or *Anywhere* for the widest.
- **Only new jobs.** The first run saves the newest jobs and remembers every job listed at that moment; the next runs with the same settings save only jobs posted since then. The memory is kept in your own Apify storage (key-value store `remote-jobs-scraper-state`).
- **Credit the boards.** The boards allow use of their jobs if you **link to the original listing and name the board as the source** — the `url` and `source` fields are there for that. Himalayas also asks not to submit its jobs to Jooble, Neuvoo, Google Jobs or LinkedIn Jobs.

### Use it via API

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("dataspace/remote-jobs-scraper").call(run_input={
    "searchQueries": ["devops engineer"],
    "candidateCountry": "Germany",
    "postedWithinDays": 7,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["companyName"], job["location"], job["salaryText"], job["url"])
```

Results also flow into Google Sheets, Airtable, Make, Zapier, n8n, webhooks or your AI agent through the Apify MCP server.

### FAQ

**Why these five boards?** They publish their jobs through public APIs or feeds and allow re-use with a link back. Boards whose terms forbid redistribution (for example Remotive and Working Nomads) are deliberately not included, and LinkedIn or Indeed are not scraped.

**Are the jobs really remote?** All five boards are remote-job boards (Arbeitnow: only jobs marked remote). Some remote jobs are limited to certain countries or time zones — check `countries`, `regions` and `timezones`, or use *I live in*.

**Does it collect recruiter contacts?** No. The Actor collects no personal data: e-mail addresses and phone numbers in descriptions are masked, and `mailto:` links are never returned. Apply through `url` / `applyUrl`.

**How fresh is the data?** Every run reads the boards live. Jobicy covers the last 7 days, Remote OK its latest ~100 jobs, the other boards all current jobs.

**Is it legal?** The Actor reads only public job listings through the boards' public APIs and RSS feeds — without logging in, without solving CAPTCHAs or bypassing protections, and without collecting personal data. You are responsible for using the data in line with applicable laws and each board's terms, including crediting the source — see the Disclaimer.

**Missing a feature?** Open an issue on the Issues tab — feedback is welcome.

### More scrapers by dataspace

- [Career Site Jobs Scraper](https://apify.com/dataspace/career-site-jobs-scraper) — jobs straight from company career sites (Greenhouse, Lever, Workday and more)
- [Greenhouse Jobs Scraper](https://apify.com/dataspace/greenhouse-jobs-scraper) — all jobs from 3,400+ companies on Greenhouse
- [Google Maps Scraper](https://apify.com/dataspace/google-maps-scraper) — local businesses with phones, websites and ratings

**Like it?** If this Actor saves you time, please leave a review on the Reviews tab — it helps others find it. Found a problem? Open an issue and it will be fixed quickly.

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Himalayas, We Work Remotely, Remote OK, Jobicy or Arbeitnow. Their names are trademarks of their owners and are mentioned only to describe the publicly available data sources (the Remote OK logo is not used). It collects only public job listings through public APIs and RSS feeds — without logging in, without solving CAPTCHAs or bypassing protections, and without collecting personal data (contact details in descriptions are masked). Company logos are returned as links, not copied. You are responsible for making sure that your use of the data complies with applicable laws (including data protection laws) and with each board's terms — in particular, link back to the original listing and name the board as the source when you publish jobs.

# Actor input Schema

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

Job titles, skills or fields, one per line — e.g. <code>react developer</code>, <code>customer support</code>, <code>data analyst</code>. Each keyword is a separate search across all selected job boards. Leave empty to get the <b>latest remote jobs</b> from every board.

## `keywordMatch` (type: `string`):

<b>Smart</b>: a one-word keyword (<code>python</code>) may appear anywhere, including the requirements; a phrase (<code>data engineer</code>) must be in the job title, tags or category — no unrelated jobs that merely mention both words. <b>Job title only</b> is the strictest.

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

Which remote job boards to search. Empty = all five. The same job posted on several boards is saved once.

## `maxItemsPerSearch` (type: `integer`):

How many jobs to save for each keyword (newest first, after removing duplicates).

## `candidateCountry` (type: `string`):

Only jobs that accept candidates from this country — e.g. <code>Germany</code>, <code>US</code>, <code>Brazil</code>, <code>Türkiye</code>. Regions are understood too: a job open to <i>EMEA</i> or <i>Europe</i> matches Germany. Jobs that don't say where candidates may live are skipped. Leave empty for all jobs.

## `includeWorldwide` (type: `boolean`):

With a country set: also keep jobs that hire from anywhere in the world.

## `worldwideOnly` (type: `boolean`):

Only jobs that hire from anywhere in the world.

## `seniority` (type: `array`):

Only jobs with these levels (from the board or the job title). Empty = all.

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

Only jobs with these employment types. Empty = all.

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

E.g. <code>7</code>. Empty or 0 = no limit.

## `onlyWithSalary` (type: `boolean`):

Skip jobs that don't show a salary range.

## `titleMustContain` (type: `array`):

Keep only jobs whose title contains at least one of these words or phrases (not case-sensitive), e.g. <code>engineer</code>, <code>python</code>.

## `titleMustNotContain` (type: `array`):

Skip jobs whose title contains any of these words, e.g. <code>sales</code>, <code>intern</code>.

## `onlyNewJobs` (type: `boolean`):

For job alerts: remembers the jobs found by earlier runs with the same settings (in your own Apify storage) and saves only jobs you haven't seen yet. Schedule the Actor daily and get just the new remote jobs.

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

Full job description as plain text. Same price; turn off for smaller exports.

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

The scraper connects directly first and switches to a new proxy IP only if a job board slows it down.

## Actor input object example

```json
{
  "searchQueries": [
    "python developer",
    "product designer"
  ],
  "keywordMatch": "smart",
  "sources": [
    "himalayas",
    "weworkremotely",
    "remoteok",
    "jobicy",
    "arbeitnow"
  ],
  "maxItemsPerSearch": 50,
  "includeWorldwide": true,
  "worldwideOnly": false,
  "onlyWithSalary": false,
  "onlyNewJobs": false,
  "includeDescription": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Title, company, who can apply, type, level, salary, date and job board.

## `eligibility` (type: `string`):

Worldwide or which countries, regions and time zones.

## `salaries` (type: `string`):

Salary range, currency, period and yearly equivalent.

## `allFields` (type: `string`):

Every field: full description, tags, company website, apply link and more.

# 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 = {
    "searchQueries": [
        "python developer",
        "product designer"
    ],
    "maxItemsPerSearch": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspace/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 = {
    "searchQueries": [
        "python developer",
        "product designer",
    ],
    "maxItemsPerSearch": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("dataspace/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 '{
  "searchQueries": [
    "python developer",
    "product designer"
  ],
  "maxItemsPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call dataspace/remote-jobs-scraper --silent --output-dataset

```

## MCP server setup

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