<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.kosmos.ac/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kosmos</id>
	<title>Kosmos MediaWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.kosmos.ac/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kosmos"/>
	<link rel="alternate" type="text/html" href="https://wiki.kosmos.ac/index.php?title=Spezial:Beitr%C3%A4ge/Kosmos"/>
	<updated>2026-08-30T13:09:07Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.kosmos.ac/index.php?title=DriversHub&amp;diff=3</id>
		<title>DriversHub</title>
		<link rel="alternate" type="text/html" href="https://wiki.kosmos.ac/index.php?title=DriversHub&amp;diff=3"/>
		<updated>2026-08-18T21:52:57Z</updated>

		<summary type="html">&lt;p&gt;Kosmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= API-Dokumentation =&lt;br /&gt;
Repository: &amp;lt;code&amp;gt;CharlesWithC/HubBackend&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 1. API-Grundlagen ==&lt;br /&gt;
&lt;br /&gt;
=== Base URL ===&lt;br /&gt;
Die API besitzt &#039;&#039;&#039;keine fest eingebaute öffentliche Base URL&#039;&#039;&#039;. Host und API-Prefix kommen aus der Hub-Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispielkonfiguration:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;domain&amp;quot;: &amp;quot;hub.example.com&amp;quot;,&lt;br /&gt;
   &amp;quot;prefix&amp;quot;: &amp;quot;/api&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Damit lautet die Base URL:&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://hub.example.com/api&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Ein Request auf:&lt;br /&gt;
 &amp;lt;code&amp;gt;GET /user/profile&amp;lt;/code&amp;gt;&lt;br /&gt;
wird also beispielsweise:&lt;br /&gt;
 &amp;lt;code&amp;gt;GET &amp;lt;nowiki&amp;gt;https://hub.example.com/api/user/profile&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Der Prefix ist konfigurierbar und muss mit &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; beginnen.&lt;br /&gt;
&lt;br /&gt;
=== Swagger / OpenAPI ===&lt;br /&gt;
Wenn in der Konfiguration&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;openapi&amp;quot;: true&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
gesetzt wird, stellt der Server die interaktive Swagger-Dokumentation unter&lt;br /&gt;
 &amp;lt;code&amp;gt;{prefix}/doc&amp;lt;/code&amp;gt;&lt;br /&gt;
bereit.&lt;br /&gt;
&lt;br /&gt;
Bei &amp;lt;code&amp;gt;prefix: &amp;quot;/api&amp;quot;&amp;lt;/code&amp;gt; also:&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://hub.example.com/api/doc&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Im Repository liegt außerdem:&lt;br /&gt;
 &amp;lt;code&amp;gt;/openapi.json&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 2. Authentifizierung =&lt;br /&gt;
Es gibt zwei Token-Typen:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Bearer Token&#039;&#039;&#039; – für Benutzer&lt;br /&gt;
# &#039;&#039;&#039;Application Token&#039;&#039;&#039; – für Anwendungen/Integrationen&lt;br /&gt;
&lt;br /&gt;
== Bearer Token ==&lt;br /&gt;
Header:&lt;br /&gt;
 &amp;lt;code&amp;gt;Authorization: Bearer &amp;lt;TOKEN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;code&amp;gt;curl \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer e1234567-89ab-cdef-0123-456789abcdef&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;https://hub.example.com/api/user/profile&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Tokens sind UUID-artige, serverseitig gespeicherte Session-Tokens. Es steckt kein JWT-Payload darin.&lt;br /&gt;
&lt;br /&gt;
== Application Token ==&lt;br /&gt;
Header:&lt;br /&gt;
 &amp;lt;code&amp;gt;Authorization: Application &amp;lt;TOKEN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;code&amp;gt;curl \&lt;br /&gt;
   -H &amp;quot;Authorization: Application 12345678-1234-1234-1234-123456789abc&amp;quot; \&lt;br /&gt;
   &amp;lt;nowiki&amp;gt;https://hub.example.com/api/user/profile&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Application Tokens haben gegenüber normalen User-Tokens Einschränkungen. Nicht jeder authentifizierte Endpoint muss Application Tokens akzeptieren.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 3. Allgemeine Request-Regeln =&lt;br /&gt;
Für praktisch alle Requests außer &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; erwartet das Backend:&lt;br /&gt;
 &amp;lt;code&amp;gt;Content-Type: application/json&amp;lt;/code&amp;gt;&lt;br /&gt;
