Use Himalayas Remote Job Finder with Salary & Tech Stack with Python
Search Himalayas remote job listings by keyword or company and get salary range, employment type, tech stack and job page link for each role.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"categories": [],
"country": "",
"employmentType": "",
"excludeWorldwide": false,
"includeCompanyTechStack": false,
"includeSkills": false,
"jobUrls": [],
"maxItems": 3,
"mode": "searchJobs",
"salaryCurrency": "",
"searchQuery": "software engineer",
"seniority": [],
"sortBy": "recent",
"worldwide": false
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to scrape. `searchJobs` runs a keyword search with filters. `browseAll` walks the newest-updated feed. `byCompany` returns a company's open roles. `byJobUrls` checks specific job URLs. |
searchQuery | string | optional | Free-text keyword search (mode=searchJobs). Leave blank to page through the newest searchable listings. Himalayas caps keyword searches at 5,000 results. |
companySlug | string | optional | Canonical company slug or Himalayas company URL, e.g. `stripe` or `https://himalayas.app/companies/stripe`. Comma-separate several slugs, e.g. `stripe,vercel`. |
jobUrls | array | optional | Himalayas job page URLs, e.g. `https://himalayas.app/companies/stripe/jobs/senior-engineer`. Closed or invalid URLs are skipped. |
country | string | optional | Only jobs open to this country. Leave blank for any country. Worldwide jobs are included unless Exclude worldwide is on. |
worldwide | boolean | optional | Only jobs with no country restrictions. Overrides the country filter. |
excludeWorldwide | boolean | optional | When a country is set, exclude jobs that are open worldwide. Requires country. |
seniority | array | optional | Keep jobs at any of these seniority levels. Leave empty for all levels. |
employmentType | string | optional | Keep jobs of this employment type. Leave blank for all types. |
timezone | string | optional | Keep jobs that accept this UTC offset, e.g. `-5`, `UTC-5` or `UTC+05:30`. Leave blank for any timezone. |
categories | array | optional | Keep jobs whose categories, parent categories or tech tags contain any of these terms (case-insensitive), e.g. `python`, `react`, `developer`. |
minSalary | integer | optional | Annualised salary floor. Hourly, weekly and monthly pay is converted to a yearly figure before comparison. Use salaryCurrency to compare in a specific currency. |
maxSalary | integer | optional | Annualised salary ceiling. Jobs whose annualised range starts above this value are excluded. |
salaryCurrency | string | optional | Only compare and keep jobs paid in this currency. Leave blank to compare each listing in its own currency (no conversion is applied). |
sortBy | string | optional | Search result order. Browse mode always uses newest-updated order. |
includeSkills | boolean | optional | Fetch each job's required skills from Himalayas job details. Adds one lookup per job; the public anonymous limit is 30 lookups per minute and 200 per day, so large runs keep base records and stop enrichment at the limit. |
includeCompanyTechStack | boolean | optional | Fetch the employer's company-level tech stack once per company. Many companies do not publish one, so this field is often absent. Shares the same anonymous lookup limit. |
maxItems | integer | optional | Hard cap on the number of job records emitted (1–5000). |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/Hd9yFj2ejcfGhmuYa/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
Remote job listings from Himalayas with salary range and pay period, annualised pay, seniority, employment type, location and timezone restrictions, tech tags and optional job skills or company tech stack.
Questions before you run
Which inputs are required?
The published required fields are mode
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build cNQtmjcIwQjWeE4SR and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.