You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
See the root docker-compose.casaos.yml for CasaOS deployment.
API Endpoints
Authentication
Method
Route
Description
POST
/auth/register
Register new user
POST
/auth/login
Login
POST
/auth/refresh
Refresh JWT token
POST
/auth/logout
Revoke refresh token
Characters
Method
Route
Description
GET
/characters
List user's characters
GET
/characters/{id}
Get character by ID
POST
/characters
Create a character
PUT
/characters/{id}
Update a character
DELETE
/characters/{id}
Delete a character
Warbands
Method
Route
Description
GET
/warbands
List user's warbands
GET
/warbands/{id}
Get warband by ID
POST
/warbands
Create a warband
PUT
/warbands/{id}
Update a warband
DELETE
/warbands/{id}
Delete a warband
PUT
/warbands/reorder
Reorder warbands
Content
Method
Route
Description
GET
/contents
List content (optional ?expansion=)
GET
/contents/{id}
Get content by ID
POST
/contents
Create a content entry
PUT
/contents/{id}
Update a content entry
DELETE
/contents/{id}
Delete a content entry
Trackings
Method
Route
Description
GET
/trackings
List trackings (filters: characterId, status, frequency, expansion, motiveId, contentId)
GET
/trackings/{id}
Get tracking by ID
POST
/trackings
Create a tracking entry
PUT
/trackings/{id}
Update a tracking entry
DELETE
/trackings/{id}
Delete a tracking entry
Motives
Method
Route
Description
GET
/motives
List user's motives
GET
/motives/{id}
Get motive by ID
POST
/motives
Create a motive
PUT
/motives/{id}
Update a motive
DELETE
/motives/{id}
Delete a motive
All Character, Content, Tracking, Warband, and Motive list/detail/write routes derive ownership
from the authenticated JWT. Detail, update, and delete requests for another user's ID return the
same 404 as a missing ID. Character create/update also returns 404 for a supplied missing or
foreign warbandId. Content create/update validates the complete distinct motiveIds list before
writing and returns 404 if any ID is missing or foreign; mixed-owner lists are never partially
attached. Tracking creation applies the same non-enumerating 404 behavior to foreign or missing
character/content IDs.
Dashboard
Method
Route
Description
GET
/dashboard/weekly
Weekly tracking summary grouped by status
GET
/dashboard/quick-status
Lightweight owner-scoped counts for Household
Normal JWT callers receive their own status. Household callers use a separate opaque integration
access token and must have the dashboard.read scope; the connection's persisted user identity is
the only owner used by the query.
Household connection protocol v1
Method
Route
Authentication
Description
POST
/api/integrations/household/v1/authorize
Normal WarcraftArchive JWT
Approve or deny consent and return an allowlisted redirect
POST
/api/integrations/household/v1/token
PKCE code or rotating refresh token
Issue integration-only access/refresh tokens
POST
/api/integrations/household/v1/revoke
Token in body
Idempotently revoke only the identified connection
Integration access token with tracking.status.write
Update only the status of an owned tracking
The browser entry point is
/#/integrations/household/authorize?client_id=household&redirect_uri=...&state=...&code_challenge=...&code_challenge_method=S256&scope=profile.read%20dashboard.read.
It preserves the complete request through normal login, asks for consent, and receives only a
one-time authorization-code redirect. Access and refresh tokens are returned only by the backend
token exchange. Supported scopes are profile.read, dashboard.read, and tracking.status.write.
The tracking status PATCH derives ownership only from the Household connection and returns 404
unless both the tracking's character and content belong to that user. Its response includes tracking,
character, and content IDs; labels/details; status and difficulty IDs/labels; and the frequency period.
Allowed status transitions are:
NotStarted -> Pending
Pending -> NotStarted or InProgress
InProgress -> Pending or Finished
Finished -> NotStarted, InProgress, LastDay, or LastWeek
LastDay -> NotStarted or Finished
LastWeek -> NotStarted or Finished
Repeating the current status is idempotent.
LastDay is valid only for Daily trackings and LastWeek only for Weekly trackings.
Authorization codes expire after five minutes, are stored only as SHA-256 hashes, require PKCE
S256, and are single-use. Access tokens expire after 15 minutes. Refresh tokens expire after 30
days, rotate on every use, and reuse revokes only that connection's token family. All integration
credentials are persisted only as hashes. Redirect URIs use exact ordinal matching: no wildcard
scheme, host, port, path, or prefix matching.