Florality
FeaturesPricingSecurityFAQAbout
Sign upSign in
Public REST APIv1

REST reference & guides

Public REST APIv1

REST reference & guides

Get started

  • Overview
  • Authentication
  • Scopes
  • Errors

API reference

  • Members
  • Groups
    • GETList groups
    • POSTCreate group
    • GETGet group
    • PATCHUpdate group
    • DELETEDelete group
    • GETList folder nodes
    • GETGroup tree
    • GETGet folder node
    • GETGroup path
    • POSTCreate folder node
    • PATCHUpdate folder node
    • DELETEDelete folder node
    • PATCHFolder icon
  • Entries
  • Front
  • Appearance
  • Custom fields
  • Trash
  • Search
  • Member statuses
  • Systems
  • Messaging
  • Privacy buckets
  • Terminology
  • Friends
  • Subscriptions
  • Billing
  • Import
  • Social
  • Guestbook & poll
  • Group layout
  • Activity
  1. Documentation
  2. Groups
API keys
Florality

Organise your system. One front at a time.

Get startedSign in

Product

  • Features
  • Pricing
  • Public REST API
  • Security

Company

  • About
  • Our team
  • Changelog
  • Contact

Resources

  • FAQ
  • Trust & Safety
  • Privacy Policy
  • Terms of Service
  • Refunds and cancellation

© 2026 Florality. All rights reserved.

Privacy·Terms·

Groups & folders

Two surfaces under /api/v1/groups: member collections (flat groups with member counts) and folder nodes (tree hierarchy under /api/v1/groups and /api/v1/groups/tree). Every route here is authorized with the same effective API key scope: the higher of the stored groups and directories values (see Scopes). Read operations require effective read; write operations require effective read_write. Read operations require effective read; Write operations require effective read_write.

Dashboard: Use Settings → API keys → Member groups to attach privacy buckets to each API group (friend visibility uses bucket overlap on that group). Group CRUD over HTTP is documented in the sections below; there is no separate folder-tree UI for groups.


List groups

GET/api/v1/groups

Returns all active groups for the account, sorted by name, with member counts.

Response

200

JSON
[{
  "_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "name": "string",
  "description": "string",
  "icon": "string",
  "colorPreset": "string",
  "memberCount": 3,
  "createdAt": 1714233600000,
  "updatedAt": 1714237200000
}]
Shell
curl -sS \
  -H "Authorization: Bearer YOUR_TOKEN" \
  "https://api.floralitys.com/api/v1/groups"

Status codes

  • 200: JSON array of group objects
  • 401 / 403: : JSON error

Group object fields

FieldTypeNotes
_idstringGroup id (UUID)
namestringDisplay name
descriptionstring?Optional
icon / colorPresetstring?Optional presentation
memberCountnumberActive members in this group
createdAt / updatedAtnumberUnix ms

Create group

POST/api/v1/groups

JSON body: name (string, required); optional description, icon, colorPreset.

Response

201

Created group object (same fields as list rows).

JSON
{
  "_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "name": "string",
  "description": "string",
  "icon": "string",
  "colorPreset": "string",
  "memberCount": 3,
  "createdAt": 1714233600000,
  "updatedAt": 1714237200000
}
Shell
curl -sS \
  -X POST \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Team A","description":"optional"}' \
  "https://api.floralitys.com/api/v1/groups"

400

JSON
{
  "code": "BAD_REQUEST",
  "message": "Invalid request body."
}

Status codes

  • 201: Created group object
  • 400: Validation error

Get group

GET/api/v1/groups/{groupId}

Response

200

JSON
{
  "_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "name": "string",
  "description": "string",
  "icon": "string",
  "colorPreset": "string",
  "memberCount": 3,
  "createdAt": 1714233600000,
  "updatedAt": 1714237200000
}

404

JSON
{
  "code": "NOT_FOUND",
  "message": "Group not found."
}

Status codes

  • 200: Group object
  • 404: Group not found

Update group

PATCH/api/v1/groups/{groupId}

JSON body (at least one field): optional name; optional description, icon, colorPreset (string or null to clear).

Response

200

