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
  • Entries
  • Front
  • Appearance
  • Custom fields
  • Trash
  • Search
  • Member statuses
  • Systems
  • Messaging
  • Privacy buckets
  • Terminology
  • Friends
  • Subscriptions
  • Billing
  • Import
  • Social
    • GETGet section
    • POSTLinks
    • POSTWidgets
    • POSTReorder
    • GETFriend section
  • Guestbook & poll
  • Group layout
  • Activity
  1. Documentation
  2. Social
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·

Social profile

Manage your profile social section: outbound links, layout widgets, section theme, and display order. Read a friend's filtered section when you share an accepted friendship.

Base path: /api/v1/social (your section), /api/v1/friends/{friendUserId}/social (friend view). Scope: social: read for GET routes, read_write for mutations. See Authentication and Scopes.

Guestbook and poll widget interactions use separate scopes under /api/v1/social/widgets/{widgetId}/guestbook and .../poll: see Guestbook & poll.

Spotify connection, now-playing, and playlists are not available on public REST. Gallery image upload for custom_badge widgets is not available on REST: use hosted gallery URLs in widget config.


Concepts

  • Social section: links, widgets, musicConnections, optional theme, and updatedAt for the account owner.
  • Visibility: each link and widget: public, logged_in, friends_only, mutuals_only, private. Friend reads apply filterSocialSectionForViewer server-side.
  • Upsert: POST creates; PATCH .../{id} updates by path id. Optional id in body supports create-with-id.
  • Widget type: top-level type must equal config.kind.
  • Clerk OAuth links: POST /sync-oauth inserts/updates verified Clerk identities (Discord, TikTok, YouTube, Twitch, GitHub). New rows default to visibility: private until you set visibility via link PATCH.
  • Spotify platform: manual platform: spotify links are rejected; connect via Settings → Connections, not REST.

Endpoint index

MethodPathScope
GET/api/v1/socialread
PATCH/api/v1/socialread_write: theme only
POST/api/v1/social/linksread_write
PATCH / DELETE/api/v1/social/links/{linkId}read_write
POST/api/v1/social/widgetsread_write
PATCH / DELETE/api/v1/social/widgets/{widgetId}read_write
POST/api/v1/social/reorderread_write
POST/api/v1/social/sync-oauthread_write
GET/api/v1/friends/{friendUserId}/socialread

Get my social section

GET/api/v1/social

200: 200: full owner section (all visibilities). No query parameters.

Shell
curl -sS \
  -H "Authorization: Bearer YOUR_TOKEN" \
  "https://api.floralitys.com/api/v1/social"
JSON
{
  "userId": "a0a0a0a0-a0a0-a0a0-a0a0-a0a0a0a0a0a0",
  "links": [
    {
      "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
      "platform": "discord",
      "displayName": "River",
      "handle": "river_pl",
      "url": "https://discord.com/users/…",
      "description": "Connected via Clerk",
      "badge": "main",
      "accentColor": null,
      "avatarUrl": "https://img.clerk.com/…",
      "visibility": "friends_only",
      "featured": false,
      "sortOrder": 0,
      "createdAt": 1714233600000,
      "updatedAt": 1714237200000
    }
  ],
  "widgets": [
    {
      "id": "b47ac10b-58cc-4372-a567-0e02b2c3d480",
      "type": "status",
      "title": "Now",
      "config": { "kind": "status", "statusText": "At work" },
      "visibility": "public",
      "size": "medium",
      "sortOrder": 0,
      "pinned": false,
      "collapsed": false,
      "createdAt": 1714233600000,
      "updatedAt": 1714237200000
    }
  ],
  "musicConnections": [
    {
      "id": "c47ac10b-58cc-4372-a567-0e02b2c3d481",
      "provider": "spotify",
      "displayName": "River",
      "externalUserId": "spotify-user-id",
      "status": "connected",
      "connectedAt": 1714233600000,
      "updatedAt": 1714237200000
    }
  ],
  "theme": {
    "accentColor": "#7c3aed",
    "borderStyle": "subtle",
    "cornerStyle": "rounded"
  },
  "updatedAt": 1714237200000
}

Update section theme

PATCH/api/v1/social

204: 204: updates social_section_settings.theme only. Send null to clear theme. Partial objects merge allowed (all fields optional).

FieldValues
cardBackgroundstring, max 64
accentColorstring, max 32
borderStyledefault | subtle | strong
cornerStylerounded | sharp
iconStyledefault | minimal | filled
Shell
curl -sS -X PATCH \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "accentColor": "#7c3aed",
    "borderStyle": "subtle",
    "cornerStyle": "rounded"
  }' \
  "https://api.floralitys.com/api/v1/social"
JSON
null
Plain text
// 204 No Content: empty response body

Social links

POST/api/v1/social/links: 201 { "linkId" }

