Remote Job Listings Scraper
Pricing
from $1.05 / 1,000 results
Remote Job Listings Scraper
Scrape public remote job feeds from Remotive, Himalayas, Arbeitnow and Jobicy. Get normalized job titles, companies, apply links, posting dates, locations, salary details, tags and descriptions. Choose sources, filter results and set a total item limit; jobs are selected round-robin across sources.
Pricing
from $1.05 / 1,000 results
Rating
0.0
(0)
Developer
Axiom Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Returns: one row per remote job with id, source, title, company, applyUrl, postedAt and location.
Input: {"sources": ["remotive", "himalayas", "jobicy", "arbeitnow"], "maxItems": 40}
Best for: remote job boards and newsletters, salary and hiring-trend research, lead lists of companies that hire remotely.
{"id": "himalayas:companies/baker-tilly/jobs/sr-manager-technology-enablement-consulting-managed-services","source": "himalayas","title": "Sr Manager, Technology Enablement (Consulting & Managed Services)","company": "Baker Tilly","applyUrl": "https://himalayas.app/companies/baker-tilly/jobs/sr-manager-technology-enablement-consulting-managed-services","postedAt": "2026-10-14T08:16:45.000Z","location": "United States"}
What does Remote Jobs Scraper do?
Remote Jobs Scraper is a remote jobs API in one Actor. It reads four open remote job boards (Remotive, Himalayas, Arbeitnow and Jobicy) and returns every listing in the same format.
All four sources are public JSON feeds that load without logging in. The Actor reads them politely, with about one request per second per host, so a normal run is a handful of requests and finishes in well under a minute. Requests to independent boards run concurrently, while pages from each board remain sequential. Results retain the selected sources’ round-robin order; a source contributes when it has matching jobs and the item limit leaves room. With maxItems: 1, only the first selected source is requested unless it returns no usable jobs.
What data can you get from the remote job boards?
Every record has the same fields, whichever board it came from. Fields a board does not publish are returned as null. The id is prefixed with the source name, so ids never collide across boards.
| Field | Description | Example |
|---|---|---|
id | Source-prefixed job ID, unique within a run | remotive:2091132 |
source | Board the job came from: remotive, himalayas, arbeitnow, jobicy or remoteok | remotive |
title | Job title | Senior back-end Engineer |
company | Hiring company | Lemon.io |
applyUrl | Original job link on the source board, unmodified | https://remotive.com/remote-jobs/... |
postedAt | Publication date, ISO 8601 in UTC | 2026-09-30T13:15:26.000Z |
category | Category or industry of the job | Software Development |
jobType | Employment type in lower snake case | full_time |
location | Location or region the candidate must be in, Worldwide when unrestricted | USA |
locationRestrictions | List of countries or regions | ["USA", "Canada"] |
salaryMin | Lower end of the salary range | 107000 |
salaryMax | Upper end of the salary range | 219000 |
salaryCurrency | Currency code | USD |
salaryPeriod | yearly, monthly, weekly or hourly | yearly |
salaryText | Raw salary text, where the board only gives free text | 80,000 - 120,000 USD |
seniority | Seniority level when the board lists one | Senior |
tags | Skill tags or categories | ["python", "aws"] |
companyLogo | Company logo URL | https://remotive.com/job/2091132/logo |
description | Job description as plain text | Senior Developer? Work Remote. |
descriptionHtml | Job description as the original HTML | <p>Senior Developer?</p> |
sourceUrl | Job page on the source board | https://remotive.com/remote-jobs/... |
Salary data is sparse on these boards. Himalayas and Jobicy publish structured salary ranges for some listings, Remotive publishes free text that the Actor parses when it can, and Arbeitnow publishes none. Expect salary fields on a minority of rows, and use the other fields for filtering.
How to use Remote Jobs Scraper
- Open the Actor in Apify Console and go to the Input tab.
- Pick the sources you want, or leave all four selected.
- Optionally add a search keyword, a category or a location restriction.
- Set the maximum number of results.
- Click Start. When the run finishes, open the Output tab and export the dataset as JSON, CSV, Excel, XML or HTML.
Tips:
maxItems is the total across all sources. Results are taken round-robin, so selected boards contribute when they have matching jobs and the limit leaves room. Filters are applied to the normalised fields, so the same keyword works on every source.
includeDescription: falsereturns nulldescriptionanddescriptionHtmlwhile keeping titles, companies and links.- Schedule the Actor hourly or daily and compare the
idvalues between runs to find new listings.
Input
Three optional filters help narrow an export before any matching row is saved. salaryOnly: true retains jobs with a published numeric salary bound or nonempty raw salary text. It does not infer compensation, convert currencies or guarantee that the published range applies to every location. postedWithinDays accepts 0 to disable the age filter, or 1–3650 to keep only postings within that many days. Enabled age filtering excludes missing and future dates. A posting date is a feed value, not proof that the vacancy is still open.
excludeKeywords accepts an array of phrases. A match in the title, company, category, tags or full available description excludes the job, ignoring case. For example, ["unpaid", "commission only"] removes listings containing either phrase. Exclusions inspect all available description text even with includeDescription: false. These filters combine with the existing search, category and location filters using AND. Defaults preserve the existing unfiltered behavior. Filtering takes place before saving and charging a result; rejected jobs do not consume the shared item limit. Narrow filters can exhaust a source or reach its scan limit before filling maxItems.
jobTypes selects one or more normalized employment types: full_time, part_time, contract, freelance, internship or working_student. An empty array keeps every type. A selected list excludes jobs whose type is missing, including RemoteOK rows, rather than guessing from their description. Matching uses the existing jobType field exactly; a listing need match only one selected type. For example, {"sources":["himalayas","jobicy"],"jobTypes":["full_time"],"maxItems":7} collects full-time matches from those boards.
companyKeywords keeps company names containing any supplied phrase, ignoring case. It examines only company, so another employer mentioned in a description cannot qualify a job. Empty arrays disable both new filters. Active filters combine using AND, apply before saving and charging, and can return fewer rows than requested. They do not infer missing employment details or contact company websites.
A salary-focused input is {"sources":["himalayas","jobicy"],"salaryOnly":true,"postedWithinDays":30,"excludeKeywords":["unpaid"],"maxItems":20}. These filters use source data without third-party enrichment.
| Field | Type | Required | Description |
|---|---|---|---|
sources | array of strings | No | Boards to read: remotive, himalayas, arbeitnow, jobicy, remoteok. Default: the first four. Add remoteok to include RemoteOK. |
searchQuery | string | No | Optional keywords, e.g. python developer. Source search rules apply on Remotive, Himalayas and Jobicy; Arbeitnow and RemoteOK require every word in title, company, tags, category or description text. |
category | string | No | Keep jobs whose category, title or tags contain this text, case-insensitive; hyphens and underscores match spaces. |
locationFilter | string | No | Keep jobs whose location or restrictions contain this text, for example USA, Europe or Worldwide. |
includeDescription | boolean | No | Include description and descriptionHtml. Default true. |
jobTypes | array of enum strings | No | Keep any selected normalized employment type; default [] accepts all. Missing types are excluded when active. |
companyKeywords | array of strings | No | Keep any matching company name phrase, ignoring case; default []. |
salaryOnly | boolean | No | Require source salary data, e.g. true; default false. |
postedWithinDays | integer | No | Maximum posting age, e.g. 7 for the past week; 0–3650, default 0 disables filtering. |
excludeKeywords | array of strings | No | Exclude any phrase in available job text, e.g. ["unpaid"]; default []. |
maxItems | integer | No | Total number of jobs, 1-10000, default 50. |
dedupe | boolean | No | Collapse jobs with the same company, title and apply-link host. Default true. |
proxyConfiguration | object | No | Proxy settings. Default: no proxy, because the sources are open JSON APIs. |
{"sources": ["himalayas", "jobicy"],"searchQuery": "engineer","category": "","locationFilter": "USA","includeDescription": true,"maxItems": 30,"dedupe": true,"proxyConfiguration": { "useApifyProxy": false }}
How filtering works: Remotive uses server-side search, Himalayas uses its search API, and Jobicy uses tag search. Those sources keep their own keyword matching rules. Arbeitnow and RemoteOK use client-side matching: every search word must occur in the title, company, tags, category or first 3000 description characters. Category and location filters apply to every source and combine with keyword search using AND. Category checks category, title and tags; location checks location restriction text. Europe does not automatically match every European country, and USA does not match every spelling of United States. Turning off descriptions changes output only, not matching. Narrow filters mean the Actor reads more pages before it finds enough matches, and it stops after a bounded number of pages, so a very narrow filter can return fewer jobs than maxItems.
Output
Each job is one dataset row. Here are real rows from a run (descriptions shortened here, full text in the dataset):
[{"id": "remotive:2091132","source": "remotive","title": "Senior back-end Engineer","company": "Lemon.io","applyUrl": "https://remotive.com/remote-jobs/software-development/senior-back-end-engineer-2091132","postedAt": "2026-09-30T13:15:26.000Z","category": "Software Development","jobType": "full_time","location": "Europe, USA, UK, Canada, Australia, Ireland, Switzerland, Singapore, Mexico, Iceland, Norway","salaryMin": null,"salaryMax": null,"companyLogo": "https://remotive.com/job/2091132/logo"},{"id": "himalayas:companies/capslock/jobs/senior-performance-copywriter-1931759832","source": "himalayas","title": "Senior Performance Copywriter","company": "CapsLock","applyUrl": "https://himalayas.app/companies/capslock/jobs/senior-performance-copywriter-1931759832","postedAt": "2026-10-03T16:41:12.000Z","jobType": "full_time","location": "Belgium","seniority": "Senior"}]
You can download the dataset as JSON, CSV, Excel, XML, RSS or HTML, or read it through the Apify API.
How much does it cost to scrape remote jobs?
Remote Jobs Scraper is charged per result. You pay only for the jobs returned, and maxItems caps how many that can be, so a run never costs more than you plan for. See the Pricing tab of the Actor for the current price. Because the sources are free public APIs, there is no proxy cost by default.
Use with AI agents (MCP)
Connect Remote Jobs Scraper to Claude, Cursor or any MCP client through the Apify MCP server:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?tools=axiomworks/remote-jobs-scraper"}}}
Example prompts:
- "Find 30 remote software engineering jobs from Himalayas and Jobicy and list company, title and apply link."
- "Which remote jobs posted today mention Python and accept candidates from Europe?"
- "Get 50 remote marketing jobs with a listed salary range and summarise the typical pay."
Use only the documented input fields. For recent postings, set postedWithinDays: 1 for the past day or 7 for the past week; this is a rolling age window, not a calendar-day filter. For published compensation, set salaryOnly: true, then inspect salary units and currencies before comparing jobs. Use excludeKeywords: ["unpaid"] to remove matching phrases. maxItems is one shared budget across sources. A zero-row run is successful, not proof that no remote jobs exist: clear searchQuery, category, locationFilter , excludeKeywords, jobTypes and companyKeywords, set salaryOnly: false and postedWithinDays: 0, then try {"sources":["himalayas","jobicy"],"maxItems":7}. Source failures appear in the log; retry later or choose another source. A blocked source can use the optional proxy settings on Apify. The default prefill requests 40 jobs from four sources without filters.
Integrations and API
Run Remote Jobs Scraper from your own code with the Apify API. Set APIFY_TOKEN to your Apify API token and send it in the Authorization header, never in the URL.
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("axiomworks/remote-jobs-scraper").call(run_input={"sources": ["himalayas", "jobicy"], "searchQuery": "engineer", "maxItems": 30})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["company"], item["applyUrl"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('axiomworks/remote-jobs-scraper').call({sources: ['himalayas', 'jobicy'],searchQuery: 'engineer',maxItems: 30,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
cURL
curl -X POST "https://api.apify.com/v2/acts/axiomworks~remote-jobs-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"sources": ["himalayas", "jobicy"], "searchQuery": "engineer", "maxItems": 30}'
You can also connect the dataset to Make, Zapier, n8n, Google Sheets or a webhook from the Integrations tab, and schedule runs to keep a job board or spreadsheet fresh.
FAQ
Which sites does it cover?
Remotive, Himalayas, Arbeitnow and Jobicy by default, plus RemoteOK when you add remoteok to sources. Pick any subset with the sources input. RemoteOK makes one request per run, and its salary range (USD per year) is filled only where the listing publishes one. Please link back to RemoteOK and name it as the source when you republish its jobs.
How fresh is the data? Himalayas, Arbeitnow and Jobicy update continuously, Arbeitnow roughly hourly. Remotive delays its public feed by about 24 hours, and asks API users to fetch only a few times a day, so the Actor makes exactly one Remotive request per run.
Why did I get fewer jobs than maxItems?
Either the filters matched fewer jobs than requested, or a board has fewer matching listings. Remotive's public feed holds only a small set of jobs at a time. Arbeitnow is mostly on-site German jobs, and only listings flagged remote are kept. Add sources or loosen filters to get more. A source error is logged and other sources continue. If every source fails or no jobs match, the run succeeds with zero rows and a status message explaining what to try.
Why are salary fields empty? Most listings on these boards do not publish a salary. The fields are filled only when the source provides a range, or when Remotive's free-text salary can be parsed.
Are duplicates removed?
By default, yes. Jobs with the same company, title and apply-link host collapse into one. Set dedupe to false to keep everything.
Do I need a proxy? No. The four sources are open JSON APIs and the Actor runs without a proxy by default. If requests are blocked, the Actor retries with backoff, and you can enable Apify Proxy in the input.
Can I get the original posting?
Yes. applyUrl is the unmodified link on the source board, and the source field names the board. Please keep the attribution and link back when you republish listings.
Is it legal to scrape remote job boards?
The Actor reads only public job listing data from open APIs that need no login and no CAPTCHA solving. Job listings describe positions, not private individuals, but you remain responsible for how you use the data, including compliance with privacy rules such as GDPR and with each board's terms. Several boards ask for attribution and a link back to the original listing; Remotive, for example, asks that you link to its job URL, mention it as the source, and not republish its jobs on other job aggregators. Keep source and applyUrl intact when you display or share results. This is not legal advice, and this Actor is not affiliated with or endorsed by Remotive, Himalayas, Arbeitnow or Jobicy.
Feedback
Found a bug or need a field that isn't here? Open an issue on the Issues tab and we'll look at it.