API Dokumentation

Vollständige Referenz aller rl-dev.de API-Endpunkte

Base URL
https://rl-dev.de

Alle Endpunkte sind unter dieser Base URL erreichbar.

Browser Auth API

Registrierung und Login für Browser-Benutzer. Nach dem Login erhältst du einen Token, der für Sync- und Plugin-Endpunkte benötigt wird.

POST /api/browser/register

Neuen Browser-Account registrieren. Gibt Token zurück.

Request Body (JSON):

{
  "username": "meinuser",
  "password": "meinpasswort",
  "email": "user@example.com"
}

Response (201):

{
  "status": "ok",
  "token": "a1b2c3d4e5f6...",
  "user": { "id": 1, "username": "meinuser", "email": "user@example.com" }
}
POST /api/browser/login

Login mit Username & Passwort. Gibt neuen Token zurück.

Request Body (JSON):

{
  "username": "meinuser",
  "password": "meinpasswort"
}

Response (200):

{
  "status": "ok",
  "token": "a1b2c3d4e5f6...",
  "user": { "id": 1, "username": "meinuser", "email": "user@example.com" }
}
GET /api/browser/me 🔐 Auth

Aktuelle User-Daten abrufen. Zeigt auch ob User ein Browser Dev ist.

Authentifizierung: Sende den Token als Header bei allen geschützten Endpunkten: Authorization: Bearer <token> oder X-Browser-Token: <token>

Browser Sync API

Synchronisiere Browser-Daten wie Lesezeichen, Passwörter, Startseiten und Einstellungen. Alle Endpunkte erfordern Authentifizierung.

Unterstützte Datentypen: bookmarks, passwords, homepages, settings

GET /api/browser/sync 🔐 Auth

Alle Sync-Daten abrufen. Gibt ein Objekt mit allen Datentypen zurück.

POST /api/browser/sync 🔐 Auth

Einen Datentyp speichern/aktualisieren.

{
  "type": "bookmarks",
  "data": [
    { "title": "Google", "url": "https://google.com" },
    { "title": "rl-dev.de", "url": "https://rl-dev.de" }
  ]
}
GET /api/browser/sync/<type> 🔐 Auth

Einzelnen Datentyp abrufen. <type> = bookmarks | passwords | homepages | settings

PUT /api/browser/sync/<type> 🔐 Auth

Einzelnen Datentyp speichern. Body: { "data": ... }

Plugin Store API

Plugins durchsuchen, herunterladen und (als Browser Dev) hochladen. Downloads sind öffentlich, Uploads erfordern Dev-Rechte.

GET /api/browser/plugins

Alle aktiven Plugins auflisten. Query-Parameter: ?category=general und ?q= suchbegriff

GET /api/browser/plugins/<slug>

Details eines Plugins abrufen.

GET /api/browser/plugins/<slug>/download

Plugin-Datei herunterladen (ZIP). Öffentlich – kein Token nötig. Download-Counter wird hochgezählt.

POST /api/browser/plugins 🔐 Browser Dev

Neues Plugin hochladen. Nur Browser Devs! Multipart Form-Data:

name:        "Mein Plugin"        (required)
description: "Beschreibung"       (optional)
version:     "1.0.0"              (optional, default: 1.0.0)
category:    "general"            (optional)
file:        <plugin.zip>        (required, .zip/.tar.gz/etc)
icon:        <icon.png>          (optional, Bild-Datei)
PUT /api/browser/plugins/<slug> 🔐 Dev/Author

Plugin bearbeiten. JSON-Felder: name, description, version, category, is_active

DELETE /api/browser/plugins/<slug> 🔐 Dev/Author

Plugin löschen (inkl. Dateien). Nur der Author oder ein Dev.

Projekt-Fortschritt API

Projekt-Fortschritt abrufen und verwalten. Lesen ist öffentlich, Schreiben erfordert Admin-Login.

GET /api/projects

Alle Projekte auflisten (öffentlich)

GET /api/projects/<id>

Einzelnes Projekt abrufen (öffentlich)

POST /api/projects 🔐 Admin

Neues Projekt erstellen

PUT /api/projects/<id> 🔐 Admin

Projekt aktualisieren

DELETE /api/projects/<id> 🔐 Admin

Projekt löschen

Browser Extra APIs

GET /api/browser/sync/last-sync 🔐 Auth

Gibt Timestamps der letzten Aktualisierung pro Datentyp zurück. Nützlich für Delta-Sync – nur synchronisieren wenn sich etwas geändert hat.

{
  "status": "ok",
  "last_sync": {
    "bookmarks": "2026-08-09T06:00:00+02:00",
    "passwords": "2026-08-09T05:30:00+02:00",
    "homepages": null,
    "settings": "2026-08-08T22:15:00+02:00"
  }
}
POST /api/browser/telemetry 🔐 Auth

Browser-Statistiken senden (Tabs, Bookmarks, Plugins, Session-Dauer, etc.).

{
  "client_version": "1.2.0",
  "os_name": "Windows 11",
  "tab_count": 12,
  "bookmark_count": 85,
  "plugin_count": 3,
  "session_duration": 3600,
  "extra": { "custom_field": "value" }
}
GET /api/browser/changelog

Browser-Update-Changelog abrufen. Query: ?type=release|beta|hotfix|dev und ?limit=20

POST /api/browser/feedback Optional Auth

User-Feedback aus dem Browser senden. Token optional – mit Token wird der User zugeordnet.

