HappierDocs

API rate limits

Every rate-limited endpoint, its default, what it counts against, and the two environment variables that change it.

Happier rate-limits its busiest endpoints. The defaults suit a normal deployment; you would usually only raise one after watching a specific endpoint throttle under real load, or lower one on a server exposed to the public internet.

Each endpoint has two environment variables — a maximum and a window. Set both or neither; setting only the maximum leaves the window at its default, which is rarely what you want.

The window accepts the same duration strings the defaults use (1 minute, 30 seconds, 1 hour).

What it counts against matters more than the number. Account limits are per signed-in account, so one busy user cannot exhaust another's budget. IP address limits apply before Happier knows who is calling — they protect unauthenticated routes, and behind a reverse proxy they are only as accurate as the forwarded client address your proxy sets. 27 of the 33 limits are per-account.

Two clusters are worth knowing about before a rollout, because they throttle exactly when many people onboard at once: auth.pairing.* covers connecting a new device, and connectedServices.deviceAuth.* covers linking an agent account from a headless machine.

EndpointDefaultCounted perEnvironment variables
account.profile300 / 1 minuteAccountHAPPIER_ACCOUNT_PROFILE_RATE_LIMIT_MAX
HAPPIER_ACCOUNT_PROFILE_RATE_LIMIT_WINDOW
account.settings300 / 1 minuteAccountHAPPIER_ACCOUNT_SETTINGS_RATE_LIMIT_MAX
HAPPIER_ACCOUNT_SETTINGS_RATE_LIMIT_WINDOW
artifacts300 / 1 minuteAccountHAPPIER_ARTIFACTS_RATE_LIMIT_MAX
HAPPIER_ARTIFACTS_RATE_LIMIT_WINDOW
auth.pairing.consume60 / 1 minuteAccountHAPPIER_AUTH_PAIRING_CONSUME_RATE_LIMIT_MAX
HAPPIER_AUTH_PAIRING_CONSUME_RATE_LIMIT_WINDOW
auth.pairing.request30 / 1 minuteIP addressHAPPIER_AUTH_PAIRING_REQUEST_RATE_LIMIT_MAX
HAPPIER_AUTH_PAIRING_REQUEST_RATE_LIMIT_WINDOW
auth.pairing.start60 / 1 minuteAccountHAPPIER_AUTH_PAIRING_START_RATE_LIMIT_MAX
HAPPIER_AUTH_PAIRING_START_RATE_LIMIT_WINDOW
auth.pairing.status240 / 1 minuteAccountHAPPIER_AUTH_PAIRING_STATUS_RATE_LIMIT_MAX
HAPPIER_AUTH_PAIRING_STATUS_RATE_LIMIT_WINDOW
changes600 / 1 minuteAccountHAPPIER_CHANGES_RATE_LIMIT_MAX
HAPPIER_CHANGES_RATE_LIMIT_WINDOW
connectedServices.deviceAuth.poll240 / 1 minuteAccountHAPPIER_CONNECTED_SERVICES_DEVICE_AUTH_POLL_RATE_LIMIT_MAX
HAPPIER_CONNECTED_SERVICES_DEVICE_AUTH_POLL_RATE_LIMIT_WINDOW
connectedServices.deviceAuth.start30 / 1 minuteAccountHAPPIER_CONNECTED_SERVICES_DEVICE_AUTH_START_RATE_LIMIT_MAX
HAPPIER_CONNECTED_SERVICES_DEVICE_AUTH_START_RATE_LIMIT_WINDOW
connectedServices.quotas.read600 / 1 minuteAccountHAPPIER_CONNECTED_SERVICES_QUOTAS_READ_RATE_LIMIT_MAX
HAPPIER_CONNECTED_SERVICES_QUOTAS_READ_RATE_LIMIT_WINDOW
connectedServices.quotas.refresh60 / 1 minuteAccountHAPPIER_CONNECTED_SERVICES_QUOTAS_REFRESH_RATE_LIMIT_MAX
HAPPIER_CONNECTED_SERVICES_QUOTAS_REFRESH_RATE_LIMIT_WINDOW
connectedServices.quotas.write120 / 1 minuteAccountHAPPIER_CONNECTED_SERVICES_QUOTAS_WRITE_RATE_LIMIT_MAX
HAPPIER_CONNECTED_SERVICES_QUOTAS_WRITE_RATE_LIMIT_WINDOW
diagnostics.bugReportSnapshot30 / 1 minuteAccountHAPPIER_DIAGNOSTICS_BUG_REPORT_SNAPSHOT_RATE_LIMIT_MAX
HAPPIER_DIAGNOSTICS_BUG_REPORT_SNAPSHOT_RATE_LIMIT_WINDOW
features120 / 1 minuteIP addressHAPPIER_FEATURES_RATE_LIMIT_MAX
HAPPIER_FEATURES_RATE_LIMIT_WINDOW
feed300 / 1 minuteAccountHAPPIER_FEED_RATE_LIMIT_MAX
HAPPIER_FEED_RATE_LIMIT_WINDOW
kv.list600 / 1 minuteAccountHAPPIER_KV_LIST_RATE_LIMIT_MAX
HAPPIER_KV_LIST_RATE_LIMIT_WINDOW
machines300 / 1 minuteAccountHAPPIER_MACHINES_RATE_LIMIT_MAX
HAPPIER_MACHINES_RATE_LIMIT_WINDOW
oauthExternal.authParams60 / 1 minuteIP addressHAPPIER_OAUTH_EXTERNAL_AUTH_PARAMS_RATE_LIMIT_MAX
HAPPIER_OAUTH_EXTERNAL_AUTH_PARAMS_RATE_LIMIT_WINDOW
oauthExternal.callback60 / 1 minuteIP addressHAPPIER_OAUTH_EXTERNAL_CALLBACK_RATE_LIMIT_MAX
HAPPIER_OAUTH_EXTERNAL_CALLBACK_RATE_LIMIT_WINDOW
oauthExternal.connectParams60 / 1 minuteAccountHAPPIER_OAUTH_EXTERNAL_CONNECT_PARAMS_RATE_LIMIT_MAX
HAPPIER_OAUTH_EXTERNAL_CONNECT_PARAMS_RATE_LIMIT_WINDOW
session.detail300 / 1 minuteAccountHAPPIER_SESSION_DETAIL_RATE_LIMIT_MAX
HAPPIER_SESSION_DETAIL_RATE_LIMIT_WINDOW
session.messages600 / 1 minuteAccountHAPPIER_SESSION_MESSAGES_RATE_LIMIT_MAX
HAPPIER_SESSION_MESSAGES_RATE_LIMIT_WINDOW
session.messages.byLocalId600 / 1 minuteAccountHAPPIER_SESSION_MESSAGES_BY_LOCAL_ID_RATE_LIMIT_MAX
HAPPIER_SESSION_MESSAGES_BY_LOCAL_ID_RATE_LIMIT_WINDOW
session.pending600 / 1 minuteAccountHAPPIER_SESSION_PENDING_RATE_LIMIT_MAX
HAPPIER_SESSION_PENDING_RATE_LIMIT_WINDOW
session.pending.materialize120 / 1 minuteAccountHAPPIER_SESSION_PENDING_MATERIALIZE_RATE_LIMIT_MAX
HAPPIER_SESSION_PENDING_MATERIALIZE_RATE_LIMIT_WINDOW
sessions.list300 / 1 minuteAccountHAPPIER_SESSIONS_LIST_RATE_LIMIT_MAX
HAPPIER_SESSIONS_LIST_RATE_LIMIT_WINDOW
share.public.manage10 / 1 minuteAccountHAPPIER_SHARE_PUBLIC_MANAGE_RATE_LIMIT_MAX
HAPPIER_SHARE_PUBLIC_MANAGE_RATE_LIMIT_WINDOW
share.public.messages20 / 1 minuteIP addressHAPPIER_SHARE_PUBLIC_MESSAGES_RATE_LIMIT_MAX
HAPPIER_SHARE_PUBLIC_MESSAGES_RATE_LIMIT_WINDOW
share.public.read10 / 1 minuteIP addressHAPPIER_SHARE_PUBLIC_READ_RATE_LIMIT_MAX
HAPPIER_SHARE_PUBLIC_READ_RATE_LIMIT_WINDOW
share.session.create20 / 1 minuteAccountHAPPIER_SHARE_SESSION_CREATE_RATE_LIMIT_MAX
HAPPIER_SHARE_SESSION_CREATE_RATE_LIMIT_WINDOW
voice.sessionComplete60 / 1 minuteAccountHAPPIER_VOICE_SESSION_COMPLETE_RATE_LIMIT_MAX
HAPPIER_VOICE_SESSION_COMPLETE_RATE_LIMIT_WINDOW
voice.token10 / 1 minuteAccountHAPPIER_VOICE_TOKEN_RATE_LIMIT_MAX
HAPPIER_VOICE_TOKEN_RATE_LIMIT_WINDOW

On this page