# AUBI-plus Scraper - Ausbildung, Duales Studium & Praktikum Jobs (`mangomarkets/aubi-plus-scraper`) Actor

Scrape apprenticeships (Ausbildung), dual study programs and internships from AUBI-plus (DE/AT/CH) by keyword, city + radius, or any URL. One clean row per job: title, company, location, start date, requirements, benefits, apply link, full description and contact emails.

- **URL**: https://apify.com/mangomarkets/aubi-plus-scraper.md
- **Developed by:** [Anouar Springer](https://apify.com/mangomarkets) (community)
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

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

## AUBI-plus Job Scraper

Collect apprenticeships (Ausbildung), dual study programmes (Duales Studium), internships and more from **AUBI-plus**, one of the largest training and apprenticeship portals in Germany, Austria and Switzerland. Every posting becomes one clean row, ready for Excel, Google Sheets or your own database.

### What you get

- **All offer types:** Ausbildung, Duales Studium, Studium, Fernstudium, Schülerpraktikum, Praktikum, Werkstudium, Trainee, Weiterbildung and Abschlussarbeit
- **Germany, Austria and Switzerland:** aubi-plus.de, aubi-plus.at and aubi-plus.ch
- **Search like on the website:** by job title or company, near a city or postal code within a radius you choose
- **Everything at once:** leave the search empty to collect all offers on AUBI-plus
- **Complete job details:** full description, start date, benefits, minimum school degree, application deadline and apply link

### How to use it

1. Enter a **Keyword**, e.g. `Fachinformatiker`, `Mechatroniker` or a company name.
2. Optionally enter a **Location** (city or postal code) and a **Radius** in km.
3. Optionally pick the **Offer types** you want, e.g. only Ausbildung and Duales Studium.
4. Set **Maximum number of jobs** and click **Start**.
5. Download the results as Excel, CSV or JSON, or connect them to Google Sheets, Zapier, Make and others.

**Other ways to search:**

- **Paste AUBI-plus links:** copy a search results page, a city page or single job pages from the AUBI-plus website into **Start URLs**.
- **Scrape everything:** leave Keyword, Location and Start URLs empty, and set Maximum number of jobs high enough, e.g. 100,000.

### Output

Each row contains:

| Field | Example |
|---|---|
| Title | Ausbildung Fachinformatiker für Anwendungsentwicklung (m/w/d) |
| Company | Name, company page and logo |
| Location | Postal code, city and federal state |
| Start date | 01.08.2027, or "Nach Absprache" |
| Offer type | Ausbildung, Duales Studium, Praktikum, … |
| Benefits | e.g. Fahrtkostenzuschuss, Weiterbildung |
| Requirements | Profession, application deadline, minimum school degree, duration, reference number |
| Apply | Direct apply link, or a note that applications go through the AUBI-plus form |
| Contact | Contact emails listed in the posting |
| Description | Full job description as text and HTML |
| Link | URL of the posting on AUBI-plus |

### Example inputs

IT apprenticeships in and around Berlin:

```json
{ "keyword": "Fachinformatiker", "location": "Berlin", "radiusKm": 25, "maxItems": 200 }
```

All Ausbildung offers on a Hamburg city page:

```json
{ "startUrls": [{ "url": "https://www.aubi-plus.de/ausbildung/ort/hamburg-38346/" }], "jobTypes": ["ausbildung"] }
```

### Tips

- By default, only postings whose title matches your keyword are kept. Turn on **Include related jobs** to also get the other openings that AUBI-plus shows for the same companies.
- Turn off **Scrape full job details** for a much faster run that only collects titles and links.
- AUBI-plus has no "posted within" filter, so this scraper doesn't offer one either.

# Actor input Schema

## `startUrls` (type: `array`):

Optional. AUBI-plus search/list URLs (e.g. a filtered /suchmaschine/suche/ URL, an /ausbildung/ort/berlin-33899/ city page) or direct job-detail URLs. When you add at least one URL here, Keyword, Country and Location are **not** used to build a URL — these links are crawled as-is (pagination is still followed). Examples: `https://www.aubi-plus.de/suchmaschine/suche/?mSuggest=Mechatroniker`, `https://www.aubi-plus.de/ausbildung/ort/berlin-33899/`, a single job URL, or `https://www.aubi-plus.de/sitemap/index.xml`.

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

Job title, study programme or company, e.g. Fachinformatiker. Ignored when Start URLs is filled in.

## `country` (type: `string`):

Which AUBI-plus country site to search with Keyword. Germany has by far the most offers. Ignored when Start URLs is non-empty (the URL's own domain is used then).

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

City or postal code (e.g. `Berlin`, `10115`). With Keyword it is converted to coordinates and searched within Radius, like on the AUBI-plus website. With Start URLs it is applied as a text filter on each job's postal code, city and region.

## `radiusKm` (type: `integer`):

Search radius around Location, in km. Used with Keyword search.

## `fullScrapeSource` (type: `string`):

How to collect *all* offers when Keyword, Location and Start URLs are empty. **All offers** (recommended) collects every offer listed on AUBI-plus. **Website search** goes through the search pages, which AUBI-plus cuts off after a certain number of pages, so it returns fewer offers.

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

Keep only these offer types. Leave empty for all.

## `includeRelatedJobs` (type: `boolean`):

AUBI-plus also returns related professions and, grouped under each company, that company's other openings. Leave off (default) to keep only postings whose title contains your keyword. Turn on to keep everything the AUBI-plus search returns. Has no effect without a keyword.

## `scrapeDetails` (type: `boolean`):

Open every job page to extract description, benefits, training type, apply link, region and contact emails. Turn off for a fast run that only collects job URLs, titles and IDs from the result pages.

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

Maximum number of jobs to save in this run. To collect all offers, set this high enough, e.g. 100000.

## `maxPages` (type: `integer`):

Safety limit on how many search result pages (`seite=N`) are followed per search.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

Apify Proxy is used by default. Switch to Residential if you see blocks, or add your own proxy URLs.

## Actor input object example

```json
{
  "keyword": "Fachinformatiker",
  "country": "de",
  "location": "Berlin",
  "radiusKm": 25,
  "fullScrapeSource": "sitemap",
  "includeRelatedJobs": false,
  "scrapeDetails": true,
  "maxItems": 20,
  "maxPages": 500,
  "maxConcurrency": 20,
  "minConcurrency": 1,
  "maxRequestRetries": 10,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Overview table: title, company, offer type, location, start date, apply link.

## `jobsFull` (type: `string`):

All fields, including full description, requirements (details), benefits and contact emails.

# 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": "Fachinformatiker",
    "location": "Berlin",
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mangomarkets/aubi-plus-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": "Fachinformatiker",
    "location": "Berlin",
    "maxItems": 20,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("mangomarkets/aubi-plus-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": "Fachinformatiker",
  "location": "Berlin",
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call mangomarkets/aubi-plus-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mangomarkets/aubi-plus-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/hxm79hv4BgaXGC0Df/builds/0v11SaLQhxjOvoPvH/openapi.json
