# Remote Jobs Scraper: RemoteOK and Himalayas | $1/1K (`one_dollar_store/remote-jobs-scraper`) Actor

Remote jobs from RemoteOK and Himalayas in one list, repeats across the two boards merged: title, company, location, tags, salary, date and a link back to the source board. No login or key. $1 per 1,000 results, platform usage included.

- **URL**: https://apify.com/one_dollar_store/remote-jobs-scraper.md
- **Developed by:** [One Dollar Store](https://apify.com/one_dollar_store) (community)
- **Categories:** Jobs
- **Security:** Limited permissions
- **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 and Himalayas in one list

**$1 per 1,000 jobs. Platform usage included. No rental, no minimum.**

Remote Jobs Scraper collects remote job listings from RemoteOK and Himalayas into one list and merges repeats. Filter by keyword, required location and how recently a job was posted. Each row gives the title, company, location, tags, salary where the board shows it, posting date and a link back to the board.

[Open it in Apify Console](https://console.apify.com/actors/MpGKJjAEjPGjxdj44/input)

Remote jobs from two public job boards, RemoteOK and Himalayas, in one list with one set of fields. The same job posted on two boards is merged into one row that names both. Rows alternate between the boards, each board newest first, and each row has a link back to the job on the board it came from. Filter by keyword, location and age. There is no login and no API key.

### How much does Remote Jobs Scraper cost?

| Jobs | Price |
|---|---|
| 1,000 | $1.00 |
| 10,000 | $10.00 |
| 100,000 | $100.00 |

Plus $0.001 per run. One flat price, platform usage included, so there is no separate compute or proxy bill. A daily run that collects 300 jobs costs about $0.30, or about $9 a month.

### Why use it

- **Two boards, one format.** You get one list instead of two feeds with two sets of field names.
- **Repeats merged.** When the same company and title appear on two boards, you pay for one row, and `alsoListedOn` shows the other board and its link.
- **A link back on every row.** `sourceUrl` is the job's page on the board it was read from, and `source` names the board. The boards ask for both when you show their jobs (see the section on crediting the sources).
- **Filters before you pay.** Keyword, location and posting age are applied first, so you are charged only for the jobs you keep.

### How to use Remote Jobs Scraper

1. Open the actor, leave both boards on, press **Start**.
2. Or paste this input:

```json
{ "sources": ["remoteok", "himalayas"], "keyword": "python", "maxAgeDays": 14, "maxItems": 100 }
```

3. Download the results as JSON, CSV or Excel, or read them through the API.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/one_dollar_store~remote-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keyword": "python", "maxAgeDays": 14, "maxItems": 100}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("one_dollar_store/remote-jobs-scraper").call(
    run_input={"keyword": "python", "maxAgeDays": 14, "maxItems": 100}
)
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["source"], job["company"], job["title"], job["sourceUrl"])
```

### Use it from an AI assistant

Claude, ChatGPT, Cursor and other assistants can call this actor through Apify's MCP server. Add it with this server address:

```
https://mcp.apify.com?tools=one_dollar_store/remote-jobs-scraper
```

Then ask, for example: "Find remote data engineer jobs posted in the last week and give me the link to each one."

### Switching from another remote jobs actor

Most remote job actors cover one board and take a keyword and a limit. Here `keyword` and `maxItems` work the same way, and `sources` picks the boards. The core fields are `title`, `company`, `location`, `postedAt`, `source` and `sourceUrl`. Salary fields are filled only where a board provides them.

### Crediting the sources

The two boards publish their feeds for free and ask for credit in return. Each row carries what you need: `source` names the board and `sourceUrl` is the job's page on that board.

- **RemoteOK** asks anyone who uses its jobs to link back to the job on remoteok.com with a normal link (no nofollow) and to name Remote OK as the source. It also asks you not to use its logo without written consent. The actor does not return logos.
- **Himalayas** asks you to show a visible link back to himalayas.app and to say the data comes from Himalayas.

These requests are about showing the jobs to other people. They are the boards' requests as we read them on 9 October 2026; check each board's own page for the current wording.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `sources` | list | both | Boards to read: `remoteok`, `himalayas`. |
| `keyword` | text | none | Keeps jobs where all of these words appear in the title, company, tags or category. Not case sensitive. |
| `location` | text | none | Keeps jobs whose required location contains this text. Several options with a semicolon: `Worldwide; Europe`. |
| `maxAgeDays` | number | 0 | Keeps jobs posted in the last N days. 0 means no limit. |
| `includeDescription` | true or false | false | Adds the job description as plain text in `description`. Rows get larger. |
| `maxItems` | number | 200 | Total jobs for the run. Minimum 10. |

Example with filters:

```json
{
  "sources": ["remoteok", "himalayas"],
  "keyword": "data engineer",
  "location": "Worldwide; Europe",
  "maxAgeDays": 30,
  "includeDescription": true,
  "maxItems": 100
}
```

### What data does Remote Jobs Scraper return?

| Field | Meaning |
|---|---|
| `source` | The board the row was read from: RemoteOK or Himalayas. |
| `sourceUrl` | The job's page on that board. Use it as the link back. |
| `jobId` | Board name plus the board's own id, for example `remoteok-1137460`. Stable, good for dropping repeats between runs. |
| `title`, `company` | Job title and hiring company. |
| `companyUrl` | The company's page on Himalayas. Himalayas rows only. |
| `location` | Where the board says candidates must be. `Worldwide` when a board lists no restriction. |
| `category` | Himalayas parent categories. Himalayas rows only. |
| `employmentType` | Full time, contract and so on. Himalayas rows only. |
| `seniority` | Himalayas rows only. |
| `tags` | Skill and topic tags from the board. |
| `salaryMin`, `salaryMax` | Salary numbers, only where the board shows them. RemoteOK sends numbers without a currency or period. |
| `salaryCurrency`, `salaryPeriod` | Himalayas rows with a salary only. |
| `postedAt` | When the board published the job, in UTC. |
| `expiresAt` | Himalayas rows only. |
| `applyUrl` | Direct apply link, when it differs from `sourceUrl`. |
| `alsoListedOn` | The other boards that list the same company and title, each with its link. Only on merged rows. |
| `description` | Plain text description, only when `includeDescription` is on. |
| `scrapedAt` | Time of the run. |

### Sample results

Real rows from a test run on 9 October 2026, one from each board. Descriptions are left out and long tag lists are shortened to their first entries.

```json
[
  {"source": "Himalayas", "sourceUrl": "https://himalayas.app/companies/highmark-health/jobs/clinical-and-population-health-analyst", "jobId": "himalayas-clinical-and-population-health-analyst", "title": "Clinical and Population Health Analyst", "company": "Highmark Health", "companyUrl": "https://himalayas.app/companies/highmark-health", "location": "United States", "category": "Healthcare", "employmentType": "Full Time", "seniority": "Mid-level", "tags": ["Clinical-Analyst", "Population-Health-Analyst", "Healthcare-Analyst", "Clinical-Data-Analyst"], "salaryMin": 72700, "salaryMax": 116600, "salaryCurrency": "USD", "salaryPeriod": "annual", "postedAt": "2026-10-09T01:05:08.000Z", "expiresAt": "2026-12-08T01:05:07.000Z", "scrapedAt": "2026-10-09T02:11:09.744Z"},
  {"source": "RemoteOK", "sourceUrl": "https://remoteOK.com/remote-jobs/remote-junior-crypto-analyst-trader-empire-assets-1137460", "jobId": "remoteok-1137460", "title": "Junior Crypto Analyst & Trader", "company": "Empire Assets", "location": "Remote", "tags": ["crypto", "finance", "trader", "remote"], "salaryMin": 60000, "salaryMax": 80000, "postedAt": "2026-10-02T12:53:01.000Z", "scrapedAt": "2026-10-09T02:11:10.258Z"}
]
```

### Limits

- Each board publishes only so many jobs. In our test on 9 October 2026 the RemoteOK feed held 99 jobs. Himalayas is far larger and is read 20 jobs at a time, up to 1,200 jobs per run. A run therefore returns at most about 1,300 jobs, however high `maxItems` is.
- Himalayas says its data is refreshed every 24 hours. Running more than once or twice a day brings little new data.
- Himalayas limits how fast it can be read. The actor waits between pages. If Himalayas stops answering, the run keeps the jobs already read and says so in the log. If one board cannot be read at all, the other board still runs and the log says which one failed.
- Salary is shown only where a board has it, and in each board's own form: numbers without currency from RemoteOK, numbers with currency and period from Himalayas.
- Repeats are found by company name and title. Two different jobs with the same company and title on two boards would be merged into one row; two jobs with the same company and title on the same board are kept apart.
- `maxAgeDays` drops jobs that have no posting date.
- `location` is free text written by each board, so use a few options if you filter, for example `Worldwide; Anywhere`.
- Company contact details, emails and logos are not returned.
- The description is plain text made from the board's HTML. Layout is simplified.

### FAQ

**How much does it cost to scrape 10,000 remote jobs?**
$10, plus $0.001 for each run. Note that the two boards together hold fewer jobs than that at any one time, so a single run is smaller; many runs over time add up.

**Do I pay for compute or proxy on top?**
No. Platform usage is included in the $1 per 1,000 price. The actor calls the two public feeds directly and uses no proxy.

**Where does the data come from?**
From the public feeds of RemoteOK (remoteok.com/api) and Himalayas (himalayas.app/jobs/api). No login and no key.

**Can I show these jobs on my own site?**
Each board asks for a link back and a mention as the source. See the section on crediting the sources above.

**How do I find only new jobs every day?**
Schedule one run a day and keep the `jobId` values you already have. You can also set `maxAgeDays` to 1 or 2.

**Is it legal?**
The actor reads public feeds that the boards offer for reuse, with no login. How you use the data is up to you: follow each board's request for credit, the terms of the boards and the law where you live. Do not use the data to send unwanted messages.

**Is this an official RemoteOK or Himalayas product?**
No. It is an independent tool and is not affiliated with or endorsed by either board.

**Do I need an Apify account?**
Yes. Actors run from an Apify account, and a free account is enough to start: it includes $5 of platform usage every month. You can [sign up here](https://www.apify.com?fpr=ymnoit). This is a referral link and it costs you nothing.

**Is there a limit on the free plan?**
Yes. A run started from a free plan account delivers the first 10 results, then ends with a message and a link to the plans. Any paid plan returns everything you ask for, up to your own limit. The price per result is the same on every plan.

### Feedback and support

Found a problem or want a field added? Open an issue on the Issues tab of this actor and it gets read. If the actor saved you time, an honest rating on the Reviews tab helps other people find it.

### More from The One Dollar Store

Every actor here costs $1 per 1,000 results, platform usage included. See the whole store: https://apify.com/one_dollar_store

**Jobs**

- [Foundit Jobs Scraper](https://apify.com/one_dollar_store/foundit-jobs-search-scraper): Indian jobs with salary and experience filters.
- [Naukri Jobs Scraper](https://apify.com/one_dollar_store/naukri-job-listings-scraper): Naukri.com jobs by keyword, city and experience.
- [Greenhouse Jobs Scraper](https://apify.com/one_dollar_store/greenhouse-jobs-scraper): Open roles from Greenhouse company boards.
- [Lever Jobs Scraper](https://apify.com/one_dollar_store/lever-jobs-scraper): Open roles from Lever company boards.
- [SmartRecruiters Jobs Scraper](https://apify.com/one_dollar_store/smartrecruiters-jobs-scraper): Open roles from SmartRecruiters companies.

### Changelog

- 26 October 2026: clearer description and headings, field details for AI tools. Price and output unchanged.
- October 2026: first release.

# Actor input Schema

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

Which boards to read. Both are on by default.

## `keyword` (type: `string`):

Optional. Keeps jobs where all of these words appear in the title, company, tags or category, in any order (not case sensitive). Example: python backend.

## `location` (type: `string`):

Optional. Keeps jobs whose required location contains this text (not case sensitive). Separate several options with a semicolon: Worldwide; Europe; United States.

## `maxAgeDays` (type: `integer`):

Optional. Keeps jobs posted in the last N days. 0 means no limit.

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

Adds the job description as plain text in the field description. Rows get larger. Off by default.

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

The run stops after this many jobs. Rows alternate between the boards, each board newest first. Minimum 10.

## Actor input object example

```json
{
  "sources": [
    "remoteok",
    "himalayas"
  ],
  "maxAgeDays": 0,
  "includeDescription": false,
  "maxItems": 60
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "sources": [
        "remoteok",
        "himalayas"
    ],
    "maxItems": 60
};

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

# Run the Actor and wait for it to finish
run = client.actor("one_dollar_store/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 '{
  "sources": [
    "remoteok",
    "himalayas"
  ],
  "maxItems": 60
}' |
apify call one_dollar_store/remote-jobs-scraper --silent --output-dataset

```

## MCP server setup

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