# JobTeaser Scraper — EU Student & Graduate Jobs (`studio-amba/jobteaser-scraper`) Actor

Scrape student and graduate job listings from jobteaser.com across France and other EU countries. Extract job title, company, location, contract type, and posting date by search keyword. No login required.

- **URL**: https://apify.com/studio-amba/jobteaser-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result scrapeds

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

## JobTeaser Scraper — EU Student & Graduate Jobs (No Login)

Scrape student internships, apprenticeships, and graduate job listings from jobteaser.com — Europe's largest student-to-employer job platform, active in France, Belgium, Germany, Italy, Spain, Poland, and the Nordics.

### What is JobTeaser?

JobTeaser partners with universities and business schools across Europe to run their official career portals, then aggregates every posted job into one searchable platform. It's the primary channel students and recent graduates use to find internships (`stage`), apprenticeships (`alternance`), and first jobs — which makes it a strong data source for anyone tracking early-career hiring demand, internship pay and duration norms, or which companies are actively recruiting students in a given country.

- **Early-career hiring intelligence** — Track which companies are posting internships and graduate roles, and how often
- **Market research for HR / EdTech tools** — Benchmark internship duration, contract types, and location spread across sectors
- **Recruitment marketing** — Identify competing employers targeting the same student talent pool
- **Academic / career-services research** — Analyze the internship market by city, sector, or contract length

### What data does JobTeaser Scraper extract?

- Job title
- Hiring company name
- Job location (city, country)
- Contract type (internship duration, apprenticeship, permanent, etc.)
- Relative posting date (e.g. "3 days ago")
- Canonical job offer URL

### How to scrape jobteaser.com data

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | String | Search term, e.g. `"stage marketing"`, `"alternance developpeur"`, `"graduate program"` |
| `lang` | String | JobTeaser locale segment: `en`, `fr`, `nl`, `it`, `pl`, `no`, `sv`, `pt`, etc. (default `fr`) |
| `maxResults` | Integer | Maximum job listings to return (default: 100) |
| `brightDataApiKey` | String (secret) | Bright Data Web Unlocker API key — required, see below |
| `proxyConfiguration` | Object | Not used by this actor — kept for input-schema compatibility |

**A Bright Data Web Unlocker API key is required.** JobTeaser runs DataDome anti-bot protection that returns a "Security checkup" challenge page to plain and datacenter requests. Bright Data's Web Unlocker (French exit) solves the challenge server-side and returns the real page. Get a key at [brightdata.com](https://brightdata.com).

**Tips:**

- Combine `searchQuery` with `lang` to target a specific country's listings — the same query on `/fr/`, `/nl/`, or `/it/` returns different local results
- Leave `searchQuery` empty and it falls back to `"stage marketing"` so the actor always returns data
- Results are deduplicated by job URL across pagination

### Output

Each job listing is returned as a structured JSON object:

```json
{
    "jobTitle": "Stage marketing et offres commerciales F/H",
    "company": "Eiffage Énergie Systèmes",
    "location": "Jonage, France",
    "contractType": "Stage 4 à 6 mois",
    "url": "https://www.jobteaser.com/fr/job-offers/8ef6aa93-9293-47aa-bc1d-bf690b7de5e5-eiffage-energie-systemes-stage-marketing-et-offres-commerciales-f-h",
    "postedDate": "il y a 3 jours",
    "scrapedAt": "2026-07-13T09:12:00.000Z"
}
```

### Output fields

| Field | Type | Example |
|-------|------|---------|
| `jobTitle` | String | `"Stage marketing et offres commerciales F/H"` |
| `company` | String | `"Eiffage Énergie Systèmes"` |
| `location` | String | `"Jonage, France"` |
| `contractType` | String | `"Stage 4 à 6 mois"` |
| `url` | String | Full job offer URL |
| `postedDate` | String | `"il y a 3 jours"` (relative, as shown on the listing) |
| `scrapedAt` | String | ISO 8601 timestamp |

### Cost estimate

Each search-results page returns ~20 job listings from one Bright Data request, so this actor uses well under **1 compute unit per 100 job listings**. At standard Apify pricing that is a fraction of a cent per listing.

### Limitations

- Salary and full job description live on the detail page only — this actor scrapes the SSR listing grid, not detail pages
- Sponsored/featured cards occasionally omit the relative posting date
- Data is scraped from the public website and may change without notice
- Respect JobTeaser's terms of service and use responsibly

### Frequently asked questions

**Do I need my own Bright Data account?**
Yes. JobTeaser blocks plain and datacenter requests with a DataDome challenge page, so a Bright Data Web Unlocker API key is required to run this actor. A free Bright Data trial is enough to test it.

**Can I scrape more than one country in a single run?**
Not in one run — `lang` scopes the run to a single JobTeaser locale. Schedule separate runs per country (or use the managed service below) if you need multi-country coverage.

**Why do some listings have no `postedDate`?**
Sponsored/featured cards use a different footer layout that sometimes omits the relative date. Every other field is still populated.

**How fresh is the data?**
Each run scrapes the live search-results pages at request time — there's no caching layer, so results reflect what's on JobTeaser right now.

### Related scrapers

- [Pracuj Scraper](https://apify.com/studio-amba/pracuj-scraper) — Poland's largest job board.
- [InfoJobs Scraper](https://apify.com/studio-amba/infojobs-scraper) — Spain's largest job board.
- [HelloWork Scraper](https://apify.com/studio-amba/hellowork-scraper) — French job board and career site.
- [France Travail Scraper](https://apify.com/studio-amba/france-travail-scraper) — France's national employment agency, full job market.
- [Welcome to the Jungle Scraper](https://apify.com/studio-amba/welcometothejungle-scraper) — French/EU tech and startup job board.

### Disclaimer

This actor collects only publicly available job-offer data from jobteaser.com for legitimate use such as market research and job aggregation. Respect JobTeaser's terms of service and applicable data-protection law when using the output.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs, deduplication, delta detection, and delivery to your inbox, Google Sheets, or API — maintenance included. We can also build a custom version with your exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email <hello@studioamba.dev> for a free data sample. We maintain 300+ European web scrapers and answer within one business day.

# Actor input Schema

## `searchQuery` (type: `string`):

Search term for job listings, e.g. 'stage marketing', 'alternance developpeur', 'graduate program'.

## `lang` (type: `string`):

JobTeaser locale segment: en, fr, nl, it, pl, no, sv, pt, etc.

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

Maximum number of job listings to return.

## `brightDataApiKey` (type: `string`):

Your Bright Data API key for the Web Unlocker zone. Required to bypass JobTeaser's DataDome anti-bot protection. Get one at https://brightdata.com. Can also be supplied via the BRIGHT\_DATA\_API\_KEY environment variable.

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

Not used — this actor routes all traffic through Bright Data Web Unlocker (FR), not Apify proxies.

## Actor input object example

```json
{
  "searchQuery": "stage marketing",
  "lang": "fr",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}
```

# 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 = {
    "searchQuery": "stage marketing",
    "lang": "fr",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "FR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/jobteaser-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 = {
    "searchQuery": "stage marketing",
    "lang": "fr",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "FR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/jobteaser-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 '{
  "searchQuery": "stage marketing",
  "lang": "fr",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}' |
apify call studio-amba/jobteaser-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/6jAzc9DVIFdZ5gvPF/builds/Z70hrqhPIvGllzlQn/openapi.json
