# Remote Jobs Aggregator API (`ai-coding-radar/remote-job-intelligence`) Actor

Remote jobs aggregator API for recruiter alerts, job boards, and AI agents. Collect and deduplicate fresh listings from Arbeitnow, Jobicy, Remote OK, and Himalayas into JSON, CSV, or Excel. Filter by keyword, location, and age; connect with n8n, Make, Zapier, or API. No key or proxy.

- **URL**: https://apify.com/ai-coding-radar/remote-job-intelligence.md
- **Developed by:** [AI Coding Radar](https://apify.com/ai-coding-radar) (community)
- **Categories:** Jobs, Developer tools, Open source
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 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/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 Jobs Aggregator API

Aggregate and deduplicate fresh remote-job listings from four public feeds in
one run. The normalized dataset includes source attribution, direct application
URLs, salary when published, employment type, seniority, timezone restrictions,
and categories for recruiter alerts, job boards, market research, and AI agents.

- [Run the Actor on Apify](https://apify.com/ai-coding-radar/remote-job-intelligence)
- [Try the public daily software-jobs example](https://apify.com/ai-coding-radar/remote-job-intelligence/examples/daily-remote-software-jobs)
- [Try the public daily AI and machine-learning jobs example](https://apify.com/ai-coding-radar/remote-job-intelligence/examples/daily-remote-ai-and-machine-learning-jobs)
- [Browse the complete automation API catalog](https://ai-coding-radar.github.io/#toolbox-title)

### Use cases

- **Remote jobs aggregator API:** power a niche job board, recruiter pipeline,
  or hiring-data product with one JSON/CSV/Excel feed instead of four scrapers.
- Build a daily remote-jobs digest with n8n, Make, Zapier, or the Actor API.
- Feed a job board or recruiter workflow with deduplicated listings.
- **Remote salary and hiring research:** compare the salary, seniority, category,
  and location signals that public sources expose.
- Export the Apify dataset as JSON, CSV, or Excel for research and reporting.
- Give an AI agent structured records without logging in to job sites.

### Automation recipes

- Import the [n8n webhook digest workflow](https://github.com/Jarvis-Dong/remote-job-intelligence/blob/main/examples/n8n-remote-jobs-webhook.json)
  and connect its response to Slack, email, a database, or a job board.
- Follow the [Make scheduled-digest recipe](https://github.com/Jarvis-Dong/remote-job-intelligence/blob/main/examples/README.md) for a
  scheduler, HTTP request, JSON parsing, and delivery modules.

Both recipes use the caller's own Apify API token; no token or private delivery
URL is stored in this repository.

### Sources

- Arbeitnow public job-board API (remote listings only)
- Jobicy public remote-jobs API
- Remote OK public API
- Himalayas public jobs API

The Actor does not log in, use cookies, bypass CAPTCHAs, submit applications,
or rewrite a source's description. Each output record includes an attribution
URL. Consumers must render that URL as a normal follow link and keep each
provider's source credit and API terms. Job descriptions are untrusted source
data; the default output omits them so downstream automation does not ingest
instructions hidden in a listing.

### Copy-paste REST quickstart

Keep an Apify API token in your secret manager, then send a complete input
instead of the empty placeholder shown by some generated API clients:

```sh
curl -sS -X POST \
  'https://api.apify.com/v2/acts/ai-coding-radar~remote-job-intelligence/run-sync-get-dataset-items?clean=1' \
  -H "Authorization: Bearer $APIFY_API_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"sources":["arbeitnow","jobicy","remoteok","himalayas"],"keywords":["software"],"keywordMatchMode":"all","locations":[],"maxAgeDays":7,"limit":20,"includeDescription":false}'
```

The generated API client's empty `{}` input is also safe: it uses the same
four sources, `software` keyword, seven-day window, and 20-result limit. Send
the explicit payload above whenever you want a different query.

### Input

```json
{
  "sources": ["arbeitnow", "jobicy", "remoteok", "himalayas"],
  "keywords": ["software"],
  "keywordMatchMode": "all",
  "locations": [],
  "maxAgeDays": 7,
  "limit": 20,
  "includeDescription": false
}
```

`keywordMatchMode` defaults to `all`, preserving the strict legacy behavior. Set
it to `any` when a search should match at least one keyword. Every keyword is
matched against the job title, company, tags, locations, or (when requested)
the job description, so use one broad term for a strict daily alert or `any`
for a wider recruiter search.
`locations` match the normalized location and source location restrictions.
An empty filter means all matching remote listings. Results are deduplicated by
canonical application URL, then by a normalized company/title pair. When more
than one source is selected, the newest unique records are merged round-robin
by source so a high-volume feed does not hide the other selected feeds. The run
status reports a source warning when a public feed is unavailable.

Each row can include `salary`, `jobType`, `employmentType`, `seniority`,
`timezoneRestrictions`, and `categories`; fields remain empty when a source did
not publish them.

### Fixture-backed sample output

The offline fixture in `tests/fixtures/sample.json` produces this normalized
record (abridged):

```json
{
  "id": "arbeitnow:sample-python",
  "source": "arbeitnow",
  "sourceName": "Arbeitnow",
  "jobTitle": "Python Engineer",
  "company": "Example Co",
  "locations": ["Worldwide"],
  "remote": true,
  "tags": ["Python", "Backend"],
  "publishedAt": "2026-08-13T00:00:00Z",
  "applyUrl": "https://example.com/jobs/python-engineer",
  "salary": null
}
```

### Pricing note

The primary billable event is one returned job record. The launch price is
`$0.001` per record, plus `$0.00005` when a run starts. Platform usage is
included in that price. No revenue is claimed by this repository.

### Local checks

```sh
python3 -m unittest discover -s tests -v
python3 -m remote_job_intelligence --fixture tests/fixtures/sample.json
```

The fixture command is offline. A live run is only performed by the Apify
runtime and fails when every selected source is unavailable.

# Actor input Schema

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

Public feeds to query; no login or proxy is required.

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

Match any or all keywords in the normalized listing text.

## `keywordMatchMode` (type: `string`):

Use 'all' to require every keyword (the legacy default), or 'any' to match at least one.

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

Match a source location or location restriction.

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

Exclude listings older than this many days.

## `limit` (type: `integer`):

Maximum number of normalized records to return.

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

Include cleaned job descriptions in each result.

## Actor input object example

```json
{
  "sources": [
    "arbeitnow",
    "jobicy",
    "remoteok",
    "himalayas"
  ],
  "keywords": [
    "software"
  ],
  "keywordMatchMode": "all",
  "maxAgeDays": 7,
  "limit": 20,
  "includeDescription": false
}
```

# Actor output Schema

## `results` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ai-coding-radar/remote-job-intelligence").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("ai-coding-radar/remote-job-intelligence").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 '{}' |
apify call ai-coding-radar/remote-job-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ai-coding-radar/remote-job-intelligence"
        }
    }
}

```

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/m1ydD1ux1cs7Dk3RR/builds/B7EP5nN3gE8b5ePr1/openapi.json
