Remote Job Listings Scraper avatar

Remote Job Listings Scraper

Pricing

from $1.05 / 1,000 results

Go to Apify Store
Remote Job Listings Scraper

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

Axiom Works

Maintained by Community

Actor 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.

FieldDescriptionExample
idSource-prefixed job ID, unique within a runremotive:2091132
sourceBoard the job came from: remotive, himalayas, arbeitnow, jobicy or remoteokremotive
titleJob titleSenior back-end Engineer
companyHiring companyLemon.io
applyUrlOriginal job link on the source board, unmodifiedhttps://remotive.com/remote-jobs/...
postedAtPublication date, ISO 8601 in UTC2026-09-30T13:15:26.000Z
categoryCategory or industry of the jobSoftware Development
jobTypeEmployment type in lower snake casefull_time
locationLocation or region the candidate must be in, Worldwide when unrestrictedUSA
locationRestrictionsList of countries or regions["USA", "Canada"]
salaryMinLower end of the salary range107000
salaryMaxUpper end of the salary range219000
salaryCurrencyCurrency codeUSD
salaryPeriodyearly, monthly, weekly or hourlyyearly
salaryTextRaw salary text, where the board only gives free text80,000 - 120,000 USD
senioritySeniority level when the board lists oneSenior
tagsSkill tags or categories["python", "aws"]
companyLogoCompany logo URLhttps://remotive.com/job/2091132/logo
descriptionJob description as plain textSenior Developer? Work Remote.
descriptionHtmlJob description as the original HTML<p>Senior Developer?</p>
sourceUrlJob page on the source boardhttps://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

  1. Open the Actor in Apify Console and go to the Input tab.
  2. Pick the sources you want, or leave all four selected.
  3. Optionally add a search keyword, a category or a location restriction.
  4. Set the maximum number of results.
  5. 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: false returns null description and descriptionHtml while keeping titles, companies and links.
  • Schedule the Actor hourly or daily and compare the id values 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.

FieldTypeRequiredDescription
sourcesarray of stringsNoBoards to read: remotive, himalayas, arbeitnow, jobicy, remoteok. Default: the first four. Add remoteok to include RemoteOK.
searchQuerystringNoOptional 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.
categorystringNoKeep jobs whose category, title or tags contain this text, case-insensitive; hyphens and underscores match spaces.
locationFilterstringNoKeep jobs whose location or restrictions contain this text, for example USA, Europe or Worldwide.
includeDescriptionbooleanNoInclude description and descriptionHtml. Default true.
jobTypesarray of enum stringsNoKeep any selected normalized employment type; default [] accepts all. Missing types are excluded when active.
companyKeywordsarray of stringsNoKeep any matching company name phrase, ignoring case; default [].
salaryOnlybooleanNoRequire source salary data, e.g. true; default false.
postedWithinDaysintegerNoMaximum posting age, e.g. 7 for the past week; 0–3650, default 0 disables filtering.
excludeKeywordsarray of stringsNoExclude any phrase in available job text, e.g. ["unpaid"]; default [].
maxItemsintegerNoTotal number of jobs, 1-10000, default 50.
dedupebooleanNoCollapse jobs with the same company, title and apply-link host. Default true.
proxyConfigurationobjectNoProxy 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:

  1. "Find 30 remote software engineering jobs from Himalayas and Jobicy and list company, title and apply link."
  2. "Which remote jobs posted today mention Python and accept candidates from Europe?"
  3. "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 ApifyClient
client = 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.

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.