# Remote Jobs Feed: Remote Jobs from 40,000+ Company Career Sites (`tidelane/remote-jobs-feed`) Actor

Remote jobs straight from company career sites (Greenhouse, Lever, Ashby, Workday, ADP and 13 more), refreshed daily. Filter by where you may work from (anywhere, Europe, US, a country), title, salary, date. Shows if a job is open worldwide, to regions or countries. Only new jobs since the last run.

- **URL**: https://apify.com/tidelane/remote-jobs-feed.md
- **Developed by:** [Tidelane Data](https://apify.com/tidelane) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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/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

## Remote Jobs Feed: Remote Jobs from 40,000+ Company Career Sites

Get **remote jobs straight from the employers' own career sites**, filtered by where you are allowed to work from. The feed is collected every day from more than 40,000 company career sites on 18 systems (Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee, Personio, BambooHR, Rippling, Oracle, Teamtailor, Pinpoint, Breezy HR, d.vinci, ADP, Paylocity, Jobvite), often before they reach the big job boards, and without reposts and duplicates.

- ✅ **Remote jobs only:** the company marks the job remote, or the location says Remote, Work from home, Home office, Télétravail and the like. Jobs the company marks hybrid or on-site stay out (or add hybrid jobs with one switch)
- ✅ **Where you may work from:** Anywhere, Europe, EMEA, North America, Americas, LATAM, APAC, Middle East, Africa or any country. *Remote (Europe)* matches Germany, a job open worldwide matches everyone
- ✅ **Each job says who can take it:** `remoteScope` is `anywhere`, `regions` (for example Remote EMEA), `countries` (for example Remote - US) or `unspecified` (just *Remote*), and `remoteRegions` lists the regions
- ✅ **Filters:** title words and excluded words, companies, job board systems, posted within N days, new in the feed within N hours, salary published, words in the description
- ✅ **Extra fields and filters, no AI costs:** seniority (intern to executive), years of experience asked, skills (about 110 tools and technologies), yearly salary (hourly and monthly pay converted), visa sponsorship and the ad's language. Filter for example on senior Python jobs, roles asking at most 2 years, jobs offering visa sponsorship or pay from 100,000 USD a year
- ✅ **Only new jobs:** schedule it daily with *Only jobs new since my last run* and get just the jobs you have not seen yet
- ✅ **Fast and cheap:** a search over the whole feed takes well under a minute, and you pay only for the jobs you get

### What can you use it for?

- **Remote job boards and newsletters:** fill your board or weekly email with fresh remote jobs for your audience, for example remote engineering jobs open to Europe
- **Job alerts:** a daily schedule with *only new jobs* and a webhook to Slack, Telegram, email or Google Sheets
- **Job seekers:** find every remote job you can actually take from your country, not only the ones on the big boards
- **Market research:** which companies hire remotely, for which roles and regions, and what they pay
- **AI agents:** give an agent current remote jobs through the Apify API or MCP

### How to use it

1. Enter where you may work from, for example `Europe` and `Germany`, or leave it empty for all remote jobs.
2. Add title keywords such as `software engineer` or `marketing`.
3. Choose how many jobs you want in **Max results** (newest first) and run.
4. Download the results as JSON, CSV, Excel or HTML, or connect them to Google Sheets, Make, Zapier or n8n. For alerts, turn on **Only jobs new since my last run** and create a daily schedule.

#### Input example

```json
{
    "remoteFrom": ["Europe", "Germany"],
    "titleKeywords": ["engineer", "developer"],
    "titleExcludeKeywords": ["intern"],
    "postedWithinDays": 7,
    "maxResults": 200
}
```

#### Output example

```json
{
    "title": "Growth Marketing Manager - Affiliates & Partnerships (Maternity cover) (f/m/x)",
    "companyName": "Feather",
    "location": "EU Remote | Berlin",
    "locations": [
        "EU Remote | Berlin"
    ],
    "countries": [
        "DE"
    ],
    "workplaceType": "remote",
    "remoteScope": "regions",
    "remoteRegions": [
        "europe",
        "emea"
    ],
    "employmentType": "temporary, full-time",
    "department": "Growth & Marketing",
    "team": "Senior Content, SEO and GEO Manager",
    "salary": {
        "min": 48000,
        "max": 65000,
        "currency": "EUR",
        "interval": "yearly",
        "text": null
    },
    "postedAt": "2026-10-12T13:05:07.000Z",
    "firstSeenAt": "2026-10-21T06:44:08.688Z",
    "jobUrl": "https://feather.jobs.personio.com/job/2838368",
    "applyUrl": "https://feather.jobs.personio.com/job/2838368#apply",
    "ats": "personio",
    "companySlug": "feather",
    "jobId": "personio:feather:2838368"
}
```

Fields a career site does not publish are `null`. `countries` are ISO codes derived from the location texts. `postedAt` is the date the career site reports; when it reports none, `firstSeenAt` (the day the feed first found the job) is used for sorting and the date filters.

Each run also saves a summary as `OUTPUT` in the key-value store: when the feed was updated, how many jobs it holds, how many matched and how many were returned.

### Pricing

You pay per job returned. Searching is free, so filters cost nothing. Set **Max results** or a run spending limit to cap the cost of a run.

### FAQ

**How do you know where I may work from?** From the job's own location texts. *Remote (Europe)*, *EMEA - Remote* or *LATAM* name a region; *Remote - US* or *Germany (Remote)* name countries; *Worldwide* or *Work from anywhere* mean anywhere. Jobs that only say *Remote* are often limited to the company's home country, so they are left out when you set a place, unless you turn on *Also jobs that just say Remote*. Always check the posting for time zone or visa requirements.

**How are seniority, experience and skills found?** With fixed rules from the title and the ad text, not AI, so they cost nothing extra and give the same answer every time. Seniority comes from the title (Senior, Junior, Head of, Werkstudent, ...) or, without such a word, from the years of experience the ad asks for. Experience is the first "3+ years" or "mindestens 3 Jahre" the ad links to experience. Visa sponsorship is `true` or `false` only when the ad says so, otherwise `null`.

**Which companies are in the feed?** Companies whose career site runs on one of the 18 systems above and that are publicly linked on the web, found through the open Common Crawl web index. Missing a company? Use our *Career Site Jobs* Actor with the company's career page URL.

**How fresh is it?** The whole feed is collected once a day; the `OUTPUT` summary shows the time of the last update. Closed jobs disappear with the next update.

**Why is there no full job description?** The ad texts belong to the employers. The feed searches them for your description words and gives you the facts and the link to the original posting, where the text is always up to date.

**Is it legal?** The feed uses the public job board APIs that these systems publish so that job ads can be found, plus the public job lists of career sites on systems such as Workday, Oracle and ADP. It returns structured facts and links, not the ad texts, and no personal data. You are responsible for how you use the data. If in doubt, ask a lawyer.

Found a bug or need a filter? Open an issue on the Actor page and we will look at it quickly.

***

#### Impressum (Angaben gemäß § 5 DDG)

Levi Griesinger, Tidelane Data\
Besigheimer Straße 18\
74369, Löchgau, Deutschland\
E-Mail: LeviGriesinger@gmail.com

# Actor input Schema

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

Keep jobs whose title contains at least one of these words. A word matches at the start of a word, so engineer also finds Engineering. Case and accents are ignored. Leave empty for all titles.

## `titleExcludeKeywords` (type: `array`):

Drop jobs whose title contains any of these words, e.g. intern, senior, manager.

## `remoteFrom` (type: `array`):

Keep remote jobs open to people in at least one of these places. Use regions (Anywhere, Europe, EMEA, North America, Americas, LATAM, APAC, Middle East, Africa) or countries (Germany, DE, United States). Jobs open worldwide always match; a job for Remote (Europe) matches Germany. Leave empty for all remote jobs.

## `includeUnspecifiedRemote` (type: `boolean`):

Some jobs only say Remote without a country or region. They are often limited to the company's home country. Turn this on to get them too when you set Where you may work from.

## `includeHybrid` (type: `boolean`):

Add hybrid jobs (some days in an office) in the places above.

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

Keep jobs of companies whose name or board slug contains one of these texts.

## `ats` (type: `array`):

Limit to some systems. Leave empty for all.

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

Keep jobs posted in the last N days. Jobs without a posting date count from the day the feed first saw them. 0 means no date filter.

## `newInFeedWithinHours` (type: `integer`):

Keep jobs the feed first saw in the last N hours, e.g. 24 for jobs that appeared since yesterday. 0 means no filter.

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

Keep only jobs that publish a salary range.

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

Keep jobs of these levels. The level comes from the job title (e.g. Senior, Junior, Head of, Werkstudent) or, without a title word, from the years of experience the ad asks for.

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

Keep jobs that mention at least one of these skills, e.g. Python, React, SAP, Excel, AutoCAD. Matching uses our list of about 110 common tools and technologies (see the README).

## `maxExperienceYears` (type: `integer`):

Keep jobs that ask for at most this many years of experience, e.g. 2 for junior roles. Jobs that state no number pass. 0 means no filter.

## `visaSponsorshipOnly` (type: `boolean`):

Keep only jobs whose ad says visa sponsorship or visa support is available.

## `languages` (type: `array`):

Keep jobs whose ad is written in one of these languages.

## `minYearlySalary` (type: `integer`):

Keep jobs whose published pay reaches at least this amount per year (hourly, daily and monthly pay is converted to a year). Combine with the currency field. 0 means no filter.

## `salaryCurrency` (type: `string`):

3-letter currency code for the salary filter, e.g. USD, EUR or GBP. Leave empty for any currency.

## `descriptionKeywords` (type: `array`):

Keep jobs whose description contains at least one of these words, e.g. python, visa sponsorship. The full text is searched; each result lists the words it matched in matchedKeywords. Checked on the newest matches of the other filters (at least 5,000 or 20 times Max results).

## `onlyNewSinceLastRun` (type: `boolean`):

Skip jobs this search already returned in an earlier run. Ideal for a daily schedule. The list of returned job IDs is kept in your own key-value store remote-job-feed-state.

## `stateKey` (type: `string`):

Give each scheduled search its own name, so two searches do not share their list of returned jobs.

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

Newest jobs first. Up to 100,000 per run.

## Actor input object example

```json
{
  "titleKeywords": [
    "software engineer",
    "data"
  ],
  "remoteFrom": [
    "Europe",
    "Germany"
  ],
  "includeUnspecifiedRemote": false,
  "includeHybrid": false,
  "postedWithinDays": 0,
  "newInFeedWithinHours": 0,
  "salaryOnly": false,
  "visaSponsorshipOnly": false,
  "onlyNewSinceLastRun": false,
  "maxResults": 100
}
```

# Actor output Schema

## `results` (type: `string`):

All results of the run as dataset items.

## `summary` (type: `string`):

Summary per input with status (ok, error and the reason).

# 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 = {
    "titleKeywords": [
        "software engineer",
        "data"
    ],
    "remoteFrom": [
        "Europe",
        "Germany"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidelane/remote-jobs-feed").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 = {
    "titleKeywords": [
        "software engineer",
        "data",
    ],
    "remoteFrom": [
        "Europe",
        "Germany",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("tidelane/remote-jobs-feed").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 '{
  "titleKeywords": [
    "software engineer",
    "data"
  ],
  "remoteFrom": [
    "Europe",
    "Germany"
  ]
}' |
apify call tidelane/remote-jobs-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidelane/remote-jobs-feed"
        }
    }
}
```

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/yvXX8z59iePuU8Q7P/builds/aQPEZWTAgusvVis2H/openapi.json
