<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Kosmos MediaWiki  - Letzte Änderungen [de]</title>
		<link>https://wiki.kosmos.ac/index.php?title=Spezial:Letzte_%C3%84nderungen</link>
		<description>Verfolge mit diesem Feed die letzten Änderungen in Kosmos MediaWiki.</description>
		<language>de</language>
		<generator>MediaWiki 1.45.3</generator>
		<lastBuildDate>Sun, 30 Aug 2026 14:03:31 GMT</lastBuildDate>
		<item>
			<title>DriversHub</title>
			<link>https://wiki.kosmos.ac/index.php?title=DriversHub&amp;diff=3&amp;oldid=2</link>
			<guid isPermaLink="false">https://wiki.kosmos.ac/index.php?title=DriversHub&amp;diff=3&amp;oldid=2</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.kosmos.ac/index.php?title=DriversHub&amp;amp;diff=3&amp;amp;oldid=2&quot;&gt;Änderungen zeigen&lt;/a&gt;</description>
			<pubDate>Tue, 18 Aug 2026 21:52:57 GMT</pubDate>
			<dc:creator>Kosmos</dc:creator>
			<comments>https://wiki.kosmos.ac/index.php?title=Diskussion:DriversHub</comments>
		</item>
		<item>
			<title>DriversHub</title>
			<link>https://wiki.kosmos.ac/index.php?title=DriversHub&amp;diff=2&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.kosmos.ac/index.php?title=DriversHub&amp;diff=2&amp;oldid=0</guid>
			<description>&lt;p&gt;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;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&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 &amp;#039;{&amp;quot;name&amp;quot;:&amp;quot;John Doe&amp;quot;}&amp;#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 &amp;#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;
  }&amp;#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 &amp;#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;
  }&amp;#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;</description>
			<pubDate>Tue, 18 Aug 2026 21:52:00 GMT</pubDate>
			<dc:creator>Kosmos</dc:creator>
			<comments>https://wiki.kosmos.ac/index.php?title=Diskussion:DriversHub</comments>
		</item>
</channel></rss>