Concepts
Response envelope
The consistent shape every endpoint returns.
Every backend endpoint returns the same envelope:
{
"success": true,
"data": { },
"message": "optional human-readable message"
}A response interceptor wraps handler return values into this shape
automatically, so new endpoints inherit it without extra code. The frontend
unwraps data in its query hooks. List endpoints page with page, limit,
sortBy, and sortOrder.