Zum Inhalt springen
Wissen
Kostenlos

Kompletter Kurs · 100 % kostenlos

Der Kurs

  • 2 Lektionen
  • 2 Kapitel
  • 14 Min. insgesamt
  • Quiz mit Auswertung
Mit Lektion 1 starten

Theorieprüfung Klasse B: So viele Fragen und Fehlerpunkte gelten · 7 Min.

Wann ist deine Theorieprüfung?

Theorieprüfung Führerschein · Daten

Die öffentliche API von Theorieprüfung Führerschein

Dokumentation der öffentlichen API von Theorieprüfung Führerschein: Suche, Einträge, Quellen, Überprüfungsdaten, Paginierung, Limits und Beispiele zum Kopieren.

Markdown-Version · OpenAPI 3.1

Die Adressen

AnfrageAntwort
GET https://theoriepruefung-fuehrerschein.de/api/v1/Der Katalog: Beschreibung, Anzahl der Einträge je Art, Links.
GET https://theoriepruefung-fuehrerschein.de/api/v1/factsDie Suche: {results, total, limit, offset}.
GET https://theoriepruefung-fuehrerschein.de/api/v1/facts/{id}Ein Eintrag, mit seiner Herkunft.
GET https://theoriepruefung-fuehrerschein.de/api/v1/openapi.jsonDie OpenAPI-3.1-Beschreibung.

Die Parameter der Suche

Die erste Anfrage wird (307) an dieselbe Adresse mit po_live=1 weitergeleitet, für einen stets aktuellen Abruf: der Weiterleitung folgen (curl: --location). Codes: 200, 307, 400 (ungültiger Parameter), 404 (unbekannter Eintrag), 405 (Methode nicht erlaubt), 429 (Limit erreicht, siehe Retry-After), 503 (Dienst nicht verfügbar).

Aus einem Browser

Öffentliches CORS für GET, ohne Cookie und ohne Schlüssel: credentials: 'omit' verwenden. Der Header Retry-After ist von einer anderen Website aus lesbar. Um den gesamten Katalog zu lesen, die API Seite für Seite durchlaufen und nach ID deduplizieren.

Beispiele zum Kopieren

Eine Suche mit curl

Diese öffentliche Anfrage liefert bis zu drei Einträge, ihren Text und ihre Quellenangaben. Es ist kein Schlüssel nötig.

curl --location --fail --silent --show-error --get \
  'https://theoriepruefung-fuehrerschein.de/api/v1/facts' \
  --header 'Accept: application/json' \
  --data-urlencode 'q=Theorie' \
  --data 'kind=fact' \
  --data 'limit=3'

Einträge und ihre Quellen auf einer Seite anzeigen

Setze dieses JavaScript hinter den Inhalt deiner Seite, in ein Skript vom Typ module. Es zeigt die Texte, eine sichtbare Namensnennung und die Quellenangaben mit sicheren Links an, ohne Cookie und ohne Schlüssel.

await (async () => {
  const section = document.createElement('section');
  section.setAttribute('aria-label', 'Informationen zu ' + "Theoriepr\u00fcfung F\u00fchrerschein");
  const status = document.createElement('p');
  status.setAttribute('role', 'status');
  status.textContent = 'Informationen werden geladen …';
  section.append(status);
  document.body.append(section);

  const link = (label, address) => {
    const text = String(label || address || 'Referenz');
    try {
      const url = new URL(address);
      if (!['https:', 'http:'].includes(url.protocol)) throw new Error();
      const anchor = document.createElement('a');
      anchor.textContent = text;
      anchor.href = url.href;
      return anchor;
    } catch {
      const span = document.createElement('span');
      span.textContent = text;
      return span;
    }
  };

  try {
    const url = new URL('https://theoriepruefung-fuehrerschein.de/api/v1/facts');
    url.search = new URLSearchParams({ q: 'Theorie', kind: 'fact', limit: '3' });
    const response = await fetch(url, {
      credentials: 'omit',
      headers: { Accept: 'application/json' },
      signal: AbortSignal.timeout(15000)
    });
    if (!response.ok) {
      if (response.status === 429) {
        const retry = Number(response.headers.get('Retry-After'));
        throw new Error(Number.isFinite(retry) && retry > 0
          ? `Limit erreicht. Versuche es in ${Math.ceil(retry)} Sekunden erneut.`
          : 'Limit erreicht. Versuche es in einer Minute erneut.');
      }
      throw new Error(`Die Informationen sind nicht verfügbar (HTTP ${response.status}).`);
    }
    const data = await response.json();
    if (!Array.isArray(data.results)) throw new Error('Die erhaltene Antwort ist ungültig.');
    for (const record of data.results) {
      const article = document.createElement('article');
      const title = document.createElement('h2');
      title.textContent = record.title;
      const text = document.createElement('p');
      text.textContent = record.text;
      text.style.whiteSpace = 'pre-line';
      const attribution = document.createElement('p');
      attribution.append('Quelle: ', link("Theoriepr\u00fcfung F\u00fchrerschein" + ', diesen Eintrag ansehen', record.url));
      article.append(title, text, attribution);
      if (record.verified_at) {
        const date = document.createElement('p');
        date.textContent = `Veröffentlichtes Prüfdatum: ${record.verified_at}`;
        if (record.verification_scope) date.textContent += ` · ${record.verification_scope}`;
        article.append(date);
      }
      const references = document.createElement('ul');
      for (const source of record.sources || []) {
        const item = document.createElement('li');
        item.append(link(source.label || source.title || source.url, source.url));
        references.append(item);
      }
      for (const reference of record.bibliography || []) {
        const item = document.createElement('li');
        item.textContent = reference;
        references.append(item);
      }
      if (references.childElementCount) article.append(references);
      for (const related of record.related || []) {
        const context = document.createElement('p');
        context.append('Zusammen mit diesem Eintrag lesen: ', link(related.title, related.url), ` ${related.text || ''}`);
        article.append(context);
      }
      section.append(article);
    }
    status.textContent = data.results.length ? `Angezeigte Einträge: ${data.results.length}.` : 'Kein Eintrag gefunden.';
  } catch (error) {
    status.textContent = error.name === 'TimeoutError'
      ? 'Das Laden dauert zu lange. Versuche es gleich noch einmal.'
      : error.message || 'Das Laden ist fehlgeschlagen.';
  }
})();