JSON
{
  "_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "name": "string",
  "description": "string",
  "icon": "string",
  "colorPreset": "string",
  "memberCount": 3,
  "createdAt": 1714233600000,
  "updatedAt": 1714237200000
}
Shell
curl -sS \
  -X PATCH \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Team A renamed"}' \
  "https://api.floralitys.com/api/v1/groups/GROUP_ID"

404

JSON
{
  "code": "NOT_FOUND",
  "message": "Group not found."
}

Status codes

  • 200: Updated group
  • 404: Group not found

Delete group

DELETE/api/v1/groups/{groupId}

Soft-deletes the group and its group-member links for the account.

Response

204

Plain text
// 204 No Content: empty response body
Shell
curl -sS \
  -X DELETE \
  -H "Authorization: Bearer YOUR_TOKEN" \
  "https://api.floralitys.com/api/v1/groups/GROUP_ID"

404

JSON
{
  "code": "NOT_FOUND",
  "message": "Group not found."
}

Status codes

  • 204: Success, no body
  • 404: Group not found

List folder nodes (flat)

GET/api/v1/groups

All active (non-trashed) folder nodes for the account as a flat JSON array (no sideSystemId / subSystemId query).

Response

200

JSON
[{
  "_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "userId": "a0a0a0a0-a0a0-a0a0-a0a0-a0a0a0a0a0a0",
  "name": "string",
  "parentId": "b1c2d3e4-f5a6-7890-abcd-ef1234567890",
  "icon": "home",
  "iconColorPreset": "blue",
  "createdAt": 1714233600000,
  "updatedAt": 1714237200000,
  "version": 2,
  "deletedAt": null,
  "purgeAt": null,
  "originalParentId": null
}]
Shell
curl -sS \
  -H "Authorization: Bearer YOUR_TOKEN" \
  "https://api.floralitys.com/api/v1/groups"

Folder node object fields

FieldTypeNotes
_idstringFolder node id (UUID)
userIdstringInternal account id
namestringFolder name (root may be stored as internal name; tree endpoint shows "Root")
parentIdstring?Parent folder id; omitted for canonical root
icon / iconColorPresetstring?Optional
versionnumberOptimistic concurrency (renames)
createdAt / updatedAtnumber?Unix ms

Group tree

GET/api/v1/groups/tree

Nested tree from the canonical root: nodes are DirectoryTreeNode (id, name, optional icon / iconColorPreset, children, memberCount).

Response

200

JSON
{
  "id": "root-uuid",
  "name": "Root",
  "memberCount": 2,
  "children": [
    {
      "id": "child-uuid",
      "name": "Folder",
      "icon": "folder",
      "iconColorPreset": "violet",
      "memberCount": 0,
      "children": []
    }
  ]
}

404

When the canonical root row is missing.

JSON
{
  "code": "NOT_FOUND",
  "message": "Root group not found."
}
Shell
curl -sS \
  -H "Authorization: Bearer YOUR_TOKEN" \
  "https://api.floralitys.com/api/v1/groups/tree"

Get folder node

GET/api/v1/groups/{groupId}

Response

200

JSON
{
  "_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "userId": "a0a0a0a0-a0a0-a0a0-a0a0-a0a0a0a0a0a0",
  "name": "string",
  "parentId": "b1c2d3e4-f5a6-7890-abcd-ef1234567890",
  "icon": "home",
  "iconColorPreset": "blue",
  "createdAt": 1714233600000,
  "updatedAt": 1714237200000,
  "version": 2,
  "deletedAt": null,
  "purgeAt": null,
  "originalParentId": null
}

404

JSON
{
  "code": "NOT_FOUND",
  "message": "Group not found."
}

Status codes

  • 200: Folder node object
  • 404: Not found or not accessible

Group path (breadcrumb)

GET/api/v1/groups/{groupId}/path

JSON array of { id, name } from root to the folder (root segment uses name Root).

Response

200

JSON
[
  { "id": "root-uuid", "name": "Root" },
  { "id": "folder-uuid", "name": "Work" }
]

404

JSON
{
  "code": "NOT_FOUND",
  "message": "Group not found."
}

Create folder node

POST/api/v1/groups

JSON body: name (string, required); optional parentId (UUID of parent folder; omit to create under the account root); optional clientMutationId (UUID).

