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.The Picnic object
Thepicnic_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.
string | null
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
[] 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.
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.
200
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.string
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).
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.
string | null
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.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.
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.
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.
200 — "Success"
Error responses
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.
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.
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.
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.
200 — "Success"
Error responses
Short-link redirects
Every picnic with a customlink 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.