taking longer than usual.

skip to content
sometimes/ developers

developers / bots / operations

limits and reliability

these limits apply to API 1. inspect GET /limits and response headers to adapt to your installation’s current allowance.

API 1 · REST + gatewaydownload reference

rate limits

limits apply simultaneously at application, installation, user and resource levels. token rotation and multiple installations cannot bypass an application or user quota. return RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset and RateLimit-Bucket headers; 429 additionally includes Retry-After in seconds and retry_after_ms in the error. use returned values rather than relying on wall-clock alignment. GET /limits returns current limits, permitted field enums and remaining storage quotas for the current installation without unrelated account data.

scroll the table horizontally to see all columns.

bucketinitial limitscope
REST requests50/second, burst 100application
REST requests10/second, burst 20installation
message-like writes5 per 5 seconds, burst 5application + installer + chat; includes media/polls/private replies
notifications5/hour and 20/dayapplication + installer
friend requests / group invitations10/hourapplication + installer, plus existing account limits
call starts / invitations5 per 10 minutesapplication + installer + chat
drawing previews10/secondinstallation + chat
JSON request256 KiB; profile writes 1,756,384 bytes; SDP 64 KiBrequest
gateway inbound frame64 KiB; 120/minute except heartbeat ACK and event ACKapplication connection
simultaneous uploads3installation; reservation-aware
uploaded bytes500 MiB/dayapplication + installer, plus asset/user quotas
active call sessions1 per installation; 20 per applicationv1 self-service default
bot applications / private invites10 per developer / 1,000 per applicationowner/application
installations100 active per user; 10,000 per applicationv1 self-service default

storage and event budgets

replay stores at most 10,000 events per installation and 100,000 per application for 24 hours, with a 64 KiB event payload cap. oversized changes emit {resource_id,revision,fetch_required:true} instead of the body; fetching still requires current grants. private message bodies expire at their TTL, independent of replay. idempotency receipts last 24 hours; never store secrets or unredacted private content in request logs. activity metadata lasts 90 days and contains action, actor, application, resource IDs, timestamp, result and changed field names, not old/new message or profile bodies.

retry and conflict handling

retry network failures, 429 and 503 with bounded exponential backoff and jitter, honoring Retry-After. retain the original idempotency key for uncertain POST outcomes. do not automatically merge a 412 by overwriting a user’s more recent edit; reread and reconcile only intended fields. installation revocation is permanent until a new human authorization. transient gateway interruption does not grant permission to repeat non-idempotent actions.

abuse handling

publication has no approval queue, but existing platform content rules, account restrictions and abuse controls still apply. users can block, disable or uninstall bots; group owners can exclude them; platform staff can disable abusive applications after publication. grant checks are enforced server-side even when clients are old or malicious. rate-limit reservations and upload quotas apply across concurrent tokens. developers cannot buy or declare their way around consent in an install URL.

versioning and compatibility

API version 1 is selected by /api/bots/v1 and the gateway ready frame. nonbreaking additive fields may appear; clients ignore unknown response fields and event types. requests reject unknown fields. removing fields, changing grant semantics or expanding administrator requires a new API/catalogue version and migration plan. announce breaking retirement at least 90 days ahead and keep old consent snapshots interpretable. the four quickstart languages call this public contract directly; no official bot SDK is required.