# Recruitee Jobs API: Job Listings by Company (`conserving_celerytop/recruitee-jobs-api`) Actor

Get job listings from public Recruitee careers sites as JSON or CSV. Enter company names, then filter by keyword, department, country, remote and age, or get only new jobs since your last run. $1.20 per 1,000 jobs. Independent tool, not affiliated with Recruitee.

- **URL**: https://apify.com/conserving_celerytop/recruitee-jobs-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.90 / 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 Recruitee jobs API to get job listings from public Recruitee careers sites as JSON, CSV or Excel, for $1.20 per 1,000 jobs. Enter company names such as grid or bunq, filter by keyword, department, country, city, remote flag, employment type and age, or switch on Only new jobs since last run and schedule the Actor to get a daily feed of fresh jobs. It needs no login, no API key and no proxy.

The Actor reads the public JSON that every Recruitee careers site publishes at `https://company.recruitee.com/api/offers/`. It is an unofficial tool built by an independent developer. It is not affiliated with, endorsed by or operated by Recruitee or Tellent.

### What this Recruitee jobs API returns

One row is one open job. The fields are:

- Company (the subdomain), company name, job ID and title.
- Department, location text, city, country, country code and the list of all locations of the job.
- Remote flag and workplace types: remote, hybrid and onsite, as the company ticks them.
- Employment type, experience level and category, as Recruitee codes such as `fulltime_permanent`, `mid_level` and `information_technology`.
- Tags that the company set on the job.
- Salary minimum, maximum, currency and period, when the company publishes a range. Most Recruitee jobs list no salary.
- Posted at, updated at and closes at, in ISO 8601 UTC.
- Job URL and apply URL on the company careers site.
- Description text, only when you switch on Include job description. Email addresses, phone numbers and links to personal profiles are replaced by a marker.

The Actor never outputs the application form questions or the mailbox address that Recruitee creates for a job.

#### How it differs from our other jobs Actors

