# Remote Job Aggregator API (`parsebird/remote-job-aggregator-api`) Actor

Search remote jobs across Arbeitnow, Jobicy, Himalayas, and RemoteOK in one run — one keyword, one unified output schema, no separate scrapers to manage.

- **URL**: https://apify.com/parsebird/remote-job-aggregator-api.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Jobs, Automation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.00 / 1,000 job scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Remote Job Aggregator API

Search remote jobs across four job boards in a single run: [Arbeitnow](https://www.arbeitnow.com), [Jobicy](https://jobicy.com), [Himalayas](https://himalayas.app), and [RemoteOK](https://remoteok.com). The **Remote Job Aggregator API** sends one keyword to all four public job APIs, normalizes the results into one schema, deduplicates, and returns a single clean dataset — no need to run and merge four separate scrapers.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
One keyword search, one set of limits, one output schema across Arbeitnow, Jobicy, Himalayas, and RemoteOK — pick any combination of the four and get back a merged, deduplicated, ready-to-use job feed.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/remote-job-aggregator-api. Searches remote jobs across Arbeitnow, Jobicy, Himalayas, and RemoteOK in one call. Call via ApifyClient: client.actor("parsebird/remote-job-aggregator-api").call(run_input={"searchKeywords": "python developer", "platforms": ["arbeitnow","jobicy","himalayas","remoteok"], "maxJobsPerPlatform": 20, "maxTotalJobs": 50}). Returns per job: title, company, location, salary, description, platform, work_type, job_type, tags, url, posted_date, scraped_at, index. Full API spec: https://apify.com/parsebird/remote-job-aggregator-api/api. Get your token: https://console.apify.com/settings/integrations.
```

### What does Remote Job Aggregator API do?

Instead of running four separate scrapers and merging their outputs yourself, this actor queries [Arbeitnow's](https://www.arbeitnow.com/blog/job-board-api), [Jobicy's](https://github.com/Jobicy/remote-jobs-api), [Himalayas's](https://himalayas.app/jobs), and [RemoteOK's](https://remoteok.com/api) public job APIs directly, in parallel, and maps every result into the same output schema regardless of source.

- 🔍 **One keyword, four sources** — search once, get matching jobs from up to four job boards.
- 🧹 **Cross-platform deduplication** — each job is uniquely identified by platform + source ID before being added to the dataset.
- 🌍 **Remote-only by design** — Jobicy, Himalayas, and RemoteOK are remote-only job boards; Arbeitnow (which lists both remote and on-site roles) is filtered to `remote: true` listings only, so every result in this actor's output is a remote job.
- ⚖️ **Per-platform and total limits** — cap how many jobs come from each board individually, and cap the combined total.
- 🔢 **Stable `index` field** — every job in the output dataset is numbered in the order it was collected, which is convenient for digest emails and dashboards.

### What job data can you extract?

| Field | Description |
|-------|-------------|
| `title` | Job title |
| `company` | Hiring company name |
| `location` | Location or region restriction, or `Worldwide`/`Anywhere` when unrestricted |
| `salary` | Formatted salary range string where the source platform discloses it, else `null` |
| `description` | Plain-text summary (HTML stripped, truncated to ~500 characters) |
| `platform` | Source board: `arbeitnow`, `jobicy`, `himalayas`, or `remoteok` |
| `work_type` | Always `Remote` |
| `job_type` | Normalized employment type where available: `Full-Time`, `Part-Time`, `Contract`, `Internship` |
| `tags` | Source platform's own skill/category tags |
| `url` | Link to the original job listing |
| `posted_date` | Original publish date (ISO 8601 where the source provides it) |
| `scraped_at` | Timestamp this actor collected the job |
| `index` | 0-based position in this run's combined, deduplicated result set |

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchKeywords` | string | No | `""` | Keywords to search, e.g. `"python developer"`, `"react"`, `"marketing"`. Empty = fetch all available jobs |
| `platforms` | string\[] | No | all four | Which boards to query: `arbeitnow`, `jobicy`, `himalayas`, `remoteok` (any combination) |
| `maxJobsPerPlatform` | integer | No | `20` | Max jobs to fetch from each platform (1–50) |
| `maxTotalJobs` | integer | No | `50` | Cap total jobs across all platforms (0–200; `0` = unlimited, bounded only by per-platform limits) |

### Output example

```json
{
  "title": "Senior Python & TypeScript Developer",
  "company": "Varicent",
  "location": "Mexico",
  "salary": null,
  "description": "We're transforming Sales Performance Management with a remote-first team...",
  "platform": "jobicy",
  "work_type": "Remote",
  "job_type": "Full-Time",
  "tags": ["Programming"],
  "url": "https://jobicy.com/jobs/135061-senior-python-typescript-developer",
  "posted_date": "2025-10-29T07:17:22+00:00",
  "scraped_at": "2026-06-26T15:30:00.000000",
  "index": 6
}
```

Download results as **JSON, CSV, Excel, HTML, or XML** directly from the Apify Console, or fetch them via the [Apify API](https://docs.apify.com/api/v2) / [dataset endpoint](https://apify.com/parsebird/remote-job-aggregator-api/api).

### Use cases

- **Daily job alerts** — schedule a run every weekday and email or Slack yourself a fresh digest for a role you're tracking (see the workflow below).
- **Job board aggregation** — power your own remote-jobs site or newsletter from a single feed instead of integrating four APIs yourself.
- **Market research** — compare how many roles for a given keyword each platform is currently listing.
- **Talent sourcing** — pull a broad remote candidate-facing job list for a role category across multiple boards at once.

### ⚙️ Daily remote-job alert workflow

Turn the actor into a recurring alert instead of checking four job boards manually:

1. Build a workflow in [n8n](https://n8n.io), [Make](https://www.make.com), or [Zapier](https://zapier.com) with an HTTP request step that calls this actor's [run-sync-get-dataset-items endpoint](https://docs.apify.com/api/v2#/reference/actors/run-actor-synchronously-and-get-dataset-items).
2. Add an **HTTP Header Auth** credential with `Authorization: Bearer <YOUR_APIFY_TOKEN>` — never paste a token directly into a shared workflow.
3. Set `searchKeywords`, `platforms`, and the result limits in the request body to match the role you're tracking.
4. Add a final step (email, Slack, Discord) that formats `title`, `company`, `location`, `platform`, and `url` from each returned job into a digest.
5. Run the workflow once manually to check the first digest, then activate a weekday (or daily) schedule.

Point the same workflow at a different `searchKeywords` value any time to monitor a different role, or lower `maxTotalJobs` to keep digests short.

### How it works

1. **Parallel fetch** — the actor queries the selected platforms' public job APIs concurrently: Arbeitnow (paginated, filtered to `remote: true`), Jobicy (native keyword + count filter), Himalayas (native keyword + pagination), and RemoteOK (single feed, keyword-matched client-side).
2. **Normalize** — every platform's raw response is mapped into the same output schema, with descriptions stripped of HTML and salary data formatted into one readable string.
3. **Deduplicate** — jobs are keyed by platform + source ID before being added to the combined result.
4. **Cap and index** — results are trimmed to `maxTotalJobs` and numbered sequentially in the `index` field.
5. **Output** — the combined dataset is pushed to Apify, ready for download, API access, or a downstream workflow.

### How much does it cost to use the Remote Job Aggregator API?

This actor uses [Pay-Per-Event (PPE)](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing) pricing — you're charged per job listing extracted, not per compute unit.

| Event | Price per event | Price per 1,000 |
|-------|----------------|-----------------|
| `job-scraped` (Free plan) | $0.012 | **$12.00** |
| `job-scraped` (Bronze plan) | $0.011 | **$11.00** |
| `job-scraped` (Silver plan) | $0.010 | **$10.00** |
| `job-scraped` (Gold plan) | $0.009 | **$9.00** |

A run collecting 100 jobs across all four platforms costs roughly $0.90–$1.20 depending on your Apify plan. All Apify accounts include a [free trial](https://apify.com/pricing) with credits to try the actor before committing to a paid plan.

### FAQ

**Why did a platform return fewer jobs than `maxJobsPerPlatform`?**
Each source has its own limits. RemoteOK exposes only its latest ~100 jobs with no pagination, so a narrow keyword can legitimately match few or none of them. Arbeitnow mixes remote and on-site roles — only ~3-5% of listings are remote — and its own API rate-limits pagination past a handful of pages, so narrow remote+keyword searches can return fewer results than requested.

**Why is `salary` sometimes `null`?**
Not every platform discloses compensation for every listing. `salary` is `null` whenever the source job has no salary data.

**Can I run this on a schedule?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run it daily or weekly, or wire it into the [n8n/Make/Zapier workflow](#️-daily-remote-job-alert-workflow) above for automated digests.

**What are the limitations of this actor?**
⚠️

- RemoteOK has no pagination — only its latest ~100 listings are searchable per run
- Arbeitnow pagination is capped to stay within its own API's rate limits, and only its `remote: true` listings are included
- `job_type` is left blank when the source platform doesn't classify it clearly
- Descriptions are truncated to ~500 characters for a consistent digest-style output across all four platforms — use the dedicated single-platform actors below for full descriptions

### Is it legal to use this actor?

Yes. This actor only accesses publicly available job listings through each platform's own public job API — [Arbeitnow](https://www.arbeitnow.com/blog/job-board-api), [Jobicy](https://github.com/Jobicy/remote-jobs-api), Himalayas, and [RemoteOK](https://remoteok.com/api) — all intended for this kind of programmatic access. It does not bypass login walls or collect personal data about individuals. Scraping publicly available data is generally considered legal — see [Apify's overview of web scraping legality](https://www.apify.com/is-web-scraping-legal) for more detail. Users are responsible for ensuring their use of the collected data complies with applicable laws and each platform's Terms of Service.

### Python and JavaScript usage

**Python** ([apify-client](https://docs.apify.com/api/client/python/)):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "searchKeywords": "python developer",
    "platforms": ["arbeitnow", "jobicy", "himalayas", "remoteok"],
    "maxJobsPerPlatform": 20,
    "maxTotalJobs": 50,
}

run = client.actor("parsebird/remote-job-aggregator-api").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["platform"], "-", item["title"], "at", item["company"])
```

**JavaScript** ([apify-client](https://docs.apify.com/api/client/js/)):

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const input = {
    searchKeywords: 'python developer',
    platforms: ['arbeitnow', 'jobicy', 'himalayas', 'remoteok'],
    maxJobsPerPlatform: 20,
    maxTotalJobs: 50,
};

const run = await client.actor('parsebird/remote-job-aggregator-api').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Related Actors

Need deeper, platform-specific data (full HTML descriptions, every filter each site supports)? Use the dedicated scrapers this aggregator is built on:

- [Arbeitnow Jobs Scraper](https://apify.com/parsebird/arbeitnow-jobs-scraper)
- [Jobicy Remote Jobs Scraper](https://apify.com/parsebird/jobicy-remote-jobs-scraper)
- [Himalayas Remote Jobs Scraper](https://apify.com/parsebird/himalayas-remote-jobs-scraper)
- [RemoteOK Jobs Scraper](https://apify.com/parsebird/remoteok-jobs-scraper)
- [Hiring.cafe Jobs Scraper](https://apify.com/parsebird/hiring-cafe-scraper) — 2.8M+ aggregated postings across 46 ATS platforms

Browse the full catalog on the [ParseBird Apify Store page](https://apify.com/parsebird).

# Actor input Schema

## `searchKeywords` (type: `string`):

Keywords to search, e.g. "python developer", "react", "marketing". Leave empty to fetch all available jobs.

## `platforms` (type: `array`):

Which job boards to query. Any combination.

## `maxJobsPerPlatform` (type: `integer`):

Maximum jobs to fetch from each platform.

## `maxTotalJobs` (type: `integer`):

Cap total jobs across all platforms combined. 0 = unlimited (bounded only by Max Jobs Per Platform × number of platforms).

## Actor input object example

```json
{
  "searchKeywords": "",
  "platforms": [
    "arbeitnow",
    "jobicy",
    "himalayas",
    "remoteok"
  ],
  "maxJobsPerPlatform": 10,
  "maxTotalJobs": 40
}
```

# Actor output Schema

## `dataset` (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 = {
    "platforms": [
        "arbeitnow",
        "jobicy",
        "himalayas",
        "remoteok"
    ],
    "maxJobsPerPlatform": 10,
    "maxTotalJobs": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/remote-job-aggregator-api").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 = {
    "platforms": [
        "arbeitnow",
        "jobicy",
        "himalayas",
        "remoteok",
    ],
    "maxJobsPerPlatform": 10,
    "maxTotalJobs": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/remote-job-aggregator-api").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 '{
  "platforms": [
    "arbeitnow",
    "jobicy",
    "himalayas",
    "remoteok"
  ],
  "maxJobsPerPlatform": 10,
  "maxTotalJobs": 40
}' |
apify call parsebird/remote-job-aggregator-api --silent --output-dataset

```

## MCP server setup

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

```

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/DVcoDDt700NUWpc9J/builds/151yoPSph1redWb2v/openapi.json
