API reference
Direct messages
One-to-one direct messages. A DM is a channel without a community; its messages, edits, deletes, history and acks use the message operations with the DM's ID, and anyone but its two participants gets 404.
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
List DM channels
/users/@me/channels
Bot token: Call it with a bot token (people can call it too).
The caller's direct messages, newest activity first.
Ordered by the newest message, or by when the DM was opened for DMs without messages. Each carries the caller's read state.
Try it: GET /users/@me/channels
Sends the bot token from the top of this page.
Request
GET https://api.palloo.app/v1/users/@me/channels
curl command
Response
Responses
- 200
-
The caller's DMs.
Body: DMChannelList
Example response (200) { "channels": [ { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "kind": "dm", "recipients": [ { "id": {}, "username": "string", "display_name": "string", "kind": {}, "avatar": {}, "avatar_dark": {} } ], "created_at": "2026-10-15T09:00:00Z", "last_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "mention_count": 0, "last_pin_timestamp": "2026-10-15T09:00:00Z" } ] } - 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
Open DM channel
/users/@me/channels
Bot token: Call it with a bot token (people can call it too).
Open the DM with a user, or get it if it exists.
There is exactly one DM per pair of users. An existing DM is returned (200) whatever the
current settings, since both participants can always read it. A new one (201) needs what
sending needs: the recipient has not blocked the caller and allows DMs from them (they
are friends, or the recipient's direct_messages is server_members and they share a
community), and the caller has not blocked the recipient. Bots can open DMs with users
they share a community with, but not with other bots. Both participants' gateway
sessions receive channel_create. Creating DMs is rate limited; getting existing ones
is not.
Try it: POST /users/@me/channels
Sends the bot token from the top of this page.
Prefilled from the example above. Replace the placeholder values; unknown fields are refused.
Request
POST https://api.palloo.app/v1/users/@me/channels
curl command
Response
Request body
application/json:
OpenDMRequest
(required)
| Field | Type | Description |
|---|---|---|
| recipient_idRequired | string |
{
"recipient_id": "string"
}
Responses
- 200
-
The existing DM.
Body: DMChannelState
Example response (200) { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "kind": "dm", "recipients": [ { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "username": "string", "display_name": "string", "kind": "user", "avatar": "string", "avatar_dark": "string" } ], "created_at": "2026-10-15T09:00:00Z", "last_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "mention_count": 0, "last_pin_timestamp": "2026-10-15T09:00:00Z" } - 201
-
The new DM.
Body: DMChannelState
Example response (201) { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "kind": "dm", "recipients": [ { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "username": "string", "display_name": "string", "kind": "user", "avatar": "string", "avatar_dark": "string" } ], "created_at": "2026-10-15T09:00:00Z", "last_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "last_read_message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "mention_count": 0, "last_pin_timestamp": "2026-10-15T09:00:00Z" } - 400
-
invalid_body: the body is not a single JSON object matching the schema.Body: Error
- 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 403
-
dm_not_allowed: the recipient does not accept DMs from the caller (a block looks the same), orbots_not_allowed: both are bots.Body: Error
- 404
-
user_not_found.Body: Error
- 409
-
cannot_target_self, orblocking_user: the caller blocked the recipient.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