Remote Jobs Aggregator
Pricing
from $2.99 / 1,000 results
Remote Jobs Aggregator
Remote Jobs Aggregator is a Python tool designed to scrape and collect job listings across multiple remote job boards and company ATS portals. It extracts titles, companies, locations, salary ranges, and apply links into clean CSV or JSON formats.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
real-estate-api
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Remote Jobs Scraper: Remote OK, Himalayas, Remotive and We Work Remotely in One Dataset (Free)
Overview
Collect remote job listings from Remote OK, Himalayas, Remotive, and We Work Remotely in one unified dataset. Each record includes the job title, company, salary information, location and timezone restrictions, tags, application link, and original listing source.
Filter listings by keywords, Remotive category, or Himalayas country. No account or login is required.
Because each job board uses a different data structure, this scraper standardizes records, removes duplicates, and preserves source attribution. Remote OK, Himalayas, and Remotive require attribution when their listings are republished.
Use Cases
- Remote job boards and newsletters: Collect remote vacancies and retain links to their original listings.
- Recruiter sourcing: Discover companies hiring remotely across multiple job boards.
- B2B lead generation: Identify companies with open roles, along with job titles and application links.
- Salary research: Compare available salary figures and salary descriptions across job boards.
- Job-market analytics: Analyze job tags, categories, location restrictions, and hiring trends.
Filtering Options
Keyword filtering works differently across the four sources:
- Remote OK: Keywords are matched against job tags.
- Himalayas: Keywords are used for job searches, particularly when a country is specified or a keyword is provided.
- Remotive: Keywords are used to search listings. Because category filtering can be broad, keyword matches are checked again during processing.
- We Work Remotely: Listings are collected from selected category feeds and filtered locally by keyword.
Remotive category names use slugs such as software-dev. Enter the desired category slug directly.
When keywords are empty, the scraper collects Remote OK's latest listings, browses Himalayas listings, selects a Remotive feed, and retrieves listings from the chosen We Work Remotely categories.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
sources | array | All four sources | Job boards to collect from, in priority order. The first source takes precedence when duplicate listings are found. |
keywords | array | Empty | Keywords used for source-specific searches and local filtering. |
remotiveCategory | string | Empty | Remotive category slug, such as software-dev. |
wwrCategories | array | remote-programming-jobs | We Work Remotely categories to collect. Each selected category is processed separately. |
country | string | Empty | Country filter for Himalayas, using an ISO-2 code or country name, such as US. |
postedWithinDays | integer | 30 | Exclude jobs older than the specified number of days. Listings without a posting date are retained. Range: 1–90. |
onlyWithSalary | boolean | false | Keep listings containing numeric salary information or Remotive salary text. |
includeDescription | boolean | true | Include the job description. |
descriptionFormat | string | text | Description format: text, markdown, or html. |
outputFormat | string | normalized | Use normalized for standardized records or raw to include the original source record in rawJob. |
dedupeAcrossSources | boolean | true | Merge matching company and job-title records. Other source listings are stored in alsoListedOn. |
maxItems | integer | 200 | Maximum total job records. Hard limit: 2,000 per run. |
maxItemsPerSource | integer | 100 | Maximum records per job board. Hard limit: 1,000 per source. |
timeoutSecs | integer | 300 | Maximum duration of the run, in seconds. |
requestTimeoutSecs | integer | 30 | Timeout for an individual request, in seconds. |
Example Input
{"sources": ["remoteok","himalayas","remotive","weworkremotely"],"keywords": ["python"],"remotiveCategory": "software-dev","wwrCategories": ["remote-programming-jobs"],"country": "US","postedWithinDays": 30,"onlyWithSalary": false,"includeDescription": true,"descriptionFormat": "text","outputFormat": "normalized","dedupeAcrossSources": true,"maxItems": 200,"maxItemsPerSource": 100,"timeoutSecs": 300,"requestTimeoutSecs": 30}
Extracted Data
Each job record includes sourceName and sourceUrl for attribution. The job title is stored in jobTitle, and the description is stored in jobDescription to maintain compatibility with the dataset schema.
The dedupeKey combines a normalized company identifier and job-title identifier. When duplicates appear across sources, the first source in the configured priority order is retained. Additional listings are recorded in alsoListedOn.
Example Output
{"id": "himalayas:JOB_LISTING_ID","sourceName": "Himalayas","sourceUrl": "SOURCE_LISTING_URL","applyUrl": "APPLICATION_URL","jobTitle": "Sales Recruiter","company": "Toptal","companySlug": "toptal","employmentType": "Full Time","seniority": ["Mid-level"],"locationRestrictions": ["Canada"],"timezoneRestrictions": [-8, -7, -6, -5, -4, -3.5],"salaryMin": null,"salaryMax": null,"salaryPeriod": "annual","postedAt": "2026-10-11T18:46:27Z","alsoListedOn": []}
Field Reference
| Field | Type | Description |
|---|---|---|
id | string | Source identifier combined with the listing identifier. |
sourceName | string | Source board: Remote OK, Himalayas, Remotive, or We Work Remotely. |
sourceUrl | string | Original listing URL on the source board. |
applyUrl | string | Application link, when available. |
jobTitle | string | Job title. |
company | string | Hiring company. For We Work Remotely, the company may be extracted by splitting the listing title at the first : . |
companyLogo | string | Company logo URL, when available. |
companySlug | string | Company identifier used by Himalayas. |
category | string | Job category or parent category. |
tags | array | Job tags from Remote OK or Remotive. |
employmentType | string | Employment type, normalized where possible. For example, full_time becomes Full Time. |
seniority | array | Seniority labels from Himalayas. |
locationRestrictions | array | Eligible locations or geographic restrictions supplied by the source. |
timezoneRestrictions | array | Timezone offsets supplied by Himalayas. |
salaryMin | number | Minimum salary, when available. |
salaryMax | number | Maximum salary, when available. |
salaryCurrency | string | Salary currency, when available. USD may be assigned to numeric Remote OK salary values. |
salaryPeriod | string | Salary period, such as annual, when available. |
salaryText | string | Free-text salary description from Remotive. |
postedAt | string | Listing publication timestamp in UTC, when available. |
expiresAt | string | Listing expiration timestamp in UTC, when available. |
jobDescription | string | Job description in the selected format. |
dedupeKey | string | Normalized company and job-title key used for deduplication. |
alsoListedOn | array | Other sources containing the same company and job title. |
scrapedAt | string | Timestamp indicating when the record was collected. |
rawJob | object | Original source record, included only when outputFormat is raw. |
Missing salary values are preserved as empty or null values where appropriate. Remote OK salary values of 0 are treated as unavailable.
Dataset Views
The dataset contains two views:
- Jobs: Normalized job listings and their available details.
- Errors: Source-specific collection failures.
Error records can contain source, input, error, and statusCode. A failure on one source does not automatically cancel collection from the other sources.
Collection and Rate Limits
Sources are processed sequentially to reduce unnecessary requests and respect their usage restrictions.
-
Remote OK: Processes one request per keyword, or one unfiltered request when no keywords are supplied. The initial JSON element containing the legal notice is skipped. Calls are spaced at least two seconds apart. The feed provides recent listings without pagination.
-
Himalayas: Uses browsing or search pagination depending on the selected filters. Each page contains up to 20 jobs. Requests are spaced at least one second apart. After an HTTP 429 response, the scraper waits 60 seconds and retries once before recording an error and continuing.
-
Remotive: Processes one request per keyword, without additional pages. Requests are spaced at least 30 seconds apart. Remotive recommends no more than four runs per day and restricts excessive request frequency. Listings may be delayed by approximately 24 hours.
-
We Work Remotely: Processes each selected category feed separately, with at least one second between requests. The feed's stated time-to-live is 60 minutes.
The timeoutSecs setting limits the total run duration. Records collected before a timeout are retained. The overall maxItems limit is applied after deduplication.
Attribution and Source Restrictions
When republishing collected listings, retain sourceName and sourceUrl so readers can identify the original source.
| Source | Attribution and restrictions |
|---|---|
| Remote OK | Provide a dofollow link to the original listing and identify Remote OK by name. Do not use its logo. |
| Himalayas | Link to the original listing and identify Himalayas by name. Do not resubmit listings to Jooble, Neuvoo, Google Jobs, or LinkedIn Jobs. |
| Remotive | Link to the original listing and identify Remotive by name. Do not resubmit listings to Google Jobs, LinkedIn Jobs, Jooble, or Neuvoo. Respect its collection frequency restrictions. Using its listings to collect email addresses or sign-ups violates its stated terms. |
| We Work Remotely | Use the original listing link and respect the source's published feed guidance. The source's feed indicates a 60-minute time-to-live. |
The companyLogo field, when present, refers to the hiring company's logo rather than the logo of a job board.
Free Usage Limits
- Maximum of 2,000 job records per run.
- Default overall limit of 200 records.
- Maximum of 1,000 records per source.
- Himalayas returns up to 20 jobs per page.
- Results depend on the available listings, selected filters, source restrictions, and configured limits.
FAQ
How often can I run the Remotive source?
Remotive recommends no more than four runs per day and restricts excessive request frequency. This scraper spaces requests by at least 30 seconds and makes one request per keyword. Keep scheduled runs within the source's recommended daily limit.
Why is the job title stored as jobTitle?
The dataset reserves title and description for system-level use. Therefore, job titles are stored in jobTitle, and job descriptions are stored in jobDescription.
Does every listing include salary information?
No. Salary details vary by source. Remote OK may provide 0 when a numeric salary is unavailable, Himalayas may provide null values, and Remotive may provide a text description instead of numeric values. Enable onlyWithSalary to exclude listings without recognized salary information.
Can Himalayas return more than 20 jobs on one page?
No. The scraper processes pages of up to 20 jobs and continues using pagination until the configured limit is reached or no more results are available.
Can I resubmit these listings to Google Jobs or LinkedIn Jobs?
Himalayas and Remotive restrict the redistribution of their listings to certain job aggregators. Follow each source's terms, including the restrictions on resubmitting listings to Google Jobs, LinkedIn Jobs, Jooble, and Neuvoo.
Can I export the results?
Yes. The collected records are stored in the dataset for download and further analysis. The standardized output can be used for reporting, job-market research, and recruiting workflows.
Trademark Notice
Remote OK, Himalayas, Remotive, We Work Remotely, and their respective names, logos, and trademarks belong to their owners. Their use in this documentation is solely to identify the sources of the collected information and does not imply affiliation, sponsorship, endorsement, or partnership.
Disclaimer
This is an independent data collection tool. It is not affiliated with, endorsed by, sponsored by, or officially associated with Remote OK, Himalayas, Remotive, or We Work Remotely.
Is Web Scraping Legal?
Collecting information that is already public is generally legal. Scraping is not the same thing as hacking, and there is no single law that bans it. The limits are the usual ones: do not break into accounts, do not take private or confidential data, and be careful with personal data and copyrighted works. A site's terms can also restrict how you access it. Facts such as a public name, price, or rating are not the same thing as republishing someone's article or photo.
This actor collects information from public pages. It does not log in and it does not bypass access controls.
For a longer explanation, see Apify's article Is web scraping legal?.