API reference
Webhooks
Incoming webhooks: a secret URL that posts messages into one text channel. Managing them needs Manage Webhooks in the channel.
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 channel webhooks
/channels/{id}/webhooks
Bot token: Call it with a bot token (people can call it too).
The channel's webhooks. Requires Manage Webhooks in the channel.
Required permissions
Requires Manage Webhooks in the channel.
Try it: GET /channels/{id}/webhooks
Sends the bot token from the top of this page.
Request
GET https://api.palloo.app/v1/channels/{id}/webhooks
curl command
Response
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| id Required | path | string |
Channel ID. |
Responses
- 200
-
The webhooks, oldest first. Tokens are never listed.
Body: WebhookList
Example response (200) { "webhooks": [ { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "name": "string", "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "created_at": "2026-10-15T09:00:00Z" } ] } - 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 403
-
missing_permission: the caller is a member but lacks the permission.Body: Error
- 404
-
channel_not_found: no such channel, or the caller is not a member of its community or cannot view the channel.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
Create webhook
/channels/{id}/webhooks
Bot token: Call it with a bot token (people can call it too).
Create a webhook on a text channel. Requires Manage Webhooks in the channel. Returns its token, once.
At most 15 webhooks per channel. Post with POST /webhooks/{id}/{token}; the token starts with palloo_wh_ and is never shown again.
Required permissions
Requires Manage Webhooks in the channel.
Try it: POST /channels/{id}/webhooks
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/channels/{id}/webhooks
curl command
Response
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| id Required | path | string |
Channel ID. |
Request body
application/json:
WebhookNameRequest
(required)
| Field | Type | Description |
|---|---|---|
| nameRequired | string | 1-80 characters, the same rules as other names. |
{
"name": "string"
}
Responses
- 201
-
The webhook and its token.
Body: WebhookWithToken
Cache-Controlheader.Example response (201) { "webhook": { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "name": "string", "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "created_at": "2026-10-15T09:00:00Z" }, "token": "palloo_wh_..." } - 400
-
invalid_body,invalid_nameorname_reserved(a reserved webhook name, unless its creator is an instance admin).Body: Error
- 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 403
-
missing_permission: the caller is a member but lacks the permission, ormfa_sudo_required: the account has MFA and this session has not verified a factor in the last 5 minutes (POST /users/@me/mfa/sudo, then retry).Body: Error
- 404
-
channel_not_found: no such channel, or the caller is not a member of its community or cannot view the channel.Body: Error
- 409
-
channel_not_textorwebhook_limit_reached.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
List community webhooks
/communities/{id}/webhooks
Bot token: Call it with a bot token (people can call it too).
The community's webhooks in the channels where the caller has Manage Webhooks.
Requires Manage Webhooks as a community permission (from roles).
Required permissions
Requires Manage Webhooks as a community permission (from roles).
Try it: GET /communities/{id}/webhooks
Sends the bot token from the top of this page.
Request
GET https://api.palloo.app/v1/communities/{id}/webhooks
curl command
Response
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| id Required | path | string |
Community ID. |
Responses
- 200
-
The webhooks, oldest first.
Body: WebhookList
Example response (200) { "webhooks": [ { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "name": "string", "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "created_at": "2026-10-15T09:00:00Z" } ] } - 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 403
-
missing_permission: the caller is a member but lacks the permission.Body: Error
- 404
-
community_not_found: no such community, or the caller is not a member. The two cases are indistinguishable on purpose.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
Execute webhook with header
/webhooks/{id}
Webhook token: Authenticated by the webhook token, not a bot token.
Post a message as the webhook, with the token in the Authorization header.
The same as POST /webhooks/{id}/{token}, but the token travels as Authorization: Webhook <token> instead of in the URL, so proxies and logs never see it. A missing or wrong token is the same 404 as an unknown webhook. Rate limited per webhook (5 at once, then 1 per second) and per client address.
Try it: POST /webhooks/{id}
Sent as Authorization: Webhook ... instead of the bot token. It is a password too, and is forgotten with the bot token.
Prefilled from the example above. Replace the placeholder values; unknown fields are refused.
Request
POST https://api.palloo.app/v1/webhooks/{id}
curl command
Response
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| id Required | path | string |
Webhook ID. |
Request body
application/json:
ExecuteWebhookRequest
(required)
| Field | Type | Description |
|---|---|---|
| content | string | Required unless files are attached. |
| username | string | A name for this message only, 1-80 characters, the same rules as other names. |
| message_reference | ReplyReference | Posts the message as a reply to a message in the webhook's channel, as for |
| allowed_mentions | AllowedMentions | |
| attachments | array of object | Only with multipart. Describes the files by their |
| attachments[].idRequired | integer | at least 0; at most 9 |
| attachments[].description | string | |
| attachments[].filename | string | A display name to use instead of the part's; the stored extension stays, as for |
{
"content": "string",
"username": "string",
"message_reference": {
"message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
"channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
"fail_if_not_exists": true
},
"allowed_mentions": {
"replied_user": false
},
"attachments": [
{
"id": 0,
"description": "string",
"filename": "string"
}
]
}
multipart/form-data:
ExecuteWebhookMultipart
(required)
| Field | Type | Description |
|---|---|---|
| payload_json | string | |
| files[0] | string (binary) | |
| files[1] | string (binary) | |
| files[2] | string (binary) | |
| files[3] | string (binary) | |
| files[4] | string (binary) | |
| files[5] | string (binary) | |
| files[6] | string (binary) | |
| files[7] | string (binary) | |
| files[8] | string (binary) | |
| files[9] | string (binary) |
Responses
- 204
-
Posted. Members receive
message_create. - 400
-
invalid_body,invalid_content,invalid_name(theusernameoverride),name_reserved(a reservedusernameoverride other than the webhook's own name), or for filesinvalid_upload,too_many_attachments,invalid_attachment(anattachmentsentry names no file part),invalid_description,content_type_mismatch,invalid_image,image_too_large,upload_rejectedorupload_malware(the file was blocked as malware). Files are charged to the webhook creator's daily upload quota (429upload_quota_exceeded) and upload rate limit, and to a per-webhook upload limit (5 requests with files, then 1 every 12 seconds).Body: Error
- 403
-
webhook_disabled: the webhook's creator is suspended (any message), or the creator no longer has an account (messages with files, which are charged to the creator).Body: Error
- 404
-
webhook_not_found: no such webhook, or the token is missing or wrong. These are indistinguishable.Body: Error
- 413
-
file_too_large: a file is larger thanmedia.max_upload_bytes; the message says the limit.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
- 503
-
storage_unavailable,scan_unavailableorupload_processing(the image decoders are busy); send again later.Body: Error
Retry-Afterheader.
Rename webhook
/webhooks/{id}
Bot token: Call it with a bot token (people can call it too).
Rename a webhook. Requires Manage Webhooks in its channel. Past messages keep their name.
Required permissions
Requires Manage Webhooks in its channel.
Try it: PATCH /webhooks/{id}
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/webhooks/{id}
curl command
Response
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| id Required | path | string |
Webhook ID. |
Request body
application/json:
WebhookNameRequest
(required)
| Field | Type | Description |
|---|---|---|
| nameRequired | string | 1-80 characters, the same rules as other names. |
{
"name": "string"
}
Responses
- 200
-
The renamed webhook.
Body: Webhook
Example response (200) { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "name": "string", "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "created_at": "2026-10-15T09:00:00Z" } - 400
-
invalid_body,invalid_nameorname_reserved(a reserved webhook name, unless its creator is an instance admin).Body: Error
- 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 403
-
missing_permission: the caller is a member but lacks the permission.Body: Error
- 404
-
webhook_not_found: no such webhook, or the caller cannot view its channel.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
Delete webhook
/webhooks/{id}
Bot token: Call it with a bot token (people can call it too).
Delete a webhook. Requires Manage Webhooks in its channel. Its messages stay.
Required permissions
Requires Manage Webhooks in its channel.
Try it: DELETE /webhooks/{id}
Sends the bot token from the top of this page.
Request
DELETE https://api.palloo.app/v1/webhooks/{id}
curl command
Response
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| id Required | path | string |
Webhook ID. |
Responses
- 204
-
Deleted.
- 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 403
-
missing_permission: the caller is a member but lacks the permission.Body: Error
- 404
-
webhook_not_found: no such webhook, or the caller cannot view its channel.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
Regenerate webhook token
/webhooks/{id}/token/regenerate
Bot token: Call it with a bot token (people can call it too).
Replace a webhook's token. Requires Manage Webhooks in its channel. The old URL stops working.
Required permissions
Requires Manage Webhooks in its channel.
Try it: POST /webhooks/{id}/token/regenerate
Sends the bot token from the top of this page.
Request
POST https://api.palloo.app/v1/webhooks/{id}/token/regenerate
curl command
Response
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| id Required | path | string |
Webhook ID. |
Responses
- 200
-
The webhook and its new token.
Body: WebhookWithToken
Cache-Controlheader.Example response (200) { "webhook": { "id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "community_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "name": "string", "created_by": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A", "created_at": "2026-10-15T09:00:00Z" }, "token": "palloo_wh_..." } - 401
-
unauthenticated: the bearer token is missing, invalid or expired.Body: Error
WWW-Authenticateheader. - 403
-
missing_permission: the caller is a member but lacks the permission, ormfa_sudo_required: the account has MFA and this session has not verified a factor in the last 5 minutes (POST /users/@me/mfa/sudo, then retry).Body: Error
- 404
-
webhook_not_found: no such webhook, or the caller cannot view its channel.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
Execute webhook
/webhooks/{id}/{token}
No token: Needs no token.
Post a message as the webhook. No other authentication.
Prefer POST /webhooks/{id} with Authorization: Webhook <token>, which keeps the token out of URLs. content follows the message rules. username replaces the webhook's name on this message only. Mentions of users who can view the channel and of mentionable roles ping; @everyone and @here never do. Rate limited per webhook (5 at once, then 1 per second) and per client address.
Try it: POST /webhooks/{id}/{token}
Sends no bot token.
Prefilled from the example above. Replace the placeholder values; unknown fields are refused.
Request
POST https://api.palloo.app/v1/webhooks/{id}/{token}
curl command
Response
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| id Required | path | string |
Webhook ID. |
| token Required | path | string |
The webhook's token. |
Request body
application/json:
ExecuteWebhookRequest
(required)
| Field | Type | Description |
|---|---|---|
| content | string | Required unless files are attached. |
| username | string | A name for this message only, 1-80 characters, the same rules as other names. |
| message_reference | ReplyReference | Posts the message as a reply to a message in the webhook's channel, as for |
| allowed_mentions | AllowedMentions | |
| attachments | array of object | Only with multipart. Describes the files by their |
| attachments[].idRequired | integer | at least 0; at most 9 |
| attachments[].description | string | |
| attachments[].filename | string | A display name to use instead of the part's; the stored extension stays, as for |
{
"content": "string",
"username": "string",
"message_reference": {
"message_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
"channel_id": "01J9ZQ3V5K8M2N4P6R8T0W2Y4A",
"fail_if_not_exists": true
},
"allowed_mentions": {
"replied_user": false
},
"attachments": [
{
"id": 0,
"description": "string",
"filename": "string"
}
]
}
multipart/form-data:
ExecuteWebhookMultipart
(required)
| Field | Type | Description |
|---|---|---|
| payload_json | string | |
| files[0] | string (binary) | |
| files[1] | string (binary) | |
| files[2] | string (binary) | |
| files[3] | string (binary) | |
| files[4] | string (binary) | |
| files[5] | string (binary) | |
| files[6] | string (binary) | |
| files[7] | string (binary) | |
| files[8] | string (binary) | |
| files[9] | string (binary) |
Responses
- 204
-
Posted. Members receive
message_create. - 400
-
invalid_body,invalid_content,invalid_name(theusernameoverride),name_reserved(a reservedusernameoverride other than the webhook's own name), or for filesinvalid_upload,too_many_attachments,invalid_attachment(anattachmentsentry names no file part),invalid_description,content_type_mismatch,invalid_image,image_too_large,upload_rejectedorupload_malware(the file was blocked as malware). Files are charged to the webhook creator's daily upload quota (429upload_quota_exceeded) and upload rate limit, and to a per-webhook upload limit (5 requests with files, then 1 every 12 seconds).Body: Error
- 403
-
webhook_disabled: the webhook's creator is suspended (any message), or the creator no longer has an account (messages with files, which are charged to the creator).Body: Error
- 404
-
webhook_not_found: no such webhook, or the token is wrong. The two are indistinguishable.Body: Error
- 413
-
file_too_large: a file is larger thanmedia.max_upload_bytes; the message says the limit.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
- 503
-
storage_unavailable,scan_unavailableorupload_processing(the image decoders are busy); send again later.Body: Error
Retry-Afterheader.