JobTeaser Scraper at a glance
JobTeaser Scraper is a ready-to-run Apify actor from abotapi for collecting jobs data. Its documented output includes title, change type (incremental mode), company, location and contract, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.50 per 1,000 results on the Apify Free plan and from $0.80 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Jobs, Automation, Developer Tools
- Pricing
- $1.50 per 1,000 results (Free plan), from $0.80 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 32 options
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.
What JobTeaser Scraper can do
- 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: sector, company type, headquarters, website, follower count, presentation, social links, photo and video gallery, CSR actions and impact labels, 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.
Choose what to collect
These inputs let you configure JobTeaser Scraper - Internships, Graduate Jobs & Apply Links. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | search = provide keywords, a location, and filters. url = paste search-result, job-detail, or company-profile URLs. |
queriesarray | One or more job titles, skills, or employer names. Each is searched separately. Leave empty to browse all jobs matching your filters. |
localestring | Browsing language of the site (affects labels and localized fields, not which jobs exist). |
locationstring | City, region, or country, e.g. Paris, Berlin, France. Countries filter directly; cities are resolved to coordinates and combined with the radius below. |
radiusstring | Search radius around a city location. |
contractarray | Limit to one or more contract types. |
contractDurationarray | Limit by contract length. |
Show 25 more inputs
| Input | What it controls |
|---|---|
remoteTypesarray | Limit by remote-work policy. |
candidacyTypestring | Limit by how candidates apply. |
studyLevelsarray | Limit by required education level. |
workExperiencearray | Limit by candidate experience level. |
companyBusinessTypearray | Limit by employer type. |
companySectorsarray | Limit by employer industry. |
jobCategoriesarray | Limit by job category or sub-category. |
languagesarray | Limit by the language market of the listing. |
startDatearray | Expected start dates: 0 = as soon as possible, or year_month like 2026_09. |
jobWithImpactboolean | Keep only listings from employers highlighted for social or environmental impact. |
postedWithinstring | Keep only jobs published within this window. The site has no date filter, so this is applied to each job's published date (or activation date on search cards) before it is returned; jobs without a date are kept. Filtered jobs are not returned or billed. |
startUrlsarray | Paste search-result URLs (/job-offers?...), job-detail URLs (/job-offers/ or /job-offers/-), or company-profile URLs (/companies/). Only used in url mode. Left untouched, url mode scrapes one example of each of these shapes. |
fetchDetailsboolean | Attach the complete description (text, HTML, rich text), salary, apply link, dates, and category to every job. Leave off for lighter search-card results. |
includeCompanyDetailsboolean | Also fetch each employer's public company profile (size, sector, culture, social links, gallery, FAQ) and attach it to the job record. Fetched once per company. |
maximizeCoverageboolean | Collect as many matching listings as possible by fanning the search out across contract types when a single result list hits the site's display cap. |
maxItemsinteger | Total records to return across all searches or URLs. This is the run cap. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue an interrupted crawl without returning or charging for records already collected there. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching records as NEW. A record counts as UPDATED when any compared field changes: all record fields except the excluded ones (source_context, search_metadata.search_index/result_position, company_details on job rows, detail-page-only fields, and anything you list in Ignore fields). Later runs normally return only NEW, UPDATED, and REAPPEARED records. Turn on "Emit unchanged" or "Emit expired" only when you also want those records returned (and billed). State is kept separately for each search/URL and filter/detail setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and filter settings, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search/URL scope, not when Max results capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names (dotted paths such as compensation.salary_min, a parent name ignores everything under it) whose changes must not mark a record UPDATED or appear in changedFields. The fields are still returned in the record. Already ignored automatically: source_context, search_metadata.search_index and result_position, company_details on job rows, and detail-page-only fields (so a run with Fetch details off never flags every job as changed). |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify then Settings then API & Integrations, then select it here. Notion gets a page-per-item export; other connectors get a best-effort write. Leave empty to skip. Supported: Notion, Linear, Airtable, Apify. |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required only for the Notion export. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
titleTitle (text)changeTypeChange type (incremental mode) (text)company.nameCompany (text)primary_location.addressLocation (text)contract.codeContract (text)classification.category_nameCategory (text)work_arrangement.remote_policyRemote (text)compensation.display_textSalary (text)dates.published_atPosted (text)application.external_urlApply (link)urlURL (link)changedFieldsChanged fields (incremental mode) (array)Show 16 more fields
firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)contract.labelContract (text)requirements.study_levelStudy level (text)dates.start_dateStart date (text)content.description_textDescription (text)application.channel_codeApply channel (text)status.is_activeActive (boolean)company_details.nameCompany (text)company_details.sectorSector (text)company_details.business_type_codeBusiness type (text)company_details.followers_countFollowers (number)company_details.headquarter_addressHeadquarters (text)company_details.websiteWebsite (text)company_details.descriptionDescription (text)record_typeRecord type (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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"
}
}Ways to use this data
- 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 profile changes.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does JobTeaser Scraper return?
The documented output for JobTeaser Scraper includes title, change type (incremental mode), company, location, contract, category, remote and salary. Availability of each field depends on the source page and the selected mode.
How much does JobTeaser Scraper cost?
It costs $1.50 per 1,000 results on the Apify Free plan and from $0.80 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
What happens when a run reaches its time limit?
The actor watches the run's own timeout. Shortly before it, it stops starting new page reads, keeps every result already collected, logs one line saying the time limit ended the run, and finishes SUCCEEDED, so you never get a cut-off run with no closing message. Results whose job page or company profile could not be read in time are left out rather than delivered half-built. If the limit ends the run before any result was read, it ends FAILED with a message saying so. Raise the timeout in Run options to collect more in one run.
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.
