# Teamtailor Jobs Scraper - Career Page Jobs API (`groupoject/teamtailor-jobs-scraper`) Actor

Scrape jobs from any public Teamtailor career site. Extract job titles, companies, locations, descriptions, apply URLs, posting dates, and monitor new jobs for alerts.

- **URL**: https://apify.com/groupoject/teamtailor-jobs-scraper.md
- **Developed by:** [Group Oject](https://apify.com/groupoject) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 teamtailor jobs

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Teamtailor Jobs Scraper - Career Page Jobs API

**Scrape clean job listings from any public Teamtailor career site.**

Teamtailor is used by startups, scale-ups, agencies, and European companies to publish branded career pages. This Actor reads the public Teamtailor `jobs.json` feed and returns structured job data: title, company, locations, remote/hybrid signal, employment type, description, apply URL, posting date, and monitoring flags for new jobs.

Use it for job boards, recruitment intelligence, lead generation, hiring alerts, labor-market research, and company hiring trackers.

***

### What it does

- Scrapes one or many Teamtailor company career sites
- Accepts full URLs or simple slugs like `recruitgo`
- Extracts full job descriptions from the public JSON feed
- Filters by keyword, location, department, and posting freshness
- Supports monitor mode for scheduled new-job detection
- Outputs one clean dataset row per job
- Stores `SUMMARY` and `SOURCES` records in the key-value store

No login, cookies, browser, or API key required.

***

### Popular use cases

- **Teamtailor jobs scraper** - export all jobs from a company career page.
- **Startup hiring tracker** - monitor Teamtailor companies for new roles.
- **Recruitment lead generation** - find companies actively hiring by role or location.
- **Job board feed** - collect fresh jobs for niche boards and newsletters.
- **Labor market research** - track hiring trends across startups and regions.
- **New job alerts** - schedule monitor mode and send results to integrations.

***

### Ready-to-run task ideas

#### Remote SaaS Jobs from Teamtailor

```json
{
  "companySlugs": ["recruitgo", "parcellab", "leaseweb"],
  "keywords": ["engineer", "developer", "product", "data"],
  "locations": ["remote", "hybrid"],
  "includeDescription": true,
  "maxJobsPerCompany": 100
}
```

#### European Startup Hiring Tracker

```json
{
  "companySlugs": ["luminorbank", "parcellab", "leaseweb"],
  "keywords": ["software", "data", "product", "marketing"],
  "includeDescription": true,
  "monitorMode": true,
  "onlyNewJobs": true,
  "stateKey": "european-startup-teamtailor-hiring"
}
```

#### Marketing Jobs on Teamtailor

```json
{
  "companyUrls": ["https://luminorbank.teamtailor.com/jobs", "https://recruitgo.teamtailor.com/jobs"],
  "keywords": ["marketing", "growth", "content", "seo"],
  "includeDescription": true,
  "postedWithinDays": 30
}
```

***

### Input

| Field | Type | Description |
|---|---|---|
| `companyUrls` | string\[] | Teamtailor URLs such as `https://company.teamtailor.com/jobs` |
| `companySlugs` | string\[] | Teamtailor subdomains such as `company` |
| `companyUrlsText` | string | Paste URLs/slugs, one per line |
| `keywords` | string\[] | Keep jobs matching any keyword |
| `locations` | string\[] | Keep jobs matching any location text |
| `departments` | string\[] | Keep jobs matching department/title/description text |
| `includeDescription` | boolean | Convert HTML description to clean text |
| `includeHtmlDescription` | boolean | Include raw HTML description |
| `postedWithinDays` | integer | Optional freshness filter |
| `monitorMode` | boolean | Store seen job IDs across runs |
| `onlyNewJobs` | boolean | Output only new jobs when monitoring |
| `stateKey` | string | Stable dedupe key per saved task |

***

### Output

```json
{
  "companyName": "Luminor Group",
  "companySlug": "luminorbank",
  "sourceUrl": "https://luminorbank.teamtailor.com",
  "feedUrl": "https://luminorbank.teamtailor.com/jobs.json",
  "jobId": "7935820",
  "title": "Senior Java Software Engineer",
  "department": "Core API Unit",
  "locations": ["Riga, LV"],
  "location": "Riga, LV",
  "country": "LV",
  "remoteType": "Hybrid",
  "employmentType": "FULL_TIME",
  "description": "Clean text job description...",
  "applyUrl": "https://luminorbank.teamtailor.com/jobs/7935820...",
  "jobUrl": "https://luminorbank.teamtailor.com/jobs/7935820...",
  "postedAt": "2026-06-18T00:00:00+03:00",
  "validThrough": "2026-07-10T23:59:59+03:00",
  "isNew": true
}
```

***

### Monitoring new jobs

Turn on `monitorMode` and run the Actor on a schedule. The Actor stores seen job IDs in a named key-value store and marks new jobs with `isNew: true`.

Use `onlyNewJobs: true` for alert workflows where each run should output only jobs that were not seen before.

***

### Notes

- Teamtailor career sites expose a public JSON feed at `/jobs.json`.
- Some companies may disable or customize feeds; failed sources appear in the `SOURCES` key-value output.
- Remote/hybrid detection is inferred from structured fields and job text when explicit remote metadata is missing.
- Use a different `stateKey` for each saved task/search scope.

***

### Related tools

- [Indeed Jobs Scraper](https://apify.com/groupoject/indeed-jobs-scraper) - scrape jobs across Indeed, Google Jobs, ZipRecruiter, LinkedIn, and Glassdoor.

***

### Changelog

See [CHANGELOG.md](CHANGELOG.md).

# Actor input Schema

## `companyUrls` (type: `array`):

Teamtailor career site URLs, e.g. https://recruitgo.teamtailor.com/jobs or https://luminorbank.teamtailor.com.

## `companySlugs` (type: `array`):

Teamtailor subdomain slugs. Example: recruitgo becomes https://recruitgo.teamtailor.com/jobs.json.

## `companyUrlsText` (type: `string`):

Paste one Teamtailor URL or company slug per line.

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

Only keep jobs matching any keyword in title, company, location, or description. Leave empty for all jobs.

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

Only keep jobs matching any location text. Leave empty for all locations.

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

Only keep jobs matching department/title/description text. Leave empty for all departments.

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

Convert the Teamtailor HTML job description to clean text.

## `includeHtmlDescription` (type: `boolean`):

Also include raw HTML job description.

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

Maximum number of jobs to read from each Teamtailor career site.

## `maxTotalJobs` (type: `integer`):

Maximum number of jobs to save across all selected Teamtailor sources.

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

Optional freshness filter based on published date.

## `monitorMode` (type: `boolean`):

Store seen job IDs across runs so scheduled runs can mark new jobs.

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

When monitor mode is on, output only jobs not seen in previous runs.

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

Optional stable key for dedupe state. Use a different key per saved task/search scope.

## `requestDelayMs` (type: `integer`):

Delay between company feed requests. Increase this for very large source lists.

## `debugMode` (type: `boolean`):

Enable verbose logs for troubleshooting source URLs and filters.

## Actor input object example

```json
{
  "companyUrls": [
    "https://luminorbank.teamtailor.com/jobs",
    "https://recruitgo.teamtailor.com/jobs"
  ],
  "keywords": [
    "engineer",
    "developer",
    "data"
  ],
  "includeDescription": true,
  "includeHtmlDescription": false,
  "maxJobsPerCompany": 200,
  "maxTotalJobs": 1000,
  "monitorMode": false,
  "onlyNewJobs": false,
  "requestDelayMs": 300,
  "debugMode": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per Teamtailor job: title, company, location, employment type, apply URL, and posting date.

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

Counts, top companies, top locations, duration, and per-source run status.

## `sources` (type: `string`):

Per-company feed status, kept job counts, and any source errors.

# 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 = {
    "companyUrls": [
        "https://luminorbank.teamtailor.com/jobs",
        "https://recruitgo.teamtailor.com/jobs"
    ],
    "keywords": [
        "engineer",
        "developer",
        "data"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("groupoject/teamtailor-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 = {
    "companyUrls": [
        "https://luminorbank.teamtailor.com/jobs",
        "https://recruitgo.teamtailor.com/jobs",
    ],
    "keywords": [
        "engineer",
        "developer",
        "data",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("groupoject/teamtailor-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companyUrls": [
    "https://luminorbank.teamtailor.com/jobs",
    "https://recruitgo.teamtailor.com/jobs"
  ],
  "keywords": [
    "engineer",
    "developer",
    "data"
  ]
}' |
apify call groupoject/teamtailor-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=groupoject/teamtailor-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Fsp2dbevGLrMf1Y30/builds/waehFaDFPmROmLz7f/openapi.json
