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, or after a denial (notify 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
- EnforcementHow a configured row behaves. Enforce blocks. Require approval opens an admin inbox when the type supports it. Audit only records and never blocks.
- Enforce
- DefaultWhat happens when no row of this type is configured.
- Not configured — no policy throttle on opens.
Caps how many opens a principal may perform in a sliding window. Use this so a looping agent or script cannot hammer a door. Supply per_user and/or per_org as a positive integer.
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. Shared row fieldsenforcement (enforce, require_approval,audit_only) and enabled apply to every type;audit_only and disabled rows never block.
| Name | Type | Required | Values | Description |
|---|---|---|---|---|
| per_user | integer | No | — | Maximum opens per principal in the window. At least one of per_user or per_org must be an integer greater than 0. |
| per_org | integer | No | — | Maximum opens per organization in the window. Alternative to per_user. |
| window_seconds | integer | Yes | — | Sliding window length in seconds. Required; integer from 1 through 31536000 (365 days). |
| applies_to | string or string[] | No | agentapi_keyinvitationmemberresidentadminall | Principal kinds this row binds. Closed set: agent, api_key, invitation, member, resident, admin, all. Unknown strings and empty arrays are rejected. `all` matches every kind. When omitted, the type-specific default applies (see Default). Device-tier rows without `applies_to` often bind everyone, including admins. Default: agent, api_key, invitation |
| output | string or integer | No | — | Optional channel or output id. When set, the policy binds only that output. When omitted, it binds every output of the tier target. A scoped row does not apply when the acting output is unknown. |
How overlapping rows combine
Most-restrictive (minimum) numeric caps across applicable rows.
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)