# Remote Jobs Search - Jobicy, Arbeitnow, RemoteOK (`staymeter-labs/remote-jobs-search`) Actor

Search remote and Europe/UK job listings from three open job APIs (Jobicy, Arbeitnow, RemoteOK) in one run. Keyword, location, salary and freshness filters, duplicates removed, source credit included. No key needed.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 Search — Jobicy, Arbeitnow and RemoteOK in one run (free)

Search **remote jobs and Europe/UK job listings** from three open job APIs at once and get clean, de-duplicated JSON or CSV: title, company, location, salary range (when published), tags, posting time and a link back to the original listing. Filter by keyword, location, salary and freshness. No API key, no browser, no proxies.

Typical searches: *remote jobs API*, *remote developer jobs*, *job board aggregator*, *remote jobs with salary*, *job alerts for a newsletter or Slack*, *hiring-trend research*.

### How to use in 3 steps

1. Enter **keywords** (one per line), e.g. `python`, `data engineer`, `customer support`. A job matches if any keyword appears in its title, tags, company or description. Leave empty for the newest jobs.
2. Optionally narrow by **location** (`USA`, `Europe`, `Germany`…), **employment type** (`Full-Time`, `Contract`…), **seniority** (`Senior`, `Junior`…), **exclude keywords** (`intern`, `sales`), **posted within N days**, **minimum yearly salary** or **only jobs with a stated salary**.
3. Click **Start**. Download JSON, CSV or Excel, or schedule the Actor (e.g. daily) and read the dataset through the Apify API.

### What you get

| Field | Example |
|---|---|
| `id` | `jobicy:155801` (source + listing id, stable between runs) |
| `source` | `Jobicy`, `Arbeitnow` or `Remote OK` |
| `sourceUrl` | Link to the original listing (always present) |
| `title`, `company`, `companyLogo` | `Bioinformatics Scientist`, `Natera` |
| `location` | `USA`, `Europe, UK`, `null` when the source gives none |
| `remote` | `true` / `false` |
| `jobTypes`, `tags`, `seniority` | `["Full-Time"]`, `["Data Science & Analytics"]`, `Senior` |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | `101800`, `127300`, `USD`, `yearly` — `null` when not published |
| `postedAt` | `2026-10-19T11:45:25Z` (UTC) |
| `description` | Plain text, only with *Include description text* |

```json
{
  "id": "jobicy:155801",
  "source": "Jobicy",
  "sourceUrl": "https://jobicy.com/jobs/155801-bioinformatics-scientist",
  "title": "Bioinformatics Scientist",
  "company": "Natera",
  "location": "USA",
  "remote": true,
  "jobTypes": ["Full-Time"],
  "tags": ["Data Science & Analytics"],
  "seniority": "Senior",
  "salaryMin": 101800,
  "salaryMax": 127300,
  "salaryCurrency": "USD",
  "salaryPeriod": "yearly",
  "postedAt": "2026-10-19T11:45:25Z"
}
```

### Input examples

Latest Python and data jobs in Europe with a published salary:

```json
{ "keywords": ["python", "data engineer"], "locations": ["Europe", "Germany"], "salaryRequired": true, "maxItems": 100 }
```

Everything new from RemoteOK and Jobicy in the last 2 days:

```json
{ "sources": ["jobicy", "remoteok"], "postedWithinDays": 2, "maxItems": 300 }
```

Senior full-time remote jobs, no interns, short keywords like `ai` work too:

```json
{ "keywords": ["ai", "machine learning"], "excludeKeywords": ["intern"], "jobTypes": ["Full-Time"], "seniority": ["Senior"], "maxItems": 100 }
```

### Use cases

- Job-alert newsletters, Slack/Discord bots and job boards (keep the source credit, see below).
- Salary and hiring-trend research across remote roles.
- Feeding an AI agent or spreadsheet with fresh remote openings.

### Data sources, attribution and fair use

Data comes from public APIs that allow reuse with credit:

