Member statuses
Custom status tags (emoji, Lucide, or custom icon) you assign to members, the active front, or the whole account. Definitions live under /api/v1/member-statuses; resolved tags visible on a member profile are at /api/v1/members/{memberId}/statuses.
Read (GET) needs memberStatuses: read. Write (POST, PATCH, PUT, DELETE) needs memberStatuses: read_write. See Authentication and Scopes.
Each definition is linked to at least one privacy bucket so friends only see statuses you allow. Resolved lists respect the active system scope (side/sub system) where applicable.
Concepts
- Definition: reusable status template (name, icon, colour, privacy buckets).
- Assignment: attaches a definition to member, active_front, or account.
- Resolved status: what the UI shows after merging assignments; at most one tag per definition on a member (member target wins over active front over account).
Definition object
| Field | Type | Notes |
|---|---|---|
id | string (UUID) | Definition id |
name | string | Max 48 characters |
description | string | null | Max 280 characters |
icon / iconType | string | iconType: emoji, lucide, or custom |
colour | string | null | Hex colour, e.g. #6B7280 |
position | number | Sort order in the definitions list |
privacyBucketIds | string[] | At least one bucket on create |
deletedAt / purgeAt | number | null | Set when soft-deleted to trash |
Resolved status object
| Field | Type | Notes |
|---|---|---|
assignmentId | string (UUID) | Use with unassign |
definitionId | string (UUID) | Source definition |
targetKind | string | member, active_front, or account |
name, icon, iconType, colour | , | Copied from definition at resolve time |
List definitions
GET/api/v1/member-statuses
Returns all active (non-trashed) definitions for the account, ordered by position.
Response
200: JSON array of definition objects.
[{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"userId": "a0a0a0a0-a0a0-a0a0-a0a0-a0a0a0a0a0a0",
"name": "Resting",
"description": "Low energy",
"icon": "π",
"iconType": "emoji",
"colour": "#6B7280",
"position": 0,
"deletedAt": null,
"purgeAt": null,
"createdAt": 1714233600000,
"updatedAt": 1714237200000,
"privacyBucketIds": ["b1c2d3e4-f5a6-7890-abcd-ef1234567890"]
}]curl -sS \
-H "Authorization: Bearer YOUR_TOKEN" \
"https://api.floralitys.com/api/v1/member-statuses"const res = await fetch("https://api.floralitys.com/api/v1/member-statuses", {
headers: { Authorization: "Bearer YOUR_TOKEN" },
});
if (!res.ok) throw new Error(await res.text());
const definitions = await res.json();Create definition
POST/api/v1/member-statuses
Request body
| Field | Required | Notes |
|---|---|---|
name | yes | 1β48 characters |
icon, iconType | yes | Validated per icon type |
privacyBucketIds | yes | Non-empty UUID array |
description, colour | no | Optional |
Response
201: created definition. 400: validation error.
curl -sS -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Resting",
"description": "Low energy",
"icon": "π",
"iconType": "emoji",
"colour": "#6B7280",
"privacyBucketIds": ["BUCKET_UUID"]
}' \
"https://api.floralitys.com/api/v1/member-statuses"Get definition
GET/api/v1/member-statuses/{definitionId}
Response
200: single definition. 404: not found or trashed.
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"userId": "a0a0a0a0-a0a0-a0a0-a0a0-a0a0a0a0a0a0",
"name": "Resting",
"description": "Low energy",
"icon": "π",
"iconType": "emoji",
"colour": "#6B7280",
"position": 0,
"deletedAt": null,
"purgeAt": null,
"createdAt": 1714233600000,
"updatedAt": 1714237200000,
"privacyBucketIds": ["b1c2d3e4-f5a6-7890-abcd-ef1234567890"]
}{
"code": "NOT_FOUND",
"message": "Status definition not found."
}List assignment holders
GET/api/v1/member-statuses/{definitionId}?holders=1
Returns who currently has this definition assigned (members, active front, or account-level rows). Same path as get definition; query holders=1 switches the response shape.
Response
200: array of holder objects.
[
{
"assignmentId": "c2d3e4f5-a6b7-8901-cdef-123456789abc",
"targetKind": "member",
"memberId": "b1c2d3e4-f5a6-7890-abcd-ef1234567890",
"memberName": "River",
"memberDisplayName": "River"
}
]Update definition
PATCH/api/v1/member-statuses/{definitionId}
Partial update. Body fields match create (except id comes from the path). Include privacyBucketIds only when replacing the full bucket set.
Response
200: updated definition. 404 / 400 on failure.
Delete definition (trash)
DELETE/api/v1/member-statuses/{definitionId}
Soft-deletes the definition into trash (memberStatusDefinition). Assignments are cleared as part of delete.
Response
204: no body. Restore with restore or purge from trash via the dashboard.
// 204 No Content: empty response bodyReorder definitions
POST/api/v1/member-statuses/reorder
Request body
{ "orderedIds": ["uuid-1", "uuid-2", "..."] }Every id must be an active definition owned by the account.
Response
204: no body.
Restore definition from trash
POST/api/v1/member-statuses/{definitionId}/restore
Restores a trashed definition. Does not restore old assignments.
Response
204: no body. 404 if not in trash.
Set privacy buckets
PUT/api/v1/member-statuses/{definitionId}/privacy-buckets
Request body
{ "bucketIds": ["uuid-1", "uuid-2"] }Replaces the definition's privacy bucket links (minimum one id).
Response
204: no body.
Account-level resolved statuses
GET/api/v1/member-statuses/assignments/account
Statuses assigned with targetKind: account (shown account-wide).
Response
200: array of resolved status objects.
[
{
"assignmentId": "c2d3e4f5-a6b7-8901-cdef-123456789abc",
"definitionId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Resting",
"description": "Low energy",
"icon": "π",
"iconType": "emoji",
"colour": "#6B7280",
"targetKind": "member"
}
]Assign status
POST/api/v1/member-statuses/assignments
Request body
| Field | Required | Notes |
|---|---|---|
definitionId | yes | UUID |
targetKind | yes | member, active_front, or account |
memberId | when targetKind is member | Member UUID |
Response
204: no body. 400 if definition inactive or member invalid.
curl -sS -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"definitionId": "DEFINITION_UUID",
"targetKind": "member",
"memberId": "MEMBER_UUID"
}' \
"https://api.floralitys.com/api/v1/member-statuses/assignments"Assign to account
POST/api/v1/member-statuses/assignments/account
Request body
{ "definitionId": "DEFINITION_UUID" }Response
204: no body.
Assign to active front
POST/api/v1/member-statuses/assignments/active-front
Request body
{ "definitionId": "DEFINITION_UUID" }Applies to whoever is currently on front.
Response
204: no body.
Assign to multiple members
POST/api/v1/member-statuses/assignments/members
Request body
{
"definitionId": "DEFINITION_UUID",
"memberIds": ["MEMBER_UUID_1", "MEMBER_UUID_2"]
}Between 1 and 32 member ids per request.
Response
204: no body.
Unassign
POST/api/v1/member-statuses/assignments/unassign
Request body
{ "assignmentId": "ASSIGNMENT_UUID" }Use assignmentId from a resolved status or holder list, not the definition id.
Response
204: no body.
Resolved statuses for a member
GET/api/v1/members/{memberId}/statuses
Tags visible on that member after resolution (member + active front + account assignments). Respects active system scope.
Response
200: array of resolved status objects.
[
{
"assignmentId": "c2d3e4f5-a6b7-8901-cdef-123456789abc",
"definitionId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Resting",
"description": "Low energy",
"icon": "π",
"iconType": "emoji",
"colour": "#6B7280",
"targetKind": "member"
}
]curl -sS \
-H "Authorization: Bearer YOUR_TOKEN" \
"https://api.floralitys.com/api/v1/members/MEMBER_UUID/statuses"Clear all statuses on a member
DELETE/api/v1/members/{memberId}/statuses
Removes every assignment targeting that member (does not touch account or front assignments).
Response
204: no body.
Friend-visible statuses
Read a friend's statuses through the friends scope (friends: read), not memberStatuses. Privacy buckets on each definition control what friends see.
| Method | Path | Description |
|---|---|---|
GET | /api/v1/friends/{friendUserId}/member-statuses | Account-level statuses on a friend's profile |
GET | /api/v1/friends/{friendUserId}/member-statuses/members/{memberId} | Statuses on one of the friend's members |
friendUserId is the friend's user UUID. Response shape matches ResolvedMemberStatus above.
Errors
Failures return { code, message }. Common codes: UNAUTHORIZED (401), FORBIDDEN (403 scope), NOT_FOUND (404), BAD_REQUEST (400). See Errors.
{
"code": "BAD_REQUEST",
"message": "Invalid request body."
}