Remote Jobs API: Himalayas, Jobicy, RemoteOK & Arbeitnow avatar

Remote Jobs API: Himalayas, Jobicy, RemoteOK & Arbeitnow

Pricing

Pay per usage

Go to Apify Store
Remote Jobs API: Himalayas, Jobicy, RemoteOK & Arbeitnow

Remote Jobs API: Himalayas, Jobicy, RemoteOK & Arbeitnow

One feed of remote jobs from Himalayas, Jobicy, RemoteOK and Arbeitnow: filters, merged duplicates, a source link and attribution line on every row, and a new-only mode for schedules. No login, no proxy. Free during launch; from 1 November 2026: $1.50 per 1,000 jobs.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Tinlark

Tinlark

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Share

Remote Jobs API: Himalayas, Jobicy, RemoteOK and Arbeitnow in one feed

Get remote job listings from Himalayas, Jobicy, RemoteOK and Arbeitnow as one uniform record per job. Filter by keyword, category, country, time zone, job type, salary and age. The same job listed on several boards is merged into one row. Every row carries the board's own listing URL and a ready-made attribution line, which the boards ask any re-publisher to show. Turn on new-only mode and a daily schedule returns only listings you have not received before.

The Actor uses the boards' public JSON APIs. It needs no login, no browser and no proxy.

Use cases

  • A remote job board or newsletter. Fill it with listings that carry the source link and attribution each board requires.
  • Job alerts. Schedule a run with newOnly and a State name, and send yourself or your users the listings that appeared since the last run.
  • Market data. Count remote roles by category, country, seniority or published salary range.
  • AI agents and automations. The input and output schemas are defined, so an agent can call the Actor and read the fields without guessing.
  • Candidate search. Keywords plus time zone, country and minimum salary narrow over 100,000 listings to the few that fit.

What you get

One row per job, the same fields for every board: title, company, categories (a common list) and the board's own tags, job type, where candidates must be (countries or regions and UTC offsets), salary (min, max, currency, period, only where the board publishes it), seniority (only where the board states it), posted and expiry date, description as plain text or HTML, listingUrl, applyUrl and attribution.

Input

Everything is optional. With an empty input you get the 100 newest listings across the four boards.

FieldWhat it does
sourceshimalayas, jobicy, remoteok, arbeitnow. Default: all four.
keywords, excludeKeywordsMatched, not case sensitive, against title, company, categories, tags and description. Up to 20 each.
categoriesCommon categories: software-engineering, devops-infrastructure, data-ai, design, product, marketing, sales, customer-support, finance, hr-recruiting, legal, operations-admin, writing-content, security, education, healthcare, other.
countriesTwo-letter ISO codes (US, DE, GB). Matches the country, or a region that contains it (EMEA, Europe, LATAM), in the board's own location text.
includeWorldwideWith a country filter, also keep listings open to candidates anywhere. Default on.
jobTypesfull-time, part-time, contract, internship.
timezonesUTC offsets such as -5, UTC+1, UTC+05:30.
minSalaryUsdYearly USD. Hourly, daily, weekly and monthly pay is converted to a year.
postedWithinDaysKeep listings published in the last N days.
includeDescriptiontext (default), html or none.
dedupeMerge the same company and title across boards (default on).
newOnly, stateNameReturn only listings not delivered before in runs with the same State name.
maxItemsDefault 100, at most 10,000.

Example: the prefilled run

{
"sources": ["himalayas", "jobicy", "remoteok", "arbeitnow"],
"keywords": ["python"],
"maxItems": 50
}

Example: a daily feed of new senior engineering jobs in Europe

{
"keywords": ["senior", "lead"],
"categories": ["software-engineering"],
"countries": ["DE", "NL", "GB"],
"postedWithinDays": 7,
"newOnly": true,
"stateName": "eu-senior-eng",
"maxItems": 500
}

The first run returns everything that matches. Every later run with the same State name returns only listings that were not delivered before. Use a different State name for each watch list.

If maxItems cuts the list, the boards take turns (newest first within each board), so one busy board does not crowd out the others.

Output

Results go to the default dataset: download them as JSON, CSV, Excel or XML, or read them through the API. The Jobs, With salary and Problems views show the main fields. A run summary (rows per board, requests, errors, duration) is stored under the SUMMARY key.

Job row (real output, description shortened)

