# WeWorkRemotely Jobs Scraper: Remote Jobs, Salary and New Alerts (`getascraper/weworkremotely-jobs-scraper`) Actor

Get remote jobs from WeWorkRemotely across all ten categories in one run, deduplicated and newest first. Filter by keyword, region, country, job type, freshness and salary. Pay ranges and skills come as clean fields, with optional descriptions and company details, plus a new-jobs-only monitor mode.

- **URL**: https://apify.com/getascraper/weworkremotely-jobs-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (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.68 / 1,000 job postings

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

## WeWorkRemotely Jobs Scraper: Remote Jobs, Salary and New Alerts

<table width="100%" style="margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#F0FDFA;border:1px solid #99F6E4;border-top:4px solid #0F766E;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Get every remote job on WeWorkRemotely in one clean list, with pay ranges and skills already pulled out.</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">All ten categories in a single run, deduplicated and newest first. Filter by keyword, skill, company, seniority, region, country, job type and salary, or schedule it to receive only new postings.</span>
</td>
</tr>
</table>
<table width="100%" style="margin-top:0">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#115E59">🗂️ Whole board</span><br>
<span style="font-size:12px;color:#57534E">All ten categories in one run, merged into one list with no repeats.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#115E59">💰 Pay as numbers</span><br>
<span style="font-size:12px;color:#57534E">Stated salary ranges come as minimum, maximum, currency and period.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#115E59">🔎 Filters that combine</span><br>
<span style="font-size:12px;color:#57534E">Keywords, skills, company, seniority, region, job type, freshness and salary floor in one search.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#115E59">🔔 New jobs only</span><br>
<span style="font-size:12px;color:#57534E">Schedule it and get just the postings you have not seen before.</span>
</td>
</tr>
</table>

