# Himalayas Jobs Scraper (`deriverge/himalayas-jobs-scraper`) Actor

Remote jobs from Himalayas with salary as numbers, the countries candidates may live in, allowed time zones and seniority. Search by title or skill, filter by candidate country, seniority or company, and get up to 5,000 results per search.

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

## Pricing

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

## Himalayas Jobs Scraper

Himalayas Jobs Scraper reads remote jobs from himalayas.app through the site's public jobs API, one row per job: title, company, category and role tags, seniority, employment type, the countries candidates may live in, the time zones they must be in, salary as numbers, and the posting and expiry dates. Click **Start** on the prefilled search, `data engineer`, to get 50 jobs. Himalayas returns at most 5,000 results for one search, so broad terms need a country or seniority level to reach further. It costs $0.80 per 1,000 jobs on the Free plan ($0.40 on Business), and the $5 of monthly credit in Apify's Free plan covers about 6,200 jobs.

### What data does it return?

| Field | Description |
|---|---|
| `title`, `url` | Job title and the job's page on Himalayas. `applyUrl` holds the apply link Himalayas gives, usually the same page. |
| `company`, `companySlug` | Company name and its Himalayas slug, which can differ from the name: `Motive` is `thinkmotive`. The slug works in **Companies**. |
| `category`, `tags` | Main category, such as `Data Science`, `Developer` or `Sales`, and the role tags Himalayas attaches, e.g. `Analytics Engineer`. |
| `seniority` | `Entry-level`, `Mid-level`, `Senior`, `Manager`, `Director` or `Executive`. A job with two levels lists both: `Senior, Manager`. |
| `employmentType` | `full_time`, `part_time`, `contract`, `temporary`, `internship`, `volunteer` or `other`. |
| `countries`, `locationRestriction` | Countries where candidates must live, as a list and as one text. Empty when the job is open worldwide. |
| `timezones` | UTC offsets candidates must be located in, as numbers such as `-5` or `5.5`. |
| `salaryMin`, `salaryMax`, `salaryCurrency` | Pay range as numbers and its currency code, such as `USD`, `CAD` or `GBP`. |
| `salaryPeriod` | The unit of the pay figures: `yearly`, `monthly` or `hourly`. |
| `postedAt`, `expiresAt` | When the job was published and when the listing expires, in ISO 8601 UTC. |
| `description` | Job description as plain text: the first 300 characters, or all of it with **Include the full description**. |
| `companyLogo` | Link to the company logo. |
| `key` | Stable ID made of `himalayas:` and the job URL, which the new-only mode compares between runs. |

### How to scrape Himalayas jobs

1. Put job titles, skills or company names into **Search for**, one per line. Each line is a separate Himalayas search, the same as the search box on the site, and it also returns loosely related roles, which **Exclude keywords** can drop.
2. Add countries to **Candidates located in** as names or two-letter codes (`Germany`, `DE`). Each country is a separate search, so two terms and three countries make six searches. Jobs open worldwide are included; **Only jobs that name these countries** drops them, and **Only jobs open worldwide** keeps only them.
3. Narrow further with **Seniority**, **Employment types**, **Companies** (a slug such as `gitlab` or a company page link), **Time zone** (`UTC-5`, `UTC+05:30`), **Minimum salary** and **Posted within the last N days**.
4. Pick the order in **Sort by** (newest first, most relevant, highest or lowest salary) and how deep to read in **Maximum jobs per search**, 500 by default and up to 5,000.
5. Click **Start**. With the default settings a run for one term finishes in under 20 seconds, and the **Output** tab offers the jobs as CSV, Excel or JSON.

An API input for mid-level and senior data jobs limited to Germany or the Netherlands, best paid first:

```json
{
  "searchQueries": ["data engineer", "analytics engineer"],
  "countries": ["DE", "Netherlands"],
  "excludeWorldwide": true,
  "seniority": ["Mid-level", "Senior"],
  "employmentTypes": ["full_time"],
  "sort": "salaryDesc",
  "maxJobsPerSearch": 300
}
```

### Example output

One job from a run on 29 September 2026, with the description at its default 300 characters. The row also has `companyUrl`, `companyHeadquarters`, `verified` and `salaryText`, columns kept for the other boards of our Remote Jobs Scraper; on Himalayas they stay empty.