- **Jobicy** — "You may use Jobicy listings in your own products and user experiences without requesting individual permission. Keep Jobicy as the original source and preserve the canonical Jobicy job URL" (jobi.cy/apidocs).
- **Arbeitnow** — "This is a free public API for jobs, please do not abuse. I would appreciate linking back to the site."
- **Remote OK** — "Please link back … to the URL on Remote OK and mention Remote OK as a source."

Every row carries `source` and `sourceUrl`. **If you republish these listings, show the source name and link to `sourceUrl`.** Do not submit them to other job aggregators. Requests are sent politely (a few per run, with retries and backoff).

### FAQ

**Why are there fewer jobs than my `maxItems`?** Jobicy only serves the last 7 days; RemoteOK about the latest 100 listings. Widen keywords or drop filters. The limit is split evenly across the selected sources.

**Why is `salaryMin` null?** Most listings do not publish pay. Zero or empty values are returned as `null`, never as `0`.

**Does `remote: true` mean fully remote on Arbeitnow?** It is the flag Arbeitnow publishes; check the listing.

**Do short keywords like `ai`, `go` or `qa` work?** Yes. Keywords of 3 characters or fewer are matched as whole words (so `ai` does not match "maintain"), and Jobicy is read unfiltered for them because its own tag search needs 3+ characters.

**What happens to jobs without an employment type or seniority?** They are kept, because the source did not say. Only Jobicy publishes seniority; Arbeitnow and RemoteOK rows have `seniority: null`.

**How are duplicates handled?** The same company + title is returned once per run, even if several sources list it.

### Limits

- Only jobs from the selected open APIs; LinkedIn, Indeed and similar sites are not scraped.
- Up to 5,000 jobs per run.

Pricing: Free to use — you only pay Apify's standard platform usage.

# Actor input Schema

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

Job titles, skills or companies, one per line. A job matches if ANY keyword appears in its title, tags, company or description. Leave empty to get the latest jobs.

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

Drop jobs whose title, tags or company contain ANY of these words, e.g. intern, junior, sales.

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

Which open job APIs to query. jobicy = remote jobs worldwide (last 7 days). arbeitnow = jobs in Germany/Europe incl. remote. remoteok = remote tech jobs.

## `remoteOnly` (type: `boolean`):

Drop on-site jobs (only matters for Arbeitnow, which also lists on-site roles).

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

Keep jobs whose location text contains ANY of these words, e.g. USA, Europe, Germany, Worldwide. Leave empty for all locations.

## `jobTypes` (type: `array`):

Keep only these employment types, e.g. Full-Time, Part-Time, Contract, Freelance, Internship. Jobs without a stated type are kept.

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

Keep only these levels (Jobicy publishes them), e.g. Senior, Midlevel, Junior. Jobs without a stated level are kept.

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

Only jobs published in the last N days.

## `salaryRequired` (type: `boolean`):

Keep only listings that publish a salary range.

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

Keep jobs whose stated top salary is at least this yearly amount (in the listing's own currency). Jobs without a stated salary are dropped when this is set.

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

Add the full job description as plain text (larger output).

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

Stop after this many jobs in total.

## Actor input object example

```json
{
  "keywords": [
    "python",
    "data engineer"
  ],
  "sources": [
    "jobicy",
    "arbeitnow",
    "remoteok"
  ],
  "remoteOnly": true,
  "postedWithinDays": 7,
  "salaryRequired": false,
  "includeDescription": false,
  "maxItems": 100
}
```

# 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 = {
    "keywords": [
        "python",
        "data engineer"
    ],
    "sources": [
        "jobicy",
        "arbeitnow",
        "remoteok"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("staymeter-labs/remote-jobs-search").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": [
        "python",
        "data engineer",
    ],
    "sources": [
        "jobicy",
        "arbeitnow",
        "remoteok",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("staymeter-labs/remote-jobs-search").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": [
    "python",
    "data engineer"
  ],
  "sources": [
    "jobicy",
    "arbeitnow",
    "remoteok"
  ]
}' |
apify call staymeter-labs/remote-jobs-search --silent --output-dataset

```

## MCP server setup

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

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/qPqPRqQEhEp4vZopL/builds/dKuHmceq30U3qD4rA/openapi.json