**WeWorkRemotely Jobs Scraper** collects the remote job postings listed on [WeWorkRemotely](https://weworkremotely.com), one of the best known remote job boards. Each run returns one record per job with the company, role, category, job type, region, eligible countries, skills, posting and expiry dates, and the pay range when the posting states one.

The site spreads its jobs over ten category pages and has no way to filter across them. This Actor reads all of them at once, removes duplicates and applies your filters to the whole board. Full job descriptions and company details are one checkbox away.

No WeWorkRemotely account is needed.

### 🙋 Why use it

- **I am a recruiter** who sources for remote roles. I filter for worldwide jobs that name a minimum salary, so I only spend time on openings that fit my candidates.
- **I run a niche job board.** I schedule the new jobs mode once a day, and every run hands me only the postings I have not published yet.
- **I research pay for remote work.** I get stated salary ranges as numbers with a currency and a pay period, instead of copying them out of descriptions by hand.
- **I am a remote job seeker.** I search all categories for "python" or "customer success" in one go and sort out the roles open to my country.

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Choose what you want</span><br>
<span style="font-size:12px;color:#57534E">Pick categories, add keywords, and set region, country, job type and pay filters.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run the Actor</span><br>
<span style="font-size:12px;color:#57534E">It reads the live board, merges the categories and keeps the jobs that match.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Export or schedule</span><br>
<span style="font-size:12px;color:#57534E">Download JSON, CSV or Excel, or run it on a schedule for a new jobs feed.</span>
</td>
</tr>
</table>

No coding required. Click **Try for free**, adjust the Input tab and press **Start**. A first run with the default settings returns the 20 newest jobs from the last 30 days.

### ⚙️ Input

The form is grouped into sections. Every field is optional.

**🗂️ Job categories**

| Field | Type | Description |
| --- | --- | --- |
| `categories` | array of enum | Categories to read: full-stack, front-end and back-end programming, DevOps and sysadmin, design, product, customer support, sales and marketing, management and finance, or all other. Leave empty for all ten. |

**🔎 Keywords and skills**

| Field | Type | Description |
| --- | --- | --- |
| `keywords` | array of strings | Keep jobs whose title, company, skills or description mention at least one of these words or phrases. |
| `titleKeywords` | array of strings | Keep jobs whose job title contains at least one of these words. Stricter than keywords. |
| `skills` | array of strings | Keep jobs that list at least one of these skills. Partial matches count. |
| `excludeKeywords` | array of strings | Drop jobs whose title, company or skills mention any of these words. |

**🌍 Location and eligibility**

| Field | Type | Description |
| --- | --- | --- |
| `regions` | array of enum | Where you can work from: anywhere in the world, USA only, North America, Americas, Europe, EMEA, or other. |
| `countries` | array of strings | Keep jobs that list one of these countries as eligible, for example Canada or United Kingdom. |
| `excludeCountries` | array of strings | Drop jobs that list any of these countries as eligible. |
| `locations` | array of strings | Keep jobs whose region, state or listed countries contain one of these words, for example Texas or Asia. |

**💼 Role and employer**

| Field | Type | Description |
| --- | --- | --- |
| `jobTypes` | array of enum | Full-time, contract, part-time or freelance. |
| `seniority` | array of enum | Intern, junior, mid, senior, lead or director, read from the job title when it states a level. |
| `companies` | array of strings | Keep jobs from companies whose name contains one of these words. |
| `excludeCompanies` | array of strings | Drop jobs from companies whose name contains any of these words. |
| `companyHeadquarters` | array of strings | Keep jobs from companies whose published headquarters contain one of these words. |
| `onlyWithCompanyWebsite` | boolean | Keep only jobs where the employer published a company website. |

**💰 Pay and freshness**

| Field | Type | Description |
| --- | --- | --- |
| `postedWithinDays` | integer | Only jobs posted in the last N days. The board still lists some old postings, so the default is 30. |
| `excludeExpired` | boolean | Drop jobs whose listing has already passed its expiry date. |
| `salaryOnly` | boolean | Keep only jobs whose posting states a pay range. |
| `minAnnualSalary` | integer | Keep jobs whose stated pay, converted to a yearly amount, reaches this number. Amounts are compared as written, without currency conversion. |
| `salaryCurrencies` | array of strings | Keep jobs whose stated pay is in one of these currencies, such as USD, EUR or GBP. |

**📦 Output and limits**

| Field | Type | Description |
| --- | --- | --- |
| `maxResults` | integer | Number of jobs to return. Default 20. |
| `sortBy` | enum | Newest first (default), oldest first, highest stated pay first, company name or job title. |
| `maxJobsPerCompany` | integer | Return at most this many jobs per company. 0 means no limit. |

**🧩 Extra details**

| Field | Type | Description |
| --- | --- | --- |
| `includeDescription` | boolean | Add the full job description as text and as HTML. |
| `includeCompanyDetails` | boolean | Add company headquarters, website and logo when the employer published them. |

**🔔 New jobs monitoring**

| Field | Type | Description |
| --- | --- | --- |
| `onlyNewJobs` | boolean | Return only jobs not returned by an earlier run with the same watchlist name. |
| `monitorScope` | string | Watchlist name. Use one name per search so each keeps its own list of seen jobs. |
| `resetSeenJobs` | boolean | Forget the jobs remembered under this watchlist name before the run. |

### 📦 Output

Every run produces one dataset row per job. Here is a real example with company details turned on:

```json
{
    "jobId": "vertex-marketing-group-distribution-engineer",
    "url": "https://weworkremotely.com/remote-jobs/vertex-marketing-group-distribution-engineer",
    "title": "Distribution Engineer",
    "company": "Vertex Marketing Group",
    "category": "Back-End Programming",
    "jobType": "Full-Time",
    "region": "Anywhere in the World",
    "state": "Lemesos",
    "skills": ["Python", "API", "DevOps", "Android", "iOS"],
    "postedAt": "2026-10-20T11:32:37.000Z",
    "expiresAt": "2026-11-19T11:32:37.000Z",
    "salaryText": "$4,000 to $6,000",
    "salaryMin": 4000,
    "salaryMax": 6000,
    "salaryCurrency": "USD",
    "salaryPeriod": "month",
    "companyHeadquarters": "Bulgaria",
    "companyWebsite": "https://vertexmg.com",
    "companyLogoUrl": "https://wwr-pro.s3.amazonaws.com/logos/0171/6611/logo.gif",
    "scrapedAt": "2026-10-23T18:06:48.732Z"
}
```

Download the dataset as JSON, CSV, HTML or Excel, or read it through the Apify API. Fields a posting does not provide are left out instead of filled with placeholders.

### 📋 Data table

| Field | Type | Description |
| --- | --- | --- |
| `jobId` | string | Stable identifier of the posting, usable as a unique key. |
| `url` | string | Link to the posting on WeWorkRemotely, where you apply. |
| `title` | string | Job title without the company prefix. |
| `company` | string | Hiring company. |
| `category` | string | WeWorkRemotely category of the job. |
| `jobType` | string | Full-Time, Contract, Part-Time or Freelance. |
| `seniority` | string | Intern, junior, senior, lead or director, only when the job title states a level. |
| `region` | string | Region the job is open to, as posted, such as "Anywhere in the World" or "USA Only". |
| `countries` | array | Countries the employer lists as eligible, when it lists any. |
| `state` | string | State or province given by the employer, when present. |
| `skills` | array | Skills listed by the employer, when present. |
| `postedAt` | string | Posting date and time in ISO format. |
| `expiresAt` | string | Date the posting expires. |
| `salaryText` | string | Pay range as written in the posting. |
| `salaryMin` | number | Lower end of the stated pay range. |
| `salaryMax` | number | Upper end of the stated pay range. |
| `salaryCurrency` | string | Currency code of the stated pay. |
| `salaryPeriod` | string | Pay period: year, month or hour. |
| `companyHeadquarters` | string | Company headquarters, when company details are on and the employer gave one. |
| `companyWebsite` | string | Company website, when company details are on and the employer gave one. |
| `companyLogoUrl` | string | Company logo image, when company details are on and the job has one. |
| `description` | string | Full job description as plain text, when descriptions are on. |
| `descriptionHtml` | string | Full job description with formatting, when descriptions are on. |
| `scrapedAt` | string | Time the record was collected. |

Salary fields appear only when the posting states a clear pay range. Roughly half of postings do.

### 💰 Pricing

This Actor is pay per result. You are billed for the job records that land in your dataset. There are no subscriptions or monthly fees. Check the Actor's **Pricing** tab on Apify Store for the current rate.

Free plan runs are limited to 25 jobs per run, 3 runs per day and a short wait between runs.

### ⭐ Enjoying WeWorkRemotely Jobs Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#F0FDFA;border:1px solid #99F6E4;border-left:5px solid #0F766E;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">One filtered list of remote jobs replaces ten category pages and a lot of copy and paste.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other recruiters and job board owners find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#0F766E;border:1px solid #99F6E4;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/weworkremotely-jobs-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### 💡 Tips for better runs

- Leave `categories` empty and use `keywords` to search the whole board at once. WeWorkRemotely's own search cannot do this across categories.
- Raise `maxResults` to collect the full board. A full run returns a few hundred jobs.
- Turn on `salaryOnly` with `minAnnualSalary` to build a list of well paid remote roles. Hourly and monthly pay is converted to a yearly amount for the comparison.
- For a new jobs feed, turn on `onlyNewJobs`, give each search its own `monitorScope`, and attach a schedule. The first run returns the current jobs and remembers them.
- Turn on `includeDescription` only when you need the text. Leaving it off keeps the dataset small.

### ❓ FAQ

##### Does it need a login or get blocked?

No. It reads the public job listings of WeWorkRemotely. No account, cookies or API keys are involved.

##### How many jobs are there?

The board holds a few hundred live postings at any time across the ten categories. Some older postings stay listed for months, which is why the default shows the last 30 days.

##### Does every job have a salary?

No. Roughly half of the postings state a pay range, and only those get salary fields. Jobs without a stated range have no salary fields at all, and nothing is guessed.

##### Does it return an apply link or contact details?

Each record links to the posting page on WeWorkRemotely, where candidates apply. Company website and headquarters are included when the employer published them. Personal contact details are never collected.

##### How do I get only new remote jobs every day?

Turn on `onlyNewJobs`, pick a watchlist name and schedule the Actor. Each run returns only postings that were not returned before under that name.

### 🔗 Other actors

- [Web3Career Jobs Scraper: Crypto Jobs, Salary Data & New Alerts](https://apify.com/getascraper/web3career-jobs-scraper) ↗ - Crypto and blockchain job listings with remote and salary filters and a new jobs mode.
- [Welcome to the Jungle Scraper: WTTJ Jobs, Salary, Remote, RAG](https://apify.com/getascraper/welcome-to-the-jungle-jobs-scraper) ↗ - Jobs from Welcome to the Jungle by keyword, country, contract type and remote policy.
- [Handshake Jobs Scraper: Internships, Salaries & Job Deadlines](https://apify.com/getascraper/handshake-jobs-scraper) ↗ - Public Handshake jobs and internships with salary ranges and application deadlines.
- [Ashby Jobs Scraper: Hiring Change Monitor](https://apify.com/getascraper/ashby-jobs-monitor) ↗ - Tracks new, updated and closed roles on public Ashby job boards.
- [Lever Jobs Scraper: Company Hiring Change Feed](https://apify.com/getascraper/lever-jobs-monitor) ↗ - Tracks new, updated and closed postings on public Lever job boards.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/weworkremotely-jobs-scraper/changelog.md

# Actor input Schema

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

Which WeWorkRemotely job categories to read. Leave empty to read all ten categories in one run, so you get the full board instead of only the newest 100 or so listings of the global feed.

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

Keep only jobs whose title, company, skills or description mention at least one of these words or phrases, for example python, react, customer success. Case-insensitive. Leave empty for no keyword filter.

## `titleKeywords` (type: `array`):

Keep only jobs whose job title contains at least one of these words, for example engineer, designer, account executive. Stricter than Keywords because the description is not searched. Case-insensitive. Leave empty for no title filter.

## `skills` (type: `array`):

Keep only jobs that list at least one of these skills in their skills tags, for example typescript, figma, seo. Partial matches count. Jobs with no skills tags are dropped when this is set.

## `excludeKeywords` (type: `array`):

Drop jobs whose title, company or skills mention any of these words, for example intern, unpaid. Case-insensitive. Leave empty to keep everything.

## `regions` (type: `array`):

Keep only jobs open to workers in these areas. Worldwide means no location restriction. Leave empty for every region.

## `countries` (type: `array`):

Keep only jobs that name one of these countries as an eligible work country, for example Canada or United Kingdom. Matches the country names the employer listed, case-insensitive. Jobs that list no country are dropped when this is set.

## `excludeCountries` (type: `array`):

Drop jobs that list any of these countries as an eligible work country, for example India. Jobs that list no country are kept. Case-insensitive.

## `locations` (type: `array`):

Keep only jobs whose region, state or listed countries contain at least one of these words, for example Texas, Berlin, Asia. Use it for places that the region list above does not cover. Case-insensitive.

## `jobTypes` (type: `array`):

Keep only these employment types. Leave empty for all types.

## `seniority` (type: `array`):

Keep only jobs whose title states one of these levels, for example Senior or Junior. Only titles that spell out a level are matched, so jobs without a level word in the title are dropped when this is set. Each result also carries a seniority field.

## `companies` (type: `array`):

Keep only jobs from companies whose name contains one of these words, for example stripe, automattic. Case-insensitive. Use it to follow a list of target employers.

## `excludeCompanies` (type: `array`):

Drop jobs from companies whose name contains any of these words. Case-insensitive. Useful to hide recruiters or employers you have already contacted.

## `companyHeadquarters` (type: `array`):

Keep only jobs from companies whose published headquarters contain one of these words, for example London, California, Germany. Jobs whose company did not publish a headquarters are dropped when this is set.

## `onlyWithCompanyWebsite` (type: `boolean`):

Keep only jobs where the employer published a company website. Handy for building outreach lists, since each result then carries a company website when company details are switched on.

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

Keep only jobs posted in the last N days. The board still lists some postings that are months old, so this keeps the results fresh. Raise it (up to 3650) to include older postings.

## `excludeExpired` (type: `boolean`):

Drop jobs whose listing has already passed its expiry date, so you only see roles you can still apply for.

## `salaryOnly` (type: `boolean`):

Keep only jobs whose posting states a pay range, which is read into the salary fields of each result.

## `minAnnualSalary` (type: `integer`):

Keep only jobs whose stated pay, converted to a yearly amount, is at least this number. Amounts are compared as written in the posting without currency conversion. Jobs with no stated pay are dropped when this is set. Leave at 0 to switch it off.

## `salaryCurrencies` (type: `array`):

Keep only jobs whose stated pay is in one of these currencies, as three-letter codes such as USD, EUR, GBP or CAD. Pair it with Minimum yearly salary so amounts are compared in the same currency. Jobs with no stated pay are dropped when this is set.

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

Stop after this many jobs, in the chosen order. The default of 20 keeps test runs fast. Raise it to collect more of the board (a full run is a few hundred jobs).

## `sortBy` (type: `string`):

Order of the results before the maximum is applied. Newest first is best for feeds. Highest pay puts jobs with a stated salary first. Jobs that state no pay come last.

## `maxJobsPerCompany` (type: `integer`):

Return at most this many jobs from any one company, so a single employer with many openings cannot fill the list. Leave at 0 for no limit.

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

Add the full job description as plain text and as HTML to every result. Off by default so results stay small and quick to scan.

## `includeCompanyDetails` (type: `boolean`):

Add the company headquarters, company website and logo URL to every result when the employer published them.

## `onlyNewJobs` (type: `boolean`):

Return only postings that were not returned by an earlier run with the same watchlist name. The first run returns the current jobs and remembers them. Schedule the actor daily or hourly for a new-jobs feed.

## `monitorScope` (type: `string`):

Name that keeps one watchlist separate from another. Runs that share a name share the list of jobs already seen, so use a different name for each filter combination. Only letters, numbers and dashes are kept.

## `resetSeenJobs` (type: `boolean`):

Forget every job remembered under this watchlist name before the run, so the next results are treated as new again. Only has an effect when monitoring is on.

## Actor input object example

```json
{
  "categories": [],
  "keywords": [],
  "titleKeywords": [],
  "skills": [],
  "excludeKeywords": [],
  "regions": [],
  "countries": [],
  "excludeCountries": [],
  "locations": [],
  "jobTypes": [],
  "seniority": [],
  "companies": [],
  "excludeCompanies": [],
  "companyHeadquarters": [],
  "onlyWithCompanyWebsite": false,
  "postedWithinDays": 30,
  "excludeExpired": false,
  "salaryOnly": false,
  "minAnnualSalary": 0,
  "salaryCurrencies": [],
  "maxResults": 20,
  "sortBy": "newest",
  "maxJobsPerCompany": 0,
  "includeDescription": false,
  "includeCompanyDetails": false,
  "onlyNewJobs": false,
  "monitorScope": "default",
  "resetSeenJobs": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (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 = {
    "categories": [],
    "keywords": [],
    "titleKeywords": [],
    "skills": [],
    "excludeKeywords": [],
    "regions": [],
    "countries": [],
    "excludeCountries": [],
    "locations": [],
    "jobTypes": [],
    "seniority": [],
    "companies": [],
    "excludeCompanies": [],
    "companyHeadquarters": [],
    "onlyWithCompanyWebsite": false,
    "postedWithinDays": 30,
    "excludeExpired": false,
    "salaryOnly": false,
    "minAnnualSalary": 0,
    "salaryCurrencies": [],
    "maxResults": 20,
    "sortBy": "newest",
    "maxJobsPerCompany": 0,
    "includeDescription": false,
    "includeCompanyDetails": false,
    "onlyNewJobs": false,
    "monitorScope": "default",
    "resetSeenJobs": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/weworkremotely-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 = {
    "categories": [],
    "keywords": [],
    "titleKeywords": [],
    "skills": [],
    "excludeKeywords": [],
    "regions": [],
    "countries": [],
    "excludeCountries": [],
    "locations": [],
    "jobTypes": [],
    "seniority": [],
    "companies": [],
    "excludeCompanies": [],
    "companyHeadquarters": [],
    "onlyWithCompanyWebsite": False,
    "postedWithinDays": 30,
    "excludeExpired": False,
    "salaryOnly": False,
    "minAnnualSalary": 0,
    "salaryCurrencies": [],
    "maxResults": 20,
    "sortBy": "newest",
    "maxJobsPerCompany": 0,
    "includeDescription": False,
    "includeCompanyDetails": False,
    "onlyNewJobs": False,
    "monitorScope": "default",
    "resetSeenJobs": False,
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/weworkremotely-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 '{
  "categories": [],
  "keywords": [],
  "titleKeywords": [],
  "skills": [],
  "excludeKeywords": [],
  "regions": [],
  "countries": [],
  "excludeCountries": [],
  "locations": [],
  "jobTypes": [],
  "seniority": [],
  "companies": [],
  "excludeCompanies": [],
  "companyHeadquarters": [],
  "onlyWithCompanyWebsite": false,
  "postedWithinDays": 30,
  "excludeExpired": false,
  "salaryOnly": false,
  "minAnnualSalary": 0,
  "salaryCurrencies": [],
  "maxResults": 20,
  "sortBy": "newest",
  "maxJobsPerCompany": 0,
  "includeDescription": false,
  "includeCompanyDetails": false,
  "onlyNewJobs": false,
  "monitorScope": "default",
  "resetSeenJobs": false
}' |
apify call getascraper/weworkremotely-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/weworkremotely-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/nTUKmUcIt7dW06NDc/builds/wOOPfmuPQh6jlW9uP/openapi.json