PATCH/api/v1/social/links/{linkId}: 200 { "linkId" }

DELETE/api/v1/social/links/{linkId}: 204

Link body

FieldRequiredNotes
platformyesdiscord, tiktok, instagram, x, bluesky, youtube, twitch, steam, xbox, playstation, nintendo, github, reddit, pinterest, roblox, vrchat, anilist, myanimelist, letterboxd, spotify (rejected: use Spotify connection), custom
displayNameyes1–120 chars
handlenomax 120
urlnovalid URL
descriptionnomax 280
badgenomax 32
accentColornomax 32
avatarUrlnoURL, max 2048 (OAuth avatars)
visibilityyesvisibility enum
featurednodefault false
sortOrdernoint ≥ 0; auto-assigned on create if omitted
Shell
curl -sS -X POST \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "bluesky",
    "displayName": "River",
    "handle": "river.bsky.social",
    "url": "https://bsky.app/profile/river.bsky.social",
    "visibility": "friends_only",
    "featured": true
  }' \
  "https://api.floralitys.com/api/v1/social/links"
JSON
{
  "linkId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}

Social widgets

POST/api/v1/social/widgets: 201 { "widgetId" }

PATCH/api/v1/social/widgets/{widgetId}: 200 { "widgetId" }

DELETE/api/v1/social/widgets/{widgetId}: 204

Widget body

FieldNotes
typeMust match config.kind
titleOptional, max 120
configDiscriminated union on kind (see table below)
visibilityvisibility enum
sizesmall | medium | large | full
pinned / collapseddefault false
sortOrderoptional int ≥ 0

Widget kinds

kindConfig highlights
statusstatusText (1–280)
discord_serverserverName, optional inviteUrl
currently_playingprovider (spotify), trackTitle, artistName, artworkUrl
musicSpotify resource fields, widgetKind, displayStyle, optional memberId
quotequote, optional author
pronouns_identitypronouns, optional identity
moodmood, optional note
custom_badgeimageUrls[]: hosted gallery URLs only (max 24)
link_collectionlinkIds[]: UUIDs of your links
media_favouritesentries[] with label + value
guestbookallowAnonymous: messages via guestbook routes
mutualsmaxItems (1–40)
countdowntargetAt (ms), label
pollquestion, options[] (2–8), optional allowMultipleSelections: votes via poll routes
sticker_boardstickerUrls[] (max 100 URLs)
shrinetitle, body
Shell
curl -sS -X POST \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "status",
    "title": "Now",
    "config": { "kind": "status", "statusText": "Building integrations" },
    "visibility": "public",
    "size": "medium",
    "pinned": false,
    "collapsed": false
  }' \
  "https://api.floralitys.com/api/v1/social/widgets"
JSON
{
  "widgetId": "b47ac10b-58cc-4372-a567-0e02b2c3d480"
}

Reorder links and widgets

POST/api/v1/social/reorder

204: 204: set sortOrder from array index. Provide linkIds and/or widgetIds (at least one). Each array must list every existing id for that resource type: exact permutation, no duplicates, no missing ids.

Shell
curl -sS -X POST \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "linkIds": ["LINK_UUID_A", "LINK_UUID_B"],
    "widgetIds": ["WIDGET_UUID_A", "WIDGET_UUID_B"]
  }' \
  "https://api.floralitys.com/api/v1/social/reorder"
Plain text
// 204 No Content: empty response body

Sync OAuth links from Clerk

POST/api/v1/social/sync-oauth

200: 200: reads verified Clerk external accounts for the API key's Clerk user; inserts missing platform rows or updates avatar/handle/url on existing rows. Empty body. Counts returned:

Shell
curl -sS -X POST \
  -H "Authorization: Bearer YOUR_TOKEN" \
  "https://api.floralitys.com/api/v1/social/sync-oauth"
JSON
{
  "inserted": 2,
  "updated": 1
}

Get friend social section

GET/api/v1/friends/{friendUserId}/social

200: 200: same SocialSection shape as your section, filtered for friend visibility. Requires accepted friendship; blocks return NOT_FOUND. friendUserId is the owner account UUID (Friends).

Shell
curl -sS \
  -H "Authorization: Bearer YOUR_TOKEN" \
  "https://api.floralitys.com/api/v1/friends/FRIEND_USER_UUID/social"

Errors

JSON { code, message }:

  • UNAUTHORIZED (401): missing/invalid API key
  • FORBIDDEN (403): insufficient social scope
  • BAD_REQUEST (400): validation, reorder mismatch, Spotify manual link, type/kind mismatch
  • NOT_FOUND (404): invalid UUID path param; friend not found / not accepted
  • PRECONDITION_FAILED (503): DATABASE_URL not configured

See Errors.

JSON
{
  "code": "BAD_REQUEST",
  "message": "Link reorder set must match existing links."
}