Response 201: { group, receipt }. group is the same shape as GET. receipt includes entityId, entityVersion, operation, serverTimestamp, replayKey, and optional clientMutationId.

Response

201

JSON
{
  "group": {
  "_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "userId": "a0a0a0a0-a0a0-a0a0-a0a0-a0a0a0a0a0a0",
  "name": "string",
  "parentId": "b1c2d3e4-f5a6-7890-abcd-ef1234567890",
  "icon": "home",
  "iconColorPreset": "blue",
  "createdAt": 1714233600000,
  "updatedAt": 1714237200000,
  "version": 2,
  "deletedAt": null,
  "purgeAt": null,
  "originalParentId": null
},
  "receipt": {
    "entityId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "entityVersion": 0,
    "operation": "create",
    "clientMutationId": "optional-uuid-from-request",
    "serverTimestamp": 1714233600000,
    "replayKey": "directory:f47ac10b-58cc-4372-a567-0e02b2c3d479:0:create"
  }
}

400

JSON
{
  "code": "BAD_REQUEST",
  "message": "Invalid request body."
}

500

Rare: directory created but reload failed.

JSON
{
  "code": "INTERNAL_ERROR",
  "message": "Group was created but could not be loaded."
}
JavaScript
const res = await fetch("https://api.floralitys.com/api/v1/groups", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_TOKEN",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ name: "New folder" }),
});
if (!res.ok) throw new Error(await res.text());
const { group, receipt } = await res.json();

Update folder node (rename / move)

PATCH/api/v1/groups/{groupId}

JSON body: at least one of name (rename) or parentId (UUID or null to move under root). Optional expectedVersion (non-negative int) applies to the rename step when name is sent; if the version does not match, the server returns 409.

Response

200

JSON
{
  "_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "userId": "a0a0a0a0-a0a0-a0a0-a0a0-a0a0a0a0a0a0",
  "name": "string",
  "parentId": "b1c2d3e4-f5a6-7890-abcd-ef1234567890",
  "icon": "home",
  "iconColorPreset": "blue",
  "createdAt": 1714233600000,
  "updatedAt": 1714237200000,
  "version": 2,
  "deletedAt": null,
  "purgeAt": null,
  "originalParentId": null
}

400 / 404

JSON
{
  "code": "BAD_REQUEST",
  "message": "Invalid request body."
}
JSON
{
  "code": "NOT_FOUND",
  "message": "Group not found."
}

409

JSON
{
  "code": "CONFLICT",
  "message": "Version conflict on rename."
}

Status codes

  • 200: Updated folder node object
  • 400: Business rule (e.g. duplicate name, cannot move root)
  • 404: Folder node or parent not found
  • 409: Version conflict on rename

Delete folder node

DELETE/api/v1/groups/{groupId}

Soft-deletes the folder (and descendants); members in those folders are moved to the account root. Cannot delete the root group.

Response

204

Plain text
// 204 No Content: empty response body

400 / 404

JSON
{
  "code": "BAD_REQUEST",
  "message": "Invalid request body."
}

Status codes

  • 204: Success, no body
  • 400: e.g. cannot delete root, already in trash
  • 404: Not found

Update folder icon

PATCH/api/v1/groups/{groupId}/icon

JSON body: at least one of icon or iconColorPreset (string or null). Plan limits may return 403 for premium icons or colours.

Response

200

JSON
{
  "_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "userId": "a0a0a0a0-a0a0-a0a0-a0a0-a0a0a0a0a0a0",
  "name": "string",
  "parentId": "b1c2d3e4-f5a6-7890-abcd-ef1234567890",
  "icon": "home",
  "iconColorPreset": "blue",
  "createdAt": 1714233600000,
  "updatedAt": 1714237200000,
  "version": 2,
  "deletedAt": null,
  "purgeAt": null,
  "originalParentId": null
}

403

JSON
{
  "code": "FORBIDDEN",
  "message": "Missing API key scope: groups & folders (effective of groups and directories) requires read_write"
}

404

JSON
{
  "code": "NOT_FOUND",
  "message": "Group not found."
}

Status codes

  • 200: Updated folder node object
  • 403: Pro-only icon or colour
  • 404: Folder node not found