Allow a specific user to create wallets
Allow users with a specific tag to create users
Require two users with a specific tag to add policies
Deny all delete actions for users with a specific tag
Allow a specific user (e.g. API-only user) to create a sub-org
Allow a specific user to perform auth type activities (full list here)
Note: Theactivity.resource portion determines which activities can be performed. The activity.action determines what types of actions can be taken upon those resources.
Allow a specific user to perform generic OTP activities
Allow a specific user to perform a specific activity type (full list here)
Note: Activities may be upgraded over time, and thus new versions may be introduced. These policies will NOT be valid if an activity type is upgraded and requests are made on the new activity type. For example, if Turnkey introducesACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V3 (upgraded from ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2)
and a request is made with the newer V3 version, this policy with not allow that user to perform ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V3 activities.
JSON
Allow a specific user to perform a specific activity kind (full list here)
Unlikeactivity.type, which targets one exact version, activity.kind is version-agnostic: a
single kind matches every version of an activity. Prefer activity.kind when you want a policy to
keep working as activities are upgraded. For example, the policy below continues to allow the user to
create read write sessions even if Turnkey introduces a newer version such as
ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V3, because CREATE_READ_WRITE_SESSION matches all
versions.
Not sure whether to use type, kind, or resource + action? See Choosing between type, kind, and resource + action for guidance.
JSON
Allow a specific user to sign transactions across all versions
JSON
Allow a specific credential type to perform a specific action (full list of credential types here)
This policy can be used to say, only passkeys are allowed to sign transactions and not authentication through SMS (or any other authentication method).JSON
Allow a specific credential with a specific public key type to perform a specific action
JSON
Allow exporting only a specific wallet account address
JSON
Time-based policies
The optional top-leveltime field gates when a policy is active. It is authored in the policy
language, must evaluate to a bool, and is evaluated against trusted server time. When time is
absent or empty the policy is always active; when it evaluates to false the policy is skipped for
that request. See Time in the language reference for full
details on time.now, Timestamp(...), and CronSpan(...).
Grant a user temporary access for a fixed window (one-shot)
This policy allows the user to sign transactions only during January 2025 (UTC). The window is start-inclusive and end-exclusive, so it becomes active at2025-01-01T00:00:00Z and inactive at
2025-02-01T00:00:00Z. Outside the window the time field evaluates to false and the policy is
skipped.
Allow signing only during business hours
CronSpan fires once at 9:00 AM Eastern on weekdays and holds each window open for 8 hours, covering
9:00 AM–5:00 PM Monday through Friday. Because the time zone is IANA-based, the window follows
daylight saving automatically.
Model business hours as one fire plus an 8-hour duration. Do not use an hour-range cron like
0 9-17 * * 1-5 to mean “9 to 5”: under the fire-plus-duration model that opens a separate window
at every hour and will not produce a single continuous span.Allow signing during an overnight window (crossing midnight)
A window that crosses midnight needs no special handling: fire in the evening and give it a duration that runs into the next morning. This opens a window every night at 10:00 PM Eastern that stays active until 6:00 AM.Bound a recurring window to a fixed date range (composed)
Becausetime is a boolean expression, you can intersect a recurring span with a one-shot bound.
This grants business-hours signing, but only through the end of 2025; afterward the && makes the
whole expression false.
Full policy combining consensus, condition, and time
Thetime field composes with the other policy fields: this policy applies only when the approver,
the request, and the current time all match. Here, members of the ops team may sign transactions to
the treasury address, but only during business hours.