# Remote Job Board Aggregator – RemoteOK, Arbeitnow & More (`glidepath/remote-jobs-scraper`) Actor

Fresh remote job listings from RemoteOK, Arbeitnow, Jobicy, We Work Remotely and Himalayas in one schema. Input: which boards, keyword, location. Output: title, company, salary, tags, apply link. $1.74/1k jobs.

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

## Pricing

from $1.74 / 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 Job Board Aggregator – RemoteOK, Arbeitnow & More

Get **fresh remote job listings from five public job boards** — RemoteOK, Arbeitnow, Jobicy, We Work Remotely and Himalayas — normalised into one clean schema.

It reads each board's own **public API or RSS feed** (no login, no cookies, no browser), so runs are fast, cheap and stable. Every job links back to its own listing on the source board.

### Who uses it

- **Recruiters and sourcers** — one feed instead of checking five sites.
- **Job-market research** — track how many remote roles open up per week, by tag or region.
- **Newsletter and job-alert builders** — a single, deduplicated feed to filter by keyword.
- **AI agents** — a single, predictable tool for "what remote jobs are open right now for X?".

### How to use it

1. Choose which **job boards** to read (default: all five).
2. Optionally filter by **keyword**, **location** or **posted within (days)**.
3. Run it and download the jobs as JSON, CSV or Excel — or call it via API, schedule it, or connect it to Make, Zapier, n8n, Google Sheets or your AI agent (Apify MCP).

### Input example

```json
{
  "sources": ["remoteok", "arbeitnow", "jobicy"],
  "keyword": "python",
  "postedWithinDays": 14
}
```

### Output example

```json
{
  "source": "remoteok",
  "sourceId": "1137431",
  "title": "Senior Backend Engineer",
  "company": "Acme Inc",
  "companyLogo": "https://remoteok.com/logo.png",
  "location": "Worldwide",
  "remote": true,
  "tags": ["python", "backend", "senior"],
  "jobType": ["Full-Time"],
  "salaryMin": 90000,
  "salaryMax": 130000,
  "salaryCurrency": null,
  "postedAt": "2026-09-24T16:00:06Z",
  "url": "https://remoteok.com/remote-jobs/1137431",
  "applyUrl": "https://remoteok.com/remote-jobs/1137431",
  "descriptionText": "We're looking for a backend engineer to join our small, fully remote team...",
  "scrapedAt": "2026-09-26T09:00:00Z"
}
```

| Field | Description |
|---|---|
| `source`, `sourceId` | Which board the job came from and its own id (use both to de-duplicate) |
| `title`, `company`, `companyLogo` | As published by the board |
| `location`, `remote` | Free-text location/region and whether the role is remote |
| `tags`, `jobType` | Skills/industry tags and employment type (e.g. Full-Time, Contract) |
| `salaryMin`, `salaryMax`, `salaryCurrency` | Only when the board publishes them; `null` otherwise (never guessed) |
| `postedAt` | ISO 8601 UTC, when the board publishes a date |
| `url` | The job's own page on the source board |
| `applyUrl` | Direct application link, when the board provides one separate from `url` |
| `descriptionText` | Plain text, e-mail addresses and phone numbers removed by default |

A per-board summary (jobs found, matched, saved, errors) is stored in the run's key-value store as `SUMMARY`.

### Pricing

Pay per result: **$1.74 per 1,000 job listings**, the same price on every Apify plan. A board that can't be read is never charged for, and the same job is never charged twice within one run.

- Daily check across all five boards, ~500 new jobs/day → about **$26.10/month**.
- One-off pull of 2,000 jobs for a keyword → about **$3.48**.

Set a **maximum cost per run** in the run options and the Actor stops cleanly when it is reached.

### Limits and notes

- Boards are read as-is: this Actor doesn't visit LinkedIn, Indeed or any board that requires a login, and doesn't scrape reviewer or applicant identities.
- Salary fields are only filled in when the board itself publishes a number; they're never estimated.
- Descriptions are cleaned to plain text. E-mail addresses and phone numbers a poster left in a description are removed by default.
- Each job always keeps a link back to its original page on the source board.

### FAQ

**Is it legal to aggregate these job boards?** This Actor only reads each board's own public API or RSS feed, published for exactly this kind of use. It doesn't log in and doesn't bypass any protection. One board (Remotive) that also has a public API is intentionally excluded because its own `robots.txt` disallows automated access to it.

**Why did a board return 0 jobs?** Check `SUMMARY` for the exact error — a board's feed can be briefly unavailable; the run still returns jobs from the other boards.

**Can I filter by keyword or location?** Yes — set **Keyword** and **Location contains** in the input.

**Can I use it from an AI agent?** Yes, via the Apify MCP server or API. Pass `sources` as a list; results are the dataset items above.

### Support

Open an issue on the Actor's **Issues** tab with the input you used and the run link — we reply within a few days.

Made by **Glidepath**. See the changelog for updates.

# Changelog

This Actor's version history is a separate document: https://apify.com/glidepath/remote-jobs-scraper/changelog.md

# Actor input Schema

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

Which public job-board feeds to read. Each is the board's own public API or RSS feed (no login).

## `keyword` (type: `string`):

Keep only jobs whose title, company, tags or description contain this text (case-insensitive). Leave empty for all jobs.

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

Keep only jobs whose location/region text contains this (e.g. 'USA', 'Europe', 'LATAM'). Leave empty for all locations.

## `postedWithinDays` (type: `integer`):

Keep only jobs posted in the last N days. Jobs with no parseable posted date are kept. Leave empty for no limit.

## `maxItemsPerSource` (type: `integer`):

Stop reading a board after this many jobs (before filters). Leave empty for the board's own default page size.

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

Stop the whole run after this many jobs saved. Leave empty for no limit (your maximum cost per run still applies).

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

Adds descriptionText. Turn off for smaller, faster output.

## `redactContactInfo` (type: `boolean`):

Recommended. A listing occasionally contains a recruiter's e-mail or phone number; this removes them.

## Actor input object example

```json
{
  "sources": [
    "remoteok",
    "arbeitnow",
    "jobicy",
    "weworkremotely",
    "himalayas"
  ],
  "maxItemsPerSource": 100,
  "includeDescription": true,
  "redactContactInfo": true
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

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

No description

# 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 = {
    "sources": [
        "remoteok",
        "arbeitnow",
        "jobicy",
        "weworkremotely",
        "himalayas"
    ],
    "maxItemsPerSource": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("glidepath/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 = {
    "sources": [
        "remoteok",
        "arbeitnow",
        "jobicy",
        "weworkremotely",
        "himalayas",
    ],
    "maxItemsPerSource": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("glidepath/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 '{
  "sources": [
    "remoteok",
    "arbeitnow",
    "jobicy",
    "weworkremotely",
    "himalayas"
  ],
  "maxItemsPerSource": 100
}' |
apify call glidepath/remote-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,glidepath/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/z1U6hYYxho6HmrR9F/builds/0j16z1IPhpjggFmnx/openapi.json
