# Himalayas Remote Jobs Scraper: Search, Salary & New Jobs (`datasmithlab/himalayas-jobs-scraper`) Actor

Remote jobs from Himalayas filtered by timezone, country, seniority, employment type and salary, via its official public API. Full descriptions, company data and new-jobs-only monitoring.

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

## Pricing

from $0.60 / 1,000 job listings

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 Remote Jobs Scraper: Search, Salary & New Jobs

Export **remote jobs from [Himalayas](https://himalayas.app)** as clean, structured data: title, company, seniority, employment type, **which countries and time zones can apply**, **salary ranges (with a yearly figure for easy comparison)**, categories, full description, posting and expiry dates, and apply links. Built on Himalayas' **official public Jobs API**: no browser, no proxy, no login, and no breakage from page redesigns.

### Why this one

- **Official API, up to date.** Uses the documented `himalayas.app/jobs/api` endpoints, including the new cursor pagination (the old offset paging is being removed).
- **Search or export everything.** Search by keywords, country, seniority, employment type, company and timezone, or leave everything empty to read the **whole feed (100,000+ jobs, newest first)**: raise *Max jobs* accordingly. With *Posted within* or *Only new jobs*, the feed run stops as soon as it reaches older or already-seen jobs, so daily monitoring stays fast and cheap.
- **Salary you can filter on.** Every salary is also converted to a yearly figure (`salaryYearlyMax`: monthly ×12, weekly ×52, hourly ×2080), so "at least 120,000 USD a year" works across pay periods.
- **Last 24 hours / new jobs only.** Filter by publish date, or switch on *Only new jobs since last run* and schedule it daily: each run returns just the jobs you haven't seen.
- **Many searches in one run.** Several keywords × several countries; a job that matches more than one search is returned (and charged) once.
- **Transparent:** a `SEARCHES` report shows pages read, jobs seen and matched per search, and warns when a search hits Himalayas' 5,000-result limit; a `HEALTH` report flags API format changes instead of silently returning nothing.

### Input

```json
{
  "searchQueries": ["python developer", "data engineer"],
  "countries": ["US", "DE"],
  "seniority": ["Senior"],
  "employmentTypes": ["Full Time"],
  "minYearlySalary": 120000,
  "salaryCurrency": "USD",
  "postedWithin": "7d",
  "excludeKeywords": ["manager"],
  "onlyNewSinceLastRun": true,
  "maxItems": 1000
}
```

- **Countries:** ISO code (US, DE) or name. Each country is searched separately. Jobs open worldwide are included; tick *Exclude worldwide jobs* to keep only country-specific ones, or *Worldwide jobs only* for the opposite.
- **Companies:** Himalayas company slugs, the part after `himalayas.app/companies/` (e.g. `linear`, `vercel`).
- **Timezone:** a UTC offset such as `UTC-5` or `UTC+05:30`.
- Searches run in order until `maxItems` is reached, so put your most important search first.
- **Sort** (most recent, most relevant, salary) applies to searches; choosing a non-default sort with no other filter uses Himalayas search, which is limited to 5,000 jobs.

### Output

```json
{
  "id": "himalayas:https://himalayas.app/companies/elitevorasys-llc/jobs/software-engineer",
  "title": "Software Engineer",
  "company": "ElitevoraSys LLC",
  "companySlug": "elitevorasys-llc",
  "seniority": ["Senior"],
  "employmentType": "Full Time",
  "categories": ["Software-Engineer", "Software-Engineer-Developer"],
  "parentCategories": ["Developer"],
  "isWorldwide": false,
  "locationRestrictions": ["United States"],
  "timezoneRestrictions": [-11, -10, -9.5],
  "salaryMin": 160000, "salaryMax": 240000, "salaryCurrency": "USD", "salaryPeriod": "annual",
  "salaryYearlyMax": 240000,
  "publishedAt": "2026-09-21T03:43:48Z",
  "expiresAt": "2026-10-17T15:00:23Z",
  "url": "https://himalayas.app/companies/elitevorasys-llc/jobs/software-engineer",
  "applyUrl": "https://himalayas.app/companies/elitevorasys-llc/jobs/software-engineer",
  "excerpt": "About Us ElitevoraSys is a modern engineering consultancy...",
  "descriptionText": "...",
  "source": "Himalayas (himalayas.app)"
}
```

Export as JSON, CSV, Excel or via API.

### Pricing

Pay per result: **$1.00 per 1,000 jobs** ($0.001 each), full description included, plus $0.001 per run start. Only jobs that pass your filters are charged, and duplicates across searches are not charged twice.

### Using the data (Himalayas' terms)

Himalayas publishes this API for anyone to use **on the condition that you link back to the job's Himalayas URL and mention Himalayas as the original source**. Every row includes `url` and `source` so you can do that. Himalayas also asks that its jobs are **not submitted to third-party job sites** (such as Jooble, Neuvoo, Google Jobs or LinkedIn Jobs). Please respect these conditions.

### Need company career pages too?

For jobs straight from company career sites (Workday, Greenhouse, Lever, Ashby and more), see **Career Page Jobs Scraper** by datasmithlab.

### Notes

- Only public job listings are collected. No personal data and no recruiter contact details.
- Himalayas' search returns at most 5,000 jobs per search; the `SEARCHES` report tells you when that limit is hit. Narrow the search, split it by country, or leave all filters empty to read the full feed instead.
- The scraper paces its requests to stay within Himalayas' rate limit.
- Not affiliated with Himalayas. Use the data in line with applicable laws and Himalayas' terms.
- Found a bug or need a field? Open an issue in the Issues tab.

# Actor input Schema

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

One search per line, e.g. 'react engineer' or 'product designer'. Leave empty (and all filters empty) to export the whole Himalayas remote jobs feed.

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

Jobs open to candidates in these countries (ISO code like US, DE or a country name). Each country is searched separately. Worldwide jobs are included unless you exclude them.

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

With Countries set: drop jobs that are open worldwide, keep only country-specific ones.

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

Only jobs that accept candidates from anywhere.

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

Leave empty for all levels.

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

Leave empty for all types.

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

Only these companies, by their Himalayas slug (the part after himalayas.app/companies/, e.g. linear, vercel).

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

Jobs that accept candidates in this UTC offset, e.g. UTC-5, UTC+3, UTC+05:30.

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

Drop jobs whose title contains any of these words (whole-word match).

## `postedWithin` (type: `string`):

Only jobs published in this window.

## `minYearlySalary` (type: `integer`):

Keep jobs whose salary (top of the range, converted to yearly: monthly x12, weekly x52, hourly x2080) is at least this amount. Jobs without a salary are dropped when set. Combine with Salary currency.

## `salaryCurrency` (type: `string`):

Only jobs paying in this currency (jobs without a salary are dropped when set).

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

Order in which Himalayas returns search results.

## `onlyNewSinceLastRun` (type: `boolean`):

Returns only jobs you have not received before with the same search and filters. Ideal for scheduled daily monitoring.

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

Full job description as HTML and plain text. Turn off for smaller output.

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

Stop after this many jobs in total (you are charged only for jobs returned).

## Actor input object example

```json
{
  "searchQueries": [
    "python developer"
  ],
  "countries": [
    "US"
  ],
  "excludeWorldwide": false,
  "worldwideOnly": false,
  "postedWithin": "any",
  "sort": "recent",
  "onlyNewSinceLastRun": false,
  "includeDescription": true,
  "maxItems": 100
}
```

# Actor output Schema

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

Job listings (table view, JSON/CSV/Excel export available).

## `allFields` (type: `string`):

Every field of every job, including descriptions.

## `searches` (type: `string`):

For each keyword x country search: pages read, jobs seen, jobs matched, status (ok / capped / error).

## `health` (type: `string`):

Empty-field ratios and failed searches.

# 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": [
        "python developer"
    ],
    "countries": [
        "US"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("datasmithlab/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": ["python developer"],
    "countries": ["US"],
    "maxItems": 100,
}

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

```

## MCP server setup

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