# Teamtailor Job Scraper | $1.50/1K — Nordic ATS, No Login (`s7_studio/teamtailor-job-scraper`) Actor

Scrape job postings from any Teamtailor-powered company career page via the public jobs.json feed. Get title, location, city, country, seniority, remote-type, descriptions and parse\_confidence. Multi-company batch, keyword filters, zero auth, zero proxy.

- **URL**: https://apify.com/s7\_studio/teamtailor-job-scraper.md
- **Developed by:** [S7 Studio](https://apify.com/s7_studio) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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?

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 Job Scraper | $1.50/1K — Nordic ATS, No Login

If you track which Scandinavian tech companies are hiring — or build tools for Nordic talent sourcing — this is your fastest data source.

**Pricing: $1.50/1,000 jobs** (Pay-Per-Event — you pay only for results delivered)

Scrape job postings from **any Teamtailor-powered company career page** via the public `jobs.json` feed — **No API key. No login. No proxy. No account.** Batch multiple companies in a single run and get a clean, enriched dataset ready for pipelines, dashboards, or lead generation.

### What is Teamtailor?

Teamtailor is a Scandinavian ATS (Applicant Tracking System) used by thousands of companies — especially Nordic startups and scale-ups — to power their career sites. Every Teamtailor company exposes a public **JSON Feed** at `/<slug>.teamtailor.com/jobs.json` or at a custom career domain.

### What data does this scraper return?

Each job posting returns 19 fields:

| Field | Example |
|---|---|
| `title` | "Senior Software Engineer" |
| `company` | "Hemnet" |
| `location` | "Stockholm, SE" |
| `city` | "Stockholm" |
| `country` | "SE" |
| `remote_type` | "remote" / "hybrid" / null |
| `seniority` | "senior" / "manager" / "intern" / "mid" |
| `department` | null (not in public feed) |
| `employment_type` | null (not in public feed) |
| `posted_at` | "2026-05-28T13:06:16+02:00" |
| `url` | "https://hemnet.teamtailor.com/jobs/1234-product-manager" |
| `apply_url` | same as `url` |
| `job_id` | "1234" |
| `global_id` | "teamtailor:hemnet:1234" |
| `description_text` | Full plain-text description (HTML stripped) |
| `description_html` | Full raw HTML description |
| `parse_confidence` | 0.0–1.0 quality score |
| `warnings` | List of quality flags |
| `scraped_at` | ISO timestamp of the run |

#### Why `parse_confidence`?

Every row carries a quality score from 1.0 (all key fields present) down to 0.0. If a job is missing a title, URL, or description, the score drops and a warning code is added. Filter on `parse_confidence >= 0.9` for highest-quality rows. No competitor includes this signal.

### How to specify companies

Pass **Teamtailor slugs** in the `companies` input:

```
hemnet        → hemnet.teamtailor.com/jobs.json
storytel      → storytel.teamtailor.com/jobs.json
hedvig        → hedvig.teamtailor.com/jobs.json
```

Custom career domains also work:

```
career.teamtailor.com   → career.teamtailor.com/jobs.json
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `companies` | string list | — | Teamtailor slugs or custom career domains |
| `titleKeyword` | string | — | Filter by job title (case-insensitive) |
| `locationKeyword` | string | — | Filter by location, city, or country |
| `remoteOnly` | boolean | false | Only return remote jobs |
| `maxJobsPerCompany` | integer | 50 | Cap per company (0 = unlimited) |
| `includeDescriptions` | boolean | true | Include full HTML + text descriptions |

### Use cases

- **Talent sourcing** — monitor specific companies for new roles in your target domain
- **Lead generation** — find hiring companies in a vertical (fintech, SaaS, gaming)
- **Competitive intelligence** — track hiring trends across Teamtailor-powered companies
- **Job board aggregation** — feed a niche job board with Nordic/European tech jobs
- **Change detection** — run daily and compare `job_id` sets to detect new openings

### Zero infrastructure cost

The Teamtailor `jobs.json` feed is:

- **100% public** — no API key, no login, no account required
- **Zero proxy cost** — regular HTTP fetch, no access restrictions
- **Full descriptions inline** — no second detail-page call needed
- **Schema.org structured data** — city, country, company name parsed from machine-readable markup

### Seniority classification

Every job title is classified into one of 11 levels: `executive`, `vp`, `director`, `manager`, `principal`, `staff`, `lead`, `senior`, `intern`, `entry`, `mid`. Useful for filtering senior-only or entry-level roles without parsing titles yourself.

### Pricing example

| Run | Jobs returned | Cost |
|---|---|---|
| Trial (1 company, default 50 cap) | 50 | ~$0.08 |
| 1,000 jobs (20 companies) | 1,000 | $1.50 |
| 10,000 jobs (200 companies) | 10,000 | $15.00 |

Pay per result via Apify's Pay-Per-Event model. You only pay for jobs actually returned to your dataset — no charge for empty companies or filtered-out rows.

### FAQ

**Do I need an API key or proxy?**
No. The Teamtailor `jobs.json` feed is fully public — no credentials, no proxy, no browser needed.

**What formats can I export?**
JSON, CSV, Excel, or JSONL — all available directly from the Apify dataset UI or via API.

**Can I schedule daily monitoring runs?**
Yes. Use Apify Schedules to run daily and compare `job_id` sets to detect new openings automatically.

**What if a company returns empty results?**
If a slug returns 0 jobs or a 404, it is logged and skipped cleanly — no crash, no charge, the run continues for remaining slugs.

### Limitations

- `department` and `employment_type` are not exposed in the public JSON Feed (require authenticated API access)
- `remote_type` is inferred from title and location text (Teamtailor's public feed doesn't include a structured remote flag)
- Companies using custom career domains must pass the full domain, not a Teamtailor slug
- Some companies use Teamtailor's auth-required API instead of the public feed — these return 404 and are logged as failed

### Output sample

```json
{
  "title": "Senior Software Engineer",
  "company": "Hemnet",
  "location": "Stockholm, SE",
  "city": "Stockholm",
  "country": "SE",
  "remote_type": null,
  "seniority": "senior",
  "posted_at": "2026-05-28T13:06:16+02:00",
  "url": "https://hemnet.teamtailor.com/jobs/4567890-senior-software-engineer",
  "parse_confidence": 1.0,
  "warnings": [],
  "scraped_at": "2026-06-05T10:00:00+00:00"
}
```

### Use with AI agents (MCP)

This actor is available via Apify's MCP server. Connect it to any MCP-compatible agent (Claude, n8n, Make) to pull live Nordic job data on demand — no code required.

```
https://mcp.apify.com/?tools=bovi/teamtailor-job-scraper
```

### Vs. competitors

| Feature | This actor | Generic job scrapers |
|---|---|---|
| `parse_confidence` quality score | Yes | No |
| Seniority enrichment (11 levels) | Yes | Rarely |
| Multi-company batch (1 run) | Yes | Rarely |
| Zero proxy / zero auth | Yes | Often needs proxy |
| Nordic/Teamtailor specific | Yes (native feed) | No (HTML scrape) |
| Price | $1.50/1K | $2–5/1K |

### Integrations

Built for Nordic talent-sourcing platforms and hiring-intel teams tracking open roles at Scandinavian tech companies — the JSON/dataset output drops into the tools you already run, no glue code:

- **n8n / Make / Zapier** — trigger a run or pipe every new dataset item into 500+ apps (Google Sheets, Airtable, Slack, HubSpot, your database) with no code: [n8n](https://docs.apify.com/platform/integrations/n8n), [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier).
- **Webhooks** — fire your own endpoint the moment a run finishes, to push results straight into your pipeline ([docs](https://docs.apify.com/platform/integrations/webhooks)).
- **MCP server** — expose this actor as a tool to Claude, Cursor, or any [MCP client](https://mcp.apify.com) so an AI agent can pull this data mid-conversation ([guide](https://blog.apify.com/how-to-use-mcp/)).
- **API & SDKs** — fetch the dataset as JSON, CSV, or Excel through the Apify REST API or the Python / JS SDKs.

See all [Apify integrations](https://apify.com/integrations).

### Not affiliated with Teamtailor

This actor scrapes publicly available career page data. It is not affiliated with, endorsed by, or sponsored by Teamtailor AB.

# Actor input Schema

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

Teamtailor company slugs or custom career domains to scrape. The slug is what appears before .teamtailor.com in the careers URL. Examples: "hemnet", "storytel", "hedvig". Custom domains also work: "career.teamtailor.com".

## `titleKeyword` (type: `string`):

Keep only jobs whose title contains this text (case-insensitive). Example: "engineer". Leave blank to return all jobs.

## `locationKeyword` (type: `string`):

Keep only jobs whose location, city, or country contains this text (case-insensitive). Example: "Stockholm" or "SE". Leave blank for all locations.

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

When enabled, only jobs detected as fully remote are returned (based on location or title containing "remote").

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

Cap on jobs pushed per company slug after filtering. Default 50 keeps trial runs cheap. Set to 0 for unlimited.

## `includeDescriptions` (type: `boolean`):

Return full job description as plain text and HTML. Teamtailor includes descriptions in the feed so this adds no extra API calls — it only controls whether the fields appear in your output.

## Actor input object example

```json
{
  "companies": [
    "hemnet",
    "storytel",
    "hedvig"
  ],
  "remoteOnly": false,
  "maxJobsPerCompany": 50,
  "includeDescriptions": true
}
```

# Actor output Schema

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

Dataset containing Teamtailor Job Scraper records (title, company, location, city, country, remote\_type, seniority, posted\_at, url, parse\_confidence, job\_id, apply\_url).

# 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": [
        "hemnet",
        "storytel",
        "hedvig"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s7_studio/teamtailor-job-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 = { "companies": [
        "hemnet",
        "storytel",
        "hedvig",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("s7_studio/teamtailor-job-scraper").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": [
    "hemnet",
    "storytel",
    "hedvig"
  ]
}' |
apify call s7_studio/teamtailor-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s7_studio/teamtailor-job-scraper"
        }
    }
}

```

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/Rbj85cd1XdLlYy79n/builds/jsqqZVRCYGWWfiiUg/openapi.json
