# Remote Jobs Aggregator - RemoteOK, WWR, Himalayas & 4 more (`tenfoldfleet/remote-jobs-aggregator`) Actor

Find remote jobs from Remote OK, We Work Remotely, Himalayas, Remotive, Jobicy, Arbeitnow and Working Nomads, deduplicated: title, company, salary in USD per year, location, timezones and employment type. Keyword, region and salary filters. $1.20 per 1,000 jobs; duplicates are free.

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

## Pricing

from $1.20 / 1,000 unique remote 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

### What does Remote Jobs Aggregator do?

**Remote Jobs Aggregator** collects **remote job listings from 7 job boards in one run** and returns them in one clean schema: [Remote OK](https://remoteok.com), [We Work Remotely](https://weworkremotely.com), [Himalayas](https://himalayas.app), [Remotive](https://remotive.com), [Jobicy](https://jobicy.com), [Arbeitnow](https://www.arbeitnow.com) (remote jobs only) and [Working Nomads](https://www.workingnomads.com).

The same job is often posted on several boards. This actor **removes duplicates across boards** (same company and title within 14 days), lists every board the job appeared on in `sourcesSeenOn`, and fills gaps from the duplicates (a salary from one board, a logo from another). You pay only for unique jobs.

Every job gets a **normalized salary** (min, max, currency, period, plus **USD per year** for easy comparison), a **normalized location** ("Worldwide", "United States", "Europe, United Kingdom"), **timezones**, a **remote type** (worldwide, region-restricted, hybrid) and a normalized **employment type**. Use it as a **remote jobs API** without API keys or logins.

### Why use it?

- **Remote job boards and newsletters**: fill a niche board ("remote Python jobs in Europe") with fresh, deduplicated listings every day.
- **Job seekers and career coaches**: one feed of every new remote job matching your keywords and salary floor, instead of checking 7 sites.
- **Recruiters and sales teams**: see which companies are hiring remotely right now, with company domain and logo.
- **Market research**: track remote hiring by role, region, salary and timezone over time.

### What data can it extract?

| Field | Example |
|---|---|
| `title`, `company`, `companyDomain`, `companyLogo` | Senior Backend Engineer, Toptal, toptal.com |
| `applyUrl` | Original job/apply URL from the board |
| `source`, `sourceUrl`, `sourceAttribution` | himalayas, link to the listing, "Job listed on Himalayas (https://himalayas.app)" |
| `sourcesSeenOn` | \["himalayas", "remoteok"] |
| `postedAt` | 2026-09-30T15:20:47.000Z |
| `location`, `locationRaw`, `timezones`, `remoteType` | United States, "USA Only", \["UTC-8", "UTC-5"], region-restricted |
| `employmentType`, `seniority`, `category`, `tags` | full-time, Senior, Engineering, \["python", "django"] |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | 120000, 150000, USD, year |
| `salaryUsdYearlyMin`, `salaryUsdYearlyMax` | 120000, 150000 |
| `descriptionText` | First 1,000 characters (or full text with `fullDescription`) |

### How to scrape remote jobs

1. Open the actor and pick the **job boards** (all 7 by default).
2. Optional: add **keywords** (e.g. `python`, `product designer`), **exclude keywords**, **categories/tags**, **regions/timezones** (e.g. `Europe`, `USA`, `UTC+1`) and a **minimum salary in USD per year**.
3. Set **posted within days** (default 7) and **max jobs**.
4. Click **Start**. A run takes 10 seconds without filters and up to about 6 minutes with filters.
5. Download the results as JSON, CSV or Excel, or schedule the actor to run daily.

### How much does it cost?

**$1.20 per 1,000 unique jobs** (pay per event, `job-scraped`). Duplicates removed across boards are not charged. Boards that are down and runs where no job matches your filters are **free**. The run stops when your maximum cost per run is reached.

### Input

```json
{
    "sources": ["remoteok", "weworkremotely", "himalayas", "jobicy", "arbeitnow", "workingnomads"],
    "keywords": ["python", "data engineer"],
    "excludeKeywords": ["intern"],
    "regions": ["Europe"],
    "minSalaryUsd": 80000,
    "postedWithinDays": 7,
    "dedupe": true,
    "maxItems": 500
}
```

### Output

```json
{
    "id": "himalayas-senior-data-engineer",
    "title": "Senior Data Engineer",
    "company": "Acme",
    "companyDomain": "acme.com",
    "companyLogo": "https://cdn-images.himalayas.app/...",
    "applyUrl": "https://himalayas.app/companies/acme/jobs/senior-data-engineer",
    "source": "himalayas",
    "sourceUrl": "https://himalayas.app/companies/acme/jobs/senior-data-engineer",
    "sourceAttribution": "Job listed on Himalayas (https://himalayas.app)",
    "sourcesSeenOn": ["himalayas", "weworkremotely"],
    "postedAt": "2026-09-30T08:18:51.000Z",
    "location": "Europe",
    "timezones": ["UTC+0", "UTC+1", "UTC+2"],
    "remoteType": "region-restricted",
    "employmentType": "full-time",
    "salaryMin": 90000, "salaryMax": 120000, "salaryCurrency": "EUR", "salaryPeriod": "year",
    "salaryUsdYearlyMin": 97200, "salaryUsdYearlyMax": 129600,
    "tags": ["Data", "Python", "Spark"],
    "descriptionText": "We are looking for..."
}
```

Boards that fail return a free item like `{"source": "remotive", "error": "Remotive could not be loaded: HTTP 503 ..."}`; the other boards continue. Download the dataset as JSON, CSV, Excel, XML or HTML.

### Tips

- **Breadth**: when `maxItems` is lower than the number of matching jobs, it is shared across boards (newest jobs from each board in turn), so one high-volume board does not crowd out the rest.
- **Worldwide jobs** pass every region filter, because they are open to candidates anywhere.
- **Salary filter** drops jobs that publish no salary. About a third of remote jobs publish one.
- **Himalayas** has about 95,000 jobs; the actor scans up to 2,000 of the newest per run.
- **Remotive** publishes its jobs with a 24-hour delay and asks for at most 4 API calls a day. It is therefore off by default; add `remotive` to `sources` only for occasional runs (the actor makes one request per run).
- Salaries converted to USD use fixed exchange rates; they are meant for filtering and comparison, not payroll.

### FAQ

#### Do I need API keys or an account on the job boards?

No. All 7 boards publish free public feeds. No login, cookies or proxies are used.

#### How are duplicates detected?

Company names are normalized (Inc., LLC, GmbH removed) and titles are normalized ("(Remote)" removed). Jobs with the same company and title posted within 14 days are merged. Turn `dedupe` off to keep cross-board copies; the same listing returned twice by one board is always removed and never charged twice.

#### Can I republish these jobs?

Each board's terms apply. **Remote OK**, **Remotive** and **Jobicy** require a followed link back to the original listing and naming the board as the source: use `sourceUrl` and `sourceAttribution` on every job you display. Remote OK does not allow use of the Remote OK logo (company logos are fine; the actor never outputs the Remote OK logo). **Remotive forbids submitting its jobs to Google Jobs, LinkedIn Jobs, Jooble, Neuvoo or similar third-party job sites**, and forbids showing its jobs to collect sign-ups or email addresses. Jobicy asks that apply buttons point to the original job URL (`applyUrl`).

#### Why are some Arbeitnow jobs missing?

Arbeitnow lists mostly on-site jobs in Europe. Only jobs flagged as remote are kept.

### Disclaimer

This actor collects publicly available job listings from public board feeds. You are responsible for using the data in line with each board's terms of service and applicable laws, including data protection rules such as GDPR. It is not affiliated with any of the listed job boards.

### More tools from Tenfold Fleet

| Actor | Price |
|---|---|
| [ATS Jobs Scraper - Greenhouse, Lever, Ashby & 5 More](https://apify.com/tenfoldfleet/ats-jobs-scraper) | $2 per 1,000 (job posting) |
| [Website Contact Scraper - Emails, Phones & Socials](https://apify.com/tenfoldfleet/company-contact-finder) | $8 per 1,000 (website with contacts) |
| [Google Ads Transparency Center Scraper - Competitor Ads by Site](https://apify.com/tenfoldfleet/google-ads-transparency-scraper) | $1 per 1,000 (ad scraped) |
| [Google News Scraper - Articles, Real URLs & Full Text](https://apify.com/tenfoldfleet/google-news-scraper) | $2 per 1,000 (article) |
| [Keyword Search Volume, CPC & Difficulty Checker (Bulk)](https://apify.com/tenfoldfleet/keyword-search-volume) | $5 per 1,000 (keyword with data) |
| [SEO Audit Tool - Technical On-Page SEO Checker & Score](https://apify.com/tenfoldfleet/seo-audit-tool) | $20 per 1,000 (page audited) |
| [Shopify Products Scraper - Prices, Variants & Stock](https://apify.com/tenfoldfleet/shopify-products-scraper) | $0.8 per 1,000 (product) |
| [Shopify App & Theme Detector - Store Analyzer & Contacts](https://apify.com/tenfoldfleet/shopify-store-analyzer) | $8 per 1,000 (shopify store analyzed) |
| [Sitemap URL Extractor - All URLs from sitemap.xml & robots.txt](https://apify.com/tenfoldfleet/sitemap-url-extractor) | $0.4 per 1,000 (url extracted) |
| [Technology Detector - Wappalyzer & BuiltWith Alternative](https://apify.com/tenfoldfleet/tech-stack-detector) | $10 per 1,000 (website analyzed) |
| [URL to Markdown - Web Page to LLM-Ready Text for AI Agents](https://apify.com/tenfoldfleet/url-to-markdown) | $1 per 1,000 (page converted) |
| [Workday Jobs Scraper - myworkdayjobs.com API with Salary](https://apify.com/tenfoldfleet/workday-jobs-scraper) | $1.5 per 1,000 (job posting) |
| [YouTube Comments Scraper - Replies, Likes & Sort by Newest](https://apify.com/tenfoldfleet/youtube-comments-scraper) | $0.6 per 1,000 (comment scraped) |
| [YouTube Transcript Scraper - Captions & Subtitles API](https://apify.com/tenfoldfleet/youtube-transcript-scraper) | $3 per 1,000 (transcript extracted) |

# Actor input Schema

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

Boards to collect from. Leave empty for all except Remotive. Remotive is opt-in because its API allows only 4 calls a day in total.

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

Keep jobs whose title or tags contain any of these words (whole-word match, case-insensitive), e.g. "python", "product designer". Empty = all jobs.

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

Drop jobs whose title contains any of these words, e.g. "senior", "intern".

## `tags` (type: `array`):

Keep jobs whose category or tags contain any of these, e.g. "design", "marketing", "devops".

## `regions` (type: `array`):

Keep jobs open to any of these locations or timezones, e.g. "Europe", "USA", "Germany", "UTC+1", "EMEA". Worldwide jobs always match.

## `minSalaryUsd` (type: `integer`):

Keep only jobs that publish a salary whose top of range, converted to USD per year, is at least this amount. Jobs without a salary are dropped when set. 0 = off.

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

Only jobs posted in the last N days. 0 = no date limit.

## `dedupe` (type: `boolean`):

Merge the same job posted on several boards (same company + title within 14 days) into one item; the boards it appeared on are listed in sourcesSeenOn.

## `fullDescription` (type: `boolean`):

Output the full job description text. Off = first 1,000 characters.

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

Maximum number of unique jobs to save (newest first). You pay only for saved jobs.

## Actor input object example

```json
{
  "sources": [
    "remoteok",
    "weworkremotely",
    "himalayas",
    "jobicy",
    "arbeitnow",
    "workingnomads"
  ],
  "keywords": [
    "developer",
    "engineer"
  ],
  "minSalaryUsd": 0,
  "postedWithinDays": 7,
  "dedupe": true,
  "fullDescription": false,
  "maxItems": 200
}
```

# Actor output Schema

## `results` (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": [
        "developer",
        "engineer"
    ],
    "maxItems": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("tenfoldfleet/remote-jobs-aggregator").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": [
        "developer",
        "engineer",
    ],
    "maxItems": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("tenfoldfleet/remote-jobs-aggregator").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": [
    "developer",
    "engineer"
  ],
  "maxItems": 200
}' |
apify call tenfoldfleet/remote-jobs-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tenfoldfleet/remote-jobs-aggregator"
        }
    }
}
```

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/cGqhOUd5JFP1jhv0s/builds/2j8vBC0jdg6d4lauO/openapi.json
