# We Work Remotely Jobs API: WWR and RemoteOK Feeds (`conserving_celerytop/remote-job-feeds-api`) Actor

Get remote jobs from We Work Remotely RSS feeds and the RemoteOK API in one list. Filter by category, keyword, age and salary, or return only new jobs since your last run. Every row has a source and a link back. $1.00 per 1,000 jobs. Independent tool, not affiliated with either site.

- **URL**: https://apify.com/conserving_celerytop/remote-job-feeds-api.md
- **Developed by:** [Don Mangu](https://apify.com/conserving_celerytop) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 job listings

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

Use this We Work Remotely jobs API to get remote jobs from the public We Work Remotely RSS feeds and the public RemoteOK API in one list, for $1.00 per 1,000 jobs. Every row names its source and holds a clickable link back to the original listing. Filter by category, keyword, age and salary. Switch on Only new jobs since last run and schedule the Actor to get a feed of fresh remote jobs each day.

You need no login, no API key and no proxy. The Actor reads two public sources and nothing else. It is an unofficial tool built by an independent developer. It is not affiliated with, endorsed by or operated by We Work Remotely or Remote OK.

### What this We Work Remotely jobs API returns

One row is one remote job. The fields are:

- Source and source URL: the site name and the link to the listing on that site. Always present.
- Title, company, category, job type, region, location and headquarters, as far as the source gives them.
- Tags: the skills of We Work Remotely or the tags of RemoteOK.
- Salary minimum and salary maximum, as RemoteOK publishes them. We Work Remotely feeds list no salary.
- Posted at and expires at.
- Apply URL from RemoteOK.
- Attribution: a ready credit line such as "Source: We Work Remotely (https://weworkremotely.com)".
- Description text, only when you switch on Include job description. Email addresses, phone numbers and links to personal profiles are replaced by a marker.

#### How it differs from our Remote Tech Jobs Search

[Remote Tech Jobs Search](https://apify.com/conserving_celerytop/remote-jobs-search) reads the career pages of 824 remote-first companies. This Actor reads two named job boards, We Work Remotely and RemoteOK. Use this one when you want these boards by name, one category at a time, or only the jobs that are new since your last run. Use the other one when you want jobs straight from company career pages.

### How to get remote jobs from We Work Remotely and RemoteOK, step by step

1. Open the Actor and go to Input.
2. Under Sources, keep both sources or pick one.
3. Under Categories, pick one or more categories such as All Programming or Design. Leave the list empty to read all categories.
4. Optional: enter Keywords, one per line, a number of days under Posted within days, or a Minimum salary.
5. Optional: switch on Only new jobs since last run and give the feed a Monitor name. The first run returns every matching job and sets the baseline. Later runs return only jobs that this Monitor name did not deliver before.
6. Set Max results. The prefill is 20, so a first test costs about two cents.
7. Click Start. Open the Jobs view of the dataset, or download it as JSON, CSV or Excel, or read it through the Apify API.
8. For a daily feed, create a schedule for the Actor with the same input and keep the same Monitor name.

The Actor sends one request at a time, at least one second apart, and reads 1 to 9 pages per run: one We Work Remotely feed per selected category (8 feeds when you pick none) and one RemoteOK request. Neither source publishes a rate limit. The Actor honours a Retry-After header and retries a failed request up to 3 times with growing waits. It does not solve CAPTCHAs and does not use proxies.

### Remote jobs API pricing

You pay per job returned. The event is called Job listing.

- $0.001 per Job listing, which is $1.00 per 1,000 jobs.
- A small start fee of $0.00005 per run.
- Discounts on higher Apify plans: $0.0009 (Bronze), $0.0008 (Silver), $0.0007 (Gold) per job.

Worked example: a run that returns 100 jobs costs 100 x $0.001 + $0.00005 = $0.10005. A daily run with Only new jobs that finds 15 new jobs costs 15 x $0.001 + $0.00005 = $0.01505, so 30 such runs cost $0.4515 (the 15 jobs a day is an example, not a measured value). A run that finds no job costs only $0.00005. Only saved rows are charged. Set Max results or a maximum charge per run to cap the cost.

### Input example

```json
{
  "sources": ["weworkremotely", "remoteok"],
  "categories": ["programming"],
  "keywords": ["python"],
  "postedWithinDays": 14,
  "onlyNew": true,
  "monitorName": "python-daily",
  "maxResults": 20
}
```

### Output example

This is output of a test run against recorded test data in the real field layout. It is not a live listing. The two sources were not reachable from the build environment, so a run against the live sites is NOT VERIFIED until the first platform run.

```json
{
  "source": "Remote OK",
  "jobId": "1100001",
  "title": "Senior Backend Engineer",
  "company": "Acme Data",
  "category": "Programming",
  "categoryFromTags": true,
  "jobType": null,
  "region": null,
  "location": "Worldwide",
  "headquarters": null,
  "tags": ["backend", "python", "engineer", "senior"],
  "salaryMin": 120000,
  "salaryMax": 160000,
  "postedAt": "2026-10-08T04:26:40.000Z",
  "expiresAt": null,
  "sourceUrl": "https://remoteok.com/remote-jobs/remote-senior-backend-engineer-acme-1100001",
  "applyUrl": "https://remoteok.com/l/1100001",
  "attribution": "Source: Remote OK (https://remoteok.com)",
  "descriptionText": "Build APIs. Reach out at [email removed] or [phone removed].",
  "retrievedAt": "2026-10-09T13:49:03.248Z"
}
```

A We Work Remotely row has the same fields. It fills job type, region, location and headquarters, and leaves salary and apply URL empty.

### Run it every day

Use this to get a feed of fresh remote jobs once a day.

1. Enter your filters.
2. Turn on **Only new jobs since last run** (`onlyNew`).
3. Give the feed a **Monitor name** (`monitorName`). Use one name for each set of filters.
4. Save the input as a task and add a daily schedule with the same input and the same Monitor name.

The first run returns every matching job and sets the baseline. Each later run returns only jobs that the Monitor name did not deliver before. Example: 15 new jobs a day cost 15 x $0.001 + $0.00005 = $0.01505 a day, so 30 daily runs cost $0.4515 (the 15 jobs a day is an example, not a measured value).

### Related Actors

- [Remote Tech Jobs Search](https://apify.com/conserving_celerytop/remote-jobs-search): remote jobs from 824 remote-first company career pages.
- [Tech Jobs Search](https://apify.com/conserving_celerytop/tech-jobs-search): AI, startup and remote tech jobs.
- [Startup Jobs Search](https://apify.com/conserving_celerytop/startup-jobs-search): jobs at startups.
- [AI Jobs Search](https://apify.com/conserving_celerytop/ai-jobs-search): LLM and ML jobs.
- [Visa Sponsorship Jobs](https://apify.com/conserving_celerytop/visa-sponsorship-jobs): jobs that sponsor visas.

### FAQ

#### Is it legal to use We Work Remotely and RemoteOK jobs this way?

This is not legal advice. Both sources invite reuse of their public feed with a link back. We Work Remotely, on its feed page weworkremotely.com/remote-job-rss-feed: "Anyone can use the feed, all we ask is that you attribute the links back to We Work Remotely". RemoteOK, in the legal field of its public API: "Please link back (with follow, and without nofollow!) to the URL on Remote OK and mention Remote OK as a source, so we get traffic back from your site. If you do not we'll have to suspend API access."

The We Work Remotely terms page (last updated 20 July 2026, read on 9 October 2026) has no sentence about feeds, scraping or reuse of listings. It states that content is copyright of the owners. The robots.txt of We Work Remotely allows the category feeds and sets no crawl delay.

#### What do I have to do to credit the sources?

Show the Attribution line, or the words "Source: We Work Remotely" or "Source: Remote OK", next to each job. Link each job to its Source URL with a normal link. For RemoteOK, use a followed link, not a nofollow link, and name Remote OK as the source. Do not use the Remote OK logo: RemoteOK states it is a registered trademark.

#### Does the output hold personal data?

No. The Actor does not output the names, emails or phone numbers of people. It replaces email addresses, phone numbers and personal profile links in the job text with a marker. Company names are public business data.

#### How does Only new jobs since last run work?

The Actor keeps a list of delivered jobs in a key-value store in your Apify account, named remote-job-feeds-state, one list per Monitor name. A job counts as delivered after it is saved in the dataset. A job that was cut off by Max results stays new for the next run. The list forgets a job 90 days after it left the feeds. Use one Monitor name for each set of filters.

#### Why do I get fewer jobs than on the websites?

The We Work Remotely feeds list recent jobs only, and the RemoteOK API returns the jobs it publishes at that time. The run statistics (the STATS record) show how many jobs each source gave. Filters remove the rest.

#### How is the RemoteOK category set?

RemoteOK has no category field. The Actor places each job in a group from its tags, for example devops, design or sales. This is approximate. The field categoryFromTags tells you which rows use it.

#### A source failed. What happens?

The other source still delivers, and the run status names the source that failed. You pay only for saved rows. If both sources fail, the run ends with an error and charges nothing. A long Retry-After from a source ends the request at once, so run again later.

# Actor input Schema

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

Pick the job feeds to read. Each row names its source and links back to the listing on that site.

## `categories` (type: `array`):

Pick one or more categories. We Work Remotely jobs come from the feed of each category. RemoteOK lists jobs by tags, so its jobs are placed in a category from their tags. Leave the list empty to read all categories.

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

Enter one word or phrase per line, such as python or customer success. A job matches when its title, company, tags or text contains any of them.

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

Return jobs posted in the last N days. Leave the field empty for every age.

## `minSalary` (type: `number`):

Return jobs whose highest listed salary is at least this number, as the source publishes it. Only RemoteOK lists salaries, so this filter removes We Work Remotely jobs.

## `onlyNew` (type: `boolean`):

Return only jobs that earlier runs with the same Monitor name delivered before. The first run with a Monitor name returns every matching job and sets the baseline. Schedule the Actor daily to get a feed of fresh jobs.

## `monitorName` (type: `string`):

Enter a short name for this feed, using letters, digits and hyphens. Each name keeps its own list of delivered jobs in your account. Use one name per set of filters.

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

Add the job text as plain text to every row in the field descriptionText. Email addresses, phone numbers and links to personal profiles are replaced by a marker.

## `maxResults` (type: `integer`):

Return at most this many jobs in total. Each job returned is one charged result.

## `userAgent` (type: `string`):

Both sites see this text in every request. The default names this Actor and holds only the tool name. Enter your own tool name and contact email if a site asks for one.

## Actor input object example

```json
{
  "sources": [
    "weworkremotely",
    "remoteok"
  ],
  "categories": [
    "programming"
  ],
  "onlyNew": false,
  "monitorName": "default",
  "includeDescription": false,
  "maxResults": 20,
  "userAgent": "RemoteJobFeedsActor-bot/1.0 (Apify Actor; unofficial reader of public remote job feeds; no contact given)"
}
```

# Actor output Schema

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

No description

## `stats` (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 = {
    "sources": [
        "weworkremotely",
        "remoteok"
    ],
    "categories": [
        "programming"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/remote-job-feeds-api").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 = {
    "sources": [
        "weworkremotely",
        "remoteok",
    ],
    "categories": ["programming"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/remote-job-feeds-api").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 '{
  "sources": [
    "weworkremotely",
    "remoteok"
  ],
  "categories": [
    "programming"
  ],
  "maxResults": 20
}' |
apify call conserving_celerytop/remote-job-feeds-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conserving_celerytop/remote-job-feeds-api"
        }
    }
}
```

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/mr01CN8tpdCGLHMpo/builds/Wb7WBqaQgvNvkuoXM/openapi.json
