# Remote Jobs Aggregator: RemoteOK, Jobicy, Arbeitnow + 2 more (`angadseth/remote-jobs-aggregator`) Actor

Remote jobs from RemoteOK, Jobicy, Arbeitnow, Working Nomads and 4 Day Week in one clean feed. Duplicates across boards merged. Filter by keyword, category, country or region, time zone, salary and date. Official APIs and RSS only, every job links back.

- **URL**: https://apify.com/angadseth/remote-jobs-aggregator.md
- **Developed by:** [Angad Jangir](https://apify.com/angadseth) (community)
- **Categories:** Jobs, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 remote jobs

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 Aggregator: RemoteOK, Jobicy, Arbeitnow, Working Nomads, 4 Day Week

**One clean feed of remote jobs from six job boards**, with the same job posted on several boards merged into one record. Every job comes in the same shape: title, company, logo, category, tags, seniority, employment type, **where you can work from** (countries, regions or worldwide), time zones, **salary range**, full description, posting date and a link back to the original posting.

Filter by keyword, category, country or region ("India", "Europe", "USA", "Worldwide"), time zone, minimum salary in any major currency, and posting date ("24h", "7d", or a date). Runs take seconds, because every board is read through its **official public API or RSS feed**.

### Who uses it

- **Remote job boards and newsletters** that want a fresh, de-duplicated daily feed with attribution built in.
- **Recruiters and sourcers** watching which companies hire remotely, in which countries, and at what pay.
- **Job seekers' alert bots** (Telegram, Slack, Discord, email) that post new Python, design or support jobs open to their country.
- **AI agents** that need live remote jobs as structured data. The Actor works as a tool in the Apify MCP server.
- **Analysts** tracking remote hiring, salary ranges and location limits over time.

### Job boards

| Board (`sources` value) | How it is read | Jobs per run | Salary | Reuse terms (checked 6 Nov 2026) |
|---|---|---|---|---|
| RemoteOK (`remoteok`) | Official JSON API `remoteok.com/api` | latest ~100 | yes, often (USD/year) | Allowed with a followed link back and a mention of Remote OK |
| We Work Remotely | **not used** | | | Its terms page could not be read (HTTP 403), so we could not confirm reuse is allowed |
| Jobicy (`jobicy`) | Official JSON API `jobicy.com/api/v2/remote-jobs` | last 7 days, 100 a page, keyword search | yes, when set | Allowed in your own products, credit Jobicy and keep the original job URL |
| Arbeitnow (`arbeitnow`) | Official JSON API `job-board-api` | remote jobs from the newest pages | from the text, when written | Free public API, link back to Arbeitnow |
| Working Nomads (`workingnomads`) | Official JSON API `api/exposed_jobs` | latest ~30 | from the text, when written | Public API published for reuse; link back kept |
| 4 Day Week (`fourdayweek`) | Official JSON API `4dayweek.io/api/v2/jobs` (remote only) | 100 a page, keyword search | yes, often | "Designed for scripts, dashboards and aggregators"; link back to 4dayweek.io |

**Left out on purpose:**

| Board | Why it is not included |
|---|---|
| Remotive | Its API notice says not to pass Remotive jobs on to third-party sites and offers a paid API for that. |
| Himalayas | Its API terms say to show the jobs only on sites you operate and not to pass them on to other job boards or aggregators. |

The Actor never logs in, solves captchas or gets around protection. Each board is read once per run, with at most one request every 3 seconds, and with a User-Agent that names the Actor.

### Attribution (please keep it)

Every record has `source`, `sourceName` and `sourceUrl` (the original posting). When you show these jobs to people, **credit the board (`sourceName`) and link to `sourceUrl`**, and send Apply buttons to `applyUrl`. This is what the boards ask for in exchange for free access, and it keeps the feed available for everyone. Do not use the boards' logos; their names are fine.

### Example inputs

Python jobs open worldwide, posted in the last 7 days:

```json
{
  "keywords": ["python"],
  "locations": ["Worldwide"],
  "postedSince": "7d",
  "maxItems": 100
}
```

Developer jobs you can do from India (includes APAC and Asia jobs; turn off worldwide to see only jobs that name India or its region):

```json
{
  "keywords": ["developer", "engineer"],
  "locations": ["India"],
  "includeWorldwide": false,
  "maxItems": 60
}
```

Engineering jobs paying at least $100,000 a year, from the last two weeks:

```json
{
  "keywords": ["engineer"],
  "minSalary": 100000,
  "currency": "USD",
  "postedSince": "14d",
  "maxItems": 50
}
```

Daily feed for a newsletter: everything from the last 24 hours, Europe-friendly, no internships:

```json
{
  "locations": ["Europe"],
  "excludeKeywords": ["intern", "internship"],
  "postedSince": "24h",
  "maxItems": 500
}
```

### Output

One record per job. Missing values are `null` (or `[]` for lists), dates are ISO 8601. A real record from a run on 6 Nov 2026 (description shortened):

```json
{
  "id": "fourdayweek:01a1a409-267b-7cf1-a02e-4c3bcde2df5c",
  "title": "Senior Solutions Engineer, Commercial",
  "company": "ClickUp",
  "companyUrl": "https://www.clickup.com",
  "companyLogo": "https://media.4dayweek.io/files/1780344525392_1334d72b6e5be3a4.jpg",
  "source": "fourdayweek",
  "sourceName": "4 Day Week",
  "sourceUrl": "https://4dayweek.io/job/senior-solutions-engineer-commercial-at-clickup-26083487",
  "applyUrl": "https://4dayweek.io/job/senior-solutions-engineer-commercial-at-clickup-26083487",
  "category": "Sales",
  "tags": ["Executive Communication", "Live Demos", "Proof of Value", "Solution Design", "Stakeholder Management", "Technical Discovery", "APIs", "Integrations", "Customer Experience"],
  "seniority": "senior",
  "employmentType": "Full-time",
  "locationRestrictions": ["United States"],
  "worldwide": false,
  "timezones": [],
  "salaryMin": 145000,
  "salaryMax": 185000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "descriptionText": "At ClickUp, we're building the future of work: the first truly converged AI workspace unifying tasks, docs, chat, calendar, and enterprise search ...",
  "postedAt": "2026-11-04T00:50:26.000Z",
  "alsoOn": [
    {
      "source": "arbeitnow",
      "sourceName": "Arbeitnow",
      "sourceUrl": "https://www.arbeitnow.com/jobs/companies/clickup/remote-senior-solutions-engineer-commercial-482484",
      "postedAt": "2026-11-04T18:40:16.000Z"
    }
  ],
  "scrapedAt": "2026-11-06T02:03:11.076Z"
}
```

| Field | What it is |
|---|---|
| `id` | `source:boardJobId`, stable between runs (good for "new since yesterday" checks) |
| `title`, `company`, `companyUrl`, `companyLogo` | The job and the employer |
| `source`, `sourceName`, `sourceUrl`, `applyUrl` | The board, the original posting (link back) and where to apply |
| `category`, `tags` | As the board files the job (skills, stack, industry) |
| `seniority` | intern, entry, mid, senior, lead, principal, manager, director or executive, from the title or the board |
| `employmentType` | Full-time, Part-time, Contract, Internship or Temporary |
| `locationRestrictions` | Where you can work from: country names, regions (Europe, EMEA, LATAM, APAC, North America) or `Worldwide` |
| `worldwide` | `true` when the job is open everywhere or names no location limit |
| `timezones` | Time zones the posting asks for, e.g. `CET +/- 3 hours` |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Pay range and the period (year, month, hour). From the board, or from a range written in the description |
| `descriptionText` | Full description as clean text (turn off with **Include description text**) |
| `descriptionHtml` | Original HTML, only when **Include description HTML** is on |
| `postedAt`, `scrapedAt` | When the job was posted and read |
| `alsoOn` | The same job (same company and title) on other boards, each with its own link |

The **SUMMARY** record in the key-value store shows, per board, how many jobs were read, matched, merged as duplicates and saved, the filters used, and any warnings.

### How the filters work

- **Keywords**: whole words, in the title, tags and category by default. "Anywhere" also searches the description. Jobicy and 4 Day Week also get the keyword as a search on their side, so their results go further back.
- **Where you can work from**: "India" keeps jobs that name India, or a region that includes India (APAC, Asia), plus worldwide jobs unless you turn that off. "Europe" keeps jobs for Europe, the EU, EMEA or any European country. "Worldwide" keeps only jobs open everywhere.
- **Minimum yearly salary**: compares the top of the range, turned into a yearly amount, using approximate exchange rates between currencies. Jobs without a published salary are left out when this is set.
- **Posted since**: `24h`, `3d`, `7d`, `2w`, `1m` or a date such as `2026-11-01`.
- **Max jobs** is shared fairly across the boards (round robin, newest first), so one big board cannot crowd out the others.

### Pricing

Pay per job saved. Suggested price: **$2 per 1,000 jobs** ($0.002 per result). Jobs removed by your filters or merged as duplicates cost nothing, and **Max jobs** is a hard cap on what a run can cost.

### Limits

- Each board's public feed shows its most recent jobs only (RemoteOK about 100, Jobicy the last 7 days). For a full history, schedule the Actor daily and keep the results.
- Location limits are read from what the board writes. Some boards write the company's headquarters instead, and a few postings say nothing; those count as `worldwide`.
- Seniority is a guess from the title when the board does not give it.
- Exchange rates for the salary filter are approximate and fixed; the saved salary is always in the board's own currency.

### Schedules, webhooks and integrations

- **Daily alerts**: save your input as a Task, add a Schedule (for example every morning at 8:00) and set **Posted since** to `24h`.
- **Google Sheets, Slack, email, Zapier, Make, n8n**: connect them in the Integrations tab to send each run's jobs where you need them.
- **Webhooks**: get a call when a run finishes and read the dataset from the API.
- **MCP / AI agents**: add the Actor to the Apify MCP server, and an agent can ask "remote React jobs open to India posted this week, over $40k" and get structured jobs back.

### Related Actor

Need jobs straight from company career pages instead of job boards? **[ATS Jobs Feed](https://apify.com/angadseth/ats-jobs-feed)** reads Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee, Personio and Breezy HR boards in the same record style. Use both for full coverage of remote hiring.

### FAQ

**Is this legal?** The Actor reads only the official public APIs and RSS feeds that these boards publish so others can reuse their jobs, and it follows each board's published terms: link back, credit the board, keep the original apply link. Boards whose terms forbid passing jobs on (Remotive, Himalayas) are not included. It reads politely, once per run. You are responsible for how you use the data, so keep the attribution when you publish jobs.

**Why so few results for my keyword?** Remote boards publish only their newest jobs in their feeds. Try "Anywhere" for keyword matching, a wider **Posted since**, or more **Max pages per board**, and schedule daily runs to build up a history.

**How does duplicate merging work?** Two jobs are the same when the company's name and the job title match after removing punctuation and words like "Remote" or "(m/w/d)". The record with the most detail (salary, logo, description) is kept, and the others are listed in `alsoOn`. Turn **Merge the same job across boards** off to keep every copy.

**Can I add another board?** Open an issue on the Issues tab. Only boards with an official API or feed whose terms allow reuse are added.

**Something broke or a field is wrong?** Open an issue on the Issues tab and it will be fixed quickly.

### More Actors by angadseth

- [GeM Tenders Scraper (India Government e-Marketplace Bids)](https://apify.com/angadseth/gem-tenders-scraper): Get live GeM bids and reverse auctions from India's Government e-Marketplace
- [India eProcurement Tenders Scraper (CPPP + 30 State Portals)](https://apify.com/angadseth/india-eprocurement-tenders): Live government tenders from India's central eProcure (CPPP), central PSU, defence and 30+ state NIC eProcurement portals in one run.
- [Apple App Store Scraper: apps, ratings and reviews](https://apify.com/angadseth/app-store-scraper): Get Apple App Store apps, ratings and customer reviews from many countries in one run
- [ATS Jobs Feed: Greenhouse, Lever, Ashby, Workday + 5 more](https://apify.com/angadseth/ats-jobs-feed): Get every open job from a company's own careers board
- [Bluesky Scraper: Posts, Profiles, Followers and Feeds](https://apify.com/angadseth/bluesky-scraper): Scrape Bluesky without a login
- [Website Contact Enricher: Emails, Phones, Socials per Domain](https://apify.com/angadseth/website-contact-enricher): One clean lead row per company domain
- [Website Screenshot & PDF: full page, mobile, element, WebP](https://apify.com/angadseth/website-screenshot): Screenshots (PNG, JPEG, WebP) and PDFs of any list of URLs.
- [PDF & Document Text Extractor: PDF, DOCX, PPTX, XLSX to Text](https://apify.com/angadseth/pdf-text-extractor): Turn public document URLs (PDF, DOCX, PPTX, XLSX, CSV, HTML, TXT) into clean text

# Actor input Schema

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

Which boards to read. Leave as is for all six. Each board is read once per run through its official public API or RSS feed.

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

Keep jobs that contain any of these words or phrases, e.g. "python", "react", "customer support", "data engineer". Whole words, case does not matter. Leave empty for all jobs.

## `keywordsMatch` (type: `string`):

Title and tags is the best balance: "python" finds Python roles and jobs tagged Python. Title only is strictest. Anywhere also searches the full description and finds the most.

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

Drop jobs whose title contains any of these words, e.g. "senior", "intern", "sales".

## `categories` (type: `array`):

Keep jobs whose category or tags contain any of these words, e.g. "programming", "design", "marketing", "customer support", "devops". Each board names its categories a little differently, so short words work best.

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

Keep jobs open to people in any of these places: a country ("India", "USA", "Germany", "IN"), a region ("Europe", "EU", "EMEA", "LATAM", "APAC", "North America") or "Worldwide" (only jobs open everywhere). A job limited to a region matches the countries in it, so "India" also finds APAC jobs.

## `includeWorldwide` (type: `boolean`):

With a location filter, also keep jobs that are open worldwide or name no location limit. Turn off to keep only jobs that name your country or region.

## `timezones` (type: `array`):

Keep jobs whose stated time zone contains any of these, e.g. "CET", "UTC+1", "EST", "PST". Jobs that state no time zone are kept, because most postings do not give one.

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

Keep only jobs whose published pay reaches at least this much per year (top of the range, in the currency below; hourly and monthly pay is converted to yearly). Jobs without a published salary are dropped when this is set. 0 = no salary filter.

## `currency` (type: `string`):

Currency of the minimum salary. Salaries in other currencies are compared with approximate exchange rates.

## `postedSince` (type: `string`):

Keep jobs posted after this: "24h", "3d", "7d", "2w", "1m", or a date like "2026-11-01". Empty = any date.

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

Companies often post one job on several boards. When on, the same company + title is saved once, with the other boards listed in alsoOn. Turn off to keep every board's copy.

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

Add the full job description as clean plain text. Turn off for smaller results.

## `includeDescriptionHtml` (type: `boolean`):

Also add the original description HTML where the board gives it, e.g. to show it on your own site.

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

Stop after this many jobs in total, shared fairly across the boards (newest first). You pay per job saved.

## `maxPagesPerSource` (type: `integer`):

Jobicy, Arbeitnow and 4 Day Week have more than one page (100 to 300 jobs each). Reading stops early once enough jobs match. Raise this for narrow filters over a long period.

## Actor input object example

```json
{
  "sources": [
    "remoteok",
    "jobicy",
    "arbeitnow",
    "workingnomads",
    "fourdayweek"
  ],
  "keywords": [
    "developer"
  ],
  "keywordsMatch": "titleOrTags",
  "includeWorldwide": true,
  "minSalary": 0,
  "currency": "USD",
  "dedupe": true,
  "includeDescription": true,
  "includeDescriptionHtml": false,
  "maxItems": 50,
  "maxPagesPerSource": 5
}
```

# Actor output Schema

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

All jobs found in this run, as a dataset you can download in JSON, CSV or Excel.

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

Jobs read, matched, merged and saved per job board, the filters used and any warnings from this 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": [
        "developer"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("angadseth/remote-jobs-aggregator").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": ["developer"],
    "maxItems": 50,
}

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

```

## MCP server setup

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

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/paDcYsFpErnu9RbUv/builds/cqEpTt2AuKc1IqcvM/openapi.json
