Users
The users API lets you manage the authenticated user’s profile, password, profile image, and identities (email and phone). All endpoints operate on the currently authenticated user via /users/me.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /users/me | Get current user profile |
| PATCH | /users/me | Update current user profile |
| POST | /users/me/change-password | Change password |
| POST | /users/me/profile-image | Upload profile image |
| DELETE | /users/me/profile-image | Remove profile image |
| GET | /users/me/identities | List identities |
| POST | /users/me/identities | Add an identity |
| DELETE | /users/me/identities | Remove an identity |
| POST | /users/me/identities/verify | Request identity verification |
Get Current User
GET /api/v2/users/me
Returns the authenticated user’s profile, including their identities.
Response
{
"id": 7,
"created_at": "2024-01-15T08:30:00Z",
"first_name": "Ola",
"last_name": "Nordmann",
"profile_image_url": "https://cdn.snapbooks.no/profile-images/abc123.jpg",
"last_login": "2026-03-31T14:22:00Z",
"identities": [
{
"type": "email",
"value": "ola@example.com",
"verified": true
},
{
"type": "phone",
"value": "+4791234567",
"verified": false
}
]
}
Update Current User
PATCH /api/v2/users/me
Updates the authenticated user’s first name and/or last name.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| first_name | string | No | User’s first name |
| last_name | string | No | User’s last name |
Example Request
{
"first_name": "Ola",
"last_name": "Nordmann"
}
Response
Returns the updated user object (same shape as GET /users/me).
Change Password
POST /api/v2/users/me/change-password
Changes the authenticated user’s password. Rate limited to 5 requests per hour.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| password | string | Yes | Current password |
| new_password | string | Yes | New password |
Password Requirements
- Minimum 8 characters
- Must contain at least one uppercase letter
- Must contain at least one lowercase letter
- Must contain at least one number
- Must be different from the current password
Example Request
{
"password": "OldPass123",
"new_password": "NewSecure456"
}
Response
{
"message": "Password changed successfully"
}
Error Responses
| Status | Description |
|---|---|
| 400 | Missing current or new password, passwords are identical, or new password does not meet requirements |
| 401 | Current password is incorrect |
| 429 | Rate limit exceeded (5 per hour) |
Upload Profile Image
POST /api/v2/users/me/profile-image
Uploads a new profile image for the authenticated user. The request must use multipart/form-data encoding.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| file | file | Yes | Image file (JPEG, PNG, or WebP) |
Allowed Content Types
image/jpegimage/jpgimage/pngimage/webp
Response
Returns the updated user object with the new profile_image_url.
Error Responses
| Status | Description |
|---|---|
| 400 | Missing file, no file selected, unsupported image format, or invalid image content |
Remove Profile Image
DELETE /api/v2/users/me/profile-image
Removes the authenticated user’s profile image.
Response
Returns the updated user object with profile_image_url set to null.
List Identities
GET /api/v2/users/me/identities
Returns the authenticated user’s identities (email and phone number).
Response
Returns the user object with the identities array populated. See the response example in Get Current User.
Add an Identity
POST /api/v2/users/me/identities
Adds a phone number identity to the authenticated user. Email changes are not supported through this endpoint.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| type | string | Yes | Identity type. Only phone is supported |
| value | string | Yes | The phone number |
Example Request
{
"type": "phone",
"value": "+4791234567"
}
Response
Returns the updated user object with identities.
Error Responses
| Status | Description |
|---|---|
| 400 | Missing required fields, unsupported identity type, or email changes attempted |
Remove an Identity
DELETE /api/v2/users/me/identities
Removes a phone number identity from the authenticated user. Email cannot be removed.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| type | string | Yes | Identity type to remove. Only phone is supported |
Example Request
{
"type": "phone"
}
Response
Returns the updated user object with identities.
Error Responses
| Status | Description |
|---|---|
| 400 | Missing required field, unsupported identity type, or email removal attempted |
Request Identity Verification
POST /api/v2/users/me/identities/verify
Sends a verification email to the authenticated user. Rate limited to 5 requests per hour. Only email verification is currently supported.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| type | string | Yes | Identity type to verify. Only email is supported |
| value | string | Yes | The email address to verify (must match the stored email) |
Example Request
{
"type": "email",
"value": "ola@example.com"
}
Response
{
"message": "Verification email sent"
}
Error Responses
| Status | Description |
|---|---|
| 400 | Missing required fields, unsupported identity type, email mismatch, or email already verified |
| 429 | Rate limit exceeded (5 per hour) |
Attributes
| Attribute | Type | Description |
|---|---|---|
| id | integer | Unique identifier (read-only) |
| created_at | datetime | Account creation timestamp (read-only) |
| first_name | string | User’s first name |
| last_name | string | User’s last name |
| profile_image_url | string | URL to the user’s profile image (read-only) |
| last_login | datetime | Last login timestamp (read-only) |
Identity
| Attribute | Type | Description |
|---|---|---|
| type | string | Identity type: email or phone |
| value | string | The identity value (email address or phone number) |
| verified | boolean | Whether the identity has been verified. Only email verification is supported; phone identities always return false |
Related Resources
- Client Accounts — companies the user has access to
- Invitations — invite users to join client accounts
- Authentication — OAuth2 authentication flow