Ausnahmen sind insbesondere Tracker-Webhooks:&lt;br /&gt;
 &amp;lt;code&amp;gt;/tracksim/*&lt;br /&gt;
 /trucky/*&lt;br /&gt;
 /custom-tracker/*&lt;br /&gt;
 /unitracker/*&amp;lt;/code&amp;gt;&lt;br /&gt;
Diese dürfen tracker-spezifische Payloads verwenden.&lt;br /&gt;
&lt;br /&gt;
Standard-JSON-Request:&lt;br /&gt;
 &amp;lt;code&amp;gt;curl -X PATCH \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&amp;quot;name&amp;quot;:&amp;quot;John Doe&amp;quot;}&#039; \&lt;br /&gt;
   &amp;quot;$BASE/user/profile&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fehlerformat ==&lt;br /&gt;
FastAPI-/HTTP-Fehler werden grundsätzlich in dieser Art zurückgegeben:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;error&amp;quot;: &amp;quot;Fehlermeldung&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Typische Statuscodes sind:&lt;br /&gt;
 &amp;lt;code&amp;gt;400  Bad Request&lt;br /&gt;
 401  Unauthorized&lt;br /&gt;
 403  Forbidden&lt;br /&gt;
 404  Not Found&lt;br /&gt;
 409  Conflict&lt;br /&gt;
 422  Unprocessable Entity&lt;br /&gt;
 423  Locked&lt;br /&gt;
 428  Precondition Required&lt;br /&gt;
 429  Too Many Requests&lt;br /&gt;
 500  Internal Server Error&lt;br /&gt;
 503  Service Unavailable&amp;lt;/code&amp;gt;&lt;br /&gt;
Bei Request-Validation wird die normale ausführliche FastAPI-422-Antwort durch:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;error&amp;quot;: &amp;quot;Unprocessable Entity&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
ersetzt.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 4. Rate Limits =&lt;br /&gt;
Es gibt globale und endpoint-spezifische Rate Limits.&lt;br /&gt;
&lt;br /&gt;
Global:&lt;br /&gt;
 &amp;lt;code&amp;gt;300 Requests / 60 Sekunden&amp;lt;/code&amp;gt;&lt;br /&gt;
Nach Überschreiten kann der Client für etwa fünf Minuten global blockiert werden.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich besitzen einzelne Endpoints eigene Limits.&lt;br /&gt;
&lt;br /&gt;
Beispiel aus &amp;lt;code&amp;gt;/auth/password&amp;lt;/code&amp;gt;:&lt;br /&gt;
 &amp;lt;code&amp;gt;3 Requests / 60 Sekunden&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 5. Benutzer-IDs: &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; vs. &amp;lt;code&amp;gt;userid&amp;lt;/code&amp;gt; =&lt;br /&gt;
Das ist für Clients besonders wichtig.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Interne, eindeutige User-ID.&lt;br /&gt;
&lt;br /&gt;
Jeder Account besitzt eine &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;userid&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Mitglieds-/Driver-Hub-ID.&lt;br /&gt;
&lt;br /&gt;
Diese existiert erst sinnvoll, nachdem ein Account als Mitglied angenommen wurde.&lt;br /&gt;
&lt;br /&gt;
Daher können APIs je nach Einsatzzweck entweder:&lt;br /&gt;
 &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
 &amp;lt;code&amp;gt;userid&amp;lt;/code&amp;gt;&lt;br /&gt;
verlangen.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 6. Login und Authentifizierungsflow =&lt;br /&gt;
&lt;br /&gt;
== POST &amp;lt;code&amp;gt;/auth/password&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Login mit E-Mail und Passwort.&lt;br /&gt;
&lt;br /&gt;
=== Body ===&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;email&amp;quot;: &amp;quot;user@example.com&amp;quot;,&lt;br /&gt;
   &amp;quot;password&amp;quot;: &amp;quot;Secret123!&amp;quot;,&lt;br /&gt;
   &amp;quot;captcha-response&amp;quot;: &amp;quot;&amp;lt;captcha-token&amp;gt;&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;captcha-response&amp;lt;/code&amp;gt; sollte als &#039;&#039;&#039;erforderlich&#039;&#039;&#039; betrachtet werden, auch wenn die OpenAPI-Datei es nicht sauber als required kennzeichnet.&lt;br /&gt;
&lt;br /&gt;
Unterstützte Captcha-Systeme:&lt;br /&gt;
 &amp;lt;code&amp;gt;Cloudflare Turnstile&lt;br /&gt;
 hCaptcha&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erfolgreicher Login ohne MFA ===&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;token&amp;quot;: &amp;quot;e....&amp;quot;,&lt;br /&gt;
   &amp;quot;mfa&amp;quot;: false&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Login mit aktiviertem MFA ===&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;token&amp;quot;: &amp;quot;f....&amp;quot;,&lt;br /&gt;
   &amp;quot;mfa&amp;quot;: true&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Der zurückgegebene Token ist in diesem Fall zunächst ein temporäres Auth-Ticket.&lt;br /&gt;
&lt;br /&gt;
Danach:&lt;br /&gt;
 &amp;lt;code&amp;gt;POST /auth/mfa&amp;lt;/code&amp;gt;&lt;br /&gt;
Body:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;token&amp;quot;: &amp;quot;&amp;lt;temporary-auth-ticket&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;quot;otp&amp;quot;: &amp;quot;123456&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Danach erhält man den eigentlichen Session-Token.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== POST &amp;lt;code&amp;gt;/auth/register&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Registriert einen Account per E-Mail/Passwort.&lt;br /&gt;
&lt;br /&gt;
Body:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;email&amp;quot;: &amp;quot;user@example.com&amp;quot;,&lt;br /&gt;
   &amp;quot;password&amp;quot;: &amp;quot;Secret123!&amp;quot;,&lt;br /&gt;
   &amp;quot;captcha-response&amp;quot;: &amp;quot;&amp;lt;captcha-token&amp;gt;&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Das Passwort muss mindestens acht Zeichen lang sein. Die konkrete Prüfung berücksichtigt außerdem Groß-/Kleinbuchstaben, Zahlen und Sonderzeichen.&lt;br /&gt;
&lt;br /&gt;
Eine funktionierende SMTP-Konfiguration ist für die E-Mail-Bestätigung notwendig.&lt;br /&gt;
&lt;br /&gt;
Bei Erfolg wird bereits ein Session-Token ausgegeben:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;token&amp;quot;: &amp;quot;e....&amp;quot;,&lt;br /&gt;
   &amp;quot;mfa&amp;quot;: false&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== POST &amp;lt;code&amp;gt;/auth/reset&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Startet einen Password-Reset.&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;email&amp;quot;: &amp;quot;user@example.com&amp;quot;,&lt;br /&gt;
   &amp;quot;captcha-response&amp;quot;: &amp;quot;&amp;lt;captcha-token&amp;gt;&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== POST &amp;lt;code&amp;gt;/auth/email&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Verarbeitet E-Mail-Bestätigungs-/Reset-Links.&lt;br /&gt;
&lt;br /&gt;
Query:&lt;br /&gt;
 &amp;lt;code&amp;gt;?secret=&amp;lt;SECRET&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Bei Password-Reset ggf. Body:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;password&amp;quot;: &amp;quot;NewSecret123!&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Discord / Steam Login ==&lt;br /&gt;
&lt;br /&gt;
=== GET &amp;lt;code&amp;gt;/auth/discord/callback&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Queryparameter:&lt;br /&gt;
 &amp;lt;code&amp;gt;code&lt;br /&gt;
 error_description&lt;br /&gt;
 callback_url&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;callback_url&amp;lt;/code&amp;gt; ist erforderlich.&lt;br /&gt;
&lt;br /&gt;
=== GET &amp;lt;code&amp;gt;/auth/steam/callback&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Steam-OpenID-Callback.&lt;br /&gt;
&lt;br /&gt;
Die von Steam gelieferten Parameter müssen an diesen Endpoint weitergereicht werden.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 7. Token API =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/token&amp;lt;/code&amp;gt;&lt;br /&gt;
|aktuellen Token validieren&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/token&amp;lt;/code&amp;gt;&lt;br /&gt;
|aktuellen Token erneuern&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/token&amp;lt;/code&amp;gt;&lt;br /&gt;
|aktuellen Token widerrufen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/token/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Sessions/Tokens auflisten&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/token/hash&amp;lt;/code&amp;gt;&lt;br /&gt;
|bestimmten Token anhand Hash widerrufen&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/token/all&amp;lt;/code&amp;gt;&lt;br /&gt;
|alle Benutzer-Tokens widerrufen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/token/application/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Application Tokens auflisten&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/token/application&amp;lt;/code&amp;gt;&lt;br /&gt;
|Application Token erzeugen&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/token/application&amp;lt;/code&amp;gt;&lt;br /&gt;
|Application Token widerrufen&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/token/application/all&amp;lt;/code&amp;gt;&lt;br /&gt;
|alle Application Tokens widerrufen&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/auth/ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
|Auth-Ticket erzeugen/verwenden&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/auth/ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
|Auth-Ticket abrufen&lt;br /&gt;
|}&lt;br /&gt;
Beispiel Token-Validierung:&lt;br /&gt;
 &amp;lt;code&amp;gt;curl \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   &amp;quot;$BASE/token&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Tokenliste unterstützt unter anderem:&lt;br /&gt;
 &amp;lt;code&amp;gt;page&lt;br /&gt;
 page_size&lt;br /&gt;
 order_by&lt;br /&gt;
 order&amp;lt;/code&amp;gt;&lt;br /&gt;
Mögliche &amp;lt;code&amp;gt;order_by&amp;lt;/code&amp;gt;-Werte laut OpenAPI:&lt;br /&gt;
 &amp;lt;code&amp;gt;ip&lt;br /&gt;
 timestamp&lt;br /&gt;
 country_code&lt;br /&gt;
 user_agent&lt;br /&gt;
 last_used_timestamp&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 8. System-/Info-API =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;&lt;br /&gt;
|Drivers-Hub-Informationen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/status&amp;lt;/code&amp;gt;&lt;br /&gt;
|Serverstatus&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/status/database/restart&amp;lt;/code&amp;gt;&lt;br /&gt;
|Datenbankverbindung neu starten&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/languages&amp;lt;/code&amp;gt;&lt;br /&gt;
|Hub- und unterstützte Sprachen&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/discord/role-connection/enable&amp;lt;/code&amp;gt;&lt;br /&gt;
|Discord Role Connection aktivieren&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/discord/role-connection/disable&amp;lt;/code&amp;gt;&lt;br /&gt;
|Discord Role Connection deaktivieren&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/config&amp;lt;/code&amp;gt;&lt;br /&gt;
|Konfiguration lesen&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/config&amp;lt;/code&amp;gt;&lt;br /&gt;
|Konfiguration ändern&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/config/reload&amp;lt;/code&amp;gt;&lt;br /&gt;
|Konfiguration neu laden&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/restart&amp;lt;/code&amp;gt;&lt;br /&gt;
|Backend neu starten&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/audit/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Audit-Log abrufen&lt;br /&gt;
|}&lt;br /&gt;
Administrative Endpoints sind entsprechend permission-geschützt.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 9. User API =&lt;br /&gt;
&lt;br /&gt;
== Profile und Benutzer ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Benutzerliste&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/profile&amp;lt;/code&amp;gt;&lt;br /&gt;
|Userprofil abrufen&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/profile&amp;lt;/code&amp;gt;&lt;br /&gt;
|Name/Avatar ändern&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/bio&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bio ändern&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/activity&amp;lt;/code&amp;gt;&lt;br /&gt;
|Aktivitätsdaten ändern&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/{uid}/note&amp;lt;/code&amp;gt;&lt;br /&gt;
|persönliche Notiz über User&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/{uid}/note/global&amp;lt;/code&amp;gt;&lt;br /&gt;
|globale Staff-Notiz&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/tracker/switch&amp;lt;/code&amp;gt;&lt;br /&gt;
|aktiven Tracker wechseln&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GET &amp;lt;code&amp;gt;/user/profile&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Kann einen Benutzer anhand verschiedener IDs suchen:&lt;br /&gt;
 &amp;lt;code&amp;gt;userid&lt;br /&gt;
 uid&lt;br /&gt;
 discordid&lt;br /&gt;
 steamid&lt;br /&gt;
 truckersmpid&lt;br /&gt;
 email&amp;lt;/code&amp;gt;&lt;br /&gt;
Zusätzliche Parameter:&lt;br /&gt;
 &amp;lt;code&amp;gt;role_history_limit&lt;br /&gt;
 ban_history_limit&amp;lt;/code&amp;gt;&lt;br /&gt;
Ohne Ziel-ID wird typischerweise das eigene Profil verwendet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;code&amp;gt;curl \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   &amp;quot;$BASE/user/profile?uid=123&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Oder:&lt;br /&gt;
 &amp;lt;code&amp;gt;curl \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   &amp;quot;$BASE/user/profile?discordid=123456789012345678&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PATCH &amp;lt;code&amp;gt;/user/profile&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Body:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;name&amp;quot;: &amp;quot;New Name&amp;quot;,&lt;br /&gt;
   &amp;quot;avatar&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://example.com/avatar.png&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
Optionale Queryparameter:&lt;br /&gt;
 &amp;lt;code&amp;gt;uid&lt;br /&gt;
 sync_from_discord&lt;br /&gt;
 sync_from_steam&lt;br /&gt;
 sync_from_truckersmp&amp;lt;/code&amp;gt;&lt;br /&gt;
Damit können Profildaten auch von verbundenen Plattformen synchronisiert werden.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 10. Sprache, Zeitzone und Privacy =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/language&amp;lt;/code&amp;gt;&lt;br /&gt;
|aktuelle Sprache&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/language&amp;lt;/code&amp;gt;&lt;br /&gt;
|Sprache ändern&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/timezone&amp;lt;/code&amp;gt;&lt;br /&gt;
|Zeitzone lesen&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/timezone&amp;lt;/code&amp;gt;&lt;br /&gt;
|Zeitzone ändern&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/privacy&amp;lt;/code&amp;gt;&lt;br /&gt;
|Privacy-Einstellungen&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/privacy&amp;lt;/code&amp;gt;&lt;br /&gt;
|Privacy-Einstellungen ändern&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 11. Password und MFA =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/password&amp;lt;/code&amp;gt;&lt;br /&gt;
|Passwort ändern&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/password/disable&amp;lt;/code&amp;gt;&lt;br /&gt;
|Password-Login deaktivieren&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/mfa/enable&amp;lt;/code&amp;gt;&lt;br /&gt;
|TOTP-MFA aktivieren&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/mfa/disable&amp;lt;/code&amp;gt;&lt;br /&gt;
|MFA deaktivieren&lt;br /&gt;
|}&lt;br /&gt;
TOTP-MFA wird bei jedem Login verwendet.&lt;br /&gt;
&lt;br /&gt;
Für besonders kritische administrative Aktionen, insbesondere Config-Reload, kann MFA verpflichtend sein.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 12. User Connections =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/resend-confirmation&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bestätigungsmail erneut senden&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/email&amp;lt;/code&amp;gt;&lt;br /&gt;
|E-Mail verbinden/ändern&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/discord&amp;lt;/code&amp;gt;&lt;br /&gt;
|Discord verbinden&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/steam&amp;lt;/code&amp;gt;&lt;br /&gt;
|Steam verbinden&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/truckersmp&amp;lt;/code&amp;gt;&lt;br /&gt;
|TruckersMP verbinden&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/{uid}/connections&amp;lt;/code&amp;gt;&lt;br /&gt;
|Connections administrativ ändern&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/{uid}/connections/{connection}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Connection entfernen&lt;br /&gt;
|}&lt;br /&gt;
Für das Job-Tracking ist insbesondere eine verbundene Steam-ID relevant.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 13. Notifications =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/notification/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Notifications auflisten&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/notification/{notificationid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Notification lesen&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/notification&amp;lt;/code&amp;gt;&lt;br /&gt;
|Notification(s) löschen&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/notification/{notificationid}/status/{status}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Status ändern&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/notification/settings&amp;lt;/code&amp;gt;&lt;br /&gt;
|Notification Settings&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/notification/settings/{notification_type}/enable&amp;lt;/code&amp;gt;&lt;br /&gt;
|Typ aktivieren&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/notification/settings/{notification_type}/disable&amp;lt;/code&amp;gt;&lt;br /&gt;
|Typ deaktivieren&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 14. User Administration / Bans =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/{uid}/accept&amp;lt;/code&amp;gt;&lt;br /&gt;
|Benutzer als Mitglied akzeptieren&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/{uid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Benutzer löschen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/ban/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bannliste&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/ban&amp;lt;/code&amp;gt;&lt;br /&gt;
|Banninformationen&lt;br /&gt;
|-&lt;br /&gt;
|PUT&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/ban&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bann erstellen&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/ban&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bann entfernen&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/user/ban/history/{historyid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bann-History-Eintrag löschen&lt;br /&gt;
|}&lt;br /&gt;
Das „Akzeptieren“ eines Users ist unabhängig vom Application-Plugin.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 15. Member API =&lt;br /&gt;
&lt;br /&gt;
== Informationen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/roles&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rollen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/ranks&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ranks&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/perms&amp;lt;/code&amp;gt;&lt;br /&gt;
|Permissions&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Mitgliederliste&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/banner&amp;lt;/code&amp;gt;&lt;br /&gt;
|Mitgliederbanner&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Eigene Member-Aktionen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/roles/rank&amp;lt;/code&amp;gt;&lt;br /&gt;
|Default Rank-Rolle ändern&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/roles/rank/{rank_type_id}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rank-Rolle bestimmten Typs ändern&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/bonus/history&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bonus-History&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/bonus/claim&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bonus beanspruchen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/bonus/notification/settings&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bonus-Notification-Settings&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/bonus/notification/settings&amp;lt;/code&amp;gt;&lt;br /&gt;
|Settings ändern&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/roles/history/{historyid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rollen-History löschen&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/resign&amp;lt;/code&amp;gt;&lt;br /&gt;
|Mitgliedschaft niederlegen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Member Administration ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/{userid}/roles&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rollen ändern&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/{userid}/points&amp;lt;/code&amp;gt;&lt;br /&gt;
|Punkte ändern&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/member/{userid}/dismiss&amp;lt;/code&amp;gt;&lt;br /&gt;
|Mitglied entlassen&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 16. Driving Logs – &amp;lt;code&amp;gt;/dlog&amp;lt;/code&amp;gt; =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Fahrten auflisten&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/{logid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|einzelne Fahrt&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/{logid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Fahrt löschen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/leaderboard&amp;lt;/code&amp;gt;&lt;br /&gt;
|Leaderboard&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/export&amp;lt;/code&amp;gt;&lt;br /&gt;
|Fahrten exportieren&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/statistics/summary&amp;lt;/code&amp;gt;&lt;br /&gt;
|aggregierte Statistik&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/statistics/chart&amp;lt;/code&amp;gt;&lt;br /&gt;
|Chart-Daten&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/statistics/details&amp;lt;/code&amp;gt;&lt;br /&gt;
|Detailstatistik&lt;br /&gt;
|}&lt;br /&gt;
Diese APIs gehören zu den mächtigeren Teilen des Backends und besitzen zahlreiche Filter für beispielsweise:&lt;br /&gt;
 &amp;lt;code&amp;gt;Fahrer&lt;br /&gt;
 Zeiträume&lt;br /&gt;
 Distanz&lt;br /&gt;
 Einnahmen&lt;br /&gt;
 Schaden&lt;br /&gt;
 Fahrzeug&lt;br /&gt;
 Fracht&lt;br /&gt;
 Start-/Zielort&lt;br /&gt;
 Spiel&lt;br /&gt;
 Tracker&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Filter sollten anhand der jeweiligen OpenAPI-Definition verwendet werden, da die Statistik-Endpoints unterschiedlich große Parametersätze besitzen.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 17. Tracker APIs =&lt;br /&gt;
Tracker-Routen werden nur aktiviert, wenn der entsprechende Tracker konfiguriert ist.&lt;br /&gt;
&lt;br /&gt;
== TrackSim ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/tracksim/update&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/tracksim/update/route&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PUT&lt;br /&gt;
|&amp;lt;code&amp;gt;/tracksim/driver/{userid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/tracksim/driver/{userid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Trucky ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/trucky/update&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/trucky/import/{jobid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PUT&lt;br /&gt;
|&amp;lt;code&amp;gt;/trucky/driver/{userid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/trucky/driver/{userid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom Tracker ==&lt;br /&gt;
 &amp;lt;code&amp;gt;POST /custom-tracker/update&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UniTracker ==&lt;br /&gt;
 &amp;lt;code&amp;gt;POST /unitracker/update&amp;lt;/code&amp;gt;&lt;br /&gt;
Diese Endpoints sind primär für Tracker-Server/Webhooks gedacht, nicht für den normalen Browser-Client.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 18. Announcements Plugin =&lt;br /&gt;
Nur vorhanden, wenn das Plugin aktiviert ist.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/announcements/types&amp;lt;/code&amp;gt;&lt;br /&gt;
|Announcement-Typen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/announcements/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Liste&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/announcements/{announcementid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Eintrag&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/announcements&amp;lt;/code&amp;gt;&lt;br /&gt;
|erstellen&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/announcements/{announcementid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|ändern&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/announcements/{announcementid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|löschen&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 19. Applications Plugin =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
!Funktion&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/applications/types&amp;lt;/code&amp;gt;&lt;br /&gt;
|Application-Typen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/applications/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bewerbungen&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/applications/statistics&amp;lt;/code&amp;gt;&lt;br /&gt;
|Statistiken&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/applications/{applicationid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bewerbung&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/applications&amp;lt;/code&amp;gt;&lt;br /&gt;
|Bewerbung erstellen&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/applications/{applicationid}/message&amp;lt;/code&amp;gt;&lt;br /&gt;
|Nachricht hinzufügen&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/applications/{applicationid}/status&amp;lt;/code&amp;gt;&lt;br /&gt;
|Status ändern&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/applications/{applicationid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|löschen&lt;br /&gt;
|}&lt;br /&gt;
Hinweis: Das Akzeptieren einer Application akzeptiert den User nicht automatisch als Hub-Mitglied.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 20. Challenges Plugin =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/challenges/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/challenges/{challengeid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/challenges&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/challenges/{challengeid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/challenges/{challengeid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PUT&lt;br /&gt;
|&amp;lt;code&amp;gt;/challenges/{challengeid}/delivery/{logid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/challenges/{challengeid}/delivery/{logid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Die letzten beiden Calls ordnen Driving Logs einer Challenge zu bzw. entfernen sie.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 21. Divisions Plugin =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/divisions/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/divisions/statistics&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/divisions/{divisionid}/activity&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/divisions/list/pending&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/{logid}/division&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/{logid}/division/{divisionid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/dlog/{logid}/division/{divisionid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 22. Downloads Plugin =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/downloads/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/downloads/redirect/{secret}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/downloads/{downloadsid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/downloads&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/downloads/{downloadsid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/downloads/{downloadsid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;code&amp;gt;/downloads/redirect/{secret}&amp;lt;/code&amp;gt; dient dem kontrollierten Download/Redirect anhand eines Secrets.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 23. Economy Plugin =&lt;br /&gt;
Das Economy-Plugin besitzt eine umfangreiche eigene API.&lt;br /&gt;
&lt;br /&gt;
== Economy Overview ==&lt;br /&gt;
 &amp;lt;code&amp;gt;GET /economy&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Balance ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/balance&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/balance/{userid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/balance/{userid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/balance/leaderboard&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/balance/transfer&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/balance/{userid}/transactions/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/balance/{userid}/transactions/export&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/balance/{userid}/visibility/{visibility}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Garages ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/{garageid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/{garageid}/purchase&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/{garageid}/transfer&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/{garageid}/sell&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Garage Slots ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/{garageid}/slots/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/{garageid}/slots/{slotid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/{garageid}/slots/purchase&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/{garageid}/slots/{slotid}/transfer&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/garages/{garageid}/slots/{slotid}/sell&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Trucks ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{vehicleid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{vehicleid}/{operation}/history&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{truckid}/purchase&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{vehicleid}/transfer&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{vehicleid}/relocate&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{vehicleid}/activate&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{vehicleid}/deactivate&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{vehicleid}/repair&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{vehicleid}/sell&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/trucks/{vehicleid}/scrap&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Merchandise ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/merch&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/merch/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/merch/{merchid}/purchase&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/merch/{itemid}/transfer&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/economy/merch/{itemid}/sell&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 24. Events Plugin =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/events/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/events/{eventid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PUT&lt;br /&gt;
|&amp;lt;code&amp;gt;/events/{eventid}/vote&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/events/{eventid}/vote&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/events&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/events/{eventid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/events/{eventid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/events/{eventid}/attendees&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Beim Bearbeiten von Attendees werden User-IDs verwendet.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 25. Poll Plugin =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/polls/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/polls/{pollid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PUT&lt;br /&gt;
|&amp;lt;code&amp;gt;/polls/{pollid}/vote&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/polls/{pollid}/vote&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/polls/{pollid}/vote&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/polls&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/polls/{pollid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/polls/{pollid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;code&amp;gt;GET /polls/list&amp;lt;/code&amp;gt; unterstützt u. a.:&lt;br /&gt;
 &amp;lt;code&amp;gt;page&lt;br /&gt;
 page_size&lt;br /&gt;
 order_by&lt;br /&gt;
 order&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;order_by&amp;lt;/code&amp;gt; kann beispielsweise:&lt;br /&gt;
 &amp;lt;code&amp;gt;orderid&lt;br /&gt;
 pollid&lt;br /&gt;
 title&lt;br /&gt;
 timestamp&lt;br /&gt;
 end_time&amp;lt;/code&amp;gt;&lt;br /&gt;
sein.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 26. Tasks Plugin =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Method&lt;br /&gt;
!Endpoint&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/tasks/list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|GET&lt;br /&gt;
|&amp;lt;code&amp;gt;/tasks/{taskid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/tasks&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PATCH&lt;br /&gt;
|&amp;lt;code&amp;gt;/tasks/{taskid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/tasks/{taskid}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PUT&lt;br /&gt;
|&amp;lt;code&amp;gt;/tasks/{taskid}/complete/mark&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|DELETE&lt;br /&gt;
|&amp;lt;code&amp;gt;/tasks/{taskid}/complete/mark&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/tasks/{taskid}/complete/accept&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|POST&lt;br /&gt;
|&amp;lt;code&amp;gt;/tasks/{taskid}/complete/reject&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Der typische Workflow ist:&lt;br /&gt;
 &amp;lt;code&amp;gt;Task erstellen&lt;br /&gt;
       ↓&lt;br /&gt;
 User markiert Task als erledigt&lt;br /&gt;
       ↓&lt;br /&gt;
 Staff akzeptiert oder verwirft die Completion&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 27. Beispiel eines kompletten Clients =&lt;br /&gt;
Shell-Setup:&lt;br /&gt;
 &amp;lt;code&amp;gt;BASE=&amp;quot;&amp;lt;nowiki&amp;gt;https://hub.example.com/api&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
 TOKEN=&amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
 &amp;lt;code&amp;gt;curl -sS &amp;quot;$BASE/status&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
 &amp;lt;code&amp;gt;curl -sS \&lt;br /&gt;
   -X POST \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;email&amp;quot;: &amp;quot;user@example.com&amp;quot;,&lt;br /&gt;
     &amp;quot;password&amp;quot;: &amp;quot;Secret123!&amp;quot;,&lt;br /&gt;
     &amp;quot;captcha-response&amp;quot;: &amp;quot;CAPTCHA_TOKEN&amp;quot;&lt;br /&gt;
   }&#039; \&lt;br /&gt;
   &amp;quot;$BASE/auth/password&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
 &amp;lt;code&amp;gt;{&lt;br /&gt;
   &amp;quot;token&amp;quot;: &amp;quot;e1234567-89ab-cdef-0123-456789abcdef&amp;quot;,&lt;br /&gt;
   &amp;quot;mfa&amp;quot;: false&lt;br /&gt;
 }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigenes Profil ==&lt;br /&gt;
 &amp;lt;code&amp;gt;curl -sS \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   &amp;quot;$BASE/user/profile&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fremdes Profil anhand UID ==&lt;br /&gt;
 &amp;lt;code&amp;gt;curl -sS \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   &amp;quot;$BASE/user/profile?uid=42&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Profil ändern ==&lt;br /&gt;
 &amp;lt;code&amp;gt;curl -sS \&lt;br /&gt;
   -X PATCH \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;name&amp;quot;: &amp;quot;Kosmos&amp;quot;,&lt;br /&gt;
     &amp;quot;avatar&amp;quot;: &amp;quot;&amp;lt;nowiki&amp;gt;https://example.com/avatar.png&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
   }&#039; \&lt;br /&gt;
   &amp;quot;$BASE/user/profile&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driving Logs ==&lt;br /&gt;
 &amp;lt;code&amp;gt;curl -sS \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   &amp;quot;$BASE/dlog/list?page=1&amp;amp;page_size=50&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token prüfen ==&lt;br /&gt;
 &amp;lt;code&amp;gt;curl -sS \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   &amp;quot;$BASE/token&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logout / Token widerrufen ==&lt;br /&gt;
 &amp;lt;code&amp;gt;curl -sS \&lt;br /&gt;
   -X DELETE \&lt;br /&gt;
   -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   &amp;quot;$BASE/token&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 28. Wichtige Besonderheiten für Client-Entwickler =&lt;br /&gt;
&lt;br /&gt;
=== 1. Nicht alle Endpoints sind immer vorhanden ===&lt;br /&gt;
Tracker-Endpunkte hängen von den konfigurierten Trackern ab.&lt;br /&gt;
&lt;br /&gt;
Plugin-Endpunkte hängen von den aktivierten Plugins ab.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;lt;code&amp;gt;404 Not Found&amp;lt;/code&amp;gt; kann daher bedeuten, dass die entsprechende Funktion im aktuellen Hub deaktiviert ist.&lt;br /&gt;
&lt;br /&gt;
=== 2. Permissions sind dynamisch ===&lt;br /&gt;
Viele Endpoints verlangen keine fest im Endpointnamen sichtbare Rolle wie &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Autorisierung basiert auf:&lt;br /&gt;
 &amp;lt;code&amp;gt;User accepted?&lt;br /&gt;
 +&lt;br /&gt;
 Roles&lt;br /&gt;
 +&lt;br /&gt;
 Permissions der Rollen&amp;lt;/code&amp;gt;&lt;br /&gt;
Ein Benutzer muss mindestens eine passende Permission besitzen.&lt;br /&gt;
&lt;br /&gt;
=== 3. Application Token != User Token ===&lt;br /&gt;
Ein Application Token wird vom System ausdrücklich anders behandelt.&lt;br /&gt;
&lt;br /&gt;
Ein Client sollte daher nicht davon ausgehen, dass jeder Bearer-Endpunkt automatisch mit Application Token funktioniert.&lt;br /&gt;
&lt;br /&gt;
=== 4. OpenAPI beschreibt Responses kaum ===&lt;br /&gt;
Viele Definitionen enthalten:&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;responses&amp;quot;: {}&amp;lt;/code&amp;gt;&lt;br /&gt;
Für einen streng typisierten Client sollte man Response-Schemas daher aus der Implementierung bzw. aus echten Testantworten ableiten.&lt;br /&gt;
&lt;br /&gt;
=== 5. Captcha-Abweichung ===&lt;br /&gt;
Bei &amp;lt;code&amp;gt;/auth/password&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/auth/register&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;/auth/reset&amp;lt;/code&amp;gt; sollte der Client immer:&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;captcha-response&amp;quot;: &amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
mitsenden.&lt;br /&gt;
&lt;br /&gt;
Zumindest beim Password-Login greift die Implementierung direkt auf dieses Feld zu.&lt;br /&gt;
&lt;br /&gt;
=== 6. API-Versionierung ===&lt;br /&gt;
Die API verwendet keine Versionsnummer im URL-Pfad wie:&lt;br /&gt;
 &amp;lt;code&amp;gt;/api/v1/...&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Kompatibilität hängt daher von der eingesetzten HubBackend-Version ab.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 29. Empfehlung für eine eigene Integration =&lt;br /&gt;
Für einen normalen Web-/Desktop-Client würde ich folgende Reihenfolge verwenden:&lt;br /&gt;
 &amp;lt;code&amp;gt;GET /&lt;br /&gt;
    ↓&lt;br /&gt;
 GET /languages&lt;br /&gt;
    ↓&lt;br /&gt;
 POST /auth/password&lt;br /&gt;
    ↓&lt;br /&gt;
 optional POST /auth/mfa&lt;br /&gt;
    ↓&lt;br /&gt;
 GET /token&lt;br /&gt;
    ↓&lt;br /&gt;
 GET /user/profile&lt;br /&gt;
    ↓&lt;br /&gt;
 GET /member/perms&lt;br /&gt;
    ↓&lt;br /&gt;
 Features abhängig von Permissions anzeigen&amp;lt;/code&amp;gt;&lt;br /&gt;
Danach können beispielsweise:&lt;br /&gt;
 &amp;lt;code&amp;gt;/dlog/*&lt;br /&gt;
 /member/*&lt;br /&gt;
 /announcements/*&lt;br /&gt;
 /applications/*&lt;br /&gt;
 /events/*&lt;br /&gt;
 /economy/*&amp;lt;/code&amp;gt;&lt;br /&gt;
verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Für einen generischen Client ist es sinnvoll, &#039;&#039;&#039;nicht&#039;&#039;&#039; hart anzunehmen, welche Plugins vorhanden sind, sondern die Hub-Konfiguration bzw. verfügbaren Funktionen beim Start festzustellen.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= 30. Kurzreferenz der API-Bereiche =&lt;br /&gt;
 &amp;lt;code&amp;gt;/                         Server/Hub Info&lt;br /&gt;
 /status                   Status&lt;br /&gt;
 /config                   Administration&lt;br /&gt;
 /audit                    Audit Log&lt;br /&gt;
 &lt;br /&gt;
 /auth/*                   Login / Registration&lt;br /&gt;
 /token/*                  Sessions / Application Tokens&lt;br /&gt;
 &lt;br /&gt;
 /user/*                   Accounts&lt;br /&gt;
 /member/*                 Mitglieder / Rollen / Punkte&lt;br /&gt;
 /dlog/*                   Driving Logs &amp;amp; Statistiken&lt;br /&gt;
 &lt;br /&gt;
 /tracksim/*               TrackSim&lt;br /&gt;
 /trucky/*                 Trucky&lt;br /&gt;
 /custom-tracker/*         Custom Tracker&lt;br /&gt;
 /unitracker/*             UniTracker&lt;br /&gt;
 &lt;br /&gt;
 /announcements/*          Announcements Plugin&lt;br /&gt;
 /applications/*           Applications Plugin&lt;br /&gt;
 /challenges/*             Challenge Plugin&lt;br /&gt;
 /divisions/*              Division Plugin&lt;br /&gt;
 /downloads/*              Downloads Plugin&lt;br /&gt;
 /economy/*                Economy Plugin&lt;br /&gt;
 /events/*                 Event Plugin&lt;br /&gt;
 /polls/*                  Poll Plugin&lt;br /&gt;
 /tasks/*                  Task Plugin&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kosmos</name></author>
	</entry>
	<entry>
		<id>https://wiki.kosmos.ac/index.php?title=DriversHub&amp;diff=2</id>
		<title>DriversHub</title>
		<link rel="alternate" type="text/html" href="https://wiki.kosmos.ac/index.php?title=DriversHub&amp;diff=2"/>
		<updated>2026-08-18T21:52:00Z</updated>

		<summary type="html">&lt;p&gt;Kosmos: Die Seite wurde neu angelegt: „# Drivers Hub Backend – API-Dokumentation  Repository: `CharlesWithC/HubBackend`  ## 1. API-Grundlagen  ### Base URL  Die API besitzt **keine fest eingebaute öffentliche Base URL**. Host und API-Prefix kommen aus der Hub-Konfiguration.  Beispielkonfiguration:  ```json {   &amp;quot;domain&amp;quot;: &amp;quot;hub.example.com&amp;quot;,   &amp;quot;prefix&amp;quot;: &amp;quot;/api&amp;quot; } ```  Damit lautet die Base URL:  ```text https://hub.example.com/api ```  Ein Request auf:  ```text GET /user/profile ```  wird also…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# Drivers Hub Backend – API-Dokumentation&lt;br /&gt;
&lt;br /&gt;
Repository: `CharlesWithC/HubBackend`&lt;br /&gt;
&lt;br /&gt;
## 1. API-Grundlagen&lt;br /&gt;
&lt;br /&gt;
### Base URL&lt;br /&gt;
&lt;br /&gt;
Die API besitzt **keine fest eingebaute öffentliche Base URL**. Host und API-Prefix kommen aus der Hub-Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispielkonfiguration:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;domain&amp;quot;: &amp;quot;hub.example.com&amp;quot;,&lt;br /&gt;
  &amp;quot;prefix&amp;quot;: &amp;quot;/api&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Damit lautet die Base URL:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
https://hub.example.com/api&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Ein Request auf:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
GET /user/profile&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
wird also beispielsweise:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
GET https://hub.example.com/api/user/profile&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Der Prefix ist konfigurierbar und muss mit `/` beginnen.&lt;br /&gt;
&lt;br /&gt;
### Swagger / OpenAPI&lt;br /&gt;
&lt;br /&gt;
Wenn in der Konfiguration&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;openapi&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
gesetzt wird, stellt der Server die interaktive Swagger-Dokumentation unter&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
{prefix}/doc&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
bereit.&lt;br /&gt;
&lt;br /&gt;
Bei `prefix: &amp;quot;/api&amp;quot;` also:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
https://hub.example.com/api/doc&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Im Repository liegt außerdem:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
/openapi.json&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 2. Authentifizierung&lt;br /&gt;
&lt;br /&gt;
Es gibt zwei Token-Typen:&lt;br /&gt;
&lt;br /&gt;
1. **Bearer Token** – für Benutzer&lt;br /&gt;
2. **Application Token** – für Anwendungen/Integrationen&lt;br /&gt;
&lt;br /&gt;
## Bearer Token&lt;br /&gt;
&lt;br /&gt;
Header:&lt;br /&gt;
&lt;br /&gt;
```http&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN&amp;gt;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer e1234567-89ab-cdef-0123-456789abcdef&amp;quot; \&lt;br /&gt;
  https://hub.example.com/api/user/profile&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Tokens sind UUID-artige, serverseitig gespeicherte Session-Tokens. Es steckt kein JWT-Payload darin.&lt;br /&gt;
&lt;br /&gt;
## Application Token&lt;br /&gt;
&lt;br /&gt;
Header:&lt;br /&gt;
&lt;br /&gt;
```http&lt;br /&gt;
Authorization: Application &amp;lt;TOKEN&amp;gt;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl \&lt;br /&gt;
  -H &amp;quot;Authorization: Application 12345678-1234-1234-1234-123456789abc&amp;quot; \&lt;br /&gt;
  https://hub.example.com/api/user/profile&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Application Tokens haben gegenüber normalen User-Tokens Einschränkungen. Nicht jeder authentifizierte Endpoint muss Application Tokens akzeptieren.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 3. Allgemeine Request-Regeln&lt;br /&gt;
&lt;br /&gt;
Für praktisch alle Requests außer `GET` erwartet das Backend:&lt;br /&gt;
&lt;br /&gt;
```http&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Ausnahmen sind insbesondere Tracker-Webhooks:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
/tracksim/*&lt;br /&gt;
/trucky/*&lt;br /&gt;
/custom-tracker/*&lt;br /&gt;
/unitracker/*&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Diese dürfen tracker-spezifische Payloads verwenden.&lt;br /&gt;
&lt;br /&gt;
Standard-JSON-Request:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl -X PATCH \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&amp;quot;name&amp;quot;:&amp;quot;John Doe&amp;quot;}&#039; \&lt;br /&gt;
  &amp;quot;$BASE/user/profile&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Fehlerformat&lt;br /&gt;
&lt;br /&gt;
FastAPI-/HTTP-Fehler werden grundsätzlich in dieser Art zurückgegeben:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;error&amp;quot;: &amp;quot;Fehlermeldung&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Typische Statuscodes sind:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
400  Bad Request&lt;br /&gt;
401  Unauthorized&lt;br /&gt;
403  Forbidden&lt;br /&gt;
404  Not Found&lt;br /&gt;
409  Conflict&lt;br /&gt;
422  Unprocessable Entity&lt;br /&gt;
423  Locked&lt;br /&gt;
428  Precondition Required&lt;br /&gt;
429  Too Many Requests&lt;br /&gt;
500  Internal Server Error&lt;br /&gt;
503  Service Unavailable&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Bei Request-Validation wird die normale ausführliche FastAPI-422-Antwort durch:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;error&amp;quot;: &amp;quot;Unprocessable Entity&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
ersetzt.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 4. Rate Limits&lt;br /&gt;
&lt;br /&gt;
Es gibt globale und endpoint-spezifische Rate Limits.&lt;br /&gt;
&lt;br /&gt;
Global:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
300 Requests / 60 Sekunden&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Nach Überschreiten kann der Client für etwa fünf Minuten global blockiert werden.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich besitzen einzelne Endpoints eigene Limits.&lt;br /&gt;
&lt;br /&gt;
Beispiel aus `/auth/password`:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
3 Requests / 60 Sekunden&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 5. Benutzer-IDs: `uid` vs. `userid`&lt;br /&gt;
&lt;br /&gt;
Das ist für Clients besonders wichtig.&lt;br /&gt;
&lt;br /&gt;
### `uid`&lt;br /&gt;
&lt;br /&gt;
Interne, eindeutige User-ID.&lt;br /&gt;
&lt;br /&gt;
Jeder Account besitzt eine `uid`.&lt;br /&gt;
&lt;br /&gt;
### `userid`&lt;br /&gt;
&lt;br /&gt;
Mitglieds-/Driver-Hub-ID.&lt;br /&gt;
&lt;br /&gt;
Diese existiert erst sinnvoll, nachdem ein Account als Mitglied angenommen wurde.&lt;br /&gt;
&lt;br /&gt;
Daher können APIs je nach Einsatzzweck entweder:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
uid&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
userid&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
verlangen.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 6. Login und Authentifizierungsflow&lt;br /&gt;
&lt;br /&gt;
## POST `/auth/password`&lt;br /&gt;
&lt;br /&gt;
Login mit E-Mail und Passwort.&lt;br /&gt;
&lt;br /&gt;
### Body&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;email&amp;quot;: &amp;quot;user@example.com&amp;quot;,&lt;br /&gt;
  &amp;quot;password&amp;quot;: &amp;quot;Secret123!&amp;quot;,&lt;br /&gt;
  &amp;quot;captcha-response&amp;quot;: &amp;quot;&amp;lt;captcha-token&amp;gt;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
`captcha-response` sollte als **erforderlich** betrachtet werden, auch wenn die OpenAPI-Datei es nicht sauber als required kennzeichnet.&lt;br /&gt;
&lt;br /&gt;
Unterstützte Captcha-Systeme:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
Cloudflare Turnstile&lt;br /&gt;
hCaptcha&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
### Erfolgreicher Login ohne MFA&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;token&amp;quot;: &amp;quot;e....&amp;quot;,&lt;br /&gt;
  &amp;quot;mfa&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
### Login mit aktiviertem MFA&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;token&amp;quot;: &amp;quot;f....&amp;quot;,&lt;br /&gt;
  &amp;quot;mfa&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Der zurückgegebene Token ist in diesem Fall zunächst ein temporäres Auth-Ticket.&lt;br /&gt;
&lt;br /&gt;
Danach:&lt;br /&gt;
&lt;br /&gt;
```http&lt;br /&gt;
POST /auth/mfa&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Body:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;token&amp;quot;: &amp;quot;&amp;lt;temporary-auth-ticket&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;otp&amp;quot;: &amp;quot;123456&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Danach erhält man den eigentlichen Session-Token.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## POST `/auth/register`&lt;br /&gt;
&lt;br /&gt;
Registriert einen Account per E-Mail/Passwort.&lt;br /&gt;
&lt;br /&gt;
Body:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;email&amp;quot;: &amp;quot;user@example.com&amp;quot;,&lt;br /&gt;
  &amp;quot;password&amp;quot;: &amp;quot;Secret123!&amp;quot;,&lt;br /&gt;
  &amp;quot;captcha-response&amp;quot;: &amp;quot;&amp;lt;captcha-token&amp;gt;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Das Passwort muss mindestens acht Zeichen lang sein. Die konkrete Prüfung berücksichtigt außerdem Groß-/Kleinbuchstaben, Zahlen und Sonderzeichen.&lt;br /&gt;
&lt;br /&gt;
Eine funktionierende SMTP-Konfiguration ist für die E-Mail-Bestätigung notwendig.&lt;br /&gt;
&lt;br /&gt;
Bei Erfolg wird bereits ein Session-Token ausgegeben:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;token&amp;quot;: &amp;quot;e....&amp;quot;,&lt;br /&gt;
  &amp;quot;mfa&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## POST `/auth/reset`&lt;br /&gt;
&lt;br /&gt;
Startet einen Password-Reset.&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;email&amp;quot;: &amp;quot;user@example.com&amp;quot;,&lt;br /&gt;
  &amp;quot;captcha-response&amp;quot;: &amp;quot;&amp;lt;captcha-token&amp;gt;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## POST `/auth/email`&lt;br /&gt;
&lt;br /&gt;
Verarbeitet E-Mail-Bestätigungs-/Reset-Links.&lt;br /&gt;
&lt;br /&gt;
Query:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
?secret=&amp;lt;SECRET&amp;gt;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Bei Password-Reset ggf. Body:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;password&amp;quot;: &amp;quot;NewSecret123!&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Discord / Steam Login&lt;br /&gt;
&lt;br /&gt;
### GET `/auth/discord/callback`&lt;br /&gt;
&lt;br /&gt;
Queryparameter:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
code&lt;br /&gt;
error_description&lt;br /&gt;
callback_url&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
`callback_url` ist erforderlich.&lt;br /&gt;
&lt;br /&gt;
### GET `/auth/steam/callback`&lt;br /&gt;
&lt;br /&gt;
Steam-OpenID-Callback.&lt;br /&gt;
&lt;br /&gt;
Die von Steam gelieferten Parameter müssen an diesen Endpoint weitergereicht werden.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 7. Token API&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                  | Funktion                                |&lt;br /&gt;
| ------ | ------------------------- | --------------------------------------- |&lt;br /&gt;
| GET    | `/token`                  | aktuellen Token validieren              |&lt;br /&gt;
| PATCH  | `/token`                  | aktuellen Token erneuern                |&lt;br /&gt;
| DELETE | `/token`                  | aktuellen Token widerrufen              |&lt;br /&gt;
| GET    | `/token/list`             | Sessions/Tokens auflisten               |&lt;br /&gt;
| DELETE | `/token/hash`             | bestimmten Token anhand Hash widerrufen |&lt;br /&gt;
| DELETE | `/token/all`              | alle Benutzer-Tokens widerrufen         |&lt;br /&gt;
| GET    | `/token/application/list` | Application Tokens auflisten            |&lt;br /&gt;
| POST   | `/token/application`      | Application Token erzeugen              |&lt;br /&gt;
| DELETE | `/token/application`      | Application Token widerrufen            |&lt;br /&gt;
| DELETE | `/token/application/all`  | alle Application Tokens widerrufen      |&lt;br /&gt;
| POST   | `/auth/ticket`            | Auth-Ticket erzeugen/verwenden          |&lt;br /&gt;
| GET    | `/auth/ticket`            | Auth-Ticket abrufen                     |&lt;br /&gt;
&lt;br /&gt;
Beispiel Token-Validierung:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  &amp;quot;$BASE/token&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Tokenliste unterstützt unter anderem:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
page&lt;br /&gt;
page_size&lt;br /&gt;
order_by&lt;br /&gt;
order&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Mögliche `order_by`-Werte laut OpenAPI:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
ip&lt;br /&gt;
timestamp&lt;br /&gt;
country_code&lt;br /&gt;
user_agent&lt;br /&gt;
last_used_timestamp&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 8. System-/Info-API&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                           | Funktion                             |&lt;br /&gt;
| ------ | ---------------------------------- | ------------------------------------ |&lt;br /&gt;
| GET    | `/`                                | Drivers-Hub-Informationen            |&lt;br /&gt;
| GET    | `/status`                          | Serverstatus                         |&lt;br /&gt;
| POST   | `/status/database/restart`         | Datenbankverbindung neu starten      |&lt;br /&gt;
| GET    | `/languages`                       | Hub- und unterstützte Sprachen       |&lt;br /&gt;
| POST   | `/discord/role-connection/enable`  | Discord Role Connection aktivieren   |&lt;br /&gt;
| POST   | `/discord/role-connection/disable` | Discord Role Connection deaktivieren |&lt;br /&gt;
| GET    | `/config`                          | Konfiguration lesen                  |&lt;br /&gt;
| PATCH  | `/config`                          | Konfiguration ändern                 |&lt;br /&gt;
| POST   | `/config/reload`                   | Konfiguration neu laden              |&lt;br /&gt;
| POST   | `/restart`                         | Backend neu starten                  |&lt;br /&gt;
| GET    | `/audit/list`                      | Audit-Log abrufen                    |&lt;br /&gt;
&lt;br /&gt;
Administrative Endpoints sind entsprechend permission-geschützt.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 9. User API&lt;br /&gt;
&lt;br /&gt;
## Profile und Benutzer&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                  | Funktion                    |&lt;br /&gt;
| ------ | ------------------------- | --------------------------- |&lt;br /&gt;
| GET    | `/user/list`              | Benutzerliste               |&lt;br /&gt;
| GET    | `/user/profile`           | Userprofil abrufen          |&lt;br /&gt;
| PATCH  | `/user/profile`           | Name/Avatar ändern          |&lt;br /&gt;
| PATCH  | `/user/bio`               | Bio ändern                  |&lt;br /&gt;
| PATCH  | `/user/activity`          | Aktivitätsdaten ändern      |&lt;br /&gt;
| PATCH  | `/user/{uid}/note`        | persönliche Notiz über User |&lt;br /&gt;
| PATCH  | `/user/{uid}/note/global` | globale Staff-Notiz         |&lt;br /&gt;
| POST   | `/user/tracker/switch`    | aktiven Tracker wechseln    |&lt;br /&gt;
&lt;br /&gt;
### GET `/user/profile`&lt;br /&gt;
&lt;br /&gt;
Kann einen Benutzer anhand verschiedener IDs suchen:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
userid&lt;br /&gt;
uid&lt;br /&gt;
discordid&lt;br /&gt;
steamid&lt;br /&gt;
truckersmpid&lt;br /&gt;
email&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Zusätzliche Parameter:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
role_history_limit&lt;br /&gt;
ban_history_limit&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Ohne Ziel-ID wird typischerweise das eigene Profil verwendet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  &amp;quot;$BASE/user/profile?uid=123&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  &amp;quot;$BASE/user/profile?discordid=123456789012345678&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
### PATCH `/user/profile`&lt;br /&gt;
&lt;br /&gt;
Body:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;New Name&amp;quot;,&lt;br /&gt;
  &amp;quot;avatar&amp;quot;: &amp;quot;https://example.com/avatar.png&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Optionale Queryparameter:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
uid&lt;br /&gt;
sync_from_discord&lt;br /&gt;
sync_from_steam&lt;br /&gt;
sync_from_truckersmp&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Damit können Profildaten auch von verbundenen Plattformen synchronisiert werden.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 10. Sprache, Zeitzone und Privacy&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint         | Funktion                     |&lt;br /&gt;
| ------ | ---------------- | ---------------------------- |&lt;br /&gt;
| GET    | `/user/language` | aktuelle Sprache             |&lt;br /&gt;
| PATCH  | `/user/language` | Sprache ändern               |&lt;br /&gt;
| GET    | `/user/timezone` | Zeitzone lesen               |&lt;br /&gt;
| PATCH  | `/user/timezone` | Zeitzone ändern              |&lt;br /&gt;
| GET    | `/user/privacy`  | Privacy-Einstellungen        |&lt;br /&gt;
| PATCH  | `/user/privacy`  | Privacy-Einstellungen ändern |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 11. Password und MFA&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                 | Funktion                    |&lt;br /&gt;
| ------ | ------------------------ | --------------------------- |&lt;br /&gt;
| PATCH  | `/user/password`         | Passwort ändern             |&lt;br /&gt;
| POST   | `/user/password/disable` | Password-Login deaktivieren |&lt;br /&gt;
| POST   | `/user/mfa/enable`       | TOTP-MFA aktivieren         |&lt;br /&gt;
| POST   | `/user/mfa/disable`      | MFA deaktivieren            |&lt;br /&gt;
&lt;br /&gt;
TOTP-MFA wird bei jedem Login verwendet.&lt;br /&gt;
&lt;br /&gt;
Für besonders kritische administrative Aktionen, insbesondere Config-Reload, kann MFA verpflichtend sein.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 12. User Connections&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                               | Funktion                         |&lt;br /&gt;
| ------ | -------------------------------------- | -------------------------------- |&lt;br /&gt;
| POST   | `/user/resend-confirmation`            | Bestätigungsmail erneut senden   |&lt;br /&gt;
| PATCH  | `/user/email`                          | E-Mail verbinden/ändern          |&lt;br /&gt;
| PATCH  | `/user/discord`                        | Discord verbinden                |&lt;br /&gt;
| PATCH  | `/user/steam`                          | Steam verbinden                  |&lt;br /&gt;
| PATCH  | `/user/truckersmp`                     | TruckersMP verbinden             |&lt;br /&gt;
| PATCH  | `/user/{uid}/connections`              | Connections administrativ ändern |&lt;br /&gt;
| DELETE | `/user/{uid}/connections/{connection}` | Connection entfernen             |&lt;br /&gt;
&lt;br /&gt;
Für das Job-Tracking ist insbesondere eine verbundene Steam-ID relevant.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 13. Notifications&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                                                  | Funktion                |&lt;br /&gt;
| ------ | --------------------------------------------------------- | ----------------------- |&lt;br /&gt;
| GET    | `/user/notification/list`                                 | Notifications auflisten |&lt;br /&gt;
| GET    | `/user/notification/{notificationid}`                     | Notification lesen      |&lt;br /&gt;
| DELETE | `/user/notification`                                      | Notification(s) löschen |&lt;br /&gt;
| PATCH  | `/user/notification/{notificationid}/status/{status}`     | Status ändern           |&lt;br /&gt;
| GET    | `/user/notification/settings`                             | Notification Settings   |&lt;br /&gt;
| POST   | `/user/notification/settings/{notification_type}/enable`  | Typ aktivieren          |&lt;br /&gt;
| POST   | `/user/notification/settings/{notification_type}/disable` | Typ deaktivieren        |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 14. User Administration / Bans&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                        | Funktion                          |&lt;br /&gt;
| ------ | ------------------------------- | --------------------------------- |&lt;br /&gt;
| POST   | `/user/{uid}/accept`            | Benutzer als Mitglied akzeptieren |&lt;br /&gt;
| DELETE | `/user/{uid}`                   | Benutzer löschen                  |&lt;br /&gt;
| GET    | `/user/ban/list`                | Bannliste                         |&lt;br /&gt;
| GET    | `/user/ban`                     | Banninformationen                 |&lt;br /&gt;
| PUT    | `/user/ban`                     | Bann erstellen                    |&lt;br /&gt;
| DELETE | `/user/ban`                     | Bann entfernen                    |&lt;br /&gt;
| DELETE | `/user/ban/history/{historyid}` | Bann-History-Eintrag löschen      |&lt;br /&gt;
&lt;br /&gt;
Das „Akzeptieren“ eines Users ist unabhängig vom Application-Plugin.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 15. Member API&lt;br /&gt;
&lt;br /&gt;
## Informationen&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint         | Funktion         |&lt;br /&gt;
| ------ | ---------------- | ---------------- |&lt;br /&gt;
| GET    | `/member/roles`  | Rollen           |&lt;br /&gt;
| GET    | `/member/ranks`  | Ranks            |&lt;br /&gt;
| GET    | `/member/perms`  | Permissions      |&lt;br /&gt;
| GET    | `/member/list`   | Mitgliederliste  |&lt;br /&gt;
| GET    | `/member/banner` | Mitgliederbanner |&lt;br /&gt;
&lt;br /&gt;
## Eigene Member-Aktionen&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                              | Funktion                          |&lt;br /&gt;
| ------ | ------------------------------------- | --------------------------------- |&lt;br /&gt;
| PATCH  | `/member/roles/rank`                  | Default Rank-Rolle ändern         |&lt;br /&gt;
| PATCH  | `/member/roles/rank/{rank_type_id}`   | Rank-Rolle bestimmten Typs ändern |&lt;br /&gt;
| GET    | `/member/bonus/history`               | Bonus-History                     |&lt;br /&gt;
| POST   | `/member/bonus/claim`                 | Bonus beanspruchen                |&lt;br /&gt;
| GET    | `/member/bonus/notification/settings` | Bonus-Notification-Settings       |&lt;br /&gt;
| PATCH  | `/member/bonus/notification/settings` | Settings ändern                   |&lt;br /&gt;
| DELETE | `/member/roles/history/{historyid}`   | Rollen-History löschen            |&lt;br /&gt;
| POST   | `/member/resign`                      | Mitgliedschaft niederlegen        |&lt;br /&gt;
&lt;br /&gt;
## Member Administration&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                   | Funktion           |&lt;br /&gt;
| ------ | -------------------------- | ------------------ |&lt;br /&gt;
| PATCH  | `/member/{userid}/roles`   | Rollen ändern      |&lt;br /&gt;
| PATCH  | `/member/{userid}/points`  | Punkte ändern      |&lt;br /&gt;
| POST   | `/member/{userid}/dismiss` | Mitglied entlassen |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 16. Driving Logs – `/dlog`&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                   | Funktion              |&lt;br /&gt;
| ------ | -------------------------- | --------------------- |&lt;br /&gt;
| GET    | `/dlog/list`               | Fahrten auflisten     |&lt;br /&gt;
| GET    | `/dlog/{logid}`            | einzelne Fahrt        |&lt;br /&gt;
| DELETE | `/dlog/{logid}`            | Fahrt löschen         |&lt;br /&gt;
| GET    | `/dlog/leaderboard`        | Leaderboard           |&lt;br /&gt;
| GET    | `/dlog/export`             | Fahrten exportieren   |&lt;br /&gt;
| GET    | `/dlog/statistics/summary` | aggregierte Statistik |&lt;br /&gt;
| GET    | `/dlog/statistics/chart`   | Chart-Daten           |&lt;br /&gt;
| GET    | `/dlog/statistics/details` | Detailstatistik       |&lt;br /&gt;
&lt;br /&gt;
Diese APIs gehören zu den mächtigeren Teilen des Backends und besitzen zahlreiche Filter für beispielsweise:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
Fahrer&lt;br /&gt;
Zeiträume&lt;br /&gt;
Distanz&lt;br /&gt;
Einnahmen&lt;br /&gt;
Schaden&lt;br /&gt;
Fahrzeug&lt;br /&gt;
Fracht&lt;br /&gt;
Start-/Zielort&lt;br /&gt;
Spiel&lt;br /&gt;
Tracker&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Die Filter sollten anhand der jeweiligen OpenAPI-Definition verwendet werden, da die Statistik-Endpoints unterschiedlich große Parametersätze besitzen.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 17. Tracker APIs&lt;br /&gt;
&lt;br /&gt;
Tracker-Routen werden nur aktiviert, wenn der entsprechende Tracker konfiguriert ist.&lt;br /&gt;
&lt;br /&gt;
## TrackSim&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                    |&lt;br /&gt;
| ------ | --------------------------- |&lt;br /&gt;
| POST   | `/tracksim/update`          |&lt;br /&gt;
| POST   | `/tracksim/update/route`    |&lt;br /&gt;
| PUT    | `/tracksim/driver/{userid}` |&lt;br /&gt;
| DELETE | `/tracksim/driver/{userid}` |&lt;br /&gt;
&lt;br /&gt;
## Trucky&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                  |&lt;br /&gt;
| ------ | ------------------------- |&lt;br /&gt;
| POST   | `/trucky/update`          |&lt;br /&gt;
| POST   | `/trucky/import/{jobid}`  |&lt;br /&gt;
| PUT    | `/trucky/driver/{userid}` |&lt;br /&gt;
| DELETE | `/trucky/driver/{userid}` |&lt;br /&gt;
&lt;br /&gt;
## Custom Tracker&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
POST /custom-tracker/update&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## UniTracker&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
POST /unitracker/update&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Diese Endpoints sind primär für Tracker-Server/Webhooks gedacht, nicht für den normalen Browser-Client.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 18. Announcements Plugin&lt;br /&gt;
&lt;br /&gt;
Nur vorhanden, wenn das Plugin aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                          | Funktion           |&lt;br /&gt;
| ------ | --------------------------------- | ------------------ |&lt;br /&gt;
| GET    | `/announcements/types`            | Announcement-Typen |&lt;br /&gt;
| GET    | `/announcements/list`             | Liste              |&lt;br /&gt;
| GET    | `/announcements/{announcementid}` | Eintrag            |&lt;br /&gt;
| POST   | `/announcements`                  | erstellen          |&lt;br /&gt;
| PATCH  | `/announcements/{announcementid}` | ändern             |&lt;br /&gt;
| DELETE | `/announcements/{announcementid}` | löschen            |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 19. Applications Plugin&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                                | Funktion             |&lt;br /&gt;
| ------ | --------------------------------------- | -------------------- |&lt;br /&gt;
| GET    | `/applications/types`                   | Application-Typen    |&lt;br /&gt;
| GET    | `/applications/list`                    | Bewerbungen          |&lt;br /&gt;
| GET    | `/applications/statistics`              | Statistiken          |&lt;br /&gt;
| GET    | `/applications/{applicationid}`         | Bewerbung            |&lt;br /&gt;
| POST   | `/applications`                         | Bewerbung erstellen  |&lt;br /&gt;
| POST   | `/applications/{applicationid}/message` | Nachricht hinzufügen |&lt;br /&gt;
| PATCH  | `/applications/{applicationid}/status`  | Status ändern        |&lt;br /&gt;
| DELETE | `/applications/{applicationid}`         | löschen              |&lt;br /&gt;
&lt;br /&gt;
Hinweis: Das Akzeptieren einer Application akzeptiert den User nicht automatisch als Hub-Mitglied.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 20. Challenges Plugin&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                                     |&lt;br /&gt;
| ------ | -------------------------------------------- |&lt;br /&gt;
| GET    | `/challenges/list`                           |&lt;br /&gt;
| GET    | `/challenges/{challengeid}`                  |&lt;br /&gt;
| POST   | `/challenges`                                |&lt;br /&gt;
| PATCH  | `/challenges/{challengeid}`                  |&lt;br /&gt;
| DELETE | `/challenges/{challengeid}`                  |&lt;br /&gt;
| PUT    | `/challenges/{challengeid}/delivery/{logid}` |&lt;br /&gt;
| DELETE | `/challenges/{challengeid}/delivery/{logid}` |&lt;br /&gt;
&lt;br /&gt;
Die letzten beiden Calls ordnen Driving Logs einer Challenge zu bzw. entfernen sie.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 21. Divisions Plugin&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                              |&lt;br /&gt;
| ------ | ------------------------------------- |&lt;br /&gt;
| GET    | `/divisions/list`                     |&lt;br /&gt;
| GET    | `/divisions/statistics`               |&lt;br /&gt;
| GET    | `/divisions/{divisionid}/activity`    |&lt;br /&gt;
| GET    | `/divisions/list/pending`             |&lt;br /&gt;
| GET    | `/dlog/{logid}/division`              |&lt;br /&gt;
| POST   | `/dlog/{logid}/division/{divisionid}` |&lt;br /&gt;
| PATCH  | `/dlog/{logid}/division/{divisionid}` |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 22. Downloads Plugin&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                       |&lt;br /&gt;
| ------ | ------------------------------ |&lt;br /&gt;
| GET    | `/downloads/list`              |&lt;br /&gt;
| GET    | `/downloads/redirect/{secret}` |&lt;br /&gt;
| GET    | `/downloads/{downloadsid}`     |&lt;br /&gt;
| POST   | `/downloads`                   |&lt;br /&gt;
| PATCH  | `/downloads/{downloadsid}`     |&lt;br /&gt;
| DELETE | `/downloads/{downloadsid}`     |&lt;br /&gt;
&lt;br /&gt;
`/downloads/redirect/{secret}` dient dem kontrollierten Download/Redirect anhand eines Secrets.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 23. Economy Plugin&lt;br /&gt;
&lt;br /&gt;
Das Economy-Plugin besitzt eine umfangreiche eigene API.&lt;br /&gt;
&lt;br /&gt;
## Economy Overview&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
GET /economy&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Balance&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                                            |&lt;br /&gt;
| ------ | --------------------------------------------------- |&lt;br /&gt;
| GET    | `/economy/balance`                                  |&lt;br /&gt;
| GET    | `/economy/balance/{userid}`                         |&lt;br /&gt;
| PATCH  | `/economy/balance/{userid}`                         |&lt;br /&gt;
| GET    | `/economy/balance/leaderboard`                      |&lt;br /&gt;
| POST   | `/economy/balance/transfer`                         |&lt;br /&gt;
| GET    | `/economy/balance/{userid}/transactions/list`       |&lt;br /&gt;
| GET    | `/economy/balance/{userid}/transactions/export`     |&lt;br /&gt;
| POST   | `/economy/balance/{userid}/visibility/{visibility}` |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Garages&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                               |&lt;br /&gt;
| ------ | -------------------------------------- |&lt;br /&gt;
| GET    | `/economy/garages`                     |&lt;br /&gt;
| GET    | `/economy/garages/list`                |&lt;br /&gt;
| GET    | `/economy/garages/{garageid}`          |&lt;br /&gt;
| POST   | `/economy/garages/{garageid}/purchase` |&lt;br /&gt;
| POST   | `/economy/garages/{garageid}/transfer` |&lt;br /&gt;
| POST   | `/economy/garages/{garageid}/sell`     |&lt;br /&gt;
&lt;br /&gt;
### Garage Slots&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                                              |&lt;br /&gt;
| ------ | ----------------------------------------------------- |&lt;br /&gt;
| GET    | `/economy/garages/{garageid}/slots/list`              |&lt;br /&gt;
| GET    | `/economy/garages/{garageid}/slots/{slotid}`          |&lt;br /&gt;
| POST   | `/economy/garages/{garageid}/slots/purchase`          |&lt;br /&gt;
| POST   | `/economy/garages/{garageid}/slots/{slotid}/transfer` |&lt;br /&gt;
| POST   | `/economy/garages/{garageid}/slots/{slotid}/sell`     |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Trucks&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                                          |&lt;br /&gt;
| ------ | ------------------------------------------------- |&lt;br /&gt;
| GET    | `/economy/trucks`                                 |&lt;br /&gt;
| GET    | `/economy/trucks/list`                            |&lt;br /&gt;
| GET    | `/economy/trucks/{vehicleid}`                     |&lt;br /&gt;
| GET    | `/economy/trucks/{vehicleid}/{operation}/history` |&lt;br /&gt;
| POST   | `/economy/trucks/{truckid}/purchase`              |&lt;br /&gt;
| POST   | `/economy/trucks/{vehicleid}/transfer`            |&lt;br /&gt;
| POST   | `/economy/trucks/{vehicleid}/relocate`            |&lt;br /&gt;
| POST   | `/economy/trucks/{vehicleid}/activate`            |&lt;br /&gt;
| POST   | `/economy/trucks/{vehicleid}/deactivate`          |&lt;br /&gt;
| POST   | `/economy/trucks/{vehicleid}/repair`              |&lt;br /&gt;
| POST   | `/economy/trucks/{vehicleid}/sell`                |&lt;br /&gt;
| POST   | `/economy/trucks/{vehicleid}/scrap`               |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Merchandise&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                            |&lt;br /&gt;
| ------ | ----------------------------------- |&lt;br /&gt;
| GET    | `/economy/merch`                    |&lt;br /&gt;
| GET    | `/economy/merch/list`               |&lt;br /&gt;
| POST   | `/economy/merch/{merchid}/purchase` |&lt;br /&gt;
| POST   | `/economy/merch/{itemid}/transfer`  |&lt;br /&gt;
| POST   | `/economy/merch/{itemid}/sell`      |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 24. Events Plugin&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                      |&lt;br /&gt;
| ------ | ----------------------------- |&lt;br /&gt;
| GET    | `/events/list`                |&lt;br /&gt;
| GET    | `/events/{eventid}`           |&lt;br /&gt;
| PUT    | `/events/{eventid}/vote`      |&lt;br /&gt;
| DELETE | `/events/{eventid}/vote`      |&lt;br /&gt;
| POST   | `/events`                     |&lt;br /&gt;
| PATCH  | `/events/{eventid}`           |&lt;br /&gt;
| DELETE | `/events/{eventid}`           |&lt;br /&gt;
| PATCH  | `/events/{eventid}/attendees` |&lt;br /&gt;
&lt;br /&gt;
Beim Bearbeiten von Attendees werden User-IDs verwendet.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 25. Poll Plugin&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint               |&lt;br /&gt;
| ------ | ---------------------- |&lt;br /&gt;
| GET    | `/polls/list`          |&lt;br /&gt;
| GET    | `/polls/{pollid}`      |&lt;br /&gt;
| PUT    | `/polls/{pollid}/vote` |&lt;br /&gt;
| PATCH  | `/polls/{pollid}/vote` |&lt;br /&gt;
| DELETE | `/polls/{pollid}/vote` |&lt;br /&gt;
| POST   | `/polls`               |&lt;br /&gt;
| PATCH  | `/polls/{pollid}`      |&lt;br /&gt;
| DELETE | `/polls/{pollid}`      |&lt;br /&gt;
&lt;br /&gt;
`GET /polls/list` unterstützt u. a.:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
page&lt;br /&gt;
page_size&lt;br /&gt;
order_by&lt;br /&gt;
order&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
`order_by` kann beispielsweise:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
orderid&lt;br /&gt;
pollid&lt;br /&gt;
title&lt;br /&gt;
timestamp&lt;br /&gt;
end_time&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
sein.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 26. Tasks Plugin&lt;br /&gt;
&lt;br /&gt;
| Method | Endpoint                          |&lt;br /&gt;
| ------ | --------------------------------- |&lt;br /&gt;
| GET    | `/tasks/list`                     |&lt;br /&gt;
| GET    | `/tasks/{taskid}`                 |&lt;br /&gt;
| POST   | `/tasks`                          |&lt;br /&gt;
| PATCH  | `/tasks/{taskid}`                 |&lt;br /&gt;
| DELETE | `/tasks/{taskid}`                 |&lt;br /&gt;
| PUT    | `/tasks/{taskid}/complete/mark`   |&lt;br /&gt;
| DELETE | `/tasks/{taskid}/complete/mark`   |&lt;br /&gt;
| POST   | `/tasks/{taskid}/complete/accept` |&lt;br /&gt;
| POST   | `/tasks/{taskid}/complete/reject` |&lt;br /&gt;
&lt;br /&gt;
Der typische Workflow ist:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
Task erstellen&lt;br /&gt;
      ↓&lt;br /&gt;
User markiert Task als erledigt&lt;br /&gt;
      ↓&lt;br /&gt;
Staff akzeptiert oder verwirft die Completion&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 27. Beispiel eines kompletten Clients&lt;br /&gt;
&lt;br /&gt;
Shell-Setup:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
BASE=&amp;quot;https://hub.example.com/api&amp;quot;&lt;br /&gt;
TOKEN=&amp;quot;...&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Status&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl -sS &amp;quot;$BASE/status&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Login&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl -sS \&lt;br /&gt;
  -X POST \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&lt;br /&gt;
    &amp;quot;email&amp;quot;: &amp;quot;user@example.com&amp;quot;,&lt;br /&gt;
    &amp;quot;password&amp;quot;: &amp;quot;Secret123!&amp;quot;,&lt;br /&gt;
    &amp;quot;captcha-response&amp;quot;: &amp;quot;CAPTCHA_TOKEN&amp;quot;&lt;br /&gt;
  }&#039; \&lt;br /&gt;
  &amp;quot;$BASE/auth/password&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;token&amp;quot;: &amp;quot;e1234567-89ab-cdef-0123-456789abcdef&amp;quot;,&lt;br /&gt;
  &amp;quot;mfa&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Eigenes Profil&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl -sS \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  &amp;quot;$BASE/user/profile&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Fremdes Profil anhand UID&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl -sS \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  &amp;quot;$BASE/user/profile?uid=42&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Profil ändern&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl -sS \&lt;br /&gt;
  -X PATCH \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  -d &#039;{&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;Kosmos&amp;quot;,&lt;br /&gt;
    &amp;quot;avatar&amp;quot;: &amp;quot;https://example.com/avatar.png&amp;quot;&lt;br /&gt;
  }&#039; \&lt;br /&gt;
  &amp;quot;$BASE/user/profile&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Driving Logs&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl -sS \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  &amp;quot;$BASE/dlog/list?page=1&amp;amp;page_size=50&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Token prüfen&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl -sS \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  &amp;quot;$BASE/token&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Logout / Token widerrufen&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
curl -sS \&lt;br /&gt;
  -X DELETE \&lt;br /&gt;
  -H &amp;quot;Authorization: Bearer $TOKEN&amp;quot; \&lt;br /&gt;
  -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
  &amp;quot;$BASE/token&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 28. Wichtige Besonderheiten für Client-Entwickler&lt;br /&gt;
&lt;br /&gt;
### 1. Nicht alle Endpoints sind immer vorhanden&lt;br /&gt;
&lt;br /&gt;
Tracker-Endpunkte hängen von den konfigurierten Trackern ab.&lt;br /&gt;
&lt;br /&gt;
Plugin-Endpunkte hängen von den aktivierten Plugins ab.&lt;br /&gt;
&lt;br /&gt;
Ein `404 Not Found` kann daher bedeuten, dass die entsprechende Funktion im aktuellen Hub deaktiviert ist.&lt;br /&gt;
&lt;br /&gt;
### 2. Permissions sind dynamisch&lt;br /&gt;
&lt;br /&gt;
Viele Endpoints verlangen keine fest im Endpointnamen sichtbare Rolle wie `admin`.&lt;br /&gt;
&lt;br /&gt;
Die Autorisierung basiert auf:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
User accepted?&lt;br /&gt;
+&lt;br /&gt;
Roles&lt;br /&gt;
+&lt;br /&gt;
Permissions der Rollen&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Ein Benutzer muss mindestens eine passende Permission besitzen.&lt;br /&gt;
&lt;br /&gt;
### 3. Application Token != User Token&lt;br /&gt;
&lt;br /&gt;
Ein Application Token wird vom System ausdrücklich anders behandelt.&lt;br /&gt;
&lt;br /&gt;
Ein Client sollte daher nicht davon ausgehen, dass jeder Bearer-Endpunkt automatisch mit Application Token funktioniert.&lt;br /&gt;
&lt;br /&gt;
### 4. OpenAPI beschreibt Responses kaum&lt;br /&gt;
&lt;br /&gt;
Viele Definitionen enthalten:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
&amp;quot;responses&amp;quot;: {}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Für einen streng typisierten Client sollte man Response-Schemas daher aus der Implementierung bzw. aus echten Testantworten ableiten.&lt;br /&gt;
&lt;br /&gt;
### 5. Captcha-Abweichung&lt;br /&gt;
&lt;br /&gt;
Bei `/auth/password`, `/auth/register` und `/auth/reset` sollte der Client immer:&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
&amp;quot;captcha-response&amp;quot;: &amp;quot;...&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
mitsenden.&lt;br /&gt;
&lt;br /&gt;
Zumindest beim Password-Login greift die Implementierung direkt auf dieses Feld zu.&lt;br /&gt;
&lt;br /&gt;
### 6. API-Versionierung&lt;br /&gt;
&lt;br /&gt;
Die API verwendet keine Versionsnummer im URL-Pfad wie:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
/api/v1/...&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Die Kompatibilität hängt daher von der eingesetzten HubBackend-Version ab.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 29. Empfehlung für eine eigene Integration&lt;br /&gt;
&lt;br /&gt;
Für einen normalen Web-/Desktop-Client würde ich folgende Reihenfolge verwenden:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
GET /&lt;br /&gt;
   ↓&lt;br /&gt;
GET /languages&lt;br /&gt;
   ↓&lt;br /&gt;
POST /auth/password&lt;br /&gt;
   ↓&lt;br /&gt;
optional POST /auth/mfa&lt;br /&gt;
   ↓&lt;br /&gt;
GET /token&lt;br /&gt;
   ↓&lt;br /&gt;
GET /user/profile&lt;br /&gt;
   ↓&lt;br /&gt;
GET /member/perms&lt;br /&gt;
   ↓&lt;br /&gt;
Features abhängig von Permissions anzeigen&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Danach können beispielsweise:&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
/dlog/*&lt;br /&gt;
/member/*&lt;br /&gt;
/announcements/*&lt;br /&gt;
/applications/*&lt;br /&gt;
/events/*&lt;br /&gt;
/economy/*&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Für einen generischen Client ist es sinnvoll, **nicht** hart anzunehmen, welche Plugins vorhanden sind, sondern die Hub-Konfiguration bzw. verfügbaren Funktionen beim Start festzustellen.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 30. Kurzreferenz der API-Bereiche&lt;br /&gt;
&lt;br /&gt;
```text&lt;br /&gt;
/                         Server/Hub Info&lt;br /&gt;
/status                   Status&lt;br /&gt;
/config                   Administration&lt;br /&gt;
/audit                    Audit Log&lt;br /&gt;
&lt;br /&gt;
/auth/*                   Login / Registration&lt;br /&gt;
/token/*                  Sessions / Application Tokens&lt;br /&gt;
&lt;br /&gt;
/user/*                   Accounts&lt;br /&gt;
/member/*                 Mitglieder / Rollen / Punkte&lt;br /&gt;
/dlog/*                   Driving Logs &amp;amp; Statistiken&lt;br /&gt;
&lt;br /&gt;
/tracksim/*               TrackSim&lt;br /&gt;
/trucky/*                 Trucky&lt;br /&gt;
/custom-tracker/*         Custom Tracker&lt;br /&gt;
/unitracker/*             UniTracker&lt;br /&gt;
&lt;br /&gt;
/announcements/*          Announcements Plugin&lt;br /&gt;
/applications/*           Applications Plugin&lt;br /&gt;
/challenges/*             Challenge Plugin&lt;br /&gt;
/divisions/*              Division Plugin&lt;br /&gt;
/downloads/*              Downloads Plugin&lt;br /&gt;
/economy/*                Economy Plugin&lt;br /&gt;
/events/*                 Event Plugin&lt;br /&gt;
/polls/*                  Poll Plugin&lt;br /&gt;
/tasks/*                  Task Plugin&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Kosmos</name></author>
	</entry>
</feed>