# JobTeaser Jobs Scraper (`parsebird/jobteaser-jobs-scraper`) Actor

Scrape job and internship listings from JobTeaser.com: titles, companies, locations, contract types, salaries, categories, and full descriptions.

- **URL**: https://apify.com/parsebird/jobteaser-jobs-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 jobs

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/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

### JobTeaser Jobs Scraper

Extract job and internship listings from [JobTeaser](https://www.jobteaser.com/), Europe's largest career platform for students and young graduates, by keyword, location, or a saved search URL.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by keyword, location, contract type, and posting date across 15 languages, and get clean, structured job data — full descriptions, salaries, categories, and contract types — ready for analysis or integration.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
parsebird/jobteaser-jobs-scraper on Apify. Call: ApifyClient("TOKEN").actor("parsebird/jobteaser-jobs-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: url (string, optional JobTeaser job-offers search URL whose filters are reused as-is), keyword (string, job search term, e.g. "developer"), location (string, e.g. "Paris" or "Remote", matched against each listing's location), language (string, listing locale, one of en/fr/de/es/it/nl/pl/pt/sv/da/fi/no/cs/ca/gl, default "en"), posted_within (string, "any"/"24h"/"7d"/"30d", default "any"), jobTypes (array of internship/alternating/cdi/graduate_program/apprenticeship/thesis/vie, default all), results_wanted (integer, max job records to collect, default 20), proxyConfiguration (object, optional Apify Proxy settings). Output fields per job: title, company, location, date_posted, original_publish_date, job_type, job_type_code, job_category, salary, description_html, description_text, job_url, job_id, locale, remote_type, last_indexed_at. Full actor spec: fetch via GET https://api.apify.com/v2/acts/parsebird~jobteaser-jobs-scraper (Bearer TOKEN). Get token: https://console.apify.com/account/integrations
```

### What does JobTeaser Jobs Scraper do?

**JobTeaser Jobs Scraper** collects structured job offer data from [JobTeaser.com](https://www.jobteaser.com/), the career platform used by 800+ European schools and universities to connect students and young graduates with internships, work-study programs, and entry-level jobs. Search by keyword and location, filter by contract type and posting date, or paste a JobTeaser search URL to reuse its filters directly.

Use it as a **JobTeaser API alternative** to pull structured job data into JSON, CSV, or Excel without writing a scraper yourself. No coding required — set your filters and click Start. Or call it through the [Apify API](https://docs.apify.com/api/v2) to automate recurring job data collection.

- 🔍 **Keyword and location search** — filter by job title, skill, or free-text location, or reuse an existing JobTeaser search URL as-is
- 🌍 **15 languages** — scrape listings as rendered in English, French, German, Spanish, Italian, Dutch, Polish, Portuguese, Swedish, Danish, Finnish, Norwegian, Czech, Catalan, or Galician
- 📄 **Full job descriptions** — both HTML and plain-text versions, fetched from each offer's own detail page
- 💼 **Contract type filters** — internship, work-study (alternance), permanent contract (CDI), graduate program, apprenticeship, thesis/PhD, and VIE
- 📅 **Posting-date filters** — keep only offers posted in the last 24 hours, 7 days, or 30 days
- 💶 **Salary data** — minimum/maximum pay and period, when JobTeaser publishes it
- 🔄 **Scheduling and monitoring** — run daily or weekly with [Apify scheduling](https://docs.apify.com/platform/schedules) to track new postings
- 🔗 **API access and integrations** — connect to Google Sheets, Zapier, Make, webhooks, or any workflow via the Apify API

### What data can you extract from JobTeaser?

| Field | Description |
|-------|-------------|
| `title` | Job title |
| `company` | Hiring company name |
| `location` | City and country, or "Remote" |
| `date_posted` | Publication date and time (ISO format) |
| `job_type` | Human-readable contract type, e.g. "Internship 6 months" or "CDI" |
| `job_type_code` | Stable contract code: internship, alternating, cdi, graduate\_program, apprenticeship, thesis, or vie |
| `job_category` | Job function or department |
| `salary` | Salary or stipend text, when published |
| `description_text` / `description_html` | Full job description, plain text and HTML |
| `job_url` | Direct JobTeaser listing URL |
| `job_id` | Unique JobTeaser offer identifier |
| `remote_type` | Remote-work indicator, when JobTeaser publishes one |

### How to scrape JobTeaser

1. Open the [JobTeaser Jobs Scraper](https://apify.com/parsebird/jobteaser-jobs-scraper) page on Apify Store and click **Try for free**
2. Enter a **Keyword** and/or **Location**, or paste a URL copied from [jobteaser.com/en/job-offers](https://www.jobteaser.com/en/job-offers) into **Search URL**
3. Pick a **Language**, one or more **Contract types**, and a **Posted within** window
4. Set **Max results** to control run size and cost
5. Optionally enable **Apify Proxy** for larger or recurring runs
6. Click **Start** and wait for the run to finish
7. Download your data in **JSON, CSV, Excel**, or connect via the **Apify API**

#### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/jobteaser-jobs-scraper").call(run_input={
    "keyword": "marketing",
    "location": "France",
    "language": "fr",
    "results_wanted": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['title']} — {item['company']} — {item.get('location')}")
```

#### JavaScript API example

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("parsebird/jobteaser-jobs-scraper").call({
    keyword: "marketing",
    location: "France",
    language: "fr",
    results_wanted: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.log(`${item.title} — ${item.company} — ${item.location ?? "N/A"}`);
});
```

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `url` | string | No | — | Public JobTeaser job-offers search URL. Filters already encoded in it are reused as-is |
| `keyword` | string | No | `""` | Job search term, such as developer, finance, or data analyst. Ignored when `url` is set |
| `location` | string | No | `""` | Location filter, such as Paris, Germany, or Remote. Ignored when `url` is set |
| `language` | string | No | `"en"` | Listing language: en, fr, de, es, it, nl, pl, pt, sv, da, fi, no, cs, ca, or gl |
| `posted_within` | string | No | `"any"` | Posting window: any, 24h, 7d, or 30d |
| `jobTypes` | array | No | `[]` | Contract codes: internship, alternating, cdi, graduate\_program, apprenticeship, thesis, vie. Empty = all |
| `results_wanted` | integer | No | `20` | Maximum number of job records to collect. Minimum value is 1 |
| `proxyConfiguration` | object | No | `{ "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }` | Apify Proxy settings. JobTeaser blocks datacenter IPs, so Residential proxy is used by default |

### Output example

```json
{
  "title": "Founders Associate Intern (H/F/X)",
  "company": "JobTeaser",
  "location": "Paris, France",
  "date_posted": "2026-07-20T15:08:12.000Z",
  "original_publish_date": "2026-07-20T15:08:12.000Z",
  "job_type": "Internship 6 months",
  "job_type_code": "internship",
  "job_category": "Management, Consulting & Strategy",
  "salary": "1200–1400 EUR / Monthly",
  "description_html": "<b>Company Description</b><br><br>...",
  "description_text": "Company Description ...",
  "job_url": "https://www.jobteaser.com/en/job-offers/2a54e19b-c8a7-43f2-902b-a65b66f36de2-jobteaser-founders-associate-intern-h-f-x",
  "job_id": "2a54e19b-c8a7-43f2-902b-a65b66f36de2",
  "locale": "en",
  "remote_type": "telecommute",
  "last_indexed_at": "2026-08-20T13:19:13.000Z"
}
```

Download results in JSON, HTML, CSV, or Excel.

### Use cases

- 📊 **Job market analysis** — track contract types, categories, and remote-work availability across European countries
- 🧭 **Recruitment sourcing** — monitor new internships and graduate roles for specific keywords as they go live
- 🎓 **Career-center dashboards** — feed a school or university career center with live JobTeaser listings
- 🏢 **Employer benchmarking** — see which companies are hiring students and young graduates, and for what
- 🔄 **Recurring monitoring** — schedule daily or weekly runs with `posted_within` to catch only new postings
- 🔗 **Data pipeline integration** — feed job data into a warehouse, spreadsheet, or BI dashboard via the Apify API

### How it works

1. Builds a JobTeaser search from your `keyword`, `jobTypes`, and `language` — or reuses your `url` as-is
2. Requests each search-results page, reading the job offers embedded in the server-rendered listing
3. Stops pagination once `results_wanted` unique offers are collected or a page returns no offers
4. Fetches each offer's own detail page and reads its structured JobPosting data for the full description, salary, category, and dates
5. Applies your `location` and `posted_within` filters against each offer's actual listed location and posting date
6. Pushes each job offer to the Apify dataset, deduplicated by offer ID

### How much does it cost to scrape JobTeaser?

| Event | Price per event | Price per 1,000 |
|-------|----------------|-----------------|
| `job-scraped` (Free plan) | $0.0009 | **$0.90** |
| `job-scraped` (Bronze/Silver/Gold plans) | $0.0008 | **$0.80** |

One event is charged each time a job offer is successfully scraped and saved to the dataset — you only pay for offers actually returned. Apify offers a **free trial** with platform credits, enough to scrape thousands of job offers at no cost.

### FAQ

**Do I need to build a search URL myself?**
No. Set `keyword`, `location`, `language`, and `jobTypes` and the actor builds the search for you. You can also search on [jobteaser.com/en/job-offers](https://www.jobteaser.com/en/job-offers) yourself and paste the resulting URL into `url` to reuse its filters exactly.

**How does the `location` filter work?**
It's matched as a case-insensitive text match against each job offer's own listed location (for example "Paris, France"), not a radius search around coordinates. Use a city or country name, or "Remote".

**Why are `date_posted` and `original_publish_date` the same value?**
JobTeaser publishes a single posting date per offer; both fields reflect it so downstream schemas that expect either name work without changes.

**How reliable is `remote_type`?**
It's read directly from JobTeaser's own structured job data. JobTeaser doesn't always distinguish fully remote from occasional/hybrid remote in that field, so treat it as "remote work mentioned" rather than a precise policy.

**Does this scraper fetch full job descriptions?**
Yes. Each offer's own detail page is fetched to retrieve the complete description (plain text and HTML), not just the summary shown on the search-results page.

**Do I need Apify Proxy?**
Yes, and it's on by default. JobTeaser blocks requests from datacenter IP ranges, so the actor routes through Apify's Residential proxy group automatically — you only need to change `proxyConfiguration` if you want to use your own proxy setup.

**Can I schedule recurring runs?**
Yes. Use [Apify scheduling](https://docs.apify.com/platform/schedules) to run daily or weekly, combined with `posted_within` to collect only new postings each time.

**Can I access the data via API?**
Yes. Every run produces a dataset accessible via the [Apify API](https://docs.apify.com/api/v2), usable from Python, JavaScript, Google Sheets, Zapier, Make, or any HTTP-capable tool.

### Is it legal to scrape JobTeaser?

This Actor extracts publicly available data from JobTeaser.com. Scraping public data is generally considered legal based on recent court rulings, including the US Ninth Circuit's decision in *hiQ Labs v. LinkedIn*. However, users are responsible for ensuring their use of scraped data complies with applicable laws, JobTeaser's Terms of Service, and data protection regulations including GDPR. Do not use extracted personal data for unsolicited contact or purposes incompatible with the original collection context. For more information, read Apify's blog post on [web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

### Other job scrapers on Apify

Browse all ParseBird actors, including other job board scrapers, on the [Apify Store](https://apify.com/parsebird).

# Actor input Schema

## `url` (type: `string`):

Optional: paste a JobTeaser job-offers search URL to reuse its filters (keyword, location, contract types) as-is. Leave empty to build a search from the fields below.

## `keyword` (type: `string`):

Job search term or phrase, such as developer, finance, or data analyst. Ignored when a Search URL is set.

## `location` (type: `string`):

Location filter, such as Paris, Germany, or Remote. Matched against each job offer's listed location. Ignored when a Search URL is set.

## `language` (type: `string`):

Listing language JobTeaser renders the search results in.

## `posted_within` (type: `string`):

Only keep job offers posted within this time window.

## `jobTypes` (type: `array`):

Limit results to one or more JobTeaser contract types. Leave empty to include all contract types.

## `results_wanted` (type: `integer`):

Maximum number of job records to collect.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. JobTeaser blocks datacenter IPs, so Residential proxy is used by default — turning it off will cause most requests to fail.

## Actor input object example

```json
{
  "language": "en",
  "posted_within": "any",
  "jobTypes": [],
  "results_wanted": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "keyword": "",
    "location": "",
    "language": "en",
    "posted_within": "any",
    "results_wanted": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/jobteaser-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 = {
    "keyword": "",
    "location": "",
    "language": "en",
    "posted_within": "any",
    "results_wanted": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/jobteaser-jobs-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 '{
  "keyword": "",
  "location": "",
  "language": "en",
  "posted_within": "any",
  "results_wanted": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call parsebird/jobteaser-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/jobteaser-jobs-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/Bv96p8cbF5aCUTH3e/builds/31LoTI3U4X0qzc8Bd/openapi.json
