JobTeaser Scraper – Internships, Graduate Jobs & Apply Links avatar

JobTeaser Scraper – Internships, Graduate Jobs & Apply Links

Pricing

from $0.80 / 1,000 job scrapeds

Go to Apify Store
JobTeaser Scraper – Internships, Graduate Jobs & Apply Links

JobTeaser Scraper – Internships, Graduate Jobs & Apply Links

Scrape early-career jobs and internships from JobTeaser across Europe. Search with 15 filters or use JobTeaser URLs. Returns title, company, employer profile, locations with coordinates, contract, salary, real external apply link, dates, and full description.

Pricing

from $0.80 / 1,000 job scrapeds

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

10

Total users

2

Monthly active users

a day ago

Last modified

Share

JobTeaser Scraper: Jobs, Salaries, Apply Links & Employer Profiles

JobTeaser Scraper turns JobTeaser into a clean early-career jobs feed. Search by keyword, location with radius, and twelve site filters, or paste search, job, or company links, and get a deeply structured record per posting: title, hiring company with taxonomy and an optional full employer profile, every posting location with coordinates, contract and duration, study level and experience requirements, salary, the application channel with the real external apply link, publication dates, and the complete description in text, HTML, and structured rich-text form. Export to JSON, CSV, or Excel, pull results through the API, or pipe them into your apps.

Why This Scraper?

  • Two ways to find jobs. Search by keyword, location with radius, and twelve site filters (15 search parameters total), or paste search-result, job-detail, or company-profile links directly. No need to build URLs by hand.
  • Deep job records. Around 120 fields per posting, covering company, locations, contract, classification, requirements, work arrangement, compensation, application, and dates.
  • Employer profiles on demand. Attach each company's public profile, headcount, sector, founding year, culture, social links, photo gallery, and hiring FAQ, fetched once per company and cached for the rest of the run.
  • The real apply link. External postings carry the employer's own application URL and external requisition id, not just JobTeaser's own listing page.
  • Fifteen filters. Contract type, duration, remote policy, study level, experience, company type, industry, job category, listing language, start date, application flow, and impact-labelled employers, plus keyword, location with radius, and site language. Many industries and job categories also offer a grouped "all" option alongside their specific sub-categories.
  • Multi-keyword search and coverage fan-out. Run several keyword searches in one go, and optionally fan a broad search out across contract types, when no contract filter is set, to get past the site's own display cap.
  • Built for schedules. Incremental mode returns only new and updated records on recurring runs by default (reappeared records only after an Emit expired run has marked a record missing), and resume mode continues one interrupted run without re-collecting or re-billing what it already has.

Use Cases

  • University career services: track internships and graduate programmes that match what their students are eligible for.
  • Recruitment agencies and RPOs: monitor which employers are actively hiring early-career and entry-level talent across countries.
  • HR tech and job board platforms: enrich a European early-career job feed with structured salary, location, and apply-link data.
  • Market and labour research: study entry-level hiring trends by sector, contract type, and country over time.
  • Competitive intelligence teams: watch a shortlist of employer company profiles for new postings and culture or headcount changes.

Data You Get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
id"810b03a1-5337-434b-a3fd-8e61cf053567"
title"Sample Business Developer"
url"https://www.jobteaser.com/en/job-offers/810b03a1-...-sample"
company.name / company.legal_name"Sample Company" / "Sample Company SAS"
company.profile_urllink to the employer's JobTeaser company page
company_taxonomy.main_sector_code"recruitment_training"
primary_location.city / primary_location.country"Cologne" / "Germany"
primary_location.latitude / primary_location.longitude50.93 / 6.96
locationsevery posting location, same shape as primary_location
contract.label / contract.code"Full time Position" / "cdi"
classification.category_name"Sales & Business Development"
requirements.study_level"Bachelor level or equivalent"
work_arrangement.remote_policy"Partial"
compensation.display_text / compensation.min / compensation.max"80000 EUR - 90000 EUR / annually" / 80000 / 90000 (when full details are fetched)
application.external_url / application.external_idthe employer's own apply link and requisition id (external postings)
application.channel_code"CANDIDACY_TYPE_EXTERNAL"
dates.published_at / dates.start_date"2026-01-01T00:00:00Z" / "As soon as possible"
status.is_activetrue
content.description_text / content.description_html / content.description_rich_textplain text, HTML, and structured rich-text forms (when full details are fetched)
mediaphotos and videos attached to the posting
company_detailsthe employer's full public profile, about 45 fields (when employer profiles are included)
changeType / changedFields / firstSeenAt / lastSeenAtadded only in incremental mode

