# Teamtailor Jobs Scraper API: Career Site Jobs Feed (`conserving_celerytop/teamtailor-jobs-api`) Actor

Get open jobs from Teamtailor career sites by company name or career-site address. Filter by keyword, department, location, remote and age, or return only new jobs since your last run. One row per job with a link. $1.00 per 1,000 jobs. Independent tool, not affiliated with Teamtailor.

- **URL**: https://apify.com/conserving_celerytop/teamtailor-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.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

### What this Teamtailor jobs API returns

This Actor lists the open jobs of companies that use Teamtailor for their career site. Enter company names such as `polestar`, or career site addresses such as `https://jobs.example.com/jobs`. You get one row per job with the title, department, division, role, locations, remote status, publication date and a link to the job page. It reads the public RSS feed that every Teamtailor career site publishes at `/jobs.rss`. You need no account, no API key and no proxy.

Use it to:

- watch which departments a company is hiring in,
- build a feed of new jobs from a list of employers, on a schedule,
- collect remote or hybrid jobs from many Teamtailor career sites in one table,
- pull jobs for a job board, a newsletter or a market study, with a link back to each job.

Most career sites in the test runs of this Actor belong to employers in Sweden.

What makes it different from a general career page tool:

- It is built for Teamtailor only, so rows carry Teamtailor fields: department, division, role, every location and the remote status.
- Filters run before you pay. Keyword, department, location, remote and age filters remove jobs first, and you pay only for the jobs that match.
- A career site on its own domain works too, for example `jobs.example.com`, when that domain serves the Teamtailor feed.
- The "only new jobs" mode keeps a list of delivered jobs per Monitor name, so a daily schedule returns only fresh jobs.
- Before it reads a feed, it reads the `robots.txt` of that career site and skips the feed when the file disallows it.

### How to get jobs from Teamtailor career sites

1. Click **Try for free** and open the **Input** tab.
2. In **Companies**, enter one company per line. A name such as `polestar` is enough. The Teamtailor name is the first part of the address `polestar.teamtailor.com`. A full address or a link to one job also works.
3. Add filters if you need them: **Keywords**, **Departments**, **Locations**, **Remote jobs only** and **Posted within days**.
4. Turn on **Include job description** when you need the job text. The text is plain text, and email addresses, phone numbers and links to personal profiles are replaced by a marker.
5. Set **Max jobs per company** and **Max results**. Every job in the result is one charged result.
6. Click **Start**. Open the **Jobs** view and export the rows as JSON, CSV or Excel, or call the Actor from the API.

To get only fresh jobs, turn on **Only new jobs since last run**, keep a **Monitor name** such as `nordic-tech`, and schedule the Actor. The first run with a Monitor name returns all matching jobs and sets the baseline. Every later run returns only jobs that run has not delivered before.

### Teamtailor jobs API pricing

The price is **$1.00 per 1,000 jobs**, which is $0.001 per job. One more event, Actor start, costs $0.00005 per run. You pay for each row saved to the dataset. A company that cannot be read, or a run that finds no matching job, costs only the start event.

| Plan | Price per job | Price per 1,000 jobs |
|---|---|---|
| Free | $0.001 | $1.00 |
| Bronze | $0.0009 | $0.90 |
| Silver | $0.0008 | $0.80 |
| Gold | $0.0007 | $0.70 |

Worked examples at the Free price:

- 10 jobs from 2 companies: 10 x $0.001 + $0.00005 = $0.01005.
- 100 jobs: 100 x $0.001 + $0.00005 = $0.10005.
- 250 jobs from 5 companies with 50 jobs each: 250 x $0.001 + $0.00005 = $0.25005.
- A daily monitor of 20 companies that finds 5 new jobs a day: 5 x $0.001 + $0.00005 = $0.00505 per day, about $0.15 for 30 days.

Set a maximum charge per run in the run options. The Actor stops when that limit is reached.

### Input example

This input comes from a real run on 11 October 2026. It reads two career sites and returns the 5 newest jobs of each.

```json
{
  "companies": ["polestar", "foodora"],
  "maxJobsPerCompany": 5,
  "maxResults": 10
}
```

| Field | Meaning |
|---|---|
| Companies (`companies`) | Teamtailor names, career site addresses or job links, up to 500. |
| Keywords (`keywords`) | A job matches when its title, department, role or text contains any keyword. |
| Departments (`departments`) | A job matches when its department, division or role contains any entry. |
| Locations (`locations`) | A job matches when one of its locations contains any entry. |
| Remote jobs only (`remoteOnly`) | Keeps jobs that the career site marks as fully or temporarily remote. |
| Posted within days (`postedWithinDays`) | Keeps jobs published in the last N days. |
| Only new jobs since last run (`onlyNew`) | Returns only jobs not delivered before to the same Monitor name. |
| Monitor name (`monitorName`) | Name of the list of delivered jobs. Use one name per set of companies and filters. |
| Include job description (`includeDescription`) | Adds `descriptionText`. |
| Max jobs per company (`maxJobsPerCompany`) | Newest jobs first. |
| Max results (`maxResults`) | Total cap for the run. |

### Output example

These are the first two rows of that run. Rows come newest first inside each company.

```json
{
  "source": "Teamtailor",
  "careerSite": "polestar.teamtailor.com",
  "company": "Polestar",
  "jobId": "a899dbe3-8727-4e13-a3bc-b5f8513385d6",
  "jobNumber": "8476851",
  "title": "Senior Customs Operations Specialist",
  "department": "Quality & Logistics",
  "division": null,
  "role": null,
  "location": "Göteborg, Sweden",
  "city": "Göteborg",
  "country": "Sweden",
  "locations": [
    {
      "name": "Gothenburg, Sweden",
      "city": "Göteborg",
      "country": "Sweden",
      "zip": "418 78"
    }
  ],
  "remoteStatus": "onsite",
  "workplaceType": "onsite",
  "isRemote": false,
  "postedAt": "2026-09-30T07:33:49.000Z",
  "url": "https://polestar.teamtailor.com/jobs/8476851-senior-customs-operations-specialist",
  "retrievedAt": "2026-10-11T08:51:22.917Z"
}
```

