# Remote Jobs Aggregator: Remote OK, We Work Remotely & 3 more (`globose_talent_mn9/remote-jobs-aggregator`) Actor

Remote jobs from 5 boards (Remote OK, We Work Remotely, Jobicy, Working Nomads, Arbeitnow) in one normalized, de-duplicated feed. Filter by keyword, region, seniority, salary and date; only-new mode for daily alerts. $1 per 1,000 jobs.

- **URL**: https://apify.com/globose_talent_mn9/remote-jobs-aggregator.md
- **Developed by:** [Andrew Shamah](https://apify.com/globose_talent_mn9) (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.00 / 1,000 job results

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: Remote OK, We Work Remotely, Jobicy, Working Nomads & Arbeitnow

Get remote jobs from **5 remote job boards in one run**, as one clean, normalized, de-duplicated feed. Filter by keyword, allowed region, seniority, salary and posting date, and schedule it with **only-new mode** to get a daily remote-jobs alert in Slack, email, Google Sheets or your own app.

The Actor reads each board's **official public API or RSS feed** (no login, no browser, no proxies), so it is fast (a few seconds for ~1,000 jobs) and cheap: **$1 per 1,000 jobs**, and you never pay for merged duplicates or error rows.

### Boards included

| Board | Feed used | Typical jobs per run |
|---|---|---|
| [Remote OK](https://remoteok.com) | public JSON API | ~100 newest |
| [We Work Remotely](https://weworkremotely.com) | public category RSS feeds (11 categories) | ~500 |
| [Jobicy](https://jobicy.com) | public JSON API | 100 per page (default 3 pages) |
| [Working Nomads](https://www.workingnomads.com) | public JSON feed | ~40 newest |
| [Arbeitnow](https://www.arbeitnow.com) | public JSON API (remote jobs only) | ~25 per page |

Every row keeps the source board, a link to it and the original job URL, and **apply links always point to the original listing**, as the boards' API terms ask. (Remotive and Himalayas are intentionally not included, because their API terms do not allow passing jobs on to other aggregators.)

### Why use it

- **One schema for all boards:** title, company, logo, category, tags, seniority, employment type, location / allowed regions, worldwide flag, posting date, salary (min, max, currency, period), description as text and HTML.
- **Cross-posting merged:** the same company + title on several boards is returned once, with `alsoOn` listing the other boards. Duplicates are free.
- **Salary extraction:** from the board when it has one, otherwise parsed from pay-transparency text in the description (e.g. `$145,000 - $165,000 per year`).
- **Seniority detection** (Intern, Junior, Senior, Principal/Staff, Manager, Director+) from the title or the board's level.
- **Filters:** keywords (title + tags, optionally description), excluded words, allowed regions (`Europe`, `USA`, `Israel`, `worldwide`…), work-from-anywhere only, category, seniority, posted within N days, salary required / minimum yearly salary.
- **Only-new mode** for alerts: remembers what it already returned (90 days) and returns only new jobs.
- **Contacts redacted** in descriptions by default.
- Pairs with our [Company Jobs API](https://apify.com/globose_talent_mn9/ats-jobs-api) (Greenhouse, Lever, Ashby + 7 more ATS) and [Workday Jobs API](https://apify.com/globose_talent_mn9/workday-jobs-api).

### Input example

```json
{
  "keywords": ["python", "data engineer"],
  "locations": ["Europe", "Israel", "worldwide"],
  "postedWithinDays": 7,
  "excludeKeywords": ["intern"],
  "onlyNew": true,
  "maxItems": 200
}
```

### Output example

```json
{
  "source": "weworkremotely",
  "sourceName": "We Work Remotely",
  "sourceUrl": "https://weworkremotely.com",
  "jobId": "carrot-sr-data-engineer",
  "title": "Sr. Data Engineer",
  "company": "Carrot",
  "companyLogo": "https://wwr-pro.s3.amazonaws.com/logos/.../logo.gif",
  "category": "Back-End Programming",
  "tags": ["python", "sql"],
  "seniority": "Senior",
  "employmentType": "Full-Time",
  "location": "Anywhere in the World",
  "regions": ["United States", "Canada"],
  "worldwide": true,
  "postedAt": "2026-10-28T07:31:13.000Z",
  "url": "https://weworkremotely.com/remote-jobs/carrot-sr-data-engineer",
  "applyUrl": "https://weworkremotely.com/remote-jobs/carrot-sr-data-engineer",
  "salaryMin": 145000,
  "salaryMax": 165000,
  "salaryCurrency": "USD",
  "salaryPeriod": "YEAR",
  "salarySource": "description",
  "descriptionText": "…",
  "alsoOn": [],
  "scrapedAt": "2026-10-28T16:08:05.977Z",
  "error": null
}
```

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

### Pricing

Pay per event: **$0.001 per job returned** ($1 per 1,000) plus Apify's tiny Actor-start fee. Merged duplicates, jobs skipped by only-new mode and error rows are **not charged**. Set *Max jobs* or a maximum cost per run to cap spend.

### Tips

- For a **daily alert**, set `onlyNew: true`, schedule the Actor once a day (the boards update daily) and add a Slack / email / webhook integration.
- Use `locations` with `worldwide` to get jobs you can legally take from your country plus work-from-anywhere jobs.
- `maxPagesPerSource` (Jobicy / Arbeitnow) goes deeper into older listings.

### Legal and fair use

All data comes from public feeds the boards publish for re-use. Please keep the source credit and link when you display the jobs, and don't re-submit them to other job boards (Google Jobs, LinkedIn, Indeed). Descriptions are redacted for emails and phone numbers by default. This Actor is not affiliated with any of the boards.

# Actor input Schema

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

Keep jobs whose title or tags contain at least one of these words (case-insensitive), e.g. 'python', 'designer', 'customer support'. Leave empty for all remote jobs.

## `searchInDescription` (type: `boolean`):

Match keywords against the full job description too (broader results).

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

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

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

Keep jobs whose location or allowed regions contain one of these strings, e.g. 'Europe', 'USA', 'Israel', 'EMEA'. Add 'worldwide' to also keep work-from-anywhere jobs.

## `worldwideOnly` (type: `boolean`):

Keep only jobs open to candidates anywhere in the world.

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

Keep jobs whose category or tags contain one of these, e.g. 'design', 'devops', 'marketing', 'customer support'.

## `seniority` (type: `array`):

Keep only these levels: Intern, Junior, Senior, Principal/Staff, Manager, Director+. (Detected from the title or the board's own level.)

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

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

## `requireSalary` (type: `boolean`):

Keep only jobs that state a salary (from the board or parsed from the description).

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

Drop jobs whose stated yearly salary maximum is below this (any currency, no conversion). Jobs without a salary are kept unless 'Only jobs with a salary' is on. 0 = off.

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

Which boards to aggregate. Default: all five.

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

The same company + title on several boards is returned once, with the other boards listed in 'alsoOn'. You are not charged for merged duplicates.

## `onlyNew` (type: `boolean`):

Remember jobs between runs (named key-value store in your account, 90-day memory) and return only ones not seen before. Ideal for scheduled daily job alerts.

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

Include the description as plain text and HTML. Turn off for a compact list.

## `redactContacts` (type: `boolean`):

Replace e-mail addresses and phone numbers inside descriptions with \[redacted].

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

Stop after this many jobs (newest first). 0 = no limit. You pay only for jobs returned.

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

Jobicy (100 jobs/page) and Arbeitnow (≈300 jobs/page, remote ones kept). Higher = more history.

## Actor input object example

```json
{
  "keywords": [
    "engineer",
    "developer"
  ],
  "searchInDescription": false,
  "excludeKeywords": [],
  "locations": [],
  "worldwideOnly": false,
  "categories": [],
  "seniority": [],
  "postedWithinDays": 0,
  "requireSalary": false,
  "minSalary": 0,
  "sources": [
    "remoteok",
    "weworkremotely",
    "jobicy",
    "workingnomads",
    "arbeitnow"
  ],
  "dedupe": true,
  "onlyNew": false,
  "includeDescription": true,
  "redactContacts": true,
  "maxItems": 500,
  "maxPagesPerSource": 3
}
```

# Actor output Schema

## `overview` (type: `string`):

All jobs in the default dataset, shown with the 'overview' table view.

# 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": [
        "engineer",
        "developer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("globose_talent_mn9/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": [
        "engineer",
        "developer",
    ] }

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

```

## MCP server setup

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