Skip to content
OpenAppPhysical access, simplified
Login

Expire dormant users

Type
auto_expire_dormant_users
Category
Lifecycle
Enforced at
Authoring-time
Tiers
OrgIntegration
Enforcement
Enforce
Default
Not configured — idle members and residents are not auto-expired.

Uses org_user_activity. Idle time is since last access, or since membership/resident created_at if they have never accessed. Combination takes the minimum days. Matching users have invitations revoked and residencies removed. The user record remains. Admins are exempt unless applies_to includes admin.

When it is enforced

Evaluated when someone creates or updates an invitation, hold, or share. Requests that would exceed the limit are rejected — they are not silently rewritten.

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.

NameTypeRequiredValuesDescription
daysintegerYesIdle days before expiry. Must be greater than 0.
applies_tostring 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: Type-specific; org/integration rows often bind residents, not generic members.
outputstring or integerNoOptional 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 of days across applicable rows. Disabled and audit_only rows never expire. Reject invalid days, do not clamp.

Example

A resident who has not accessed in 90 days loses residencies and authored invitations. Their login still exists. An org admin is left alone unless applies_to includes admin.

config
{
"days": 90
}

Integrations

This type is documented on these connectors: