Download OpenAPI specification:
User identity, authentication, and profile management for the Verita platform. Handles registration, login, profile updates, account preferences, and admin user management.
| username required | string [ 3 .. 20 ] characters ^[a-zA-Z0-9_]+$ |
| email required | string <email> |
| password required | string >= 8 characters ^(?=.*[a-zA-Z])(?=.*\d).+$ |
{- "username": "string",
- "email": "user@example.com",
- "password": "stringst"
}{- "accessToken": "string",
- "refreshToken": "string",
- "tokenType": "Bearer",
- "expiresIn": 3600,
- "user": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
}| email required | string <email> |
| password required | string |
{- "email": "user@example.com",
- "password": "string"
}{- "accessToken": "string",
- "refreshToken": "string",
- "tokenType": "Bearer",
- "expiresIn": 3600,
- "user": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
}| refreshToken | string |
{- "refreshToken": "string"
}{- "accessToken": "string",
- "refreshToken": "string",
- "tokenType": "Bearer",
- "expiresIn": 3600,
- "user": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
}Sends a 6-digit reset code to the address if it belongs to a registered account. Always returns 204 regardless of whether the email exists, to avoid account enumeration.
| email required | string <email> |
{- "email": "user@example.com"
}{- "timestamp": "2019-08-24T14:15:22Z",
- "status": 0,
- "error": "string",
- "message": "string"
}Exchanges the email + 6-digit code from the reset email for a short-lived, single-use reset token, which is then passed to /reset-password.
| email required | string <email> |
| code required | string^[0-9]{6}$ The 6-digit code from the reset email. |
{- "email": "user@example.com",
- "code": "string"
}{- "resetToken": "string"
}| token required | string The reset token returned by /verify-reset-code. |
| newPassword required | string >= 8 characters ^(?=.*[a-zA-Z])(?=.*\d).+$ |
{- "token": "string",
- "newPassword": "stringst"
}{- "timestamp": "2019-08-24T14:15:22Z",
- "status": 0,
- "error": "string",
- "message": "string"
}Internal endpoint called by content-service to enforce the bookmark/like privacy toggles when serving another user's profile tabs. Gated by the shared X-Internal-Service-Token (ADR-0007), not a user JWT.
| userId required | string <uuid> |
{- "digestFrequency": "DAILY",
- "showBookmarks": true,
- "showLikes": true
}Internal endpoint called by content-service's scheduled digest job. Returns users whose digest preference matches the requested frequency. Gated by X-Internal-Service-Token (ADR-0007), not a user JWT.
| frequency required | string (DigestFrequency) Enum: "DAILY" "WEEKLY" "OFF" |
| page | integer >= 0 Default: 0 |
| size | integer [ 1 .. 500 ] Default: 100 |
{- "content": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
], - "page": 0,
- "size": 0,
- "totalPages": 0,
- "totalElements": 0,
- "hasNext": true
}Internal endpoint called by content-service to keep an author's profile aggregate counts (postCount, likeReceivedCount) in sync as posts are published/unpublished and likes are added/removed. Gated by the shared X-Internal-Service-Token (ADR-0007), not a user JWT. Counts are clamped at zero; unknown user IDs are a no-op. TODO(#178): followerCount/followingCount deltas are intentionally not handled yet — the follow graph aggregate is not maintained (those two counts stay hidden in the UI).
| userId required | string <uuid> |
| postCountDelta | integer Default: 0 |
| likeReceivedCountDelta | integer Default: 0 |
{- "postCountDelta": 0,
- "likeReceivedCountDelta": 0
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}| displayName | string |
| bio | string or null <= 250 characters |
| website | string or null <uri> |
| organisation | string or null |
| expertiseAreas | Array of strings or null |
{- "displayName": "string",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}| avatar required | string <binary> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}| digestFrequency required | string (DigestFrequency) Enum: "DAILY" "WEEKLY" "OFF" |
| showBookmarks required | boolean Whether other users can see this user's bookmarks. |
| showLikes required | boolean Whether other users can see this user's liked posts. |
{- "digestFrequency": "DAILY",
- "showBookmarks": true,
- "showLikes": true
}{- "digestFrequency": "DAILY",
- "showBookmarks": true,
- "showLikes": true
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}| q | string Filter by username or display name (case-insensitive). |
| page | integer >= 0 Default: 0 |
| size | integer [ 1 .. 100 ] Default: 20 |
{- "content": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "page": 0,
- "size": 0,
- "totalPages": 0,
- "totalElements": 0,
- "hasNext": true
}| userId required | string <uuid> |
| role required | string (UserRole) Enum: "USER" "VERIFIED" "ADMIN" |
{- "role": "USER"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}| userId required | string <uuid> |
| banned required | boolean |
{- "banned": true
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "displayName": "string",
- "email": "user@example.com",
- "bio": "string",
- "organisation": "string",
- "expertiseAreas": [
- "string"
], - "role": "USER",
- "isBanned": true,
- "postCount": 0,
- "followerCount": 0,
- "followingCount": 0,
- "likeReceivedCount": 0,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}