Conventions & errors
Base URL and format
Section titled “Base URL and format”All endpoints live under https://app.todomino.eu/api. Requests and
responses are JSON (Content-Type: application/json) unless stated
otherwise. Authenticate with a personal access token.
Identifiers and timestamps
Section titled “Identifiers and timestamps”- IDs are UUIDs, generated by the server.
- Timestamps are ISO-8601 instants in UTC, e.g.
2026-07-18T09:30:00Z. - Due dates are also instants; the web client stores them as midnight
UTC of the chosen day (
2026-08-01T00:00:00Z).
| Field | Values |
|---|---|
Task/subtask status |
PENDING, DONE |
Task priority |
LOW, NORMAL, HIGH, CRITICAL, or null |
Member role |
OWNER, ADMIN, MEMBER |
Optimistic locking
Section titled “Optimistic locking”Tasks carry a version number. Full updates (PUT) must echo the version
you last read; if someone else changed the task in between, the API answers
409 Conflict — re-read the task and reapply your change.
Offline operations
Section titled “Offline operations”Mutating endpoints on tasks, subtasks, and lists accept an optional
X-Op-Id header carrying a client-generated UUID. The same op id is
executed exactly once: replays (e.g. a retry after a lost response) are
acknowledged with the same status without re-executing, so offline clients
can push queued operations safely. Creates sent with an op id must also
carry a client-generated id in the body — the client already knows every
id a replay would need. Deletes are idempotent by nature and need no op id.
Errors
Section titled “Errors”| Status | Meaning |
|---|---|
400 |
Malformed request (missing field, invalid value) |
401 |
Missing or invalid token / not signed in |
403 |
Authenticated, but your role does not allow this action |
404 |
Not found — also returned for workspaces you are not a member of |
409 |
Conflict: duplicate name, version mismatch, or duplicate attachment |
413 |
Workspace storage limit reached |
Error responses are Spring problem details; the HTTP status is the contract, the body text is informational and may change.
