# Remote Job Postings Feed (`jetlaunch/open-jobs-api-feed`) Actor

Search and monitor remote job postings from the Jobicy public Jobs API in one clean schema.

- **URL**: https://apify.com/jetlaunch/open-jobs-api-feed.md
- **Developed by:** [Chris O'Byrne](https://apify.com/jetlaunch) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 job posting returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Job Postings Feed

This Actor reads remote job postings from the public Jobs API of Jobicy (jobicy.com) and returns them in one clean, flat schema. You can search by keyword, location, category, employment type, seniority and salary, or run it on a schedule in "new since last run" mode so that each run returns only postings you have not seen before.

It uses only the official public API at jobicy.com/api/jobs. There is no scraping, no login, no API key and no proxy. The API terms say Jobicy listings may be used in your own products, including commercial ones, and may be stored and redistributed, provided Jobicy is credited with a link to the original posting. Every record carries that credit and the Jobicy link.

### Who is it for

- Recruiters, staffing agencies and HR tech teams that need remote vacancies in a spreadsheet or database.
- Job boards, newsletters and career tools that want a steady feed of new remote postings with a proper source credit.
- Analysts who track remote hiring by category, seniority or stated salary.
- Developers who want a ready-made, normalized job record without reading the API documentation.

### What you get

One record per posting: source, id, title, employer name, the location the job is open to, remote flag, employment type, seniority, salary minimum, maximum, currency and period (when the posting states a salary), tags (job categories), publication time, a plain text description (length capped by you), the posting URL and an attribution line.

No personal data is returned. Contact persons, e-mail addresses and phone numbers are not copied from the API. E-mail addresses and phone numbers that employers type into the description are masked as \[email removed] and \[phone removed]. The masking is best effort and cannot catch every written-out contact detail or name.

### Input

| Field | Meaning |
| --- | --- |
| keywords | Up to 5 search words, 3 to 50 characters each. Any or all (keywordMatch). Leave empty for the newest postings. |
| geo | Where applicants must be located, as defined by Jobicy: a country, a region such as Europe or APAC, or Anywhere. |
| industry | Job category as defined by Jobicy, for example Software Engineering. |
| employmentTypes | Full time, part time, contract, freelance, internship. |
| seniority | Words matched against the seniority level, for example Senior. |
| onlyWithSalary | Keep only postings that state a salary. |
| publishedSince | Only postings published on or after this date. |
| maxResults | 1 to 5,000. Default 25. |
| descriptionMaxChars | Cap for the description text. 0 removes it. Default 3,000. |
| mode, monitorName | search, or new-since-last-run with the name of the saved search. |

The prefill (keyword "developer", 25 results) finishes in a few seconds.

### Monitor mode

In new-since-last-run mode the Actor remembers the ids of the postings it has returned, in a named key-value store in your own account called open-jobs-api-feed-state, under the key SEEN- plus your monitor name. The first run of a monitor returns the newest matches and remembers all current ones. Later runs return only postings whose id was not seen before, each marked isNew true. Use one monitor name per saved search and keep its filters the same between runs. Create a schedule in Apify to run it every few hours or daily.

### Output example

```json
{
  "source": "jobicy.com",
  "id": "156249",
  "title": "Database Support Engineer (Japanese Speaking)",
  "employer": "Supabase",
  "location": "APAC",
  "remote": true,
  "employmentType": "Full-Time",
  "seniority": "Entry-Level, Junior",
  "salaryMin": null,
  "salaryMax": null,
  "tags": ["Technical Support"],
  "publishedAt": "2026-10-21T18:05:10+00:00",
  "description": "About Supabase ...",
  "applyUrl": "https://jobicy.com/jobs/156249-database-support-engineer-japanese-speaking",
  "attribution": "Source: Jobicy (https://jobicy.com)"
}
```

### Pricing

Pay per event. You pay only for postings written to the dataset, never for empty or failed runs.

| Event | Price | When it is charged |
| --- | --- | --- |
| job-record | $0.0015 per posting | Each posting returned in search mode |
| new-job-record | $0.002 per posting | Each new posting returned in new-since-last-run mode |

In monitor mode only new-job-record is charged, not job-record. Postings already seen are skipped and free. If your run reaches its spending limit, the Actor stops cleanly.

### FAQ

**Is it allowed to use this data commercially?** The Jobicy API documentation says the free API may be used in commercial projects, that listings may be stored, cached and redistributed, and that no separate agreement is needed. The conditions are to credit Jobicy as the source and to keep the link to the original Jobicy posting. If you republish these records, keep the applyUrl and the attribution. Do not present them as your own original postings.

**Why does applyUrl point to jobicy.com?** The source requires that application links stay on the original Jobicy posting page. The Actor does not fetch the paid direct employer links.

**Can I get Germany or another country?** Choose it in the location filter. Jobicy classifies a posting by where applicants may be located, so a Germany filter returns remote jobs open to applicants in Germany, not all jobs in Germany.

**How fresh is it?** Jobicy lists postings from the last 7 days and delays new postings by about 3 hours. To respect the source's request to start a new synchronization pass at most once per hour, the Actor caches each upstream query for 60 minutes in your account, so a repeated run within the hour reads the cache.

### Limitations

- Remote jobs only, last 7 days only. Older postings are not available from the source.
- No application deadline: the source does not provide one. Salary is present only when the employer stated it.
- Keywords are a text search in Jobicy, limited to 3 to 50 characters and 5 keywords per run. Several keywords with "any" matching use one upstream query each.
- Requests are sent one at a time, about one per second at most, with automatic retries and backoff.
- Data quality and wording come from the employers and from Jobicy and are not verified by this Actor.

### Data source and disclaimer

Data: Jobicy (jobicy.com) public Jobs API, https://jobicy.com/api/jobs, terms at https://jobicy.com/jobs-rss-feed. Listings belong to Jobicy and the hiring employers and are used under Jobicy's API terms. This Actor is not affiliated with or endorsed by Jobicy or any employer named in the data.

### Support

Questions, bug reports and feature requests are welcome in the Issues tab of this Actor.

# Actor input Schema

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

Search words, one per line, for example python or product designer. Each keyword must be 3 to 50 characters. Leave empty to list the newest postings.

## `keywordMatch` (type: `string`):

Any: a posting matches when it contains at least one keyword. All: a posting must contain every keyword.

## `geo` (type: `string`):

Where applicants must be located, as defined by Jobicy: a country, a region such as Europe or APAC, or Anywhere for postings open worldwide. Choose Any location for no filter.

## `industry` (type: `string`):

Job category as defined by Jobicy.

## `employmentTypes` (type: `array`):

Optional. Keep only postings with at least one of these types. Leave empty for all.

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

Optional. Words matched against the seniority level of the posting, one per line, for example Senior or Junior.

## `onlyWithSalary` (type: `boolean`):

Keep only postings that state a minimum or maximum salary.

## `publishedSince` (type: `string`):

Optional. Only postings published on or after this date (YYYY-MM-DD). The source only lists the last 7 days.

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

Maximum number of postings to return. You are charged per posting returned.

## `descriptionMaxChars` (type: `integer`):

Maximum characters of plain text description per posting. Set 0 for no description.

## `mode` (type: `string`):

Search: return the matching postings every run. New since last run: return only postings not returned by an earlier run of the same monitor name. The first run of a monitor returns the newest matches and remembers all current ones. Billed as new-job-record per new posting.

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

Used only in new-since-last-run mode. Runs with the same name share one list of seen posting ids, so use one name per saved search and keep the filters the same between runs.

## Actor input object example

```json
{
  "keywords": [
    "developer"
  ],
  "keywordMatch": "any",
  "geo": "any",
  "industry": "any",
  "onlyWithSalary": false,
  "maxResults": 25,
  "descriptionMaxChars": 3000,
  "mode": "search",
  "monitorName": "default"
}
```

# Actor output Schema

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

One record per posting with title, employer, location, employment terms, salary where stated, tags, publication date, description and link.

# 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 = {
    "keywords": [
        "developer"
    ],
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("jetlaunch/open-jobs-api-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 = {
    "keywords": ["developer"],
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("jetlaunch/open-jobs-api-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 '{
  "keywords": [
    "developer"
  ],
  "maxResults": 25
}' |
apify call jetlaunch/open-jobs-api-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jetlaunch/open-jobs-api-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/PSuremDD3VkCnUfHR/builds/LDh4Dqvh6TtTEJVTa/openapi.json
