Rate limit
- Type
- rate_limit
- Category
- Agent safety
- Enforced atWhen this policy is checked: while someone tries to open, while they create or change an invitation or hold, on a membership change or background sweep (lifecycle), or after a denial (record only).
- Access-time
- TiersWhere an admin can set this policy: the whole organization, one integration, or the physical device when the connector supports a device steward.
- OrgIntegration
- EnforcementEnforcement modes this type accepts. Enforce applies the row. Require approval (user sharing only) opens an admin approval inbox instead of blocking.
- Enforce
- DefaultWhat happens when no row of this type is configured.
- Not configured — no policy throttle on opens.
Caps how many entity actions a principal may perform in a sliding window. Use this so a looping agent or script cannot hammer a door. Supply per_user or per_org as a positive integer; when both are set, per_user is used. per_user counts per agent, per API key, or per signed-in user. Exceeding the cap returns 429. Evaluated on the entity-action API; not on the portal open paths.
When it is enforced
Evaluated when someone opens a door or gate or triggers an entity action. If this policy applies, the open is denied even when roles and grants would otherwise allow it.
Where to set it
Settings → Policies (org) or the integration Policies tab.
Policies never grant access. See thepolicies architecture guidefor how org, integration, and device tiers combine.
Arguments
The config object on create/update. Row fields outsideconfig are enforcement (this type acceptsenforce; any other value is rejected with 400), enabled (disabled rows never apply), and capability.
| Name | Type | Required | Values | Description |
|---|---|---|---|---|
| per_user | integer | No | — | Maximum actions per principal in the window. At least one of per_user or per_org must be an integer greater than 0. Takes precedence over per_org when both are set. |
| per_org | integer | No | — | Maximum actions per organization in the window, shared by every principal. Used only when per_user is absent. |
| window_seconds | integer | Yes | — | Sliding window length in seconds. Required; integer from 1 through 31536000 (365 days). |
| applies_to | string[] | No | agentapi_keyinvitationmemberresidentadminall | Principal kinds this row binds, as a non-empty array of agent, api_key, invitation, member, resident, admin, all. Other kinds, a bare string, and empty arrays are rejected. `all` matches every kind this policy can bind. A caller is every kind it is at once, and a row binds when any of them is listed. When omitted, the default applies. Default: agent, api_key, invitation |
How overlapping rows combine
For each principal kind the caller is, the row with the smallest cap (then the shortest window) applies. Distinct limits from different kinds are each counted once per request.
Example
An agent that retries an open more than 30 times in a minute is denied further opens until the window slides.
{ "per_user": 30, "window_seconds": 60, "applies_to": [ "agent", "api_key", "invitation" ]}Integrations
This type is documented on these connectors:
- Home Assistant (home_assistant)
- KNX (knx)
- MQTT (mqtt)
- PalGate Cloud (palgate_cloud)
- Shelly Cloud (shelly_cloud)
- Shelly Websocket (shelly_websocket)
- Tasmota (tasmota)
- Virtual Access (virtual_access)
- Virtual Demo Devices (virtual_demo)
- Waveshare (waveshare)
Related
- Policy catalog
- Policies architecture guide
- Require step-up (require_step_up)
- Quiet hours (quiet_hours)
- Emergency lockdown (emergency_lockdown)