ausbildung APIausbildung.de ↗
Access Germany's largest apprenticeship portal via API. Search listings, get posting details, browse 300+ professions, and retrieve year-by-year training salaries.
What is the ausbildung API?
The ausbildung.de API provides 5 endpoints covering apprenticeship listings, profession catalogs, and salary data from Germany's largest Ausbildung portal. Use search_listings to find vacancies by keyword, location, and radius, then drill into any posting with get_listing_detail to retrieve the full HTML description, contact emails, posting dates, and postal address. Profession-level data includes structured salary distributions broken down by training year.
curl -X GET 'https://api.parse.bot/scraper/ff4c0507-56d1-480f-a4b9-fa5925c5d6fe/search_listings?from=0&query=Informatiker&radius=10&location=Berlin' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace ausbildung-de-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ausbildung.de SDK — search apprenticeships, explore professions, compare salaries."""
from parse_apis.ausbildung_de_api import Ausbildung, ListingNotFound
client = Ausbildung()
# Search for IT apprenticeships in Berlin — limit caps total items fetched.
for listing in client.listingsummaries.search(query="Informatiker", location="Berlin", limit=3):
print(listing.title, listing.company, listing.location)
# Drill into the first result's full details.
result = client.listingsummaries.search(query="Kaufmann", limit=1).first()
if result:
detail = result.details()
print(detail.title, detail.company, detail.date_posted)
# Browse professions and get salary info for one.
profession = client.professions.list(limit=1).first()
if profession:
info = profession.details()
print(info.name, info.description[:80])
sal = profession.salary()
print(sal.profession_slug, sal.salary_years)
# Typed error handling: catch a bad slug lookup.
try:
client.listings.get(slug="nonexistent-listing-slug-00000")
except ListingNotFound as exc:
print(f"Not found: {exc.slug}")
print("exercised: listingsummaries.search / details / professions.list / profession.details / profession.salary / listings.get")Full-text search over apprenticeship/training positions by keyword, location, and radius. Returns up to 20 listings per page; advance with `from` in increments of 20. Omitting all params returns the broadest result set. Each listing carries a slug for drill-down via get_listing_detail.
| Param | Type | Description |
|---|---|---|
| from | integer | Offset for pagination in increments of 20 |
| query | string | Search keyword — profession name or company name |
| radius | integer | Search radius in km around location |
| location | string | City name or postal code to search near |
{
"type": "object",
"fields": {
"from": "integer offset used",
"listings": "array of listing summary objects each containing id, title, company, location, profession, start_date, apprenticeship_type, duration, slug, url",
"total_count": "integer total matching vacancies",
"results_count": "integer results returned on this page"
},
"sample": {
"data": {
"from": 0,
"listings": [
{
"id": "44eaa315-20ad-4b2c-af01-c9b7794faabe",
"url": "https://www.ausbildung.de/stellen/umschulung-zum-zur-fachinformatiker-in-ihk-bei-grone-bildungszentren-berlin-gmbh-gemeinnuetzig-in-berlin-44eaa315-20ad-4b2c-af01-c9b7794faabe/",
"slug": "umschulung-zum-zur-fachinformatiker-in-ihk-bei-grone-bildungszentren-berlin-gmbh-gemeinnuetzig-in-berlin-44eaa315-20ad-4b2c-af01-c9b7794faabe",
"title": "Duale Umschulung Fachinformatiker/-in (IHK)",
"company": "Grone-Bildungszentren Berlin GmbH",
"duration": "24 Monate",
"location": "10111 Berlin",
"profession": "Fachinformatiker/in",
"start_date": "2026-07-01",
"apprenticeship_type": "klassische-duale-berufsausbildung"
}
],
"total_count": 223,
"results_count": 54
},
"status": "success"
}
}About the ausbildung API
Searching and Retrieving Listings
search_listings accepts a free-text query (profession name or company name), a location (city or postal code), and an optional radius in kilometers. It returns up to 20 results per page; paginate by advancing the from offset in increments of 20. Each listing summary includes id, title, company, location, profession, start_date, apprenticeship_type, and a slug. That slug feeds directly into get_listing_detail, which returns the full JSON-LD JobPosting record: description (HTML), emails, a structured location object with postalCode and streetAddress, date_posted, valid_through, and employment_type.
Profession Catalog and Detail
list_all_professions returns the complete A-Z catalog of recognized apprenticeship career types on ausbildung.de — over 300 professions — with each entry's name, slug, and url. No parameters are required. Passing any of those slugs to get_profession_detail yields a textual description, an aggregate rating, review_count, and a salary object in MonetaryAmountDistribution format with minValue, maxValue, currency, and unitText.
Training Salary Breakdown
get_profession_salary provides a year-by-year view of training compensation. The salary_years object contains keys year_1, year_2, year_3 (and year_4 where applicable), each holding a range string such as '1.267 - 1.440 Euro'. A json_ld_salary field mirrors the structured MonetaryAmountDistribution data when available. Not all professions publish multi-year breakdowns; the endpoint returns whatever the profession page exposes.
The ausbildung API is a managed, monitored endpoint for ausbildung.de — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ausbildung.de changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official ausbildung.de API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate open apprenticeship vacancies by German city or postal code using search_listings location and radius params
- Build a profession explorer that surfaces salary progression across training years from get_profession_salary
- Monitor new listings for a specific company by querying search_listings with the company name and tracking date_posted
- Populate a comparison tool with min/max training salaries across 300+ professions from get_profession_detail
- Extract contact emails from individual posting pages via get_listing_detail for recruiter outreach pipelines
- Track listing expiry windows by comparing date_posted and valid_through fields across paginated search results
- Generate a structured profession glossary with canonical URLs using list_all_professions
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ausbildung.de offer an official developer API?+
What does get_listing_detail return beyond what search_listings provides?+
How does pagination work in search_listings?+
from parameter as an offset — pass 0 for the first page, 20 for the second, 40 for the third, and so on. The response includes total_count so you can calculate how many pages exist for a given query.