```json
{
  "key": "himalayas:https://himalayas.app/companies/thinkmotive/jobs/senior-analytics-engineer-gtm-8032467856",
  "source": "himalayas",
  "sourceName": "Himalayas",
  "jobId": "https://himalayas.app/companies/thinkmotive/jobs/senior-analytics-engineer-gtm-8032467856",
  "title": "Senior Analytics Engineer - GTM",
  "company": "Motive",
  "companyLogo": "https://cdn-images.himalayas.app/kb4cz5f6stp55p2wmrtupqmtzzqg",
  "companySlug": "thinkmotive",
  "companyUrl": null,
  "companyHeadquarters": null,
  "category": "Data Science",
  "tags": [
    "Analytics Engineer",
    "Business intelligence Engineer",
    "Data Engineer",
    "Sales Analyst",
    "Sales Operations Analyst",
    "Senior Data Analytics Engineer",
    "Senior Data And Insights Engineer",
    "Senior AI Analytics Engineer"
  ],
  "employmentType": "full_time",
  "seniority": "Senior",
  "locationRestriction": "Canada",
  "countries": [
    "Canada"
  ],
  "timezones": [
    -8,
    -7,
    -6,
    -5,
    -4,
    -3.5
  ],
  "salaryMin": 156000,
  "salaryMax": 205000,
  "salaryCurrency": "CAD",
  "salaryPeriod": "yearly",
  "salaryText": null,
  "postedAt": "2026-09-27T05:48:31.000Z",
  "expiresAt": "2026-11-26T05:48:31.000Z",
  "verified": null,
  "description": "Who we are: Motive empowers the people who run physical operations with tools to make their work safer, more productive, and more profitable. For the first time ever, safety, operations and finance teams can manage their drivers, vehicles, equipment, and fleet related spend in a single system. Combi",
  "url": "https://himalayas.app/companies/thinkmotive/jobs/senior-analytics-engineer-gtm-8032467856",
  "applyUrl": "https://himalayas.app/companies/thinkmotive/jobs/senior-analytics-engineer-gtm-8032467856"
}
```

### How much does it cost to scrape Himalayas?

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 jobs | $0.80 | $0.64 | $0.52 | $0.40 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

Reading all 5,000 results of a broad search costs $4.00 on the Free plan and $2.00 on Business. Jobs removed by a filter, expired listings and jobs already sent in new-only mode are not charged.

### Limits

- The whole board listed about 94,000 jobs on 30 September 2026, and a term as common as `data engineer` already reaches the 5,000 cap.
- Himalayas does not return search results in date order. For a search term, **Newest first** takes the most relevant results up to **Maximum jobs per search** and sorts those by `postedAt`, so a new job that ranks low for the term can be missed. A higher limit reaches it.
- About a third of the jobs publish a salary: 68 of the 200 newest on 30 September 2026. **Minimum salary** keeps the jobs without one and compares the top of each range per year, a monthly figure times 12 and an hourly one times 2,080, in the currency Himalayas gives.
- With an empty **Search for**, no country and no company, the actor reads the feed of newest jobs. Seniority, worldwide and time zone filters are then checked on at most the 6,000 newest jobs, and the log says when that point is reached.
- Listings past their `expiresAt` date are skipped.
- Himalayas limits how often its API can be called. After an HTTP 429 the actor waits 20 seconds and tries once more. If that fails too, it keeps the jobs already found for that search and moves on to the next one; after three such failures the run finishes with what it has.
- A country Himalayas does not recognize is skipped with a warning in the log.
- A run stops at 3,000 jobs unless you change **Maximum rows** (the form starts at 50).

### Where candidates can work from

Remote on Himalayas rarely means anywhere. Of the 200 newest jobs on 30 September 2026, 195 named at least one country and all 200 listed time zones. `countries` names the countries a candidate may live in and `timezones` the UTC offsets they must be in: a job limited to Canada carries offsets from `-8` to `-3.5`, a job limited to India `5.5`. The example row above is one of the Canadian jobs.

### FAQ

#### Is it legal to scrape Himalayas?

