# Remote Jobs Scraper: Remote OK, Himalayas, Remotive & more (`lanternlane-data/remote-jobs-aggregator`) Actor

Scrape remote jobs from 7 boards into one clean dataset: Himalayas, Remote OK, Remotive, We Work Remotely, Jobicy, Working Nomads and Arbeitnow. Official public feeds only. Salary, location and keyword filters, cross-board dedupe and new-job alerts.

- **URL**: https://apify.com/lanternlane-data/remote-jobs-aggregator.md
- **Developed by:** [Lantern Lane Data](https://apify.com/lanternlane-data) (community)
- **Categories:** Jobs, Automation
- **Stats:** 4 total users, 3 monthly users, 95.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## Remote Jobs Scraper: Himalayas, Remote OK, Remotive, We Work Remotely, Jobicy & more

### 🌍 What is the Remote Jobs Scraper?

Get **remote jobs from 7 popular remote job boards in one clean dataset**, in seconds. This Actor reads each board's **official public job feed** (JSON API or RSS), normalises everything into one schema (title, company, allowed countries, employment type, seniority, salary, tags, description, posted date, apply link) and **merges duplicates** when the same job is posted on several boards.

Schedule it and it becomes a **remote job alert feed**: turn on *Only jobs not seen in previous runs* and you get only fresh postings each time.

- ✅ 7 boards: **Himalayas, Remote OK, Remotive, We Work Remotely, Jobicy, Working Nomads, Arbeitnow**
- ✅ One normalised schema, ready for Sheets, Airtable, Notion, a database or an AI agent
- ✅ Salary min / max / currency / interval when the board publishes it
- ✅ Filters: keywords, exclude words, candidate location (e.g. *India*, *Europe*, *USA*), employment type, posted since, salary-only
- ✅ Cross-board dedupe with `alsoListedOn`
- ✅ New-job tracking for alerts (`isNew`, `firstSeenAt`)
- ✅ Fast and cheap: a full run of ~800 jobs takes well under a minute on 256 MB
- ✅ No login, no browser, no proxies needed: only official public feeds, called politely
- ✅ Personal e-mail addresses and phone numbers are removed from descriptions

### 🎯 What can I use it for?

- **Niche remote job boards & newsletters**: fill a "remote Python jobs" or "remote jobs for India" board or weekly newsletter.
- **Job alerts**: schedule it hourly/daily with your keywords and send new jobs to Slack, Telegram or e-mail via Apify integrations.
- **Job seekers**: one search across 7 remote boards instead of 7 tabs.
- **Market & salary research**: which skills, seniorities and pay ranges are trending in remote hiring.
- **Hiring signals**: see which companies are hiring remotely, and for which roles.
- **AI agents**: predictable, documented output via the Apify API or MCP.

### 🧩 Supported boards

| Board | Feed used | Typical volume per run | Salary |
|---|---|---|---|
| Himalayas | Public Jobs API (browse + keyword search) | up to 500 newest | ✅ structured |
| Remote OK | Public API | ~100 newest | ✅ structured (USD/year) |
| Remotive | Public API (24 h delayed by Remotive) | all published | text |
| We Work Remotely | Public RSS feed | ~90 newest | – |
| Jobicy | Public API v2 (keyword = tag search) | up to 100 newest | ✅ structured |
| Working Nomads | Public jobs feed | ~40 newest | – |
| Arbeitnow | Public job-board API (remote jobs only by default) | up to 1,600 newest | – |

Volumes depend on what each board publishes in its public feed.

### ⬇️ Input

| Field | Description |
|---|---|
| `keywords` | Keep jobs that mention any of these words (title, company, category, tags and, by default, description). Also used for server-side search on Himalayas, Remotive and Jobicy. |
| `sources` | Boards to read (default: all 7). |
| `searchInDescription` | Match keywords in the description too (default on). |
| `excludeKeywords` | Drop jobs whose title/company/category/tags contain any of these. |
| `locations` | Keep jobs open to candidates in these places, e.g. `India`, `Europe`, `USA`. |
| `includeWorldwide` | With a location filter, also keep *Worldwide / Anywhere* jobs (default on). |
| `employmentTypes` | `full-time`, `part-time`, `contract`, `internship`, `temporary`, `volunteer`, `other`. |
| `postedSince` | `2026-10-01` or `24 hours`, `7 days`, `2 weeks`. |
| `onlyWithSalary` | Only jobs with a published salary. |
| `remoteOnly` | Drop Arbeitnow's on-site jobs (default on). |
| `maxJobs` | Total cap (newest first, default 500, `0` = no limit). Also caps your cost. |
| `includeDescription` / `includeDescriptionHtml` | Plain text on by default; HTML off by default. |
| `dedupeAcrossSources` | Merge the same company + title across boards (default on). |
| `onlyNewJobs` | Output only jobs not delivered in previous runs (for alerts). |
| `stateStoreName` | Named key-value store used for tracking; use one per alert feed. |

#### Example input

```json
{
  "keywords": ["python", "data engineer"],
  "locations": ["India"],
  "includeWorldwide": true,
  "postedSince": "7 days",
  "maxJobs": 200
}
```

### ⬆️ Output

One record per job. Example (shortened):

```json
{
  "id": "remoteok-1137466",
  "source": "remoteok",
  "title": "Project Manager",
  "company": "Spiralyze",
  "url": "https://remoteok.com/remote-jobs/remote-project-manager-spiralyze-1137466",
  "applyUrl": "https://remoteok.com/remote-jobs/remote-project-manager-spiralyze-1137466",
  "location": "Worldwide",
  "locationRestrictions": [],
  "isWorldwide": true,
  "employmentType": null,
  "seniority": "Manager",
  "category": "project manager",
  "tags": ["project manager", "exec", "ops", "marketing", "cro"],
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryInterval": null,
  "descriptionText": "The Project Manager is a client-facing role ...",
  "postedAt": "2026-10-06T19:35:42Z",
  "attribution": "Remote OK (remoteok.com)",
  "alsoListedOn": ["himalayas"],
  "isNew": true,
  "firstSeenAt": "2026-10-08T07:47:09Z"
}
```

See `sample_output.json` for full records from every board. The **Overview** table view in the Console shows title, company, location, type, salary, board, date and link. Download as JSON, CSV, Excel, XML or via the API.

A `RUN_SUMMARY` record in the default key-value store lists jobs fetched / matched, requests and errors per board. If one board is temporarily down, the others are still returned.

### 💰 How much does it cost?

**Free until 22 October 2026.** From then on it uses **pay-per-event** pricing: **$1.50 per 1,000 jobs** (`job-result`, $0.0015 each) plus Apify's standard $0.00005 Actor start fee. Platform usage is included. Use `maxJobs` or the run's maximum cost setting to cap spending.

### ⚖️ Using the data responsibly

The boards publish these feeds so their jobs can be shared further, and ask for credit in return. When you **display** jobs publicly, keep the `url` link to the original listing and credit the board shown in `attribution` (e.g. "via Remote OK"). Remotive and Himalayas ask that their jobs are **not submitted to third-party job aggregators** such as Google Jobs, LinkedIn Jobs, Jooble or Neuvoo. Remotive delays its public feed by 24 hours. This Actor makes a handful of requests per run; please don't schedule it more often than every hour or so; the boards refresh a few times a day.

The output contains job and company information only. Personal e-mail addresses and phone numbers found in descriptions are removed.

### 🔌 Use it via API, Python or integrations

Run it from the Apify Console, on a schedule, or from code with the Apify API, the Python or JavaScript `apify-client`, or MCP. Connect results to Google Sheets, Slack, Zapier, Make, n8n or a webhook from the **Integrations** tab.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lanternlane-data/remote-jobs-aggregator").call(run_input={"keywords": ["python", "data engineer"], "locations": ["India"], "onlyNewJobs": true})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### ❓ FAQ

**Can I get only jobs for my country?** Use `locations` (e.g. `India`) and keep `includeWorldwide` on to also get *anywhere* jobs.

**Why do some jobs have no salary?** Not every board or employer publishes pay. Use `onlyWithSalary` to keep only jobs with a salary.

**How do alerts work?** Turn on `onlyNewJobs`, schedule the Actor, and connect an integration (Slack, e-mail, webhook). Each run returns only jobs not delivered before (per `stateStoreName`).

**A board returned 0 jobs.** Check `RUN_SUMMARY`. Boards occasionally rate-limit or change feeds; the rest of the run still completes. Report it in the Issues tab and we'll fix it quickly.

**Need another board or field?** Open an issue. Companies' own career pages (Greenhouse, Lever, Ashby, Workday ...) are covered by our [Careers Page Jobs Actor](https://apify.com/lanternlane-data/careers-page-jobs-aggregator).

### 🏮 More from Lantern Lane Data

**Jobs & hiring data** is our focus: job postings straight from employers' applicant tracking systems and official public feeds, in one consistent schema. More ATS platforms and hiring-signal tools are on the way.

- 💼 [ATS Jobs Scraper](https://apify.com/lanternlane-data/careers-page-jobs-aggregator): Every open job from 7 ATS platforms (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee) in one schema, with new and closed job alerts.

**Other tools**

- 🛍️ [Shopify Products Scraper](https://apify.com/lanternlane-data/shopify-store-products-scraper): Every product, price, variant and stock level from any Shopify store, with price-change tracking.
- 🗺️ [Sitemap URL Extractor](https://apify.com/lanternlane-data/sitemap-url-extractor): Every URL from any website's XML sitemaps, with lastmod, hreflang and new-page alerts.
- 🔦 [AI Brand Visibility Tracker](https://apify.com/lanternlane-data/ai-brand-visibility-tracker): How often ChatGPT, Perplexity, Gemini and Claude mention, rank and cite your brand vs competitors.

***

Made by **Lantern Lane Data**. Not affiliated with any of the job boards listed.

# Changelog

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

# Actor input Schema

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

Keep jobs that mention at least one of these words or phrases, e.g. <code>python</code>, <code>product designer</code>. Matched in title, company, category, tags and (by default) description. Leave empty for all jobs.

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

Which boards to read. Leave empty for all 7.

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

On by default (skills such as 'python' are often only in the description). Turn off to match title, company, category and tags only.

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

Drop jobs whose title, company, category or tags contain any of these, e.g. <code>senior</code>, <code>sales</code>.

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

Keep jobs open to candidates in one of these places, e.g. <code>India</code>, <code>Europe</code>, <code>USA</code>. Matched against the board's location / allowed-countries text.

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

When a location filter is set, also keep jobs open worldwide.

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

Leave empty for all.

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

<code>2026-10-01</code> or relative: <code>24 hours</code>, <code>7 days</code>, <code>2 weeks</code>.

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

Keep only jobs that publish a salary (structured range or salary text).

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

Arbeitnow also lists on-site jobs in Germany. Keep on to drop them.

## `maxJobs` (type: `integer`):

Total cap on job records (newest first). 0 = no limit. Also caps your cost.

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

Plain-text job description (personal e-mails and phone numbers removed).

## `includeDescriptionHtml` (type: `boolean`):

Adds the original HTML (sanitised). Off by default to keep the dataset small.

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

The same company + title on several boards becomes one record; the other boards are listed in alsoListedOn.

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

Great for scheduled alerts. Seen job IDs are remembered in a named key-value store for 90 days.

## `stateStoreName` (type: `string`):

Key-value store that remembers seen jobs. Use different names for separate alert feeds.

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

Not needed normally. Use it only if a board starts rate-limiting.

## Actor input object example

```json
{
  "keywords": [
    "python",
    "data engineer"
  ],
  "searchInDescription": true,
  "includeWorldwide": true,
  "postedSince": "7 days",
  "onlyWithSalary": false,
  "remoteOnly": true,
  "maxJobs": 500,
  "includeDescription": true,
  "includeDescriptionHtml": false,
  "dedupeAcrossSources": true,
  "onlyNewJobs": false,
  "stateStoreName": "remote-jobs-tracker"
}
```

# Actor output Schema

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

One record per remote job.

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

Jobs fetched / matched and errors per board.

# 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 engineer"
    ]
};

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

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

```

## MCP server setup

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