# Remote Jobs Scraper - Remote OK & Jobicy (`sweet_stickball/remote-jobs-scraper`) Actor

Remote jobs scraper: aggregate remote job offers from the public Remote OK and Jobicy APIs. Title, company, location, salary, tags, date and apply link, deduplicated, with source attribution. Filter by keywords, tags, region and age. No login, no API key.

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

## Pricing

from $0.84 / 1,000 jobs

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/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 Scraper - Remote OK & Jobicy

Aggregate remote job offers from public job board APIs into one flat, deduplicated list: title, company, allowed
location, salary range, tags, publish date, short description and apply link. Every job carries its source and a
link back to the original listing, as the providers ask.

### What it does

- Queries the official public APIs of [Remote OK](https://remoteok.com) and [Jobicy](https://jobicy.com). No login, no API key, no browser.
- Filters by keywords, tags/categories, allowed region and publication age.
- Removes duplicates: the same job listed twice by one source, or the same company + title on two sources
  (only the first one is kept, in the order of the `sources` input).
- Returns the newest jobs first, up to `maxItems`.
- Jobicy is read at most once per hour: its whole 7-day feed is cached for one hour in a named key-value store
  (`remote-jobs-scraper-jobicy-cache`) of the account running the Actor, and every run within that hour reuses it.

### Input

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `keywords` | array of strings | No | — | Jobs whose title, company or tags contain at least one of these words (whole word, case-insensitive) |
| `sources` | array | No | `["remoteok", "jobicy"]` | Any of `remoteok`, `jobicy` |
| `tags` | array of strings | No | — | Jobs with at least one tag/category containing one of these words (`engineering`, `marketing`, `devops`...) |
| `region` | string | No | — | Allowed location to match, e.g. `USA`, `Europe`, `UK`, `Canada`, `Germany` |
| `includeWorldwide` | boolean | No | `true` | With `region`, also keep jobs open worldwide |
| `postedWithinDays` | integer | No | — | Only jobs published in the last N days |
| `maxItems` | integer | No | 50 | Maximum number of jobs returned |

Example:

```json
{
    "keywords": ["python", "data engineer"],
    "region": "Europe",
    "postedWithinDays": 7,
    "maxItems": 50
}
```

### Output

One dataset item per job:

```json
{
    "source": "jobicy",
    "jobId": "158581",
    "title": "Senior Software Engineer",
    "company": "Example Inc",
    "companyLogo": "https://jobicy.com/data/server-nyc0409/galaxy/mercury/2025/06/logo.jpg",
    "location": "USA",
    "remoteType": "restricted",
    "employmentType": "Full-Time",
    "seniority": "Senior",
    "salaryMin": 180000,
    "salaryMax": 220000,
    "currency": "USD",
    "salaryPeriod": "yearly",
    "tags": ["Software Engineering"],
    "postedAt": "2026-11-02T18:05:09+00:00",
    "description": "Plain-text excerpt of the job description, up to 500 characters...",
    "applyUrl": "https://jobicy.com/jobs/158581-senior-software-engineer",
    "sourceUrl": "https://jobicy.com/jobs/158581-senior-software-engineer",
    "sourceAttribution": "Job listing from Jobicy (https://jobicy.com)",
    "scrapedAt": "2026-11-02T20:00:00+00:00"
}
```

`remoteType` is derived from the published location: `worldwide` ("Worldwide", "Anywhere"), `restricted`
(named countries or regions) or `unspecified` (no location given).

### Sources, terms and attribution

Each source was checked before use (robots.txt, API documentation, terms). When you display these jobs, keep the
attribution and the link to the original listing (`sourceUrl`, `applyUrl`).

| Source | Endpoint | Conditions |
|--------|----------|------------|
| Remote OK | `https://remoteok.com/api` | robots.txt: `User-agent: *` / `Allow: /` with `Content-Signal: search=yes, ai-train=no, use=reference`. API terms (returned in the API itself): link back to the job URL on Remote OK and mention Remote OK as the source; do not use the Remote OK logo. |
| Jobicy | `https://jobicy.com/api/jobs` | API documentation: the free Jobs API "can be used in commercial projects", no key required; credit Jobicy as the original source; apply links from the free API must keep pointing to the Jobicy job page (this Actor keeps them); avoid excessive requests and cache responses; polling "must not exceed once per hour" (one-hour cache in this Actor). |

Remotive, We Work Remotely and Arbeitnow are not used: Arbeitnow's website terms, accepted by using its API, only allow personal, non-commercial viewing; Remotive's robots.txt disallows its API (`Disallow: /api/*`) and We
Work Remotely's terms could not be confirmed.

### Pricing

Pay-per-event, no start fee: **$1.40 per 1,000 jobs** (event `JOB`) on the Apify Free plan, lower on paid plans. You only pay for results pushed to the dataset.

| Apify plan | Price per 1,000 jobs |
|---|---|
| Free | $1.40 |
| Starter | $1.20 |
| Scale | $1.00 |
| Business | $0.84 |

Set a maximum cost per run in the run options: the Actor stops cleanly when it is reached.

### Limitations

- Remote OK's public feed holds about 100 recent jobs; it has no logo, employment type or seniority fields, and its
  salaries are yearly USD.
- Jobicy only serves jobs published in the last 7 days, with a 3-hour publication delay. A job leaving the feed may
  still be open.
- Within one hour, runs on the same account use the same cached Jobicy snapshot, so very new Jobicy jobs can appear
  up to one hour later. Two runs started at the same second may both refresh the cache.
- Keyword and region matching is text matching on what each source publishes; location wording varies between
  sources ("USA", "United States", "Your Remote US Home Office").
- Duplicates across sources are detected on company + title; the same job with a reworded title is not merged.
- Descriptions are plain-text excerpts (500 characters); the full description is on `sourceUrl`.

### Related Actors

- [Career Site Jobs Scraper - Greenhouse, Lever, Ashby, Workday](https://apify.com/sweet_stickball/ats-jobs-scraper) — Career site jobs scraper and ATS jobs API alternative: extract job postings from Greenhouse, Lever, Ashby and Workday boards with title, department, locations, remote flag, employment type, salary range, posting date, apply URL and description.
- [Google Jobs Scraper API - Listings, Salaries & Apply Links](https://apify.com/sweet_stickball/google-jobs-scraper) — Scrape Google for Jobs listings: title, company, location, salary, apply links and posting date. Job postings data API for recruiters, no login needed.
- [Indeed Jobs Scraper API - Listings & Salaries, $0.50/1K](https://apify.com/sweet_stickball/indeed-job-scraper) — Scrape Indeed job listings: title, company, location, salary and job type in 6 countries (US, UK, FR, DE, CA, AU). Jobs data API, no login needed.

# Actor input Schema

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

Return jobs whose title, company or tags contain at least one of these words (whole-word, case-insensitive). Leave empty for all jobs.

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

Job APIs to query. Default: Remote OK and Jobicy.

## `tags` (type: `array`):

Keep jobs having at least one tag or category containing one of these words, e.g. 'engineering', 'marketing', 'customer support', 'devops'.

## `region` (type: `string`):

Keep jobs whose allowed location mentions this country or region, e.g. 'USA', 'Europe', 'UK', 'Canada', 'Germany'. 'USA', 'UK' and 'Europe' also match their usual aliases.

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

When a region is set, also keep jobs open to applicants anywhere ('Worldwide', 'Anywhere').

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

Only jobs published in the last N days. Leave empty for no limit (Jobicy only serves the last 7 days).

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

Maximum number of jobs to return, newest first, after filters and deduplication.

## Actor input object example

```json
{
  "keywords": [
    "python",
    "data engineer"
  ],
  "sources": [
    "remoteok",
    "jobicy"
  ],
  "tags": [
    "engineering"
  ],
  "region": "Europe",
  "includeWorldwide": true,
  "postedWithinDays": 3,
  "maxItems": 10
}
```

# Actor output Schema

## `jobs` (type: `string`):

Remote job offers shown with the 'jobs' 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": [],
    "sources": [
        "remoteok",
        "jobicy"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("sweet_stickball/remote-jobs-scraper").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": [],
    "sources": [
        "remoteok",
        "jobicy",
    ],
    "maxItems": 10,
}

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

```

## MCP server setup

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

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/mh7EiWozq45YVK96U/builds/4yS6gM4IdtXyr3R5m/openapi.json