Himalayas publishes its jobs through a public API that anyone may use, and asks two things in return: link back to the job's page on Himalayas (the `url` field) and name Himalayas as the source. It also asks that its jobs are not submitted to third-party job sites such as Google Jobs or LinkedIn Jobs. The rows hold job and company data only, and following those terms when you publish the jobs is your responsibility.

#### Can I follow one company?

Put its slug or company page link into **Companies** and schedule the run in new-only mode. Take the slug from `companySlug` or from the page address, because it can differ from the name: Motive's jobs are under `thinkmotive`.

#### How do I get a daily alert for new jobs?

Turn on **Return only jobs new since the last run**, give the watch a name such as `python-europe` or save the input as a task, and schedule it daily. A job you have received is not sent again, even when it drops out of the results and comes back within 60 days. A job that did not fit under **Maximum rows** or the run's maximum cost is not marked as received and comes with the next run.

#### Can I get other remote job boards in the same format?

Our Remote Jobs Scraper reads Himalayas together with five other remote job boards and returns the same columns, so the rows fit into one table.

### Related scrapers

- [Remote Jobs Scraper](https://apify.com/deriverge/remote-jobs-scraper)
- [We Work Remotely Jobs Scraper](https://apify.com/deriverge/weworkremotely-jobs-scraper)
- [Remote OK Jobs Scraper](https://apify.com/deriverge/remoteok-jobs-scraper)
- [Career Site and ATS Jobs API](https://apify.com/deriverge/career-site-jobs-search)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/deriverge/himalayas-jobs-scraper/changelog.md

# Actor input Schema

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

Each entry is a separate Himalayas search, exactly like typing it into the search box on the site: a job title, a skill or a company name, for example "data engineer" or "product designer". Leave empty to read the newest jobs.

## `countries` (type: `array`):

Keep jobs open to candidates in these countries, as a name ("Germany") or a two-letter code ("DE"). Each country is a separate search. Jobs open worldwide are included unless you turn on the next option.

## `excludeWorldwide` (type: `boolean`):

With countries set, drop jobs open worldwide and keep only those restricted to one of your countries.

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

Keep only jobs that accept candidates from anywhere.

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

Keep only these levels. Leave empty for all.

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

Keep only these types. Leave empty for all.

## `companies` (type: `array`):

Only jobs from these employers, as the Himalayas company slug ("gitlab") or company page link ("https://himalayas.app/companies/gitlab"). Leave empty for all.

## `timezone` (type: `string`):

Keep jobs that accept candidates working in this time zone, for example UTC-5 or UTC+05:30.

## `sort` (type: `string`):

Order in which Himalayas returns the results. Newest first suits a daily alert.

## `minSalary` (type: `integer`):

Drop jobs whose published top of range, counted per year (monthly pay times 12, weekly times 52, hourly times 2,080), is below this number, in the currency the board publishes. Jobs with no published salary are kept, because an absent salary is not a low one.

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

Drop jobs older than this. Filtered jobs are never charged.

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

Drop jobs whose title, company, category or tags contain any of these words, for example "senior" or "sales".

## `maxJobsPerSearch` (type: `integer`):

Cap for each search (each search term in each country). Himalayas serves up to 5,000 results per search.

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

Adds the full job description as plain text. Off, each row carries the first 300 characters.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only jobs that were not there before. Schedule it daily and you have a job alert that bills only for new postings.

## `watchName` (type: `string`):

Name of the snapshot used by the new-only mode, for example "python-europe". Runs from a saved task get a snapshot automatically even without a name.

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

Hard cap on returned jobs in the run. The run stops reading as soon as it has this many.

## Actor input object example

```json
{
  "searchQueries": [
    "data engineer"
  ],
  "excludeWorldwide": false,
  "worldwideOnly": false,
  "sort": "recent",
  "maxJobsPerSearch": 500,
  "includeDescription": false,
  "newOnly": false,
  "maxItems": 50
}
```

# Actor output Schema

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

One row per Himalayas job with the title, company, salary as numbers, candidate location, posting date and links.

## `changes` (type: `string`):

Jobs that appeared and jobs that disappeared compared with the previous snapshot of the same watch name or task.

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

How many jobs were read, how many each filter dropped, warnings about searches that found nothing, and totals.

# 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": [
        "data engineer"
    ],
    "maxItems": 50
};

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

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

```

## MCP server setup

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