Pasting a company-profile link in URL mode pushes a separate record instead of a job: id ("company:<slug>"), record_type ("company_profile"), url, and the same company_details object described above, with fields covering the employer's headcount, headquarter address, founding year, turnover, description, presentation, culture, desired profile, recruitment information, team description, contact email, countries of presence, brands, social network links, Great Place to Work permalink and year, impact labels, CSR commitments and actions, photo gallery, institutional video, open job positions, hiring FAQ, school-partner status, and banner and logo images.

How to Use

  1. Pick a mode: search (keywords, location, and filters) or url (paste links).
  2. For search mode, fill in your keywords and location, and switch on any of the fifteen filters you need.
  3. Turn on Fetch full job details and Include employer profiles if you want the complete record; leave them off for lighter, faster card-only results. In search mode, Include employer profiles requires Fetch full job details to also be on.
  4. Set Max results to control run size and cost, then click Start.

Search with filters:

{
"mode": "search",
"queries": ["data analyst"],
"location": "Paris",
"radius": "30",
"contract": ["internship", "alternating"],
"remoteTypes": ["remote_partial"],
"fetchDetails": true,
"includeCompanyDetails": true,
"maxItems": 100
}

Paste URLs (search page, job page, and company page):

{
"mode": "url",
"startUrls": [
"https://www.jobteaser.com/en/job-offers?q=marketing&contract=internship",
"https://www.jobteaser.com/en/job-offers/00000000-0000-0000-0000-000000000000-sample-job",
"https://www.jobteaser.com/en/companies/sample-company"
],
"fetchDetails": true,
"maxItems": 50
}

Browse all jobs in a country with coverage fan-out:

{
"mode": "search",
"queries": [],
"location": "Germany",
"studyLevels": ["4"],
"maximizeCoverage": true,
"maxItems": 500
}

Recurring incremental monitoring:

