# RemoteOK Jobs Scraper (`schnellscrapers/remoteok-jobs-scraper`) Actor

Scrape RemoteOK jobs from the official public JSON API: title, company, tags, location, salary, description, posting date, job URL, and apply link. Filter by tags, keywords, company, location, and salary with no login, browser, or proxy. Pay per emitted job with direct source links.

- **URL**: https://apify.com/schnellscrapers/remoteok-jobs-scraper.md
- **Developed by:** [Nate Schnell](https://apify.com/schnellscrapers) (community)
- **Categories:** Jobs, 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 jobs

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### What does RemoteOK Jobs Scraper do?

RemoteOK Jobs Scraper pulls current remote job listings from RemoteOK's public JSON API and returns one clean dataset item per job. Recruiters, job-board operators, hiring teams, and remote-work analysts can filter by tags, keywords, company, location, or declared salary without a login, browser, or proxy.

Every record keeps a direct `jobUrl` back to the original RemoteOK listing and the source API URL used for the fetch. RemoteOK's API terms ask published uses to mention RemoteOK and link back, so keep those attribution fields when you export or republish the jobs.

### What data can you extract from RemoteOK?

- Job identity — `id`, `slug`, `title`, `jobUrl`, `applyUrl`
- Hiring company — `company`, `companyUrl`, `companyLogoUrl`
- Remote work details — `location`, `tags`, `description`, `datePosted`, `postedEpoch`
- Compensation and quality — `salaryMin`, `salaryMax`, and `verified` when the source supplies them
- Provenance — `source`, `sourceUrl`, and `scrapedAt`

The API is a recent flat feed rather than a historical archive. A normal response contains about 100 current jobs. Supplying several tags makes one request per tag, then the actor removes duplicate job IDs before filters and billing.

### How to use RemoteOK Jobs Scraper

1. Open the actor and leave the tag list empty for the latest feed, or add tags such as `python`, `react`, `devops`, `design`, or `marketing`.
2. Add a keyword, company, location, excluded tag, or minimum salary filter if you need a focused hiring feed.
3. Set `maxItems` to a small number such as `20` for a bounded test. Use `includeDescription: false` when you only need links and metadata.
4. Click **Run** and wait for the dataset to finish.
5. Download the jobs as JSON, CSV, or Excel, or read them through the Apify Dataset API.

### How much does it cost?

RemoteOK Jobs Scraper uses pay-per-event pricing at $1.00 per 1,000 emitted jobs. One matching dataset item is one billable job; jobs removed by tags, keywords, salary, company, location, or non-tech filters are not billed. There is no actor-specific free tier, but the Apify Free plan's monthly platform credit covers small tests. Use `dryRun: true` to fetch and validate without writing result items, or set `maxItems` to control a paid run.

The $1.00 / 1,000-job price sits at the low end of the current RemoteOK Store band while leaving room for the small compute cost of one public JSON request per feed. No residential proxy is required.

### Input

The most useful fields are `tags`, `keywordFilter`, `companyName`, `locationFilter`, `excludeTags`, `minSalary`, and `maxItems`. An empty JSON object uses the latest feed. `includeUnverified` is left on by default because RemoteOK commonly omits the verification flag; setting it to false keeps only records explicitly marked verified.

```json
{
  "tags": ["python", "react"],
  "keywordFilter": "senior",
  "minSalary": 100000,
  "maxItems": 50,
  "includeDescription": true
}
```

### Output

Each dataset item has the same shape, whether it came from the full feed or a tag request. Salary, company links, and verification are `null` when RemoteOK does not publish those values.

```json
{
  "id": "1136223",
  "slug": "remote-cabin-crew-virtual-interviews-pan-india-akasa-air-1136223",
  "title": "Cabin Crew Virtual Interviews PAN India",
  "company": "Akasa Air",
  "companyUrl": null,
  "location": "India",
  "tags": ["customer support", "marketing", "ops"],
  "salaryMin": null,
  "salaryMax": null,
  "datePosted": "2026-08-05T11:45:49+00:00",
  "postedEpoch": 1785923149,
  "jobUrl": "https://remoteok.com/remote-jobs/remote-cabin-crew-virtual-interviews-pan-india-akasa-air-1136223",
  "applyUrl": "https://remoteOK.com/remote-jobs/remote-cabin-crew-virtual-interviews-pan-india-akasa-air-1136223",
  "description": "...",
  "companyLogoUrl": null,
  "verified": null,
  "source": "RemoteOK",
  "sourceUrl": "https://remoteok.com/api",
  "scrapedAt": "2026-08-06T18:26:50.000Z"
}
```

### Integrations

Trigger RemoteOK Jobs Scraper from a schedule or webhook, then send the dataset to Make, n8n, Zapier, Airtable, Slack, a CRM, or your own service. You can also call it from Python or Node.js with the [Apify API](https://docs.apify.com/api/v2) and download JSON, CSV, or Excel from the dataset.

### Related actors

- [Greenhouse Jobs Scraper](https://apify.com/schnellscrapers/greenhouse-jobs-scraper) — pull live jobs from Greenhouse-hosted career boards.
- [Ashby Jobs Scraper](https://apify.com/schnellscrapers/ashby-jobs-scraper) — pull live jobs from Ashby-hosted career boards.

### FAQ

#### How does RemoteOK Jobs Scraper work?

It requests `https://remoteok.com/api`, or the same endpoint with a tag query, parses the JSON feed, normalizes each job, deduplicates multi-tag results, applies filters, and pushes only matching records.

#### Can I use RemoteOK Jobs Scraper as an API?

Yes. Start a run with `POST https://api.apify.com/v2/acts/<username>~remoteok-jobs-scraper/runs?token=<APIFY_TOKEN>` and read the default dataset through the Apify API. The actor page's API tab provides ready-to-run examples.

#### Can I use RemoteOK Jobs Scraper in Python or Node.js?

Yes. Use the official `apify-client`, call `client.actor("<username>/remoteok-jobs-scraper").call({ runInput: { tags: ["python"] } })`, and iterate the returned dataset.

#### Is it legal to scrape RemoteOK?

This actor requests RemoteOK's public JSON API rather than private pages. Follow RemoteOK's current API terms, keep the direct source link and RemoteOK attribution, respect rate limits, and make sure your use of job or personal data complies with applicable privacy and employment laws.

#### Does RemoteOK Jobs Scraper return old jobs or paginate the full archive?

No. The public API is a recent flat feed, currently about 100 jobs per request. Use a scheduled run to build your own time series; use multiple tags for current category coverage and let the actor deduplicate overlapping jobs.

### Your feedback

If a RemoteOK field changes shape or you need another filter, open an issue on the actor page with a small example input and the run ID. Feature requests for additional job-board sources are welcome too.

# Actor input Schema

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

Filter jobs by any RemoteOK tag, such as `python`, `react`, `devops`, `design`, `marketing`, or `customer support`. Each tag requests the current feed and results are deduplicated.

## `keywordFilter` (type: `string`):

Keep jobs whose title, company, tags, or description contains this case-insensitive phrase (e.g. `senior`, `typescript`, or `startup`). Leave blank to keep all matching jobs.

## `companyName` (type: `string`):

Keep jobs whose company name contains this case-insensitive text (e.g. `GitLab` or `Acme`). Leave blank to include every company.

## `locationFilter` (type: `string`):

Keep jobs whose location contains this case-insensitive text (e.g. `Worldwide`, `Europe`, or `US`). Leave blank to include every location.

## `excludeTags` (type: `array`):

Drop jobs carrying any of these tags (e.g. `non tech` or `crypto`). This exclusion runs before dataset writes and billing.

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

Keep only jobs whose declared salary maximum is at least this annual USD amount. Jobs without salary data are excluded when this filter is greater than zero.

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

Keep the cleaned plain-text job description in each record. Turn off to reduce dataset size when you only need job metadata and links.

## `includeUnverified` (type: `boolean`):

When false, keep only records explicitly marked verified by the source. RemoteOK often omits this flag, so leave true unless your feed has verification data.

## `filterNonTech` (type: `boolean`):

Drop obvious non-technical roles such as receptionist, driver, nurse, accountant, and warehouse positions. Leave off for a complete remote job feed.

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

Hard cap on total jobs emitted across the full feed or all tag requests. Use a small value such as `20` for a cost-bounded smoke run; set `0` for the full matching feed.

## `maxItemsPerTag` (type: `integer`):

Limit records considered from each tag request before deduplication. RemoteOK returns a flat recent feed rather than numbered pages; use this with `maxItems` to bound multi-tag runs.

## `dryRun` (type: `boolean`):

Fetch, filter, and validate jobs without writing dataset records. Use for local or deployed previews when you want to inspect logs without billing result events.

## Actor input object example

```json
{
  "tags": [
    "python",
    "react"
  ],
  "excludeTags": [],
  "minSalary": 0,
  "includeDescription": true,
  "includeUnverified": true,
  "filterNonTech": false,
  "maxItems": 100,
  "maxItemsPerTag": 100,
  "dryRun": false
}
```

# Actor output Schema

## `records` (type: `string`):

Default dataset of RemoteOK jobs. Key fields: title, company, tags, salaryMin, salaryMax, description, jobUrl, and applyUrl.

# 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 = {
    "tags": [
        "python",
        "react"
    ],
    "keywordFilter": "",
    "companyName": "",
    "locationFilter": "",
    "excludeTags": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("schnellscrapers/remoteok-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 = {
    "tags": [
        "python",
        "react",
    ],
    "keywordFilter": "",
    "companyName": "",
    "locationFilter": "",
    "excludeTags": [],
}

# Run the Actor and wait for it to finish
run = client.actor("schnellscrapers/remoteok-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tags": [
    "python",
    "react"
  ],
  "keywordFilter": "",
  "companyName": "",
  "locationFilter": "",
  "excludeTags": []
}' |
apify call schnellscrapers/remoteok-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=schnellscrapers/remoteok-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qiuSjyR3Fx2dfblod/builds/AyTTF0B1wQCB5UBUe/openapi.json
