# Remote Jobs Scraper (`goat255/remoteok-scraper`) Actor

Scrape the latest remote jobs without a login. Filter by category tag or keyword, or pull every fresh listing. Returns clean rows with title, company, location, salary range, tags, apply link, and full description.

- **URL**: https://apify.com/goat255/remoteok-scraper.md
- **Developed by:** [Goutam Soni](https://apify.com/goat255) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## 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

## Remote Jobs Scraper

Scrape the latest remote job listings into clean structured data with no login and no API key required. Extract remote job title, company, location, salary range, tags, apply link, and full description, filtered by category tag or keyword.

### What it does

- **Latest remote jobs** across every category when you run it with no filter.
- **Category filter** by tag (for example `python`, `javascript`, `design`, `marketing`, `devops`, `sales`). Any job carrying one of your tags is returned.
- **Keyword search** matched against each job's title, company, tags, and location. Each query returns its own set of matching jobs, so you can pull several roles in one run.
- **Clean output** with a plain-text description and the original HTML, normalized dates, deduped rows, and importance-ordered columns ready for a spreadsheet or database.

No account, no password, no API key. Set your filters and get structured rows back.

### Use cases

- **Job board and aggregator feeds**: pull fresh remote roles on a schedule to populate your own listings or newsletter.
- **Recruiting and sourcing**: monitor new remote openings by stack or role to spot hiring companies early.
- **Market and salary research**: track which skills and tags are in demand and capture published salary ranges for compensation benchmarking.
- **Lead generation**: build a list of companies actively hiring remote talent in your niche for outreach.
- **Hiring trend dashboards**: feed normalized rows into BI tools to chart remote hiring over time by category.

### Input

| Field | Type | Description |
|---|---|---|
| `tags` | array | Category tags to filter by, lowercase (for example `python`, `design`, `marketing`). Empty returns all categories. |
| `searchQueries` | array | Keyword searches matched over each job's title, company, tags, and location. Each query returns its own matching jobs. |
| `maxItems` | integer | Cap on jobs returned per filter. Default 100. |
| `proxyConfig` | object | Optional proxy configuration. Not required for this source. |

#### Example input

```json
{
  "tags": ["python", "backend"],
  "searchQueries": ["senior engineer"],
  "maxItems": 100
}
````

### Output

Each job is one clean row. Columns are ordered by importance: identity first, then salary, then content, then metadata.

```json
{
  "id": "1234567",
  "position": "Senior Backend Engineer",
  "company": "Acme Co",
  "location": "Lisboa, Portugal",
  "url": "https://example.com/remote-jobs/senior-backend-engineer-acme-co-1234567",
  "applyUrl": "https://example.com/remote-jobs/senior-backend-engineer-acme-co-1234567",
  "slug": "senior-backend-engineer-acme-co-1234567",
  "salaryMin": 90000,
  "salaryMax": 130000,
  "tags": ["python", "backend", "api"],
  "description": "Acme Co is hiring a senior backend engineer to build...",
  "descriptionHtml": "<p>Acme Co is hiring a senior backend engineer to build...</p>",
  "postedAt": "2026-06-16T19:45:27.000Z"
}
```

#### Key fields

- `position`, `company`, `location`: the core role identity. Location is cleaned of duplicate and trailing tokens.
- `url` / `applyUrl`: links to view and apply for the job.
- `salaryMin` / `salaryMax`: the published salary range. These are `null` when the listing does not publish a salary, which is common.
- `tags`: the skills and categories attached to the job.
- `description` / `descriptionHtml`: the full job text as clean plain text and as the original HTML.
- `postedAt`: ISO-8601 timestamp of when the job was posted.

### FAQ

**Is it free? What does it cost?**
Pricing is shown on the actor's Store page. There is no separate account or subscription to the data source needed.

**Do I need a login or API key?**
No. The scraper reads a public listing of the latest remote jobs. No account, password, or API key is required.

**How many jobs can I get per run?**
The source exposes the latest remote postings (around 100 at a time). `maxItems` caps your result within that set. Tag and keyword filters narrow it further, each returning its own matching rows.

**How fast is it?**
A run completes in seconds. It performs a small number of requests and returns the full available set in one pass.

**Can I filter by skill or role?**
Yes. Use `tags` for category filtering (for example `python` or `design`) and `searchQueries` for free-text keyword matching over title, company, tags, and location.

**Why is the salary range empty for some jobs?**
Many remote listings do not publish a salary. When no range is available, `salaryMin` and `salaryMax` are returned as `null` rather than guessed.

# Actor input Schema

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

Filter the latest remote jobs to those carrying any of these tags. Lowercase, e.g. python, javascript, design, marketing, devops. Leave empty for all categories.

## `searchQueries` (type: `array`):

Keyword searches matched against each job's title, company, tags, and location. Each query returns its own matching jobs. Example: senior backend, product designer.

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

Cap on the number of jobs returned per filter. The feed holds the latest jobs (about 100), so values above that return the full available set.

## `proxyConfig` (type: `object`):

Optional proxy. The public feed does not require a proxy, but you may route through one if you wish.

## Actor input object example

```json
{
  "tags": [
    "python"
  ],
  "searchQueries": [],
  "maxItems": 100,
  "proxyConfig": {
    "useApifyProxy": false
  }
}
```

# 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"
    ],
    "searchQueries": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("goat255/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 = {
    "tags": ["python"],
    "searchQueries": [],
}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Remote Jobs Scraper",
        "description": "Scrape the latest remote jobs without a login. Filter by category tag or keyword, or pull every fresh listing. Returns clean rows with title, company, location, salary range, tags, apply link, and full description.",
        "version": "0.1",
        "x-build-id": "J23MwkcZEx9wxJ2nh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/goat255~remoteok-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-goat255-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/goat255~remoteok-scraper/runs": {
            "post": {
                "operationId": "runs-sync-goat255-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/goat255~remoteok-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-goat255-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": "Tags (category filter)",
                        "type": "array",
                        "description": "Filter the latest remote jobs to those carrying any of these tags. Lowercase, e.g. python, javascript, design, marketing, devops. Leave empty for all categories.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search queries (keyword filter)",
                        "type": "array",
                        "description": "Keyword searches matched against each job's title, company, tags, and location. Each query returns its own matching jobs. Example: senior backend, product designer.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Cap on the number of jobs returned per filter. The feed holds the latest jobs (about 100), so values above that return the full available set.",
                        "default": 100
                    },
                    "proxyConfig": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxy. The public feed does not require a proxy, but you may route through one if you wish.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