{
  "type": "bug",
  "subject": "Tabs crash on close",
  "message": "When I close multiple tabs quickly...",
  "client_version": "1.2.0"
}

Typen: general, bug, feature, praise

GET /api/browser/featured-plugins

Editor's Choice / Featured Plugins für Browser-Startseite. Query: ?limit=6

GET /api/browser/user-plugins 🔐 Auth

Vom eingeloggten User hochgeladene Plugins auflisten (inkl. inaktive).

Browser Version / Update API

GET /api/browser/version

Prüft ob ein Update verfügbar ist. Query: ?current=1.1.0&channel=stable

{
  "status": "ok",
  "update_available": true,
  "can_auto_update": true,
  "latest": {
    "version": "1.2.0",
    "channel": "stable",
    "release_notes": "New sync engine, bug fixes",
    "file_size": 52428800,
    "checksum": "a1b2c3...",
    "min_client_version": "1.0.0",
    "download_url": "/api/browser/download/3",
    "created_at": "2026-08-09T12:00:00+02:00"
  }
}
POST /api/browser/update

Client meldet seine Version und erhält Update-Anweisungen.

{
  "current_version": "1.1.0",
  "channel": "stable"
}
{
  "status": "ok",
  "update_available": true,
  "can_auto_update": true,
  "action": "download",
  "latest_version": "1.2.0",
  "download_url": "/api/browser/download/3",
  "checksum": "a1b2c3...",
  "file_size": 52428800,
  "release_notes": "New sync engine",
  "min_client_version": "1.0.0"
}
GET /api/browser/download/latest

Lädt die neueste Version herunter. Query: ?channel=stable|beta|dev

GET /api/browser/download/<version_id>

Lädt eine spezifische Version herunter. Zählt Download-Counter hoch.

GET /api/browser/versions

Alle veröffentlichten Versionen auflisten. Query: ?channel=stable&limit=10

Code-Beispiele

Python – Browser Login & Sync
import requests

BASE = "https://rl-dev.de/api/browser"

# Registrieren
r = requests.post(f"{BASE}/register", json={
    "username": "meinuser",
    "password": "sicherespasswort",
    "email": "user@example.com"
})
token = r.json()["token"]

# Token für alle weiteren Requests
headers = {"Authorization": f"Bearer {token}"}

# Lesezeichen synchronisieren
requests.post(f"{BASE}/sync", json={
    "type": "bookmarks",
    "data": [
        {"title": "Google", "url": "https://google.com"},
        {"title": "rl-dev.de", "url": "https://rl-dev.de"}
    ]
}, headers=headers)

# Lesezeichen abrufen
r = requests.get(f"{BASE}/sync/bookmarks", headers=headers)
print(r.json()["data"])
Python – Plugin herunterladen
import requests

# Plugin-Liste abrufen
r = requests.get("https://rl-dev.de/api/browser/plugins")
plugins = r.json()["plugins"]

# Plugin herunterladen (kein Token nötig)
r = requests.get("https://rl-dev.de/api/browser/plugins/mein-plugin/download")
with open("mein-plugin.zip", "wb") as f:
    f.write(r.content)
Python – Plugin hochladen (als Browser Dev)
import requests

headers = {"Authorization": "Bearer "}

r = requests.post("https://rl-dev.de/api/browser/plugins",
    headers=headers,
    data={
        "name": "Mein Plugin",
        "description": "Ein cooles Plugin",
        "version": "1.0.0",
        "category": "tools"
    },
    files={
        "file": open("plugin.zip", "rb"),
        "icon": open("icon.png", "rb")
    }
)
print(r.json())
JavaScript / Browser
// Login
const r = await fetch("https://rl-dev.de/api/browser/login", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ username: "meinuser", password: "passwort" })
});
const { token } = await r.json();

// Lesezeichen abrufen
const syncR = await fetch("https://rl-dev.de/api/browser/sync/bookmarks", {
    headers: { "Authorization": `Bearer ${token}` }
});
const { data } = await syncR.json();
console.log(data);

JSON Schemas

Plugin Objekt
{
  "id": 1,
  "slug": "mein-plugin",
  "name": "Mein Plugin",
  "description": "Beschreibung",
  "version": "1.0.0",
  "category": "general",
  "author": "meinuser",
  "icon_path": "/static/uploads/browser_plugins/mein-plugin.png",
  "download_count": 42,
  "file_size": 102400,
  "created_at": "2026-08-09T06:00:00+02:00",
  "updated_at": "2026-08-09T06:00:00+02:00"
}
Sync Data (bookmarks Beispiel)
{
  "status": "ok",
  "data": [
    { "title": "Google", "url": "https://google.com" },
    { "title": "rl-dev.de", "url": "https://rl-dev.de" }
  ],
  "updated_at": "2026-08-09T06:00:00+02:00"
}
Projekt Objekt
{
  "id": 1,
  "name": "Projektname",
  "description": "Beschreibung",
  "progress": 75,
  "created_at": "2026-06-16T19:00:00+02:00",
  "updated_at": "2026-06-16T20:30:00+02:00"
}

HTTP Status Codes

200 – Erfolgreich

201 – Erstellt (Register, Plugin Upload)

400 – Ungültige Anfrage (fehlende Felder)

401 – Nicht authentifiziert (Token fehlt/ungültig)

403 – Keine Berechtigung (kein Browser Dev)

404 – Nicht gefunden

409 – Konflikt (Username bereits vergeben)

Wuppertaler Tafel AllOne The Outpace - Band Homepage