[Live Career Page Jobs API](https://apify.com/conserving_celerytop/live-career-page-jobs-api) reads 22 applicant tracking systems with one general input and one general output. This Actor does one system, Recruitee, and keeps its details: the list of every location, the workplace types, experience level, salary range, company name, a department, country, city and employment type filter, a limit per company, a link to a single job, and a named monitor for new jobs. Use the general one to cover many systems. Use this one when your list of companies is on Recruitee and you want clean, filtered rows.

### How to get Recruitee jobs, step by step

1. Open the Actor and go to Input.
2. Under Companies, enter one company per line. Write the subdomain (`grid`) or paste any URL of the careers site (`https://grid.recruitee.com/`). A URL of one job (`https://grid.recruitee.com/o/support-operator-latam-mfx`) returns that job only.
3. Optional: enter Keywords, Departments, Countries (name or two-letter code), Cities, Employment types, or a number under Posted within days. Switch on Remote jobs only to keep jobs that the company marks as remote.
4. 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.
5. Set Max jobs per company and Max results. The prefill is 5 and 5, so a first test costs under one cent.
6. Click Start. Open the Jobs view of the dataset, or download it as JSON, CSV or Excel, or read it through the Apify API.
7. For a daily feed, create a schedule for the Actor with the same input and the same Monitor name.

A careers site on a custom domain, such as careers.bunq.com, shows the same jobs as the subdomain bunq.recruitee.com. Enter the subdomain. The Actor cannot find the subdomain from a custom domain by itself.

The Actor sends one request at a time, at least one second apart, with one request per company. Recruitee publishes no rate limit for this endpoint. 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.

### Recruitee jobs API pricing

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

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

Worked example: a run that returns 100 jobs costs 100 x $0.0012 + $0.00005 = $0.12005. A daily run with Only new jobs that finds 12 new jobs costs 12 x $0.0012 + $0.00005 = $0.01445, so 30 such runs cost $0.4335 (the 12 jobs a day is an example, not a measured value). The test run in this README returned 9 jobs and cost 9 x $0.0012 + $0.00005 = $0.01085. A run that finds no job costs only $0.00005. A company that cannot be read (wrong name, closed API) returns no rows and costs nothing. Only saved rows are charged. Set Max results or a maximum charge per run to cap the cost.

### Input example

This is the input of a real test run on 11 October 2026 against the live careers site of grid.recruitee.com:

```json
{
  "companies": [
    "grid"
  ],
  "maxJobsPerCompany": 5,
  "maxResults": 5
}
```

It returned 5 rows in about one second, newest first. Two of them:

| Title | Department | Posted |
|---|---|---|
| Support Operator LATAM (m/f/x) | Support | 2026-10-09 |
| Match Administrator | Operations | 2026-10-05 |

The other three rows were jobs of the department Trading.

A second test run used four entries: `grid`, `https://bunq.recruitee.com/`, `kramp` and `nosuchcompany-zz9`, with Posted within days 14, Max jobs per company 5 and Only new jobs on. It returned 9 jobs. The company kramp had switched off its public API and nosuchcompany-zz9 does not exist, so the run status named both as not read and charged nothing for them. The same input run again returned the 2 jobs that the first run had cut off with the limit of 5 per company, and none of the 9 delivered ones.

### Output example

The input below returns one job with its text. It is a real row from the live site on 11 October 2026. The text of the description is shortened here to 160 characters for this page.

```json
{
  "companies": [
    "https://grid.recruitee.com/o/support-operator-latam-mfx"
  ],
  "includeDescription": true
}
```

```json
{
  "source": "Recruitee",
  "company": "grid",
  "companyName": "GRID eSports GmbH",
  "jobId": "2778516",
  "title": "Support Operator LATAM (m/f/x)",
  "department": "Support",
  "location": "Remote job",
  "city": "Buenos Aires",
  "country": "Argentina",
  "countryCode": "AR",
  "locations": [
    "Buenos Aires, Argentina",
    "São Paulo, Brazil",
    "Lima, Peru"
  ],
  "remote": true,
  "workplaceTypes": [
    "remote"
  ],
  "employmentType": "fulltime_permanent",
  "experienceLevel": "mid_level",
  "category": "information_technology",
  "tags": [
    "LATAM",
    "Remote"
  ],
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryPeriod": null,
  "postedAt": "2026-10-09T13:23:04.000Z",
  "updatedAt": "2026-10-09T13:41:08.000Z",
  "closesAt": null,
  "url": "https://grid.recruitee.com/o/support-operator-latam-mfx",
  "applyUrl": "https://grid.recruitee.com/o/support-operator-latam-mfx/c/new",
  "descriptionText": "- Do you enjoy helping customers with complex issues?\n- Are you a champion of customer-first processes?\n- Do you have an interest in competitive video gaming? ...",
  "retrievedAt": "2026-10-11T08:43:49.844Z"
}
```

### Run it every day

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

1. Enter your companies and 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 companies and 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: 12 new jobs a day cost 12 x $0.0012 + $0.00005 = $0.01445 a day, so 30 daily runs cost $0.4335 (the 12 jobs a day is an example, not a measured value).

### Related Actors

- [Live Career Page Jobs API](https://apify.com/conserving_celerytop/live-career-page-jobs-api): jobs from 22 applicant tracking systems with one input.
- [SmartRecruiters Jobs API](https://apify.com/conserving_celerytop/smartrecruiters-jobs-api): jobs from public SmartRecruiters career sites.
- [Teamtailor Jobs API](https://apify.com/conserving_celerytop/teamtailor-jobs-api): jobs from public Teamtailor career sites.
- [Greenhouse Jobs API](https://apify.com/conserving_celerytop/greenhouse-jobs-api): jobs from public Greenhouse job boards.

### FAQ

#### Is it legal to read Recruitee careers sites this way?

This is not legal advice. The endpoint answers without a login or a key today, and the careers sites of Recruitee customers use it to show jobs to visitors. Recruitee's customer terms and conditions (versions of October 2023 and April 2024) say that the careers site is meant "to provide the public with a list of job opportunities" and that the use of the careers site "is not intended to be private". They contain no sentence on scraping or automated reading. A Recruitee support article says "The Careers Site API requires authentication", and the API documentation announces a token for calls from 10 February 2027 (see the next question). Read those two statements before you build a product on this data. The robots.txt of a careers site subdomain (grid.recruitee.com, read on 11 October 2026) holds only "Disallow: /v/", which does not cover /api/offers/. The job text belongs to each company. Link to the job URL when you show a job, and do not present the text as your own.

#### Will it keep working?

Recruitee's documentation says: "Deadline for introducing the token to calls is 10 February 2027." Today the endpoint answers without a token, as the test runs show. After the deadline Recruitee can answer HTTP 401 to calls without a company-issued token. The Actor then stops at once, says so in the run status and charges nothing. If you read your own company's careers site, you can enter your own Careers API token in the Advanced field. The token covers only the company that issued it. The Actor cannot read other companies without their tokens.

#### Does the output hold personal data?

No. The Actor does not output names, emails or phone numbers of people. It replaces email addresses, phone numbers and personal profile links in the job text with a marker. It does not output the application form or the mailbox address of a job. 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 recruitee-jobs-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 or Max jobs per company stays new for the next run. The list forgets a job 90 days after it left the careers site. Use one Monitor name for each set of companies and filters.

#### How many companies can I read in one run?

Up to 300. The Actor waits one second between requests, so 300 companies take about five to six minutes.

#### How do I find the subdomain of a company?

Open the careers page of the company. If its jobs link to an address like `https://company.recruitee.com/o/job-name`, the subdomain is company. Many companies use a custom domain on the careers page but keep the recruitee.com link on each job.

#### Why does a company return no rows?

Check the run statistics (the STATS record). It lists each company with a status: ok, not_found (no Recruitee site with that name), api_disabled (the company switched off the public API) or an error text. If the status is ok and the rows are missing, the filters removed the jobs, or the company has no open jobs.

#### What does location Remote job mean?

Recruitee shows the text Remote job as the location of a job that the company marks as remote. The list in the field locations holds the real places that the company lists for the job.

# Actor input Schema

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

Enter one company subdomain or careers-site URL per line, such as grid or https://grid.recruitee.com/. A URL of one job, such as https://grid.recruitee.com/o/job-name, returns that job only.

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

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

## `departments` (type: `array`):

Enter one department name per line, such as Engineering. A job matches when its department contains any of them. Case is ignored.

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

Enter one country name or two-letter code per line, such as Germany or DE. A job matches when any of its locations is in one of them.

## `cities` (type: `array`):

Enter one city per line, such as Amsterdam. A job matches when any of its locations contains one of them.

## `remoteOnly` (type: `boolean`):

Return only jobs that the company marks as remote.

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

Enter one type per line, such as fulltime, parttime, freelance or internship. A job matches when its employment type code contains the text.

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

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

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

Return only jobs that are new to this Monitor name. Jobs delivered by earlier runs with the same Monitor name are skipped. 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 companies and 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.

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

Return at most this many jobs from each company, newest first.

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

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

## `careersApiToken` (type: `string`):

Enter the Careers API token that your own Recruitee company issued, if you read your own careers site and Recruitee requires the token. Leave the field empty for public reads.

## Actor input object example

```json
{
  "companies": [
    "grid"
  ],
  "remoteOnly": false,
  "onlyNew": false,
  "monitorName": "default",
  "includeDescription": false,
  "maxJobsPerCompany": 5,
  "maxResults": 5
}
```

# 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 = {
    "companies": [
        "grid"
    ],
    "maxJobsPerCompany": 5,
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/recruitee-jobs-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 = {
    "companies": ["grid"],
    "maxJobsPerCompany": 5,
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/recruitee-jobs-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 '{
  "companies": [
    "grid"
  ],
  "maxJobsPerCompany": 5,
  "maxResults": 5
}' |
apify call conserving_celerytop/recruitee-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conserving_celerytop/recruitee-jobs-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/I4ERdyGWZbjqqVeOC/builds/X60yF4Dh27jW3bYxw/openapi.json
