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
user.tags.contains('<TAG_A>') || user.tags.contains('<TAG_B>') would require two approvers in total from either tag, in any combination. This counts a total; see below for enforcing a separate minimum per tag.
Require multiple approvers across tags, with per-tag minimums
This policy requires at least 1 approver tagged<SECURITY_TAG_ID> and at least 2 approvers tagged <OPS_TAG_ID> to create, update, or delete policies. A user carrying both tags counts toward both minimums.
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
Allow exporting only wallet accounts under a hardened derivation subtree
This policy allows exporting only wallet accounts whose derivation path is a fully-hardened, 4-segment path of the formm/8797555'/x'/3'/y' (a Spark-purpose subtree). Because single-quoted
policy literals cannot contain ' (apostrophe), the path is matched structurally via
wallet_account.path_indexes and wallet_account.path_hardened rather than as a string. Note that
policies match the literal stored path; on ed25519, soft and hardened spellings derive the same key.
JSON
EXPORT_WALLET_ACCOUNT activities: on any other
activity, a condition referencing them produces an evaluation error (the policy’s outcome is an
error, not a match against empty values). Prefer narrow allow policies like this one over combining
a broad allow with a path-based EFFECT_DENY: during rollout windows where some Turnkey components
do not yet know these fields, an erroring deny is skipped while a broad allow still matches (failing
open), whereas a narrow allow that errors fails closed.