# Remoteok Scraper (`cryptosignals/remoteok-scraper`) Actor

- **URL**: https://apify.com/cryptosignals/remoteok-scraper.md
- **Developed by:** [Web Data Labs](https://apify.com/cryptosignals) (community)
- **Categories:** Jobs
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN 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/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## RemoteOK Jobs Scraper — 100K+ Remote Job Listings

⭐ **Found this useful?** [Leave a review](https://apify.com/cryptosignals/remoteok-scraper#reviews) — it helps other developers find this actor and motivates continued improvement.

---

Scrape remote job listings from [RemoteOK](https://remoteok.com) — one of the world's largest remote-only job boards. Filter by tech stack tags (Python, JavaScript, React, etc.) or keywords. Returns structured data with salary ranges, company info, apply links, and tech tags.

**No login required.** Uses RemoteOK's public API.

---

### Why RemoteOK?

RemoteOK is the go-to platform for remote-first companies posting developer, designer, and product roles. It aggregates listings from companies like Stripe, GitHub, Shopify, and thousands of startups offering fully remote positions.

Unlike LinkedIn or Indeed (which mix remote with on-site), **every job on RemoteOK is remote** — making it ideal for:
- Remote job market analysis
- Salary benchmarking for distributed teams
- Finding companies with remote-first culture
- Tech stack demand tracking

---

### Key Use Cases

#### 🔍 Remote Job Market Research
Analyze which tech stacks are in highest demand for remote roles. Compare salaries across technologies and seniority levels. Track which companies are hiring remotely at scale.

#### 💼 Talent Sourcing
Build pipelines of companies actively hiring remote developers in specific tech stacks. Filter by technology to find the most relevant opportunities.

#### 📊 Salary Benchmarking
RemoteOK includes salary ranges on many listings — use this data to benchmark compensation for remote roles across technologies and locations.

#### 🤖 Job Alert Automation
Schedule daily runs to monitor new remote listings matching specific tags. Get structured data you can pipe into Slack, email, or a spreadsheet.

#### 🧪 Market Intelligence
Track hiring trends over time. Which frameworks are declining? Which are exploding? Job posting data tells the story before industry reports do.

---

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `tags` | string | `""` | Comma-separated tech tags (e.g., `"python,django"`, `"javascript,react"`, `"devops,kubernetes"`) |
| `keywords` | string | `""` | Additional keyword filter (matches title, company, description) |
| `maxItems` | integer | `25` | Max results to return (1–500) |

#### Example Inputs

**All recent Python remote jobs:**
```json
{
  "tags": "python",
  "maxItems": 50
}
````

**Senior React jobs:**

```json
{
  "tags": "react,javascript",
  "keywords": "senior",
  "maxItems": 30
}
```

**All recent remote jobs (no filter):**

```json
{
  "maxItems": 100
}
```

**DevOps and infrastructure roles:**

```json
{
  "tags": "devops,kubernetes,docker",
  "maxItems": 50
}
```

***

### Sample Output

```json
{
  "title": "Senior Python Backend Engineer",
  "company": "Stripe",
  "location": "Worldwide",
  "salary": "$140,000 - $200,000/yr",
  "postedDate": "2026-04-10",
  "tags": ["python", "django", "postgresql", "aws"],
  "jobUrl": "https://remoteok.com/remote-jobs/senior-python-backend-engineer-stripe",
  "applyUrl": "https://stripe.com/jobs/listing/...",
  "description": "We're looking for a Senior Python Backend Engineer to join...",
  "isRemote": true,
  "logo": "https://remoteok.com/assets/img/jobs/...",
  "sourceId": "123456"
}
```

#### Output Fields

| Field | Description |
|-------|-------------|
| `title` | Job title |
| `company` | Company name |
| `location` | Location (usually "Worldwide" for remote) |
| `salary` | Salary range (when disclosed) |
| `postedDate` | ISO date when posted |
| `tags` | Technology/skill tags |
| `jobUrl` | Direct RemoteOK listing URL |
| `applyUrl` | Application URL (may differ from jobUrl) |
| `description` | Job description text (up to 2,000 chars) |
| `isRemote` | Always `true` for RemoteOK listings |
| `logo` | Company logo URL |
| `sourceId` | Unique RemoteOK job ID |

***

### Pricing

This actor uses **Pay Per Event (PPE)** pricing — you only pay for what you scrape.

| Event | Price |
|-------|-------|
| **Per result scraped** | **$0.003** |

**Examples:**

- 25 job listings → **$0.075**
- 100 job listings → **$0.30**
- 500 job listings → **$1.50**

No monthly fees. No minimum spend. Failed runs cost $0.

***

### Code Examples

#### Python — Scrape Python Jobs

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("cryptosignals/remoteok-scraper").call(run_input={
    "tags": "python",
    "maxItems": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['title']} at {item['company']} — {item['salary']}")
```

#### Node.js — Monitor New Remote Jobs

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('cryptosignals/remoteok-scraper').call({
  tags: 'javascript,typescript',
  maxItems: 30,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Found ${items.length} remote JS/TS jobs`);
```

***

### Popular Tech Tags

RemoteOK supports hundreds of tags. Common ones:

| Category | Tags |
|----------|------|
| Backend | `python`, `nodejs`, `ruby`, `golang`, `java`, `php`, `rust` |
| Frontend | `javascript`, `typescript`, `react`, `vue`, `angular` |
| Mobile | `ios`, `android`, `reactnative`, `flutter` |
| Data/AI | `machinelearning`, `datascience`, `ai`, `llm` |
| DevOps | `devops`, `kubernetes`, `docker`, `aws`, `gcp` |
| Design | `design`, `ux`, `figma` |
| Product | `product`, `productmanager` |

***

### FAQ

#### Does this require a RemoteOK account?

No. Uses the public RemoteOK API — no login, no API key, no account needed.

#### How current is the data?

Results are fetched in real-time when you run the actor. RemoteOK updates listings continuously.

#### Can I get salary data?

Yes, when companies disclose it. The `salary` field is populated when available.

#### What's the maximum number of results?

RemoteOK's API returns up to 100 recent jobs per tag. With multiple tags, you can get 500+ results. Use `maxItems` to cap the output.

#### How is this different from other job scrapers?

RemoteOK is **remote-only** — every listing is a fully remote position. This makes the data much cleaner for remote-focused research than LinkedIn or Indeed where remote vs on-site filtering is inconsistent.

***

### 🔗 See Also

- **[LinkedIn Jobs Scraper](https://apify.com/cryptosignals/linkedin-jobs-scraper)** — 1M+ LinkedIn job listings, salary data, company info
- **[Indeed Jobs Scraper](https://apify.com/cryptosignals/indeed-jobs-scraper)** — Indeed.com listings across US, UK, Canada, Australia, and more

***

### ⭐ Support This Actor

If this actor saved you time, please **[leave a quick review](https://apify.com/cryptosignals/remoteok-scraper#reviews)** — it takes 30 seconds and helps others discover it.

***

*Built and maintained by [cryptosignals](https://apify.com/cryptosignals).*

# Actor input Schema

## `tags` (type: `string`):

Comma-separated technology tags to filter jobs (e.g., 'python,javascript,react'). Leave empty to get all recent remote jobs.

## `keywords` (type: `string`):

Additional keyword filter applied after tag filtering. Matches against job title, company name, and description.

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

Maximum number of job listings to return (1-500). Each result costs $0.003.

## Actor input object example

```json
{
  "tags": "python,django",
  "keywords": "senior engineer",
  "maxItems": 25
}
```

# 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("cryptosignals/remoteok-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("cryptosignals/remoteok-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 '{}' |
apify call cryptosignals/remoteok-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Remoteok Scraper",
        "version": "0.1",
        "x-build-id": "88M1iNc9s2WJbOVJO"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/cryptosignals~remoteok-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-cryptosignals-remoteok-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/cryptosignals~remoteok-scraper/runs": {
            "post": {
                "operationId": "runs-sync-cryptosignals-remoteok-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/cryptosignals~remoteok-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-cryptosignals-remoteok-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "tags": {
                        "title": "Tech Stack Tags",
                        "type": "string",
                        "description": "Comma-separated technology tags to filter jobs (e.g., 'python,javascript,react'). Leave empty to get all recent remote jobs.",
                        "default": ""
                    },
                    "keywords": {
                        "title": "Keywords Filter",
                        "type": "string",
                        "description": "Additional keyword filter applied after tag filtering. Matches against job title, company name, and description.",
                        "default": ""
                    },
                    "maxItems": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of job listings to return (1-500). Each result costs $0.003.",
                        "default": 25
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