```json
{
  "source": "Teamtailor",
  "careerSite": "polestar.teamtailor.com",
  "company": "Polestar",
  "jobId": "3d2262b1-792f-4fdd-801f-99bbfbfd908d",
  "jobNumber": "8433714",
  "title": "Internal Fleet Coordinator",
  "department": "Global Sales",
  "division": null,
  "role": null,
  "location": "Brussels, Belgium",
  "city": "Brussels",
  "country": "Belgium",
  "locations": [
    {
      "name": "Brussels, Belgium",
      "city": "Brussels",
      "country": "Belgium",
      "zip": "1000"
    }
  ],
  "remoteStatus": "none",
  "workplaceType": null,
  "isRemote": null,
  "postedAt": "2026-09-22T10:31:09.000Z",
  "url": "https://polestar.teamtailor.com/jobs/8433714-internal-fleet-coordinator",
  "retrievedAt": "2026-10-11T08:51:22.917Z"
}
```

Field notes:

- `remoteStatus` is the value from the feed. The live feeds showed `none`, `onsite` and `hybrid`. The value `none` is the default and can sit on jobs that the text describes as hybrid, so `workplaceType` and `isRemote` are null for `none`.
- `postedAt` is the publication date from the feed in UTC. The feed is not sorted by date, so the Actor sorts the rows.
- `descriptionText` appears only when **Include job description** is on. The run statistics are in the key-value store record `STATS`: companies read, jobs read, failures and the requests sent.

### Run it every day

Use this to get a feed of fresh Teamtailor 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: 20 companies with 5 new jobs a day cost 5 x $0.001 + $0.00005 = $0.00505 a day, about $0.15 for 30 days (the 5 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) reads 22 job boards, Teamtailor among them, and charges $0.01 per company with up to 1,000 jobs. It is cheaper for a full snapshot of a board with more than 10 jobs. This Actor is cheaper when filters remove most jobs, and it adds Teamtailor fields and custom domains.
- [Greenhouse Jobs API](https://apify.com/conserving_celerytop/greenhouse-jobs-api) and [Lever Jobs API](https://apify.com/conserving_celerytop/lever-jobs-api) cover employers on those two job boards.
- [SmartRecruiters Jobs API](https://apify.com/conserving_celerytop/smartrecruiters-jobs-api) and [Recruitee Jobs API](https://apify.com/conserving_celerytop/recruitee-jobs-api) are sister Actors for two more job boards.
- [Company Hiring Signals](https://apify.com/conserving_celerytop/company-hiring-signals) shows hiring activity of a company from several sources.

### FAQ

**Is it legal to use this Actor?**
The Actor reads only the public RSS feed of career sites, with no login. Teamtailor describes this feed in its help center: "Note that all of the data is publicly available" (support.teamtailor.com/en/articles/11171756-rss-feed-how-to-guide). The `robots.txt` of Teamtailor career sites does not disallow `/jobs.rss`, and the Actor checks the file before each feed. The same file also carries a content signal, `search=no, ai-train=no, ai-input=no`. Respect it: do not use the rows to train AI models or to build a public job search engine. Use the data for monitoring, research and lead lists. Job text can name a person, so the Actor removes email addresses, phone numbers and profile links. You are responsible for how you use the data.

**How fast is it, and what does it send?**
The Actor sends one request at a time, at least one second apart, with the User-Agent `apify-actor (+https://apify.com/conserving_celerytop)`. It retries up to three times with a pause, follows the Retry-After header and stops when a site answers 403.

**How many jobs can I get?**
Each company is read page by page, 100 jobs per page, up to 50 pages. Use **Max jobs per company** and **Max results** to set the size of a run.

**A company returns nothing. What now?**
Open `https://NAME.teamtailor.com/jobs` in a browser. A 404 page means the name is wrong, so use the address of the career site instead. A company on its own domain needs the address of that domain, for example `https://jobs.example.com`. The reason for each failed company is in the `STATS` record. A failed company costs nothing.

**Why are some fields empty?**
Teamtailor lets each company leave department, division, role and location empty. The Actor returns null for those fields.

**Does it find the Teamtailor career site of a company by itself?**
No. Enter the Teamtailor name or the career site address.

**Does "only new jobs" miss anything?**
A job counts as delivered once the Actor saved it. If a run stops early because of a maximum, the jobs not saved stay new for the next run. Keep one Monitor name per set of companies and filters.

This is an unofficial tool by an independent developer. It is not affiliated with, endorsed by or operated by Teamtailor or by any company whose jobs it lists. Teamtailor is a trademark of its owner.

# Actor input Schema

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

Enter one company per line: the Teamtailor name such as polestar, or the career site address such as https://jobs.example.com/jobs. A link to a single job works too. Up to 500 companies.

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

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

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

Enter one department, division or role name per line, such as engineering. A job matches when its department, division or role contains any of them.

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

Enter one city, country or office name per line, such as stockholm or germany. A job matches when any of its locations contains one of them.

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

Return only jobs that the career site marks as fully remote or temporarily remote.

## `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 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 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.

## Actor input object example

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

# 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": [
        "polestar",
        "foodora"
    ],
    "maxJobsPerCompany": 5,
    "maxResults": 10
};

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

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

```

## MCP server setup

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