Errors
Errors answer with an HTTP status and a JSON body. Branch on error.code: it's stable, while message is written for people and may change. New codes can appear within v1, so treat any code you don't recognise by its status.
{
"error": {
"type": "authentication",
"code": "invalid_api_key",
"message": "This API key is invalid, revoked or expired.",
"docUrl": "https://probed.chat/docs/api/errors#invalid_api_key"
}
}param names the parameter or header at fault, when there is one. A 402 also carries feature, currentTier and requiredTier.
missing_api_key401#
No API key was sent, or the Authorization header isn't Bearer ….
Send Authorization: Bearer prbd_sk_… with a key from Settings → API keys.
invalid_api_key401#
The key is unknown, revoked or expired.
Check you copied the whole key. If it was revoked, rotated more than 24 hours ago or expired, create a new one.
member_limit_reached402#
The space already has as many members as its plan allows.
Upgrade the space's plan, or remove members or revoke pending invites to make room.
plan_feature_required402#
The space's plan doesn't include the API, or the feature this request uses (such as custom roles).
Upgrade the space. The body's feature and requiredTier say what's needed.
channel_limit_reached402#
The space already has as many active channels of this kind as its plan allows.
Archive a channel you no longer use, or upgrade the space's plan.
permission_denied403#
The key doesn't hold the permission this needs.
Create a key with the access this request needs.
permission_ceiling403#
The key would be giving someone a permission it doesn't hold itself, through a role or an invite.
Pick a role with fewer permissions, or create a key that holds every permission the role carries.
not_found404#
There's nothing at this path for this key.
Check the path and the id. Objects in other spaces always answer 404.
invalid_request400#
Something in the request is malformed.
message and param say what. Fix it before retrying.
default_section400#
The space's default section can't be deleted.
Rename it instead, or move it with PUT /sections/order.
webhook_url_invalid400#
The webhook URL isn't one Probed will call: not https, a port below 1024 other than 443, credentials in it, or a private, loopback or reserved host.
Use an https URL on a public hostname. message says what was wrong with this one.
invalid_limit400#
limit isn't a whole number from 1 to 100.
Send a limit from 1 to 100, or leave it out for 25.
invalid_cursor400#
cursor isn't one this API returned.
Pass nextCursor from the previous page unchanged, or start again without a cursor.
idempotency_key_invalid400#
The Idempotency-Key header is empty, too long or has spaces.
Send 1 to 255 printable characters with no spaces, such as a UUID.
idempotency_key_reused409#
This Idempotency-Key was already used for a different request.
Use a new key for each distinct request. Retries of the same request keep the same key.
idempotency_in_progress409#
A request with this Idempotency-Key is still running.
Wait a moment and retry with the same key to get its result.
webhook_limit_reached409#
The space already has 10 webhook endpoints.
Delete an endpoint you no longer use. One endpoint can receive every event type.
webhook_endpoint_disabled409#
The webhook endpoint is disabled, so it can't be tested or retried.
Turn it on with PATCH /webhook-endpoints/{id} and enabled: true.
webhook_delivery_pending409#
The delivery is still queued or waiting to retry.
Wait for it to finish. Its nextAttemptAt says when it's next sent.
webhook_delivery_too_old409#
The delivery was queued before the endpoint's URL last changed, so retrying would send it to the new URL.
Fetch the event with GET /events/{id} instead, or send a test to check the new URL.
conflict409#
The request conflicts with the current state.
Fetch the object again and retry if it still makes sense.
rate_limited429#
This key sent too many requests this minute, or too many invites, timeouts, webhook tests or retries.
Wait Retry-After seconds. Keys get 100 requests a minute on Premium, 300 on Business, and can send 30 invites an hour, 20 timeouts every 10 minutes, 5 webhook tests a minute per endpoint (30 an hour per key) and 30 delivery retries a minute per endpoint.
api_error500#
Something went wrong on our side.
Retry. If it keeps happening, contact support with the Probed-Request-Id response header.
channel_archived409#
The channel is archived, so it takes no new messages.
Restore it with POST /channels/{id}/restore (Manage channels), or post somewhere else.
announcement_only403#
Keys post and edit in announcement channels only with Manage channels, and this key doesn't hold it.
Create a key with the Manage channels permission, or post in a public channel.
mention_everyone_forbidden403#
The message mentions everyone, and the key doesn't hold Mention everyone.
Leave out mentionEveryone, or create a key with the Mention everyone permission.
mention_everyone_cooldown429#
An API key already mentioned everyone in this channel in the last 10 minutes.
Wait Retry-After seconds, or send it without mentionEveryone.
upload_quota_exceeded429#
API keys in this space have uploaded 2 GB today.
Wait Retry-After seconds, until midnight UTC.
mention_not_member400#
A mentionUserIds entry isn't the userId of a member of the space.
Use userId values from GET /members. param says which entry.
slow_mode429#
The channel is in slow mode and this key's bot posted in it too recently.
Wait Retry-After seconds. Keys holding Manage slow mode aren't limited.
attachment_invalid400#
An attachment isn't a file this key uploaded: its url isn't one POST /uploads returned to this key, or the link expired.
Upload the file with POST /uploads and send the url it returns within a week. Links to other sites go in the text.
not_message_author403#
A key can only edit the messages its own bot posted.
Edit with the key (or a rotation of it) that posted the message.
upload_rejected400#
The upload isn't a file Probed stores: empty, a type that's refused (HTML, SVG, scripts, executables) or an image too damaged to read, or there's no file field.
message says which. Send the file as multipart form data in a file field.
import_in_progress409#
The space already has a customer import queued or running.
Wait for it to finish (GET /customer-imports/{id}), then send yours.
customer_imports_disabled503#
Customer imports are switched off on our side for now.
Retry later. Imports already queued resume when they're back.
customer_slug_taken409#
Another customer in the space already uses that slug.
Send a different slug, or leave it out to have one made from the name.
idea_already_on_roadmap409#
The idea was already accepted onto the roadmap.
Its roadmapItemId names the roadmap item. Change that item instead.
roadmap_board_name_taken409#
The space already has a roadmap board with this name.
Pick another name, or use the existing board.
linked_channel_not_found400#
linkedChannelId isn't a public or announcement channel of this space.
Link a channel from GET /channels, or send null for none.
calendar_event_limit_reached400#
The space already has 500 calendar events.
Delete events that are over with DELETE /calendar-events/{id}.
calendar_event_template_not_found400#
templateId isn't a calendar event template of this space.
Use an id from GET /calendar-event-templates, or leave it out.
calendar_event_template_limit_reached400#
The space already has 50 calendar event templates.
Delete a template you no longer use.
calendar_event_template_name_taken409#
The space already has a calendar event template with this name.
Pick another name, or update the existing template.
soundboard_limit_reached400#
The space already has 200 sounds, or 200 emoji playback settings, the most a soundboard holds.
Delete a sound you no longer use with DELETE /soundboard/sounds/{id}, then upload again. An emoji that already has a setting can always be changed.