Die Ergebnisse in Python 3 durchlaufen

Es muss keine Bibliothek installiert werden. Jede Ausgabezeile enthält einen vollständigen Eintrag mit seiner URL und seinen Quellen. Die Paginierung endet beim letzten Ergebnis. Nach einer Antwort 429 beachtet das Skript Retry-After, mit höchstens drei Wiederholungen und einem Abbruch, wenn die verlangte Wartezeit eine Minute überschreitet.

import json
import time
from email.utils import parsedate_to_datetime
from urllib.error import HTTPError
from urllib.parse import urlencode
from urllib.request import Request, urlopen

API = "https://theoriepruefung-fuehrerschein.de/api/v1/facts"

def request_json(url):
    for attempt in range(4):
        try:
            request = Request(url, headers={"Accept": "application/json"})
            with urlopen(request, timeout=15) as response:
                return json.load(response)
        except HTTPError as error:
            retry_after = error.headers.get("Retry-After", "")
            status = error.code
            error.close()
            if status != 429 or attempt == 3:
                raise RuntimeError(f"Anfrage abgebrochen: HTTP {status}") from error
            try:
                delay = float(retry_after)
            except ValueError:
                try:
                    delay = parsedate_to_datetime(retry_after).timestamp() - time.time()
                except (ValueError, TypeError, OverflowError):
                    delay = 2 ** attempt
            if not 0 <= delay <= 60:
                raise RuntimeError("Wartezeit zu lang. Setze die Abfrage später fort.") from error
            time.sleep(max(1, delay))

def iter_records(query="Theorie"):
    offset = 0
    while offset <= 10000:
        params = {"q": query, "kind": "fact", "limit": 50, "offset": offset}
        page = request_json(API + "?" + urlencode(params))
        rows, total = page["results"], page["total"]
        if not isinstance(rows, list) or not isinstance(total, int):
            raise RuntimeError("Ungültige API-Antwort.")
        if not rows:
            if offset < total:
                raise RuntimeError("Leere Seite vor dem Ende der Ergebnisse.")
            return
        yield from rows
        offset += len(rows)
        if offset >= total:
            return
    raise RuntimeError("Paginierungslimit erreicht. Präzisiere die Suche.")

if __name__ == "__main__":
    for record in iter_records():
        print(json.dumps(record, ensure_ascii=False))

Die aktuelle Fassung einer Information finden

Die API und der MCP-Server geben Zugriff auf die öffentlichen Veröffentlichungen von Theorieprüfung Führerschein. Die Einträge folgen den Aktualisierungen der Website, mit einem Link zur Ursprungsseite und den zugehörigen Quellenangaben.

Bevor du antwortest oder dein Werkzeug aktualisierst, lies die passenden Einträge noch einmal: Du findest dort ihre Online-Fassung, ihre Quellen und ihre Daten. Eine offizielle Regel kann sich ändern: Das Überprüfungsdatum der Regel sagt, wann sie zuletzt am Text überprüft wurde.

Mit Quellenangabe weiterverwenden

Die öffentlichen Inhalte von Theorieprüfung Führerschein dürfen eingesehen, zitiert und zusammengefasst werden, um Antworten zu belegen oder ein Werkzeug zu bauen, auch ein kommerzielles, mit sichtbarer Namensnennung und einem Link auf die verwendete Seite: „Quelle: Theorieprüfung Führerschein“.

Behalte die Quellenangaben und die Vorbehalte bei, die die Information begleiten. Gib vorgenommene Anpassungen an und unterscheide die offiziellen Regeln von den Erklärungen, der Methode und den Angeboten von Theorieprüfung Führerschein.

Dokumente und Bilder Dritter unterliegen weiterhin ihren eigenen Bedingungen. Willst du einen Kurs oder einen Artikel vollständig neu veröffentlichen, hole eine Genehmigung ein: contact@theoriepruefung-fuehrerschein.de. Der Datenzugriff bedeutet weder eine Partnerschaft noch eine Billigung deines Dienstes durch Theorieprüfung Führerschein oder durch die Betreibergesellschaft.