# JobTeaser Graduate & Internship Listings Finder (`xyrelith-data/jobteaser-graduate-and-internship-listings-finder`) Actor

Search JobTeaser job and internship offers by keyword, category, location, or company, with contract type, experience level, and remote-work filters.

- **URL**: https://apify.com/xyrelith-data/jobteaser-graduate-and-internship-listings-finder.md
- **Developed by:** [Xyrelith Data](https://apify.com/xyrelith-data) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## JobTeaser Graduate & Internship Listings Finder

Pull job, internship, and apprenticeship offers from JobTeaser — a job board aimed at students, graduates, and early-career professionals across Europe. Search by keyword, browse by category, location, or company, or fetch specific offers by URL.

### What this actor does

- **Six modes:** `search`, `browseByCategory`, `browseByLocation`, `browseByCompany`, `bySearchUrl`, `byUrl`
- **60+ job categories** (Programming, Marketing, Finance, Engineering, HR, …) as a dropdown
- **11 contract types** (Internship, Apprenticeship, Full time, VIE, Graduate Programme, …)
- **Location search** resolved to real cities via geocoding (Paris, Lyon, Berlin, …); without a keyword it returns every offer in that area
- **Company pages:** all offers from any JobTeaser company profile
- **Filters:** experience level, study level, remote policy, company sector and size, offer language, start date, simplified application
- **Sorting:** by relevance or newest first
- **Full descriptions and structured details** (optional): fetches each offer's detail page for the complete HTML description, salary range, publication and deadline dates, and company profile
- **No account, cookies, or API key needed**; empty fields are omitted

### Output per job

Every record carries this base set, from the search/browse results list:

- `jobId` — JobTeaser offer UUID
- `title`
- `companyName`, `companyLogoUrl` — when a logo is shown on the listing card
- `locationText`
- `contractText`
- `isJobOfTheWeek` — only present when the listing carries that badge
- `sourceUrl`
- `recordType: "job"`, `scrapedAt`

The following are only added when a detail page is fetched — automatically in `mode=byUrl`, or in the other modes when `includeDescription: true` is set:

- `contractType`, `contractDurationMonths` — parsed from the offer and its contract text
- `startDateText`, `wageText`, `remoteText`
- `applicationDeadlineText`, `studyLevelText`, `jobCategoryText`
- `publishedDateText` and `publishedDate` (ISO 8601), `applicationDeadline` (ISO 8601)
- `salaryCurrency`, `salaryMin`, `salaryMax`, `salaryPeriod` — when the employer publishes a range
- `educationRequirement`, `directApply`, `jobImmediateStart`
- `companyBusinessText`, `companyOverview` — company size/type and blurb
- `companyLogoUrl` — also resolved from the detail page in `mode=byUrl`
- `descriptionHtml` — full offer description

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `browseByCategory` / `browseByLocation` / `browseByCompany` / `bySearchUrl` / `byUrl` |
| `searchQuery` | string | `developer` | Free-text query (mode=search) |
| `jobCategory` | string | – | Category dropdown, 60+ options (mode=browseByCategory) |
| `location` | string | – | City / region / country (mode=browseByLocation) |
| `companySlug` | string | – | Company slug (mode=browseByCompany) |
| `jobUrls` | array | – | Full offer URLs (mode=byUrl) |
| `searchUrls` | array | – | Search/browse listing URLs (mode=bySearchUrl) |
| `contractType` | string | – | `internship`, `cdi`, `cdd`, `part_time`, … |
| `contractDurationMonths` | string | – | `3`, `6`, `12`, `24`, `36` |
| `jobLocale` | string | – | `fr`, `en`, `de`, `es`, … |
| `workExperienceCode` | string | – | `young_graduate`, `three_to_five_years`, … |
| `studyLevel` | string | – | `1`–`6` study-level buckets |
| `remoteType` | string | – | `remote_partial`, `remote_full` |
| `companySector` | string | – | 40+ sectors |
| `companyBusinessType` | string | – | `large`, `startup`, `sme`, … |
| `startDate` | string | – | `0` (as soon as possible) or `YYYY_MM` start month |
| `sortBy` | string | `relevance` | `relevance` or `date` (newest first) |
| `simplifiedApplicationOnly` | bool | `false` | Only offers with a simplified application |
| `includeDescription` | bool | `false` | Fetch detail pages for full descriptions and structured detail fields |
| `proxyConfiguration` | object | – | Optional proxy used only when JobTeaser blocks direct requests (403/429) |
| `maxItems` | int | `50` | Hard cap (1–1000) |

#### Example: keyword search

```json
{
  "mode": "search",
  "searchQuery": "data engineer",
  "contractType": "cdi",
  "maxItems": 20
}
```

#### Example: browse a category

```json
{
  "mode": "browseByCategory",
  "jobCategory": "Programming",
  "includeDescription": true,
  "maxItems": 25
}
```

#### Example: internships in Paris

```json
{
  "mode": "browseByLocation",
  "location": "Paris",
  "contractType": "internship",
  "maxItems": 30
}
```

#### Example: a saved search URL

```json
{
  "mode": "bySearchUrl",
  "searchUrls": ["https://www.jobteaser.com/en/job-offers?q=data%20engineer&contract=internship"],
  "maxItems": 40
}
```

Any locale path works (`/en/`, `/fr/`, `/de/`, …) for both job-search and company listing URLs.

#### Example: all offers from a company

```json
{
  "mode": "browseByCompany",
  "companySlug": "capgemini",
  "maxItems": 50
}
```

### Use cases

- **Graduate recruiters** — monitor what top employers post for students and graduates
- **University career services** — collect internship and apprenticeship offers by category
- **Job aggregators** — ingest structured early-career listings at scale
- **Talent analytics** — track contract types, start dates and salary ranges over time
- **Competitive intelligence** — watch hiring signals across company profiles

### FAQ

**What is JobTeaser?**  A career platform used by 1,500+ schools and 100k+ employers across Europe to publish jobs, internships and apprenticeships for students and graduates.

**Does this need an account?**  No. All browsing is public; applying requires an account on JobTeaser, which is outside the scope of this actor.

**Do I need a proxy?**  No. The actor starts with direct requests and automatically switches its own proxy when JobTeaser challenges the datacenter IP. You never have to configure one.

**Where do the categories come from?**  Directly from JobTeaser's own filter taxonomy (position categories, contract types, experience levels, study levels, sectors).

**How does location search work?**  The location text is geocoded (city / region / country), then the actor builds JobTeaser's location filter with the correct coordinates and radius.

**Why is `descriptionHtml` sometimes missing?**  Descriptions live on each offer's detail page. `mode=byUrl` fetches it automatically; for the other modes, set `includeDescription: true` to fetch it too (adds one request per offer).

**How fresh is the data?**  Search and detail pages reflect live listings; with `includeDescription` (or `mode=byUrl`) every record carries an ISO `publishedDate` and `publishedDateText`.

**Why isn't the date sort perfectly ordered?**  JobTeaser pins "Job of the Week" cards above the sorted results. All other rows follow newest-first when `sortBy` is `date`.

**How many offers can one run return?**  Up to 1000 records per run, set by `maxItems`. JobTeaser shows at most 50 result pages (about 1,000 offers) for a single query; split broad searches by category, location, or keyword to reach more.

**Do old saved inputs still work?**  Yes. Legacy keys such as `query`, `contract`, `company`, `urls`, `maxResults`, and `abroadOnly` are accepted; the actor maps them in code. `abroadOnly` was removed from JobTeaser's site, so the legacy value is logged and ignored.

**Why do some detail fields disappear on some offers?**  Detail fields are conditional: salary is only present when the employer publishes it, and some locales omit a text label. Empty values are omitted instead of being emitted as `null`.

**Is this affiliated with JobTeaser?**  No. This is a third-party actor built on JobTeaser's public pages.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

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

Free-text query matched against job title, company and keywords (mode=search).

## `jobCategory` (type: `string`):

JobTeaser position category.

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

City, region or country, e.g. `Paris`, `Lyon`, `Germany`.

## `companySlug` (type: `string`):

JobTeaser company slug, e.g. `capgemini`, `ey-gmbh-co-kg-wirtschaftspruefungsgesellschaft`.

## `jobUrls` (type: `array`):

Full JobTeaser job offer URLs, e.g. `https://www.jobteaser.com/en/job-offers/23281807-bdb4-4ec1-ad4c-8d50cff7efc9-capgemini-lead-data-engineer`.

## `searchUrls` (type: `array`):

JobTeaser search or company listing URLs in any locale, e.g. `https://www.jobteaser.com/en/job-offers?q=developer`, `https://www.jobteaser.com/fr/job-offers?q=developpeur` or `https://www.jobteaser.com/en/companies/capgemini/job-offers`. Pagination is automatic.

## `contractType` (type: `string`):

Only keep offers with this contract type.

## `contractDurationMonths` (type: `string`):

Maximum contract duration bucket.

## `jobLocale` (type: `string`):

Only keep offers published in this language.

## `workExperienceCode` (type: `string`):

Only keep offers for this experience level.

## `studyLevel` (type: `string`):

Only keep offers requiring this level of study.

## `remoteType` (type: `string`):

Only keep offers with this remote policy.

## `companySector` (type: `string`):

Only keep offers from companies in this sector.

## `companyBusinessType` (type: `string`):

Only keep offers from companies of this size/type.

## `startDate` (type: `string`):

Only keep offers starting on or after this month. Use `0` for "as soon as possible", or `YYYY_MM` (e.g. `2027_01`). JobTeaser rolls this list forward every month, so the current site options are validated at run time.

## `sortBy` (type: `string`):

How to order the results.

## `simplifiedApplicationOnly` (type: `boolean`):

Only keep offers that accept a simplified (one-click) application.

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

Fetch each offer's detail page to include the full description and extra fields. Slower but richer.

## `maxItems` (type: `integer`):

Hard cap on emitted records.

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

Optional proxy used only when JobTeaser blocks direct requests (403/429).

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "developer",
  "jobUrls": [],
  "searchUrls": [],
  "sortBy": "relevance",
  "simplifiedApplicationOnly": false,
  "includeDescription": false,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset containing all scraped JobTeaser job offers.

# 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 = {
    "mode": "search",
    "searchQuery": "developer",
    "jobUrls": [],
    "searchUrls": [],
    "sortBy": "relevance",
    "simplifiedApplicationOnly": false,
    "includeDescription": false,
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("xyrelith-data/jobteaser-graduate-and-internship-listings-finder").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 = {
    "mode": "search",
    "searchQuery": "developer",
    "jobUrls": [],
    "searchUrls": [],
    "sortBy": "relevance",
    "simplifiedApplicationOnly": False,
    "includeDescription": False,
    "maxItems": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("xyrelith-data/jobteaser-graduate-and-internship-listings-finder").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 '{
  "mode": "search",
  "searchQuery": "developer",
  "jobUrls": [],
  "searchUrls": [],
  "sortBy": "relevance",
  "simplifiedApplicationOnly": false,
  "includeDescription": false,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call xyrelith-data/jobteaser-graduate-and-internship-listings-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,xyrelith-data/jobteaser-graduate-and-internship-listings-finder"
        }
    }
}
```

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/YMr49Cl56urVPbfzB/builds/SElBqPIdKfqRS3XVo/openapi.json
