# Himalayas Remote Jobs API: Export Job Listings (`ucchiii/himalayas-jobs-api`) Actor

Export remote job listings from the public Himalayas Jobs API. Filter by keyword, category, seniority, country, timezone. One flat row per job with salary, dates, Himalayas link. Empty input = free demo. $1 per 1,000 jobs.

- **URL**: https://apify.com/ucchiii/himalayas-jobs-api.md
- **Developed by:** [Actor Factory](https://apify.com/ucchiii) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 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 Remote Jobs API: export remote job listings

**For recruiters, job-board builders, sales-intelligence teams and analysts who want a clean list of current remote jobs.**
Set a keyword, seniority, country or timezone and get **one flat row per job** from the public [Himalayas](https://himalayas.app) Jobs API. **$1.00 per 1,000 jobs**, you pay only for jobs returned.

**Try it free: leave input empty and press Start.** You get 3 sample jobs, not charged, marked `_demo: true`.

- **Official public API**: reads `himalayas.app/jobs/api` and `/jobs/api/search`. No login, no proxies, no HTML scraping.
- **Filters**: keyword (title, company, description), category, seniority, employment type, country, worldwide only, timezone, sort order.
- **Flat, normalized rows**: title, company, Himalayas job URL, location restrictions, timezones, seniority, employment type, salary min/max/currency/period when listed, posted and expiry dates, categories, plain-text description.
- **Contact details removed**: e-mail addresses and phone numbers in descriptions are replaced with `[removed]`.
- **Polite**: one request at a time, about 1 second apart, retries with backoff on 429 / 5xx.

### Sample output

| title | company | location | seniority | salary | postedAt | url |
|---|---|---|---|---|---|---|
| Senior Python Developer | Acme | Worldwide | Senior | 90,000-120,000 USD annual | 2026-10-20 | https://himalayas.app/companies/acme/jobs/senior-python-developer |
| Data Engineer | Globex | Germany, France | Mid-level | n/a | 2026-10-19 | https://himalayas.app/companies/globex/jobs/data-engineer |

### Input

```json
{
  "keywords": ["python"],
  "categories": ["Developer"],
  "seniority": ["Senior"],
  "employmentType": ["Full Time"],
  "countries": ["US", "Germany"],
  "worldwideOnly": false,
  "timezone": "UTC+1",
  "sort": "recent",
  "maxJobs": 20
}
```

- `keywords`: jobs matching any word in title, company or description. Each keyword is also sent to Himalayas as a search query (one search per keyword and country, at most 20 combinations).
- `categories`: matched against category and parent category (e.g. `Developer`, `Sales`) after fetching, so rare categories scan more pages.
- `seniority`: `Entry-level`, `Mid-level`, `Senior`, `Manager`, `Director`, `Executive`. `employmentType`: `Full Time`, `Part Time`, `Contractor`, `Temporary`, `Intern`, `Volunteer`, `Other`.
- `timezone`: UTC offset such as `-5`, `UTC+1`, `UTC+05:30`.
- `maxJobs`: 1 to 2,000 (prefill 20). A run scans at most 8,000 listings.

### Output (one item per job)

```json
{
  "source": "Himalayas",
  "title": "Senior Python Developer", "company": "Acme", "companySlug": "acme",
  "url": "https://himalayas.app/companies/acme/jobs/senior-python-developer",
  "applyUrl": "https://himalayas.app/companies/acme/jobs/senior-python-developer",
  "location": "Germany, France", "locationRestrictions": ["Germany", "France"], "worldwide": false,
  "timezones": ["UTC-1", "UTC+0", "UTC+1"],
  "seniority": "Senior", "employmentType": "Full Time",
  "salaryMin": 90000, "salaryMax": 120000, "salaryCurrency": "USD", "salaryPeriod": "annual",
  "postedAt": "2026-10-20T08:00:00Z", "expiresAt": "2026-11-20T08:00:00Z",
  "categories": ["Python"], "parentCategories": ["Developer"],
  "descriptionText": "We are looking for ...", "descriptionTruncated": false
}
```

- Salaries are as published by Himalayas and are **not** converted to annual: read `salaryPeriod` (`hourly`, `weekly`, `fortnightly`, `monthly`, `annual`).
- `location` lists the countries candidates must be in; "Worldwide" means no restriction.
- `descriptionText` is cut at 30,000 characters (`descriptionTruncated`).
- A run summary (jobs returned, listings scanned, requests, warnings) is saved to the key-value store as `SUMMARY`.

### Pricing

Pay per event: **$0.001 per job returned** (1,000 jobs cost $1.00). Filters are applied before charging. The empty-input demo and failed runs are free. Set a max charge per run in the run options to cap spend.

### Attribution and terms (Himalayas)

Job data comes from the Himalayas public API and is subject to its terms ([API docs](https://himalayas.app/docs/remote-jobs-api)). If you display or republish these listings you must:

- **credit Himalayas as the source** with a visible link, and link each job to its Himalayas page (the `url` field);
- **not resubmit** Himalayas listings to third-party job aggregators or job sites (the docs name Jooble, Neuvoo, Google Jobs and LinkedIn Jobs as examples).

Himalayas refreshes its data about every 24 hours, so running more than once a day adds nothing. You are responsible for following these terms when you use the data.

### Use cases

- Remote job alerts for a niche (for example senior Python, worldwide)
- Hiring-signal and market research by category, seniority and salary
- Content for your own remote-jobs site, with proper credit to Himalayas

### Notes

- No personal data is collected. E-mail addresses and phone numbers in descriptions are removed.
- Not affiliated with Himalayas.

### More tools from the same developer

- [Greenhouse Jobs Scraper](https://apify.com/ucchiii/greenhouse-jobs) — open jobs from any Greenhouse job board via the public Job Board API
- [Lever Jobs Scraper](https://apify.com/ucchiii/lever-jobs) — open postings from any company on Lever via the public Postings API
- [Workday Jobs Scraper](https://apify.com/ucchiii/workday-jobs) — open jobs from Workday career sites (myworkdayjobs.com) in the same fields as Career Site Jobs
- [Job Postings Normalizer](https://apify.com/ucchiii/job-postings-normalizer) — unify fields, salaries and dates from any job scraper and remove duplicates
- [Job Market Report](https://apify.com/ucchiii/job-market-report) — salary percentiles, top skills, remote share and role/country segments from normalized job data

# Actor input Schema

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

Keep jobs whose title, company or description contains any of these words, e.g. \['python', 'react'] (case-insensitive). Each keyword is also sent to Himalayas as a search query. Up to 20 keyword/country combinations. Empty = all jobs.

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

Keep jobs whose category or parent category contains any of these, e.g. 'Developer', 'Sales', 'Marketing' (case-insensitive). Applied after fetching, so very narrow categories scan more listings. Empty = all.

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

Himalayas seniority levels: Entry-level, Mid-level, Senior, Manager, Director, Executive. Empty = all.

## `employmentType` (type: `array`):

Himalayas employment types: Full Time, Part Time, Contractor, Temporary, Intern, Volunteer, Other. Empty = all.

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

Candidate must be allowed to work from this country: ISO code, name or slug (US, Germany, united-kingdom). One search per country (max 20 keyword/country combinations). Empty = all.

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

Keep only jobs open to candidates anywhere in the world.

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

Keep jobs that accept candidates in this UTC offset, e.g. -5, UTC+1 or UTC+05:30. Empty = no timezone filter.

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

Order of results when keyword, seniority, employment type, country or timezone filters are used. Without those filters Himalayas returns its default feed order.

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

Maximum number of jobs to return (1 to 2000). You are charged per job returned.

## Actor input object example

```json
{
  "keywords": [
    "python"
  ],
  "worldwideOnly": false,
  "maxJobs": 20
}
```

# Actor output Schema

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

One item per job: title, company, Himalayas job URL, location restrictions, timezones, seniority, employment type, salary fields when present, postedAt, expiresAt, categories and description text.

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

Record SUMMARY: jobs returned, listings scanned, requests made and warnings.

# 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"
    ],
    "maxJobs": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("ucchiii/himalayas-jobs-api").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"],
    "maxJobs": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("ucchiii/himalayas-jobs-api").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"
  ],
  "maxJobs": 20
}' |
apify call ucchiii/himalayas-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ucchiii/himalayas-jobs-api"
        }
    }
}
```

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/0e3oyvbpBCh2axCKi/builds/kGMHAyWDOhec9spLU/openapi.json
