← API reference

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.

unauthenticated401#

The request couldn't be authenticated.

Send a valid API key.

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.

request_too_large413#

The request body is over 1 MB.

Send a smaller body.

unsupported_media_type415#

The body isn't JSON.

Send Content-Type: application/json with a JSON body.

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.

file_too_large413#

The uploaded file is over 8 MB.

Send a smaller file.

uploads_unavailable503#

Probed's file store couldn't be reached to store an upload or check an attachment.

Retry in a moment. Nothing was posted or stored.

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.