# RemoteOK & Himalayas Jobs Scraper: Remote Jobs API, Deduped (`clearpath-data/remote-jobs-aggregator`) Actor

Remote jobs API for RemoteOK (Remote OK) and Himalayas: one de-duplicated dataset of remote jobs, no API key needed. Filter by keyword, location, category, type, salary and date. Every row carries source attribution and reuse terms. From $0.001 per job.

- **URL**: https://apify.com/clearpath-data/remote-jobs-aggregator.md
- **Developed by:** [Clearpath Data](https://apify.com/clearpath-data) (community)
- **Categories:** Jobs, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

### RemoteOK & Himalayas Jobs Scraper: Remote Jobs API, Deduped

Fresh remote jobs from RemoteOK (Remote OK) and Himalayas, via their public APIs (no API key needed), de-duplicated and filterable by keyword, location, category and salary.

**Price:** $0.001 per job ($0.0008 Silver, $0.0006 Gold+). You only pay for saved results. Set `maxResults` to cap the cost.

### Quick start: Remote jobs API

1. Click **Try for free**, keep the prefilled input and press **Start**.
2. Or call it from code:

```bash
curl -X POST "https://api.apify.com/v2/acts/clearpath-data~remote-jobs-aggregator/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" -d '{"sources": ["remoteok", "himalayas"], "maxResults": 100, "maxPagesPerSource": 3}'
```

### Sample output: remote jobs data

| source | title | company | location | postedAt |
|---|---|---|---|---|
| Remote OK | Telefondienst für Tierarztpraxis Neuruppin o | Tierarzt Plus Partner | Neuruppin | 2026-10-07 |
| Himalayas | Data Lead Link Key People | Veeva Systems | Sweden | 2026-10-09 |
| Remote OK | Project Manager | Spiralyze | Worldwide | 2026-10-06 |
| Himalayas | Primavera Unifier Solution Architect | Acumenian (now Consertus) | United States | 2026-10-09 |
| Remote OK | Platform and Integration Engineer Security Telemetry | RedMimicry | Worldwide | 2026-10-05 |

*Sample rows: real output of test run on 2026-10-09, trimmed to a few columns.*
Every row carries `attribution` and `termsUrl`. If you display jobs, follow the source's attribution terms.

### Salary fields

Jobs with a published salary carry `salary` (`min`, `max`, `currency`, `interval`, `text`). `salary.interval` is the board's raw period, unchanged (e.g. Remote OK sends `year`, Himalayas sends `annual`, `monthly` or `hourly`). `salaryPeriodNormalized` maps that raw period to one of `year`, `month`, `week`, `day` or `hour`, so `annual`, `yearly` and `year` all become `year`. It is `null` when a job has no salary or the period isn't recognised. Use it to compare or filter salaries across boards.

### Supported boards and limits

| Board | How it's read | Depth per run |
|---|---|---|
| Remote OK | Public JSON API (remoteok.com/api) | Remote OK returns only its **latest ~100 jobs**, so one run can never return more than ~100 Remote OK jobs. Schedule daily runs to build history. |
| Himalayas | Public JSON API | 20 jobs per page, up to `maxPagesPerSource` pages (default 10) |

Every row carries `attribution` and `termsUrl`. If you display jobs, follow each board's attribution terms. This Actor doesn't cover other boards (e.g. Remotive or We Work Remotely).

### Use cases

- **Remote job board or newsletter feeds:** a daily, de-duplicated list filtered by keyword and location.
- **Salary research:** keep only jobs with a published salary (`onlyWithSalary`).
- **Remote-hiring trend tracking:** schedule runs and compare categories and companies over time.

### Remote OK API vs this Actor

Remote OK's API is free to call directly. This Actor adds: Himalayas in the same schema, de-duplication across both boards (`alsoListedOn`), keyword, location, category, type, salary and date filters, plain-text descriptions, and per-row attribution. Calling its API yourself is the free option if you only need Remote OK (its latest list, unfiltered).

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `sources` | array | \["remoteok", "himalayas"] | Which boards to read, via their public APIs |
| `keywords` | array | \[] | Keep only jobs whose title contains at least one of these words (case-insensitive), e.g |
| `searchInDescription` | boolean | false | When on, keywords also match the job description text. |
| `excludeKeywords` | array | \[] | Drop jobs whose title contains any of these words, e.g |
| `locations` | array | \[] | Keep jobs open to candidates in at least one of these places (matched against the board's location or location restrictions), e.g |
| `includeWorldwide` | boolean | true | Jobs open to candidates anywhere always pass the location filter when this is on. |
| `categories` | array | \[] | Keep jobs whose board category or tag contains one of these strings, e.g |
| `employmentTypes` | array | \[] | Keep only these types, e.g |
| `onlyWithSalary` | boolean | false | Keep only jobs whose board publishes a salary range. |
| `postedSince` | string |  | Keep only jobs published on or after this date |
| `dedupeAcrossSources` | boolean | true | The same job (same company + title) posted on several boards is saved once; the other boards' links go to alsoListedOn. |
| `maxResults` | integer | 500 | Stop after saving this many jobs |
| `maxResultsPerSource` | integer | 0 | Save at most this many jobs per board (newest first) |
| `maxPagesPerSource` | integer | 10 | How deep to page through Himalayas (20 jobs per page, split across keywords) |
| `descriptionMode` | string | "text" | Include the description as plain text, HTML, both, or not at all. |

### Integrations, schedules and AI agents

- **Schedules:** Schedule it daily to build a history of new remote jobs (Remote OK only returns its latest ~100). See [Apify schedules](https://docs.apify.com/platform/schedules).
- **No-code tools:** send results to Google Sheets, Slack or a CRM with Apify's [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier) or [n8n](https://docs.apify.com/platform/integrations/n8n) integrations, or a [webhook](https://docs.apify.com/platform/integrations/webhooks) when a run finishes.
- **AI agents (MCP):** connect an MCP client such as Claude Code or Cursor to `https://mcp.apify.com?tools=clearpath-data/remote-jobs-aggregator` and the agent can run this Actor directly. See the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) docs.

### How much does it cost?

| Plan | Price per job |
|---|---|
| Free / Bronze | $0.001 |
| Silver | $0.0008 |
| Gold and above | $0.0006 |

Plus Apify's standard Actor-start event ($0.00005 per GB of memory).

**Example:** 500 jobs on the Free plan cost $0.50.

### FAQ

**How many jobs per run?** Remote OK returns its latest ~100. Himalayas depth depends on `maxPagesPerSource`.

**Duplicates?** The same company + title across boards is saved once (`alsoListedOn`).

### Other Clearpath Data Actors

| Actor | What it does |
|---|---|
| [lei-lookup](https://apify.com/clearpath-data/lei-lookup) | LEI lookup via the GLEIF API (LEI, name, BIC, ISIN) |
| [ats-jobs-by-company](https://apify.com/clearpath-data/ats-jobs-by-company) | Jobs from Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee boards |
| [companies-house-new-companies](https://apify.com/clearpath-data/companies-house-new-companies) | New UK companies from Companies House, with officers and PSCs |
| [uk-visa-sponsor-register](https://apify.com/clearpath-data/uk-visa-sponsor-register) | UK visa sponsor licence list from the GOV.UK register, with a changes feed |
| [hiring-changes-monitor](https://apify.com/clearpath-data/hiring-changes-monitor) | Jobs each company opened or closed since your last run, on the same six ATS boards |
| [us-new-business-filings](https://apify.com/clearpath-data/us-new-business-filings) | New LLCs and corporations from the NY, CO and CT state registries, since your last run |

# Changelog

This Actor's version history is a separate document: https://apify.com/clearpath-data/remote-jobs-aggregator/changelog.md

# Actor input Schema

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

Which boards to read, via their public APIs. Remote OK returns its latest ~100 jobs; Himalayas has the largest catalog (100k+ remote jobs, 20 per request).

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

Keep only jobs whose title contains at least one of these words (case-insensitive), e.g. "python", "product designer". Each keyword is also sent to the Himalayas search API to fetch relevant jobs faster. Leave empty for the latest jobs on every board.

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

When on, keywords also match the job description text.

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

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

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

Keep jobs open to candidates in at least one of these places (matched against the board's location or location restrictions), e.g. "Germany", "Europe", "USA".

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

Jobs open to candidates anywhere always pass the location filter when this is on.

## `categories` (type: `array`):

Keep jobs whose board category or tag contains one of these strings, e.g. "Engineering", "Marketing", "design".

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

Keep only these types, e.g. "Full-time", "Contract", "Part-time", "Freelance". Jobs without a type are dropped when this is set.

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

Keep only jobs whose board publishes a salary range.

## `postedSince` (type: `string`):

Keep only jobs published on or after this date. Absolute (2026-09-01) or relative ("24 hours", "3 days", "1 week").

## `dedupeAcrossSources` (type: `boolean`):

The same job (same company + title) posted on several boards is saved once; the other boards' links go to alsoListedOn.

## `maxResults` (type: `integer`):

Stop after saving this many jobs. 0 = no limit. You pay per saved job, so this also caps the cost.

## `maxResultsPerSource` (type: `integer`):

Save at most this many jobs per board (newest first). 0 = no limit.

## `maxPagesPerSource` (type: `integer`):

How deep to page through Himalayas (20 jobs per page, split across keywords). Remote OK always returns its latest ~100 jobs in one request. Higher = more jobs, slower runs.

## `descriptionMode` (type: `string`):

Include the description as plain text, HTML, both, or not at all.

## Actor input object example

```json
{
  "sources": [
    "remoteok",
    "himalayas"
  ],
  "keywords": [],
  "searchInDescription": false,
  "excludeKeywords": [],
  "locations": [],
  "includeWorldwide": true,
  "categories": [],
  "employmentTypes": [],
  "onlyWithSalary": false,
  "dedupeAcrossSources": true,
  "maxResults": 100,
  "maxResultsPerSource": 0,
  "maxPagesPerSource": 3,
  "descriptionMode": "text"
}
```

# Actor output Schema

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

Normalized remote jobs. Every row carries sourceName, jobUrl, attribution and any reuse restriction.

## `termsNotice` (type: `string`):

Attribution rules and quoted API terms for every board used in this run. Read before republishing the jobs.

## `runReport` (type: `string`):

Per-board status, request and job counts

# 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": [
        "remoteok",
        "himalayas"
    ],
    "maxResults": 100,
    "maxPagesPerSource": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath-data/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 = {
    "sources": [
        "remoteok",
        "himalayas",
    ],
    "maxResults": 100,
    "maxPagesPerSource": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("clearpath-data/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 '{
  "sources": [
    "remoteok",
    "himalayas"
  ],
  "maxResults": 100,
  "maxPagesPerSource": 3
}' |
apify call clearpath-data/remote-jobs-aggregator --silent --output-dataset

```

## MCP server setup

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