Skip to main content
Bot authentication is accepted on read endpoints (GET /api/picnics/get, GET /api/picnics/overview, POST /api/picnic/get, POST /api/picnic/search, POST /api/picnic/comments, and the /@/<link> short-link resolver) via the Authorization: <user_id> <token> header.It is rejected on all lifecycle and moderation endpoints (create, edit, join, leave, delete, ban, unban, manage, set_original) — those return 400 Not Authorized when called with a bot token. A human owner must create the picnic and use manage to promote the bot to admin. See the Bots guide.
Picnics are Clody’s public community channels. Anyone can discover and join a picnic; once inside, admins post the content and members engage through comments. Every picnic has exactly one owner (its creator), one or more admins (including the owner), and any number of members. This page covers all endpoints for creating and managing picnics, as well as the real-time Socket.IO events your client receives as picnic state changes.

The Picnic object

The picnic_summary shape is returned by most endpoints on this page.
integer
Unique numeric identifier for the picnic.
string
Display name of the picnic (up to 30 characters).
string | null
URL of the picnic’s avatar image, or null if none has been set.
integer
Total number of current members.
Custom URL slug used in the short-link /@/<link>, or null if no custom link has been set.
object
Metadata object with the following nested fields:
boolean
Whether comment threads are enabled for posts in this picnic.
boolean
true if the authenticated user is currently a member.
boolean
true if the authenticated user has admin privileges in this picnic.
boolean
true if the authenticated user is the owner of this picnic.

Endpoints

List your picnics

GET /api/picnics/get Returns the list of picnic IDs you currently belong to. Response 200
An array of integer picnic IDs. Returns an empty array [] if you have not joined any picnics.

Overview of your picnics

GET /api/picnics/overview Returns full picnic summaries for every picnic you belong to, augmented with unread-post and last-activity metadata. Use this endpoint to populate a picnic sidebar or home screen. Response 200
integer
Number of posts in this picnic you have not yet read.
integer
Unix timestamp of the most recent post, or 0 if no posts exist yet.

Get a picnic

POST /api/picnic/get Fetches the full summary for a single picnic by ID. You do not need to be a member to look up a picnic. Request body
integer
required
ID of the picnic to retrieve.
Response 200 — a Picnic object. Error responses

Search picnics

POST /api/picnic/search Searches all picnics by name using a case-insensitive substring match. Returns up to 50 results. Request body
string
required
Substring to search for in picnic names. Whitespace-only strings return an empty array immediately.
Response 200
An array of up to 50 Picnic objects whose names contain the given substring.

Create a picnic

POST /api/picnic/create Creates a new picnic. You become the owner and are automatically added as the first admin and member. Request body
string
required
Display name for the picnic. Maximum 30 characters; cannot be blank.
boolean
required
Set to true to allow members to comment on posts, or false to disable comments entirely.
Custom URL slug (maximum 30 characters) used in the short-link /@/<link>. Must be globally unique. Omit or leave blank to skip assigning a custom link.
string
Short description shown on the picnic profile (maximum 50 characters).
Response 200 — the newly created Picnic object. Error responses
After a successful creation, all your connected sessions also receive an added_picnic Socket.IO event containing the new picnic summary.

Edit a picnic

POST /api/picnic/edit Updates a picnic’s settings. Only the owner can call this endpoint. The owner is always kept in the admins list regardless of what you pass. Request body
integer
required
ID of the picnic to edit.
string
required
New display name (maximum 30 characters).
boolean
required
Whether comment threads should be enabled on this picnic going forward.
array of integers
required
Complete list of member IDs to grant admin privileges. Non-members in this list are silently ignored. The owner is always prepended if not already present.
New custom URL slug (maximum 30 characters), or null to remove the existing link.
string | null
New description (maximum 50 characters), or null to clear it.
Response 200 — the updated Picnic object. Error responses
Every current member receives an update_picnic Socket.IO event with their personalised picnic summary immediately after a successful edit.

Join a picnic

POST /api/picnic/join Adds you as a member of the specified picnic. Request body
integer
required
ID of the picnic to join.
Response 200 — the Picnic object for the picnic you just joined. Error responses

Leave a picnic

POST /api/picnic/leave Removes you from the picnic’s member and admin lists. Request body
integer
required
ID of the picnic to leave.
Response 200"Success" Error responses

Delete a picnic

POST /api/picnic/delete Permanently deletes a picnic along with all its posts and comments. Only the owner can delete a picnic. This action is irreversible. Request body
integer
required
ID of the picnic to delete.
Response 200"Success" Error responses
Deleting a picnic removes all posts and comments permanently. Every current member receives a deleted_picnic Socket.IO event.

Manage a picnic

POST /api/picnic/manage Returns the full membership roster for a picnic, including bans. Admins only. Request body
integer
required
ID of the picnic.
Response 200
array of integers
IDs of all current members.
array of integers
IDs of all users with admin privileges (always includes the owner).
integer
User ID of the picnic owner.
array of integers
IDs of users who have been banned from this picnic.
Error responses

Ban a member

POST /api/picnic/ban Bans a user from a picnic. The banned user is removed from the member list and receives a banned_from_picnic Socket.IO event. Admins only. Request body
integer
required
ID of the picnic.
integer
required
User ID of the member to ban.
Response 200"Success" Error responses

Unban a user

POST /api/picnic/unban Lifts a ban, allowing the user to rejoin the picnic. Admins only. Request body
integer
required
ID of the picnic.
integer
required
User ID of the banned user to unban.
Response 200"Success" Error responses
Every picnic with a custom link value is reachable at /@/<link>. Navigating to that URL redirects the browser to /app/picnics/<id> — the standard in-app picnic page. This lets you share a memorable URL (e.g. /@/morning-crew) instead of a numeric ID.
Custom links are set at creation time with the link field on POST /api/picnic/create, and can be updated or cleared via POST /api/picnic/edit.

Socket.IO events

Your client receives these events over the active Socket.IO connection when picnic state changes.
Each update_picnic payload is personalised — is_member, is_admin, and is_owner reflect the receiving user’s relationship to the picnic, not the caller’s.