API-Referenz
Inhalt
Alle Endpunkte liegen unter /api/v1/. Die OpenAPI-3.0-Spec wird unter /api/v1/openapi.json ausgeliefert, eine interaktive Swagger-UI unter /api/v1/docs. Die vollständige In-App-Referenz lebt unter /docs/api.
Diese Seite ist eine Navigations-Übersicht. Schemata, Response-Codes und Content-Types stehen in der OpenAPI-Spec oder in den In-App-Docs.
Authentifizierung
Zwei Methoden:
- Session-Cookie (
sid) — gesetzt vonPOST /api/v1/auth/loginundPOST /api/v1/auth/register.HttpOnly,SameSite=Strict,Securein Produktion. - API-Token —
Authorization: Bearer <token>. Erstellung unterKonto -> API-Tokens. Siehe 11-konto-und-2fa.md.
Endpunkt-Gruppen
System (ohne Auth, ohne Rate-Limit)
GET /health— Uptime, Version, StatusGET /ready— 200 wenn DB erreichbar, 503 sonst
Shares (anonym oder authentifiziert)
POST /api/v1/upload— Multipart-Upload des verschlüsselten Manifests + Blobs (20/h/IP)GET /api/v1/download/:id/manifest— verschlüsseltes ManifestGET /api/v1/download/:id/blob/:n— einzelner verschlüsselter Blob (1-basiert)GET /api/v1/r/:wordcode— 4-Wort-Code zu Share-ID auflösen
Authentifizierung (nur bei ENABLE_ACCOUNTS=true)
POST /api/v1/auth/register(3 / 10 min / IP)POST /api/v1/auth/login(5 / min / IP, zweistufig mittotpCodebei aktivem 2FA)POST /api/v1/auth/logoutGET /api/v1/auth/me
Account (Auth erforderlich)
GET /api/v1/account/uploads— eigene Shares + QuotaDELETE /api/v1/account/uploads/:idGET / PATCH /api/v1/account/profileGET /api/v1/account/securityPOST /api/v1/account/security/passwordPOST /api/v1/account/security/2fa/setupPOST /api/v1/account/security/2fa/verifyPOST /api/v1/account/security/2fa/disableGET / PATCH /api/v1/account/notificationsGET / POST /api/v1/account/tokensDELETE /api/v1/account/tokens/:idGET /api/v1/account/audit
Admin (Admin-Rolle erforderlich)
GET / PATCH / DELETE /api/v1/admin/users[/:id]GET / DELETE /api/v1/admin/shares[/:id]GET /api/v1/admin/auditGET /api/v1/admin/healthGET / PATCH /api/v1/admin/settings
Beispiel: anonymer Upload
Der Upload-Endpunkt erwartet einen Multipart-Body mit verschlüsseltem Manifest und einem Ciphertext-Blob pro Datei. Verschlüsselung erfolgt client-seitig; der Server speichert opake Bytes.
Eine Referenz-Implementierung liegt in apps/web/src/lib/upload/client.ts. Aus dem Browser empfiehlt sich der Import dieses Moduls, statt Multipart-Formatierung selbst zu schreiben.
Roher curl-Aufruf mit existierendem Ciphertext (fortgeschritten):
curl -X POST https://send.example.com/api/v1/upload \
-F 'meta={"fileCount":1,"totalSizeEncrypted":1234,"expiryHours":24,"downloadLimit":5,"passwordProtected":false,"salt":null,"ivWrap":null,"wrappedKey":null}' \
-F 'manifest-iv=<base64url>' \
-F 'manifest=@manifest.bin' \
-F 'blob-0001-iv=<base64url>' \
-F 'blob-0001=@blob1.bin'
Antwort:
{
"id": "a3f1b8c2d4e56789ab01cd23",
"wordcode": "tasche-lampe-schnee-ofen",
"expiresAt": "2026-05-03T18:00:00.000Z"
}
Webhooks
Wenn WEBHOOK_URL gesetzt ist, postet der Server JSON für upload.created und download.completed. Mit WEBHOOK_SECRET enthält jeder Request den Header X-Webhook-Signature: sha256=<hex>. Zustellung ist Best-Effort mit einem Retry. Vollständiges Schema in docs/CONFIG.md.