# Remote Jobs Scraper - 9 Job Boards in One Feed (`cancap/remote-jobs-actor`) Actor

Fresh remote jobs from 9 boards: RemoteOK, We Work Remotely, Remotive, Himalayas, Jobicy, Arbeitnow, Working Nomads, Hacker News Who is hiring and The Muse, in one deduplicated list. Filter by keyword, location, salary and date. Export to CSV, Excel or Sheets.

- **URL**: https://apify.com/cancap/remote-jobs-actor.md
- **Developed by:** [CANCAP](https://apify.com/cancap) (community)
- **Categories:** Jobs
- **Features:** Limited permissions
- **Stats:** 14 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 job listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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: 9 Job Boards in One Feed

Get **fresh remote jobs from 9 job boards in one clean, deduplicated list**: RemoteOK, We Work Remotely, Remotive, Himalayas, Jobicy, Arbeitnow, Working Nomads, Hacker News "Who is hiring?" and The Muse. Filter by keyword, location, salary and posting date, then export to CSV, Excel, JSON or Google Sheets.

**Just click "Start". The default input returns the newest remote jobs in under a minute.**

### Who uses this

- **Job seekers**: one daily list of new remote jobs matching your skills, instead of checking 9 websites.
- **Job board & newsletter owners**: power a remote-jobs site, Telegram/Discord channel or weekly email.
- **Recruiters & agencies**: see which companies are hiring remotely right now and for which roles.
- **Sales & lead-gen teams**: hiring companies are growing companies. Use new job posts as a buying signal.
- **Researchers & HR analysts**: track remote salary ranges, in-demand skills and hiring trends.

### Why this Actor

- ✅ **9 boards, one schema**: every job has the same fields, whatever site it came from.
- ✅ **Smart dedupe**: the same job posted on several boards appears once, with the other links in `alsoListedOn`.
- ✅ **Salary data**: min/max/currency where the board publishes it (filled in from duplicates when one board has it and another doesn't).
- ✅ **Powerful filters**: keywords, exclude words, location (USA, Europe, Worldwide...), minimum salary, max age.
- ✅ **Never breaks on one site**: if a board is down, you still get jobs from the others.
- ✅ **Official public APIs and feeds**: no logins, no blocking, with proper source attribution.

### How to use

1. Add **keywords** like `python`, `designer`, `customer support` (or leave empty for everything).
2. Optional: add **locations** (`USA`, `Europe`, `Worldwide`), a **minimum salary**, or **exclude words** (`senior`, `intern`).
3. Click **Start** and download your jobs in any format.

**Daily job alerts:** create an Apify **Schedule** (e.g. every morning) and connect an **integration** like Google Sheets, Slack, email, Zapier, Make or a webhook. New jobs then arrive automatically.

### Output example

```json
{
  "title": "Senior Python Developer",
  "company": "Acme",
  "location": "Worldwide",
  "category": "Software Development",
  "jobType": "full_time",
  "seniority": null,
  "salaryMin": 90000,
  "salaryMax": 130000,
  "salaryCurrency": "USD",
  "tags": ["python", "django"],
  "postedAt": "2026-10-01T08:15:00.000Z",
  "applyUrl": "https://remoteok.com/remote-jobs/123456",
  "companyLogo": "https://...",
  "description": "We are looking for...",
  "source": "remoteok",
  "alsoListedOn": ["https://weworkremotely.com/remote-jobs/acme-senior-python-developer"],
  "attribution": "Source: RemoteOK (https://remoteok.com)"
}
```

### Input

| Field | What it does | Default |
|---|---|---|
| `keywords` | Keep jobs matching ANY of these words (title, company, tags, category) | all jobs |
| `excludeKeywords` | Drop jobs whose title/tags contain these words | none |
| `locations` | Keep jobs whose location contains any of these | all |
| `minSalary` | Drop jobs with listed salary below this | 0 |
| `onlyWithSalary` | Only jobs that publish a salary | false |
| `maxAgeDays` | Only jobs posted in the last N days | 30 |
| `maxItems` | Max jobs returned (newest first) | 200 |
| `sources` | Which of the 9 boards to search | all |
| `includeDescription` | Include description text (turn off for smaller files) | true |

### Pricing

**You pay only per job delivered**, a few dollars per 1,000 jobs. Duplicates and filtered-out jobs are never charged. Set a **max cost per run** and the Actor stops cleanly at your limit.

### FAQ

**How fresh are the jobs?** Each run pulls live from the boards' public APIs and feeds, so you get what is posted right now. Schedule it daily or hourly.

**Can I get LinkedIn or Indeed jobs?** Not in this Actor. It uses only official public APIs and feeds, so it stays reliable and ToS-friendly.

**Can I republish these jobs on my site?** You may, but keep the `attribution` and link to `applyUrl` (the original listing). The source boards require this.

**A board returned 0 jobs?** Check the run's `RUN_STATS` record in the key-value store, which shows jobs per board and any source errors.

### Feedback

Want another job board, field or filter? Open an issue in the **Issues** tab. I add requests quickly.

# Actor input Schema

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

Keep jobs whose title, company, tags or category contain ANY of these words (case-insensitive). Leave empty for all jobs.

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

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

## `locations` (type: `array`):

Keep jobs whose location contains any of these, e.g. 'USA', 'Europe', 'Worldwide', 'Anywhere'. Leave empty for all locations.

## `minSalary` (type: `integer`):

Drop jobs whose listed salary is below this number. Jobs without a listed salary are kept unless 'Only jobs with salary' is on.

## `onlyWithSalary` (type: `boolean`):

Keep only jobs that publish a salary.

## `maxAgeDays` (type: `integer`):

Only jobs posted in the last N days. 0 = no limit.

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

Stop after this many jobs (newest first). 0 = no limit.

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

Which job boards to search. Default: all of them.

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

Turn off for smaller, faster exports.

## Actor input object example

```json
{
  "keywords": [
    "python",
    "react",
    "marketing"
  ],
  "excludeKeywords": [],
  "locations": [],
  "minSalary": 0,
  "onlyWithSalary": false,
  "maxAgeDays": 30,
  "maxItems": 100,
  "sources": [
    "remoteok",
    "weworkremotely",
    "remotive",
    "himalayas",
    "jobicy",
    "arbeitnow",
    "workingnomads",
    "hackernews",
    "themuse"
  ],
  "includeDescription": true
}
```

# 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",
        "react",
        "marketing"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("cancap/remote-jobs-actor").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",
        "react",
        "marketing",
    ],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("cancap/remote-jobs-actor").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",
    "react",
    "marketing"
  ],
  "maxItems": 100
}' |
apify call cancap/remote-jobs-actor --silent --output-dataset

```

## MCP server setup

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

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/gD0ifMmulOiDyfbgE/builds/TpHHL24tmbE5vI5rc/openapi.json
