API reference
Users
Every path is relative to https://api.palloo.app/v1.
Send a bot token as Authorization: Bearer palloo_bot_... unless the operation says otherwise; see Authentication.
Try it
Send real requests to https://api.palloo.app/v1 from this page. Open Try it under an operation, fill in its fields and send it.
A bot token is a password.
Anyone who has it can act as your bot. Use a test bot in a test server, never a production bot. The token stays in this tab's memory only: it is not saved, and it goes to the API and nowhere else. Reloading or leaving the page forgets it.
Starts with palloo_bot_. People's tokens are refused here.
On this page
Get me
/users/@me
Bot token: Call it with a bot token (people can call it too).
The authenticated user, with their email address and whether it is verified.
Try it: GET /users/@me
Sends the bot token from the top of this page.
Request
GET https://api.palloo.app/v1/users/@me
curl command
Response
Responses
- 200
-
The current user.
Body: CurrentUser
Example response (200) { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "username": "string", "display_name": "string", "kind": "user", "avatar": "string", "avatar_dark": "string", "banner": "string", "bio": "string", "pronouns": "string", "banner_color": 0, "instance_role": "owner", "created_at": "2026-10-15T09:00:00Z", "email": "string", "email_verified": false, "address": "string", "handle": "string", "terms_version_accepted": "string", "terms_accepted_at": "2026-10-15T09:00:00Z", "terms_acceptance_required": false, "features": [ "threads" ], "mfa_enabled": false } - 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 429
-
rate_limited: too many attempts. Every operation a bot calls is also limited per bot (50 at once, then 50 per second), so any authenticated operation can answer this to a bot. Changes to a community's structure (creating or changing the community, channels, roles, member roles, overwrites, invites, kicks, bans, timeouts, report updates and actions, and bots) are also limited per caller (30 at once, then 1 per second) and per community (60 at once, then 1 per second), and creating communities per caller (10 at once, then 1 every 5 minutes).Body: Error
Retry-Afterheader. - 500
-
internal: an unexpected server error. Details are only in server logs.Body: Error
Update me
/users/@me
Bot token: Call it with a bot token (people can call it too).
Change the caller's profile (display name, About Me, pronouns, banner color, avatar, dark mode avatar or banner); bots included.
Omitted fields keep their value. For images, set a finalized upload of the matching purpose, or null to remove the image; the old image's files are deleted an hour later. Nothing is written unless every field is valid. The user's own connections, every community they are in, their friends and everyone they share a direct message with receive user_update.
Try it: PATCH /users/@me
Sends the bot token from the top of this page.
Prefilled from the example above. Replace the placeholder values; unknown fields are refused.
Request
PATCH https://api.palloo.app/v1/users/@me
curl command
Response
Request body
application/json:
UpdateCurrentUserRequest
(required)
| Field | Type | Description |
|---|---|---|
| display_name | string or null | Trimmed, then at most 64 characters with no control or invisible formatting characters. Null or an empty string goes back to the username. |
| bio | AboutMe or null | |
| pronouns | Pronouns or null | |
| banner_color | BannerColor or null | |
| avatar | string or null | A finalized |
| avatar_dark | string or null | A finalized |
| banner | string or null | A finalized |
{
"display_name": "string",
"bio": "string",
"pronouns": "string",
"banner_color": 0,
"avatar": "string",
"avatar_dark": "string",
"banner": "string"
}
Responses
- 200
-
The current user.
Body: CurrentUser
Example response (200) { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "username": "string", "display_name": "string", "kind": "user", "avatar": "string", "avatar_dark": "string", "banner": "string", "bio": "string", "pronouns": "string", "banner_color": 0, "instance_role": "owner", "created_at": "2026-10-15T09:00:00Z", "email": "string", "email_verified": false, "address": "string", "handle": "string", "terms_version_accepted": "string", "terms_accepted_at": "2026-10-15T09:00:00Z", "terms_acceptance_required": false, "features": [ "threads" ], "mfa_enabled": false } - 400
-
invalid_body,invalid_attachment(not a finished upload of the caller's for that purpose),invalid_display_name,name_reserved(changing to a reserved name; a name already held is kept),invalid_bio,invalid_pronounsorinvalid_banner_color.Body: Error
- 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 403
-
terms_acceptance_required: the instance's terms of service changed (or were never accepted) and this account has not accepted the current version. Show the terms and callPOST /users/@me/terms, then retry.Body: Error
- 429
-
rate_limited: too many attempts. Every operation a bot calls is also limited per bot (50 at once, then 50 per second), so any authenticated operation can answer this to a bot. Changes to a community's structure (creating or changing the community, channels, roles, member roles, overwrites, invites, kicks, bans, timeouts, report updates and actions, and bots) are also limited per caller (30 at once, then 1 per second) and per community (60 at once, then 1 per second), and creating communities per caller (10 at once, then 1 every 5 minutes).Body: Error
Retry-Afterheader. - 500
-
internal: an unexpected server error. Details are only in server logs.Body: Error
Lookup user
/users/lookup
Bot token: Call it with a bot token (people can call it too).
Find a local account by address, alias handle or ID. A moved account still answers, with moved_to set, so clients can follow it. Give exactly one of address and id.
Try it: GET /users/lookup
Sends the bot token from the top of this page.
Request
GET https://api.palloo.app/v1/users/lookup
curl command
Response
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| address | query | string |
An address or handle, such as |
| id | query | ID |
A ULID. Sorts lexically in creation order. pattern ^[0-9A-HJKMNP-TV-Z]{26}$ |
Responses
- 200
-
The profile.
Body: Profile
Example response (200) { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "username": "string", "display_name": "string", "kind": "user", "avatar": "string", "avatar_dark": "string", "banner": "string", "bio": "string", "pronouns": "string", "banner_color": 0, "created_at": "2026-10-15T09:00:00Z", "address": "string", "handle": "string", "moved_to": "string", "signing_key": { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "algorithm": "ed25519", "public_key": "string", "created_at": "2026-10-15T09:00:00Z", "retired_at": "2026-10-15T09:00:00Z", "retire_reason": "rotated" }, "verified_domains": [ "string" ], "badges": [ { "key": "staff", "name": "string", "description": "string", "label": "string", "kind": "automatic", "issuer": "string", "tier": { "key": "string", "name": "string", "level": 1 }, "next_tier": { "key": "string", "name": "string", "requirement": "string" }, "active": false, "hidden": false, "hideable": false, "granted_at": "2026-10-15T09:00:00Z", "expires_at": "2026-10-15T09:00:00Z", "organization": { "id": {}, "name": "string", "domain": "string" }, "domains": [ "string" ] } ] } - 400
-
invalid_query: give exactly one ofaddressandid.Body: Error
- 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 404
-
user_not_found.Body: Error
- 429
-
rate_limited: too many attempts. Every operation a bot calls is also limited per bot (50 at once, then 50 per second), so any authenticated operation can answer this to a bot. Changes to a community's structure (creating or changing the community, channels, roles, member roles, overwrites, invites, kicks, bans, timeouts, report updates and actions, and bots) are also limited per caller (30 at once, then 1 per second) and per community (60 at once, then 1 per second), and creating communities per caller (10 at once, then 1 every 5 minutes).Body: Error
Retry-Afterheader. - 500
-
internal: an unexpected server error. Details are only in server logs.Body: Error