{
"recordType": "job",
"source": "himalayas",
"sourceName": "Himalayas",
"jobId": "https://himalayas.app/companies/instacart/jobs/software-engineer-ii-crm-seo",
"title": "Software Engineer II, CRM & SEO",
"company": "Instacart",
"companyUrl": "https://himalayas.app/companies/instacart",
"categories": ["software-engineering", "marketing"],
"tags": ["Developer", "Software Engineer", "Full Stack Engineer", "CRM Engineer"],
"jobType": "full-time",
"locationRestriction": ["Canada"],
"timezoneRestriction": ["UTC-8", "UTC-7", "UTC-6", "UTC-5", "UTC-4", "UTC-3:30"],
"isWorldwide": false,
"salaryMin": 145000,
"salaryMax": 153000,
"salaryCurrency": "CAD",
"salaryPeriod": "annual",
"seniority": "Mid-level",
"postedAt": "2026-10-03T08:53:34Z",
"expiresAt": "2026-12-02T08:53:33Z",
"description": "We're transforming the grocery industry ...",
"listingUrl": "https://himalayas.app/companies/instacart/jobs/software-engineer-ii-crm-seo",
"applyUrl": "https://himalayas.app/companies/instacart/jobs/software-engineer-ii-crm-seo",
"attribution": "Source: Himalayas (https://himalayas.app), https://himalayas.app/companies/instacart/jobs/software-engineer-ii-crm-seo",
"status": null,
"firstSeenAt": null
}

With a State name, status is new or seen and firstSeenAt is the first run that delivered the listing. Rows merged from other boards add alsoListedOn. If a board cannot be read, the dataset gets one row with recordType: "error", the board and the reason, and the other boards still run. Error rows are free.

What each board gives

BoardListings you can reachNotes
HimalayasThe whole feed (over 100,000 listings), newest firstThe richest data: salary, countries, time zones, seniority, expiry date. With keywords or a country the board's search is used; the Actor reads up to 5,000 results per search (the number the board reports as its total).
JobicyThe last 7 days, with a delay of 3 hoursThe Actor reads the whole 7-day feed at most once an hour and keeps it as a snapshot in your account (see Limits). applyUrl is Jobicy's own listing page.
RemoteOKAbout the latest 100 listingsThat is what its public API returns. Many listings have no location (read as worldwide) and no job type. Salaries are yearly USD.
ArbeitnowListings flagged remote, from the first 5 pagesA German board; most of its listings are on-site and are skipped. Remote ones often name no country.

Field notes

  • categories maps each board's own labels (and the title when a board has none) to the common list, so a listing can have more than one. The original labels are in tags.
  • salaryMin and salaryMax are filled only when the board publishes pay. Most listings have none. minSalaryUsd compares only salaries stated in USD.
  • locationRestriction is the board's own text (countries, regions such as EMEA, or a city). isWorldwide is true when the board says anywhere or names no restriction.
  • timezoneRestriction is filled only by Himalayas. A listing that lists every offset is read as having no restriction.
  • Duplicates are matched on company and title (case, punctuation and "(m/f/d)" ignored) across boards only. Two listings of the same board are never merged. Matches are exact on company and title, so merges are rare: in a 1,500-row test on 3 October 2026 the boards shared 23 companies but no identical title.

Attribution: what the boards ask of you

The Actor puts listingUrl and attribution on every row for this reason. If you publish or redistribute listings, these are the boards' own rules as read on 3 October 2026. Read the pages themselves, they can change.

BoardWhat it asksWhere
HimalayasLink back to the listing URL and mention Himalayas as the original source. Do not submit Himalayas jobs to third-party sites such as Jooble, Neuvoo, Google Jobs or LinkedIn Jobs.himalayas.app/api
JobicyKeep Jobicy as the original source and keep the Jobicy listing URL. Do not present the listings as your own postings, and do not build spam networks or misleading job databases. Application buttons should lead to the URL in applyUrl.jobicy.com/jobs-rss-feed, "Fair use"
RemoteOKLink back with a followed link (no nofollow) to the listing and mention Remote OK as the source, or API access can be suspended. Do not use the Remote OK logo without written permission. The Actor never outputs it.remoteok.com/api
ArbeitnowLink back to Arbeitnow.com on your platform. Arbeitnow may revoke API permission at any time.arbeitnow.com/terms, section 11

Pricing

Free during launch (until 31 October 2026). You pay only Apify's own platform usage for your runs.

From 1 November 2026: pay per event, $1.50 per 1,000 job rows ($0.0015 each; $2.00 per 1,000 on the Apify free plan, lower on higher Apify plans; the Store page shows the price for your plan). Not charged: error rows, duplicates merged across boards, and listings that new-only mode skips because you already have them.

Platform usage measured on 3 October 2026: a run with 1,000 job rows from Himalayas, RemoteOK and Arbeitnow (256 MB) took 57 seconds and cost $0.006 in Apify platform usage, almost all of it dataset writes. The prefilled run (50 rows from all four boards, 512 MB) took 15 seconds and cost $0.0009. On the Apify free plan that is covered by your monthly credit.

Cost examples at the planned price:

  • 500 jobs for a one-off market snapshot: $0.75.
  • A daily newOnly feed that finds 40 new matching jobs a day: $0.06 a day.
  • 10,000 jobs from Himalayas for a data set: $15.

Set Maximum cost per run in the run options to cap spending once pricing is active; the Actor stops cleanly when the cap is reached.