{
"mode": "search",
"queries": ["software engineer"],
"location": "Berlin",
"contract": ["cdi"],
"incrementalMode": true,
"stateKey": "berlin-swe-cdi",
"emitExpired": true,
"maxItems": 0
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/jobteaser-scraper").call(run_input={
"mode": "search",
"queries": ["data analyst"],
"location": "Paris",
"maxItems": 50,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], job["company"]["name"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/jobteaser-scraper').call({
mode: 'search',
queries: ['data analyst'],
location: 'Paris',
maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets, or webhooks from the Integrations tab.

Coverage and result caps

JobTeaser's own search results list is capped at roughly 1,000 postings for one filter combination, and this actor pages through up to 60 result pages per search scope on top of that. Max results then caps the total records returned across every search or URL in the run; set it to 0 for no limit. Maximize coverage fans a search out across every contract type (when no contract filter is already set) to collect more of the total once a single search hits the site's own cap.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one specific interrupted crawl: paste a previous run or dataset id and this run skips every record already collected there. No state is kept between unrelated runs.
  • Incremental mode (incrementalMode) is for scheduling this same search or URL list on a recurring basis and getting only what changed. The actor remembers its own baseline for the scope (keyed by stateKey, or an automatic key derived from the search/URL and filter settings) and classifies every record, jobs and, in URL mode, pasted company profiles alike, as NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED. By default only NEW and UPDATED records return; REAPPEARED only occurs after an earlier run with Emit expired on has marked a record missing. Turn on Emit unchanged or Emit expired to also get those record types (both return, and bill, extra rows).
  • EXPIRED is only produced once a run has scanned its full tracked scope with no cap hit and no Resume, and only with Emit expired on. REAPPEARED can then only happen for a record that a prior complete, emitExpired run had already marked missing; a record that has simply never gone missing is classified UPDATED or UNCHANGED, never REAPPEARED.
  • Change detection excludes fields that would otherwise misfire: fields only populated when Fetch full job details is on (so comparing a card-only snapshot to a detail-fetched one of the same job never reads as a false change), the attached company_details object on a job record (that is the employer's data, not the job's own, so an employer editing its profile never re-fingerprints every job there), and this run's own search position and scrape-time metadata.
  • Billing follows what is actually pushed: detail enrichment is billed once per pushed record that had its detail page fetched, not once per page fetched, so a record suppressed by incremental mode is never charged even though its page may already have been fetched to compute the fingerprint. Employer profile is billed once per unique employer that ends up on at least one pushed record with real company data, in either search or URL mode, not once per pushed record, so several jobs at the same employer still cost one charge.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each pushed record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify then Settings then API & Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you have not authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.
  4. Max items to export per connector caps how many records are written per run; it never affects the dataset itself.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip. Notion gets one page per record; Linear, Airtable, and Apify get a best-effort write.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (keywords and filters) or url (paste links).
queriesarraynone (prefill: ["data analyst"])Keywords to search; each runs separately. Empty browses all jobs matching your filters.
localestringenSite language for labels: en, fr, de, es, it, nl, sv, da.
locationstringnoneCity, region, or country, e.g. Paris, France. Cities combine with radius.
radiusstring30Search radius in km around a city location: 5, 10, 20, 30, or 50.
contractarraynoneContract types: internship, apprenticeship, fixed-term, full time, graduate programme, VIE, part-time, thesis, freelance, and more.
contractDurationarraynoneContract length buckets from 1-3 months to 25-48+ months.
remoteTypesarraynoneFull remote or partial remote.
candidacyTypestring`` (any)Restrict to simplified on-site application or external application.
studyLevelsarraynoneRequired education level, none through doctorate.
workExperiencearraynoneStudent/recent graduate up to more than 10 years.
companyBusinessTypearraynoneLarge company, start-up, SME, public/charity, or collective.
companySectorsarraynone40+ employer industries, including grouped "all" options.
jobCategoriesarraynone60+ job categories and sub-categories, including grouped "all" options.
languagesarraynoneListing language market (15 languages).
startDatearraynoneExpected start dates: 0 for as soon as possible, or YYYY_MM.
jobWithImpactbooleanfalseKeep only listings from employers highlighted for social or environmental impact.
startUrlsarraynone (prefill: ["https://www.jobteaser.com/en/job-offers?q=marketing"])Search-result, job-detail, or company-profile URLs (url mode).
fetchDetailsbooleantrueAttach the complete description, salary, apply link, dates, and category to every job.
includeCompanyDetailsbooleanfalseAlso fetch each employer's public company profile and attach it to the job record. Fetched once per company. In search mode, requires Fetch full job details to also be on; the employer slug is only known from the job's detail page.
maximizeCoveragebooleanfalseFan a search out across contract types, when no contract filter is set, to get past the site's display cap.
maxItemsinteger20Total records to return across all searches or URLs (the run cap). 0 means no limit.
resumeFromRunIdstringnoneContinue one specific interrupted run/dataset without re-collecting or re-billing what it already has.
incrementalModebooleanfalseRecurring monitoring of the same search/URL scope: NEW and UPDATED records return by default; REAPPEARED only after an Emit expired run has marked a record missing.
stateKeystringnoneOptional name for an incremental-mode monitoring campaign; auto-derived from the search/URL and filter settings when left empty.
emitUnchangedbooleanfalseAlso return (and bill) unchanged records in incremental mode.
emitExpiredbooleanfalseAlso return (and bill) records no longer found, once a complete, non-resumed, non-capped scan has run in incremental mode.
proxyobjectApify Residential proxy, country FRConnection settings. JobTeaser serves the European market and needs a residential connection for reliable results.
mcpConnectorsarraynoneOptionally pipe results into Notion, Linear, Airtable, or Apify.
notionParentPageUrlstringnoneNotion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"id": "810b03a1-5337-434b-a3fd-8e61cf053567",
"title": "Sample Business Developer",
"url": "https://www.jobteaser.com/en/job-offers/810b03a1-5337-434b-a3fd-8e61cf053567-sample",
"company": {
"id": "4dea0b07-5fbc-4a9e-9fa3-0a9d3a8e408a",
"name": "Sample Company",
"legal_name": "Sample Company SAS",
"legal_id": "508271715",
"profile_url": "https://www.jobteaser.com/en/companies/sample-company",
"logo_url": "https://media.example.com/logo.png",
"cover_image_url": "https://media.example.com/cover.jpg",
"short_description": "What the employer says about itself."
},
"company_profile": {
"summary": "What the employer says about itself.",
"type_label": "Start-up",
"size_label": "200 employees",
"industry_label": "Recruitment/Training"
},
"company_taxonomy": {
"business_type_code": "startup",
"main_sector_code": "recruitment_training",
"sector_codes": ["digital_e_commerce", "recruitment_training"],
"industry_ids": ["4e69c5c1-6d12-400c-8a91-d7e2eb33255c"],
"space_visibility": "SPACE_VISIBILITY_FULL"
},
"primary_location": {
"label": "Cologne, Germany",
"address": "Cologne, Germany",
"city": "Cologne",
"region": "North Rhine-Westphalia",
"sub_region": "Cologne",
"country": "Germany",
"place_id": "ChIJ5S-raZElv0cR8HcqSvxgJwQ",
"latitude": 50.9375,
"longitude": 6.96028
},
"locations": [ { "...": "every posting location, same shape" } ],
"google_locations": [ { "...": "normalized places from the detail page" } ],
"location_count": 1,
"has_multiple_locations": false,
"contract": { "label": "Full time Position", "code": "cdi", "duration_min_months": null, "duration_max_months": null },
"classification": {
"category_name": "Sales & Business Development",
"category_id": "b013338e-9d5e-4784-8196-02618df3d865",
"department": "Sales & Business Development",
"language_code": "de",
"work_experience_code": "three_to_five_years",
"employment_types": ["FULL_TIME"]
},
"requirements": {
"study_level": "Bachelor level or equivalent",
"study_level_code": "STUDY_LEVEL_BACHELOR",
"study_level_codes": ["STUDY_LEVEL_BACHELOR"],
"education_requirement": "bachelor degree",
"applicant_location_requirements": "Germany"
},
"work_arrangement": {
"job_location_type": "TELECOMMUTE",
"remote_policy": "Partial",
"remote_policy_code": "REMOTE_TYPE_PARTIAL_ALLOWED",
"remote_policy_type": "partially_remote"
},
"compensation": {
"display_text": "80000 EUR - 90000 EUR / annually",
"min": 80000, "max": 90000, "currency": "EUR",
"frequency": "WAGE_FREQUENCY_YEARLY", "status": "has_wage"
},
"application": {
"direct_apply": false,
"type": "external_application",
"channel_code": "CANDIDACY_TYPE_EXTERNAL",
"external_url": "https://careers.example.com/job/000",
"external_id": "64720750"
},
"dates": {
"published_at": "2026-06-24T21:10:44.000Z",
"expected_archive_at": "2026-07-31T21:10:44Z",
"application_deadline": "As long as the job is online",
"start_date": "As soon as possible",
"immediate_start": true
},
"status": { "is_active": true, "premium": true, "private_offer": false, "exclusive": false },
"content": {
"description_text": "Plain-text description.",
"description_html": "<p>Full HTML description.</p>",
"description_rich_text": [ { "...": "structured blocks" } ],
"employer_overview": "Our young grads got talent"
},
"media": [ { "type": "video", "url": "https://media.example.com/video.jpg" } ],
"company_details": { "...": "about 45 employer-profile fields when Include employer profiles is on" },
"source_context": { "seed_type": "search", "page_index": 1, "scraped_at": "2026-01-01T00:00:00+00:00" }
}

