Bund APIausbildungssuche.api.bund.dev ↗
Search Germany's Ausbildungssuche portal for Berufsausbildung offers by profession and region. Get provider, location, start date, and application contacts.
What is the Bund API?
The Ausbildungssuche API exposes 2 endpoints that return vocational training (Berufsausbildung) offers from Germany's federal training search portal. The search_offers endpoint accepts a required profession code and an optional federal state filter to return paginated offer lists with titles, occupation classifications, and provider details. The get_offer endpoint returns a single offer's full record including address coordinates, application URL, and the date the source last updated the listing.
curl -X GET 'https://api.parse.bot/scraper/0d2f0905-9c8b-41e1-b275-f5c34e347623/search_offers?profession=pflegefachperson' \ -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 ausbildungssuche-api-bund-dev-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: search German vocational training offers and inspect one."""
from parse_apis.ausbildungssuche_api_bund_dev_api import (
Ausbildungssuche, Profession, Region, OfferNotFound,
)
client = Ausbildungssuche()
# Search nursing offers in Nordrhein-Westfalen, cap at 5 total items.
for offer in client.offers.search(
profession=Profession.PFLEGEFACHPERSON, region=Region.NRW, limit=5
):
print(offer.title, "|", offer.location.city, offer.location.state_code)
# Drill into the first IT training offer nationwide.
hit = client.offers.search(profession=Profession.FACHINFORMATIKER, limit=1).first()
if hit is not None:
# Provider and location are typed nested objects.
print(hit.provider.name, hit.provider.phone)
print(hit.location.street, hit.location.postal_code, hit.location.city)
# Show offer-specific application contacts.
for contact in hit.application_contacts:
print(f" {contact.name} ({contact.role}) — {contact.email}")
# Point-lookup by offer_id obtained from the search result.
try:
detail = client.offers.get(offer_id=hit.offer_id)
print(detail.title, "starts", detail.start_date or "flexible")
except OfferNotFound:
print("Offer no longer available")
print("exercised: offers.search / offers.get / Offer fields / Provider / Address / Contact")
Searches nationwide vocational training offers (training type Berufsausbildung) for one supported profession and returns one page of normalized offers. The profession selects the site's occupation classification filter; titles that do not mention the profession are additionally dropped locally, and filtered_out_on_page reports how many offers of the upstream page were dropped, so a page can hold fewer than page_size offers. Pagination is upstream page-based: page starts at 0, the upstream page size is fixed at 20, total_pages/total_elements are the upstream counts before local title filtering, and has_more tells whether a further page exists; the site caps any search at 10000 results. An optional region restricts results to one or more German federal states. Each offer carries the offer-specific application_contacts (named contact persons attached to the offer, with their role) and application_url; the general provider contact is reported separately under provider and is not an application address. Dates are ISO YYYY-MM-DD in German local time and are null when the site has no fixed date; text fields such as degree, start_date_note, application_note and cost_note may contain HTML. One upstream request per call.
| Param | Type | Description |
|---|---|---|
| page | integer | Zero-based upstream result page; 20 upstream offers per page. |
| region | string | Federal state filter; comma-separated codes allowed (e.g. BAY,BAW). Omitted = nationwide. |
| professionrequired | string | Profession to search for. PFLEGEFACHPERSON covers Pflegefachmann/Pflegefachfrau/Pflegefachperson; FACHINFORMATIKER covers all Fachinformatiker specialisations. |
{
"type": "object",
"fields": {
"page": "upstream page number returned (zero-based)",
"offers": "array of normalized offers: offer_id (string), title, occupations (site classification labels), degree, education_type, teaching_form, schedule, duration, provider {provider_id, name, homepage, email, phone, address}, location {street, postal_code, city, district, state, state_code, lat, lon} (training venue), start_date, end_date, flexible_start, application_deadline, start_date_note, detail_url (public offer page), application_url, application_contacts (array of {name, role, email, phone, mobile, homepage} specific to the offer), application_note, cost_note, updated_at",
"has_more": "true when a further page exists",
"page_size": "upstream offers per page (20)",
"profession": "normalized profession code that was searched",
"total_pages": "upstream page count for the occupation filter before local title filtering",
"total_elements": "upstream offer count for the occupation filter before local title filtering (site caps at 10000)",
"filtered_out_on_page": "offers on this upstream page dropped because their title does not mention the profession"
},
"sample": {
"data": {
"page": 0,
"offers": [
{
"title": "Ausbildung zur/zum Pflegefachfrau-/mann",
"degree": "<p>Staatlich anerkannte/r Pflegefachfrau/-mann</p>",
"duration": "mehr als 2 Jahre bis 3 Jahre",
"end_date": "2029-12-01",
"location": {
"lat": 51.8286,
"lon": 7.2792,
"city": "Dülmen",
"state": "Nordrhein-Westfalen",
"street": "An der Kreuzkirche 5",
"district": null,
"state_code": "NRW",
"postal_code": "48249"
},
"offer_id": "320252974",
"provider": {
"name": "carecampus Pflegeakademie im Kreis Coesfeld gGmbH",
"email": "[email protected]",
"phone": "02594 9550",
"address": {
"lat": 51.945,
"lon": 7.1667,
"city": "Coesfeld",
"state": "Nordrhein-Westfalen",
"street": "Kupferstr. 10",
"district": null,
"state_code": "NRW",
"postal_code": "48653"
},
"homepage": "http://www.care-campus.de",
"provider_id": "1340"
},
"schedule": "Vollzeit",
"cost_note": null,
"detail_url": "https://web.arbeitsagentur.de/ausbildungssuche/berufsausbildung-suche/angebot/320252974",
"start_date": "2026-12-01",
"updated_at": "2026-09-03",
"occupations": [
"Pflegefachmann/Pflegefachfrau (Ausbildung)"
],
"teaching_form": "Präsenzunterricht",
"education_type": "Berufsausbildung",
"flexible_start": false,
"application_url": "https://care-campus.de",
"start_date_note": "<p>Jährlicher Beginn zum 01. August und zum 01. Oktober in Vollzeit.</p>",
"application_note": null,
"application_contacts": [
{
"name": "<contact name>",
"role": "Ansprechpartner",
"email": "[email protected]",
"phone": "02541 970690",
"mobile": null,
"homepage": "http://www.care-campus.de"
}
],
"application_deadline": null
}
],
"has_more": true,
"page_size": 20,
"profession": "pflegefachperson",
"total_pages": 31,
"total_elements": 603,
"filtered_out_on_page": 0
},
"status": "success"
}
}About the Bund API
What the API covers
Both endpoints return data scoped to Germany's Ausbildungssuche portal, covering nationwide Berufsausbildung (vocational training) offers. search_offers requires a profession parameter — a normalized code such as PFLEGEFACHPERSON or FACHINFORMATIK — and accepts an optional region parameter as a comma-separated list of federal-state codes (e.g. BAY,BAW). Results come back as zero-based pages of up to 20 offers each; has_more, total_pages, and total_elements let you drive pagination. Note that total_elements reflects the site's occupation-filter count before any title-level filtering; the filtered_out_on_page field tells you how many offers on a given page were dropped because their title did not mention the requested profession.
Offer records
Each offer in search_offers includes offer_id, title, occupations (the site's own classification labels), degree, education_type, and teaching_f (teaching format). Passing an offer_id to get_offer returns the full normalized record: provider (with provider_id, name, homepage, email, phone, and a structured address), location (training venue with state code and coordinates), start_date and end_date as ISO dates (or null when no fixed date is published), detail_url pointing to the public offer page, application_url when the provider has published one, and updated_at showing when the source last modified the record.
Limitations to know
The source caps its result set at 10,000 offers per occupation filter regardless of the actual number of matching offers. Profession codes are a fixed enumeration — you cannot pass arbitrary free-text occupation strings. Filtering to a specific city or postal code is not available; the finest geographic granularity supported is the federal state level via the region parameter.
The Bund API is a managed, monitored endpoint for ausbildungssuche.api.bund.dev — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ausbildungssuche.api.bund.dev 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 ausbildungssuche.api.bund.dev 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 Berufsausbildung vacancies by federal state using the
regionparameter for a regional job board - Track when providers update listings by monitoring the
updated_atfield fromget_offer - Build profession-specific alert feeds using
search_offerspagination fields (has_more,total_pages) to detect new offers - Display training venue maps by consuming the
locationcoordinates returned byget_offer - Pre-fill application forms using the
application_urlandapplication_contactsfromget_offer - Cross-reference provider contact details (
email,phone,homepage) for outreach to Ausbildung-offering companies
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ausbildungssuche.api.bund.de have an official developer API?+
What does `search_offers` return versus `get_offer`?+
search_offers returns a page of up to 20 offers containing key fields like offer_id, title, occupations, degree, and education_type, plus pagination metadata. get_offer takes a single offer_id and returns the complete record including provider contact details, location with coordinates, start_date, end_date, application_url, and updated_at.Can I filter offers below the federal-state level, for example by city or postal code?+
region parameter in search_offers using codes such as BAY or BAW. City or postal-code filtering is not currently supported. You can fork this API on Parse and revise it to add a post-filter step that narrows results by locality fields in the returned location object.Are apprenticeship types other than Berufsausbildung covered?+
Berufsausbildung education type. Other training categories available on the Ausbildungssuche portal (such as Umschulung or Weiterbildung) are not exposed. You can fork this API on Parse and revise it to add endpoints targeting those additional education types.How does the `filtered_out_on_page` field affect result counts?+
total_elements reflects the site's raw count for the occupation filter before any title-level checks. On each page, offers whose titles do not mention the requested profession are dropped; filtered_out_on_page tells you how many were removed. This means the effective offers you receive per page can be fewer than 20 even when has_more is true.