# Remote Jobs API - Remotive, RemoteOK, Himalayas, Jobicy (`lost.fany/remote-jobs-scraper`) Actor

Remote job listings from Remotive, Remote OK, Himalayas, Jobicy and Arbeitnow in one normalized dataset: title, company, salary, tags, location and link. Duplicates merged. dryRun prices a run before you pay; charged only for jobs delivered.

- **URL**: https://apify.com/lost.fany/remote-jobs-scraper.md
- **Developed by:** [Natalia Ivanova](https://apify.com/lost.fany) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 job rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Remote Jobs Scraper - Remotive, RemoteOK, Himalayas, Jobicy

Get **remote job listings from five job boards in one clean dataset**: Remotive, Remote OK, Himalayas, Jobicy and Arbeitnow. One run, one schema — title, company, location, employment type, salary, tags, publication date, description and the canonical link to the original posting. Duplicates posted on several boards are merged, with links to every copy.

The Actor reads only the **official public JSON APIs the boards publish for developers**. No HTML scraping, no browser, no proxies, no logins — so it does not break when a site changes its layout, and it respects each board's attribution rules by design.

### What you can do with it

- **Job alerts** — run it every morning with `postedAfter: "24 hours"` and your keywords, then send new matches to Slack, email or a Google Sheet with Apify integrations.
- **Job-board or newsletter feed** — fill a niche job site ("remote Python jobs in Europe") with fresh, deduplicated listings that link back to the source.
- **Market research** — track how many remote roles per stack, seniority or region appear each week; salary ranges where boards publish them.
- **Recruiting and lead generation** — see which companies are hiring remotely right now for a given skill.
- **AI agents** — let an agent query the job market through the Apify MCP server (see below).

### Sources

| Board | Coverage | Notes |
|---|---|---|
| [Remotive](https://remotive.com) | Tech, marketing, design, support | Listings delayed 24 h by the board itself |
| [Remote OK](https://remoteok.com) | Latest ~100 remote jobs, tags, USD salaries | |
| [Himalayas](https://himalayas.app) | Largest feed (100 000+ listings), salaries, seniority, location and timezone restrictions | Paginated by date until `postedAfter` |
| [Jobicy](https://jobicy.com) | Worldwide, industries, levels, salaries | Up to 200 newest per run |
| [Arbeitnow](https://www.arbeitnow.com) | Europe-focused, hourly updates | Only jobs marked remote are kept |

All boards allow this kind of re-use provided the original job URL and the source are kept. Every item therefore contains `url`, `source`, `sourceName` and an `attribution` line. Please keep them when you display the data.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `keywords` | array | `[]` | Keep jobs whose title, company, category, tags (and description, see below) contain **any** of these words. Empty = everything. |
| `excludeKeywords` | array | `[]` | Drop jobs whose title, company, category or tags contain any of these. |
| `searchDescription` | boolean | `true` | Also match keywords in the full description. Turn off for strict title/tag matching. |
| `sources` | array | all five | Any of `remotive`, `remoteok`, `himalayas`, `jobicy`, `arbeitnow`. |
| `postedAfter` | string | `7 days` | A date (`2026-09-01`), `today`, `yesterday` or a period (`24 hours`, `2 weeks`). |
| `location` | string | — | Keep only jobs whose location text contains this (`USA`, `Europe`, `Worldwide`, `Germany`). |
| `jobTypes` | array | `[]` | `full_time`, `part_time`, `contract`, `freelance`, `internship`, `temporary`, `other`. |
| `maxItems` | integer | `500` | Stop after this many jobs (after filtering and merging). |
| `includeDescription` | boolean | `true` | Full description as text and HTML; off = 300-character excerpt. |
| `dedupe` | boolean | `true` | Merge the same job found on several boards. |

Example — remote React or Vue jobs for Europe from the last day, without senior roles:

```json
{
  "keywords": ["react", "vue"],
  "excludeKeywords": ["senior", "lead"],
  "location": "Europe",
  "postedAfter": "24 hours",
  "maxItems": 200
}
```

### Output

One dataset item per job:

```json
{
  "id": "himalayas:senior-full-stack-python-fastapi-react-engineer",
  "title": "Senior Full Stack Python/FastAPI/React Engineer",
  "company": "Anovium",
  "url": "https://himalayas.app/companies/anovium/jobs/senior-full-stack-python-fastapi-react-engineer",
  "applyUrl": "https://himalayas.app/companies/anovium/jobs/senior-full-stack-python-fastapi-react-engineer/apply",
  "source": "himalayas",
  "sourceName": "Himalayas",
  "sourceSite": "https://himalayas.app",
  "attribution": "Originally posted on Himalayas: https://himalayas.app/companies/anovium/jobs/…",
  "location": "Colombia",
  "remote": true,
  "jobType": "full_time",
  "seniority": "Senior",
  "category": "Engineering",
  "tags": ["Full Stack Engineer"],
  "salaryMin": 60000,
  "salaryMax": 90000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": null,
  "companyLogo": "https://…/logo.png",
  "publishedAt": "2026-09-10T12:28:04Z",
  "expiresAt": "2026-10-10T12:28:04Z",
  "description": "About Anovium …",
  "descriptionHtml": "<p>About Anovium …</p>",
  "alsoOn": [{ "source": "remoteok", "url": "https://remoteok.com/remote-jobs/…" }],
  "scrapedAt": "2026-09-10T14:02:11Z"
}
```

`jobType` is normalized across boards; `salaryText` keeps free-text ranges (e.g. `$90k–$120k`) when a board publishes salary as text. The `OUTPUT` record of the key-value store holds a run summary: jobs per board, boards that failed (the run still succeeds if at least one board answers), and the filters used.

### Use cases

Ready-made examples you can run without configuring anything:

- [Scrape Remotive remote jobs](https://apify.com/lost.fany/remote-jobs-scraper/examples/remotive-jobs) — ready-made task, run it as is
- [Build a remote work job feed from five boards](https://apify.com/lost.fany/remote-jobs-scraper/examples/remote-work-job-feed) — ready-made task, run it as is

#### Scrape Remotive jobs

Remotive's curated remote tech board in one normalized schema — title, company, salary, tags, location and the canonical apply link.

```json
{ "sources": ["remotive"], "keywords": ["python"] }
```

#### Scrape Jobicy jobs

Jobicy's feed with the same fields as every other board, so nothing downstream has to know which site a row came from.

```json
{ "sources": ["jobicy"] }
```

#### Build a remote work job feed

All five boards in one run with cross-board duplicates merged — the shape you want behind a job aggregator, a newsletter or a Slack alert.

```json
{ "sources": ["remotive", "remoteok", "himalayas", "jobicy", "arbeitnow"] }
```

### Pricing

Pay per event: a small fee per Actor start plus a fee per job returned. You pay only for jobs that pass your filters after deduplication — the filtering and merging themselves are free. A daily alert run with 20–50 new matches typically costs a few cents; the current prices are shown in the **Pricing** tab.

### Limits and good practice

- The boards ask developers not to poll them constantly. The Actor makes one request per board per run (Himalayas and Arbeitnow paginate as far as `postedAfter` requires). Schedules every few hours are fine; every minute is not.
- Boards describe locations in their own words (`Worldwide`, `USA only`, `EMEA`, `Remote job`). The `location` filter is a substring match; use short terms.
- Remotive delays its public feed by 24 hours on purpose; other boards publish in near real time.
- Keywords are matched as substrings, case-insensitive: `go` also matches `Django`. Use `golang` or `go` with spaces if you need precision.

### Use with AI agents (MCP)

Add this Actor to the [Apify MCP server](https://apify.com/apify/actors-mcp-server) and an agent (Claude, Cursor, any MCP client) can ask for "remote data-engineer jobs posted this week that mention dbt" and receive structured rows with links. Typical tool input:

```json
{ "keywords": ["data engineer", "dbt"], "postedAfter": "7 days", "maxItems": 50, "includeDescription": false }
```

### FAQ

**Why do results differ from the boards' websites?** Boards show more jobs on their sites than in their public APIs (e.g. Remote OK exposes the latest ~100, Jobicy up to 200 per query). Combine several boards and run regularly to build a complete picture.

**Can I get non-remote jobs too?** No — this Actor is remote-only by design (Arbeitnow's on-site listings are filtered out).

**Is this affiliated with the boards?** No. Data is provided by the boards through their public APIs and remains theirs; keep the links and source names when you republish it.

**Something is missing or a board changed its API?** Open an issue on the Actor's **Issues** tab — fixes usually ship within a day.

### Related Actors

- [Career Page Jobs API](https://apify.com/lost.fany/greenhouse-lever-ats-jobs-scraper)
- [Hacker News Search API](https://apify.com/lost.fany/hacker-news-search-scraper)
- [Tech Stack Detector](https://apify.com/lost.fany/website-tech-stack-detector)

### Cost control

Pay per event only works if you can see the bill before you pay it:

- Set `dryRun` to count every result and print what a full run would cost - nothing is charged, and only a few sample rows are stored.
- You are charged only for rows actually delivered to the dataset; a run that finds nothing costs nothing beyond the start event.
- `maxItems` is respected exactly, and the run stops before the platform's Max total charge for the run.
- Every run writes a `COST` record to the key-value store: chargeable events, charged events, the amount in USD and whether a limit was hit.

# Actor input Schema

## `keywords` (type: `array`):

Keep jobs whose title, company, category or tags contain ANY of these words (case-insensitive), e.g. python, react, marketing. Leave empty to get everything.

## `excludeKeywords` (type: `array`):

Drop jobs whose title, company, category or tags contain any of these words, e.g. senior, sales.

## `searchDescription` (type: `boolean`):

Match keywords in the full job description as well as in the title, company, category and tags. Turn off for stricter, title-only matching. Exclude keywords always apply to title/company/tags only.

## `sources` (type: `array`):

Which boards to query. All five by default.

## `postedAfter` (type: `string`):

Only jobs published after this moment: a date (2026-09-01), 'today', 'yesterday' or a relative period like '7 days', '24 hours', '2 weeks'. Default: 7 days.

## `location` (type: `string`):

Keep only jobs whose location text contains this, e.g. USA, Europe, Worldwide, Germany. Boards describe locations differently, so keep it short.

## `jobTypes` (type: `array`):

Keep only these employment types. Empty = all.

## `maxItems` (type: `integer`):

Stop after this many jobs (after filtering and deduplication).

## `includeDescription` (type: `boolean`):

Include the full job description as plain text and HTML. Turn off for a compact dataset (300-character excerpt only).

## `dedupe` (type: `boolean`):

The same job posted on several boards is returned once, with links to the other boards in `alsoOn`.

## `proxyConfiguration` (type: `object`):

Not needed normally: the boards publish these APIs for public use. Enable only if a board starts blocking Apify's IPs.

## `dryRun` (type: `boolean`):

Count every result and show what a full run would cost, without charging for it. Only a few sample rows are stored. Use it to check the price before you pay.

## Actor input object example

```json
{
  "keywords": [
    "python"
  ],
  "excludeKeywords": [],
  "searchDescription": true,
  "sources": [
    "remotive",
    "remoteok",
    "himalayas",
    "jobicy",
    "arbeitnow"
  ],
  "postedAfter": "7 days",
  "jobTypes": [],
  "maxItems": 500,
  "includeDescription": true,
  "dedupe": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "dryRun": false
}
```

# Actor output Schema

## `results` (type: `string`):

One item per job: title, company, url, source, location, salary, tags, description.

## `summary` (type: `string`):

Counts and errors of the run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "python"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lost.fany/remote-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "keywords": ["python"] }

# Run the Actor and wait for it to finish
run = client.actor("lost.fany/remote-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "python"
  ]
}' |
apify call lost.fany/remote-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lost.fany/remote-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/apL0oPdZZPhFLaqS0/builds/IEXOfwocBS48MpNbW/openapi.json