Plan Requirement

This actor bills per event, not per plan tier: a charge when the run starts, a charge per record returned in the dataset (jobs, company profiles, and EXPIRED rows alike), and two optional charges billed per record actually returned (detail enrichment when full job details are fetched, employer profile when company details are included). In URL mode, a pasted job-detail link always incurs the detail-enrichment charge and a pasted company-profile link always incurs the employer-profile charge, regardless of the Fetch full job details / Include employer profiles toggles. The Pricing tab shows current rates. The proxy input defaults to Apify's residential proxy for France; JobTeaser serves the European market and a residential connection is required for reliable results.

FAQ

How much does it cost?

You pay per run start, per job returned, and per optional enrichment you switch on (full job details, employer profiles). The Pricing tab shows the current rates. Use Max results to cap the cost of any run.

This actor collects only publicly available job listing data. You are responsible for how you use it: follow JobTeaser's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution.

Can I get only new or changed jobs on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated records by default (plus reappeared records once an earlier Emit expired run has marked one missing), and unchanged ones are not billed unless you turn on Emit unchanged.

What is the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues one specific interrupted run: it skips records that run already collected and keeps no state afterward. Incremental mode is for running the same search or URL list again and again on a schedule; it keeps its own baseline for that scope and reports what changed since last time. Setting both together on a scope that already has saved incremental state fails the run with a clear message, since the two are meant for different situations; remove one or the other.

Why did my run return no results instead of failing?

A run only stops with an explicit failure when resumeFromRunId cannot be resolved, or when Incremental mode already has saved state for a scope and resumeFromRunId is also set. A refused connection does not fail the run: the actor retries automatically, and if every page is still refused, the run finishes normally with zero records and a status message telling you to check the residential proxy setting or broaden your filters. In Incremental mode, a run that scanned everything and found nothing new is a normal quiet run, not an error.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear, or Airtable.

🔗 Want more jobs data?

Pair this actor with these related scrapers from the same team:

💼 CareerBuilder Scraper
Scrape CareerBuilder.com job listings by search or URL. Returns title, company profile...
💼 Reed.co.uk Scraper
Scrape Reed.co.uk jobs, companies, courses, and reviews. Search by keyword, location...
💼 HiJobs.net Scraper
Scrape hijobs.net job listings via the official mobile API: title, employer, salary...
💼 s1jobs Scraper
Scrape jobs from s1jobs.com across Scotland and the UK. Search by keyword, location, or...
💼 Bayt.com Scraper
Scrape Bayt.com job listings by keyword, country, or URL. Extract structured data...
💼 France Travail Scraper
Scrape job offers from France Travail with titles, companies, locations, salaries...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.