Limits and honest notes

  • Four boards. Remotive and We Work Remotely are not included: Remotive's API allows 4 requests a day per user, which a shared cloud service cannot honour, and We Work Remotely's terms could not be read.
  • RemoteOK returns about 100 listings. That is the size of its public API answer. Older listings are not reachable through it.
  • Jobicy is a 7-day window with a 3-hour delay, and its terms allow one automated pass per hour. The first run in an hour reads the whole window and saves it as a snapshot in a named storage of your account (remote-jobs-feed-cache). Runs in the next 60 minutes reuse the snapshot, so Jobicy rows can be up to an hour old. If a pass fails, an older snapshot is used and the run summary says so.
  • Himalayas search is read up to 5,000 results per keyword or country (the board reports 5,000 as the total of a search). Keywords and countries each start their own search (at most 20 values each). Search results on the board's side can shift between calls, so a listing missed by one run can show up in the next; with a State name it is delivered once.
  • Arbeitnow: only listings the board flags as remote, from its first 5 pages, read at one request a second.
  • Salary filters need data. Listings without a published salary, or with one in another currency, are dropped when you set minSalaryUsd. Listings from boards that do not state a job type are dropped when you pick a type. Only Himalayas publishes time zones, so a time zone filter drops the other boards.
  • Country matching is text matching on the board's own location wording, with common country names and regions (EMEA, Europe, LATAM, APAC, North America). A listing that names only a city, or no country at all, does not match a country filter unless it is worldwide and includeWorldwide is on.
  • Pace. Himalayas at no more than 2 requests a second with Retry-After honoured, RemoteOK, Jobicy and Arbeitnow at 1 a second. Failed requests (429, 5xx, network errors) are retried with backoff. The Actor reads each board's robots.txt and identifies itself as TinlarkBot with a contact address.
  • State for new-only is kept per State name in a named storage remote-jobs-state-<name> of your account. Entries that were not seen for 90 days are dropped.
  • Listings are the boards' content. The Actor does not log in, read private data, or collect personal data about candidates.

Data source, terms and your responsibility

All data comes from the public APIs the boards publish for others to use, read on 3 October 2026:

  • Himalayas: himalayas.app/jobs/api and /jobs/api/search, "free public JSON API, no authentication required".
  • Jobicy: jobicy.com/api/v2/remote-jobs, the public endpoint without an API key. Its optional paid commercial key is not used.
  • RemoteOK: remoteok.com/api. The first element of the answer is a legal notice, not a job; the Actor drops it and passes its requirements on in the table above.
  • Arbeitnow: arbeitnow.com/api/job-board-api. Its terms bar commercial use of the website's own materials, so only the API is used.

Tinlark is not affiliated with Himalayas, Jobicy, RemoteOK or Arbeitnow, and those boards can change or withdraw API access at any time.

Use it from code or an AI agent

Call the Actor through the Apify API or any Apify client library, or through Apify's MCP server, with the input above, and read the dataset items. Example with the Python client:

from apify_client import ApifyClient
client = ApifyClient("<your Apify token>")
run = client.actor("tinlark/remote-jobs-feed").call(run_input={"keywords": ["python"], "countries": ["US"], "maxItems": 50})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], job["company"], job["listingUrl"])

FAQ

Does it need a proxy or a login? No. The APIs are public and the Actor makes plain HTTP requests.

How fresh is the data? Himalayas, RemoteOK and Arbeitnow are read live on every run (Arbeitnow says it updates hourly). Jobicy is up to an hour old by design.

How big can a run be? Up to 10,000 jobs. A run of 1,000 jobs from three boards took 57 seconds at 256 MB and peaked at 185 MB; the default is 512 MB.

Why did I get fewer rows than maxItems? Usually the filters leave fewer listings than that on the boards, or one board returned an error row. The summary under SUMMARY shows how many listings each board returned and how many matched.

Can I get the job descriptions? Yes, as plain text by default or as the board's HTML with includeDescription: "html". Set it to none for smaller output.

Can I schedule it? Yes. Use an Apify Schedule with newOnly and a fixed State name.

Disclaimers and legality: is it legal to use this data? The Actor reads only the public APIs that the boards publish for reuse, within their stated rate limits, and it keeps each board's source link on every row. Each board attaches conditions, mainly attribution; they are listed above and you are responsible for meeting them when you republish. Listings and company names belong to the employers and the boards. You are also responsible for the laws that apply to you, for example on unsolicited contact. This is not legal advice.

  • ATS Jobs Scraper: reads open jobs straight from company career pages, for employers that do not post on these boards.
  • Greenhouse Jobs Scraper: open jobs from the Greenhouse boards of companies you pick, with pay ranges where published.
  • Workday Jobs Scraper: open jobs from the Workday career sites of large employers you pick.

Support

Something wrong or missing? Open an issue on this Actor's Issues tab with your input (the boards and filters) and what you expected.