Docs · the operator contract

The Admin API.

The official contract for the operator surface of a Signet instance (/admin/v1): 46 operations across users, sessions, tokens, delivery and event dead-letters, configuration, audit and stats. Pinned at tag signetctl-v0.1.0.

statsusersapp-userssessionsapi-keysservice-principalsauthorization-rolesprincipal-role-grantsservice-tokenssigning-keysplatform-credentialstokensdeliverieseventsconfigaudit

Two authorities, deliberately separate. A running instance serves the auth-wire OpenAPI at /api/auth/open-api/generate-schema, and that document covers the better-auth wire only. This contract lives in the repository and covers the operator surface; instances do not serve it.
The names are load-bearing. Every operationId equals a signetctl command path: users_list is signetctl users list. A build gate asserts the bijection in both directions, so the contract and the CLI cannot drift apart. The signetctl reference is the same list wearing its terminal form.

stats

OperationRouteWhat it does
statsGET /admin/v1/statsInstance stats: users, active sessions, sign-ins per day, delivery and rate-limit counters

users

OperationRouteWhat it does
users_listGET /admin/v1/usersList users, newest first, with case-insensitive substring search over email and name
users_createPOST /admin/v1/usersCreate a user (optionally with password, role, and profile data)
users_set_rolePOST /admin/v1/users/{id}/roleSet a user's role or roles
users_deleteDELETE /admin/v1/users/{id}IRREVERSIBLE: delete a user and every row they own
users_banPOST /admin/v1/users/{id}/banBan a user (reversible): revokes their sessions and user-backed credentials
users_unbanPOST /admin/v1/users/{id}/unbanLift a user's ban
users_unlockPOST /admin/v1/users/unlockClear a lockout/escalation state, addressed by email (not id)
users_sessionsGET /admin/v1/users/{id}/sessionsList a user's sessions
users_revoke_allPOST /admin/v1/users/{id}/revoke-allRevoke every session belonging to a user

app-users

OperationRouteWhat it does
app_users_listGET /admin/v1/app-usersList one canonical application's end-user population, newest first
app_users_createPOST /admin/v1/app-usersCreate one tenant/application-scoped end user
app_users_deleteDELETE /admin/v1/app-users/{id}IRREVERSIBLE: erase one app_user principal and its sessions

sessions

OperationRouteWhat it does
sessions_revokePOST /admin/v1/sessions/{token}/revokeRevoke one session by its at-rest token reference

api-keys

OperationRouteWhat it does
api_keys_mintPOST /admin/v1/api-keysMint a declared-permission API key for an existing user

service-principals

OperationRouteWhat it does
service_principals_listGET /admin/v1/service-principalsService identities, keyset-paged (cursor, not offset) and filterable by organization
service_principals_createPOST /admin/v1/service-principalsCreate a stable tenant-owned service identity with a server-generated id
service_principals_getGET /admin/v1/service-principals/{id}One service identity with its role grants and each credential's engine-computed ceiling
service_principals_deleteDELETE /admin/v1/service-principals/{id}Delete one disarmed service principal after all credentials and open batches are terminal

authorization-roles

OperationRouteWhat it does
authorization_roles_listGET /admin/v1/authorization-rolesPersisted D150 roles, keyset-paged and filterable by organization
authorization_roles_createPOST /admin/v1/authorization-rolesCreate an immutable named D150 permission bundle in one exact scope

principal-role-grants

OperationRouteWhat it does
principal_role_grants_listGET /admin/v1/principal-role-grantsWhich identities hold which roles, keyset-paged and filterable by principal and/or role
principal_role_grants_createPOST /admin/v1/principal-role-grantsGrant one existing scoped authorization role to one existing principal

service-tokens

OperationRouteWhat it does
service_tokens_mintPOST /admin/v1/service-tokensMint a required-expiry credential for an existing service principal
service_tokens_rotatePOST /admin/v1/service-tokens/{id}/rotateRotate one active service token with an explicit bounded overlap
service_tokens_mint_batchPOST /admin/v1/service-token-batchesIdempotently mint one pre-provisioned tenant credential manifest
service_tokens_reconcile_batchPOST /admin/v1/service-token-batches/{id}/reconcileAbandon one crashed U13 claim and revoke every reverse-linked destination token
service_tokens_remint_batchPOST /admin/v1/service-token-remintsPrevalidate and remint one complete U6 legacy-credential batch

signing-keys

OperationRouteWhat it does
signing_keys_listGET /admin/v1/signing-keysList Ed25519 JWKS signing-key lifecycle metadata
signing_keys_preparePOST /admin/v1/signing-keys/preparePrepare one Ed25519 JWKS successor
signing_keys_activatePOST /admin/v1/signing-keys/{kid}/activateActivate a dwelled prepared JWKS successor
signing_keys_revokePOST /admin/v1/signing-keys/{handle}/revokeRevoke a prepared, retiring, or emergency active JWKS key

platform-credentials

OperationRouteWhat it does
platform_credentials_listGET /admin/v1/platform-credentialsList durable platform-administrator credential lifecycle metadata
platform_credentials_rotatePOST /admin/v1/platform-credentials/rotateMint a managed platform credential with bounded predecessor overlap
platform_credentials_revokePOST /admin/v1/platform-credentials/{id}/revokeRevoke one retiring or offline-recovery platform credential

tokens

OperationRouteWhat it does
tokens_listGET /admin/v1/tokensToken inventory, keyset-paged (cursor, not offset)
tokens_configGET /admin/v1/tokens/configThe token-kind registry (read-only)
tokens_getGET /admin/v1/tokens/{id}One token record by handle
tokens_revokePOST /admin/v1/tokens/{id}/revokeRevoke one exact token handle
tokens_revoke_principalPOST /admin/v1/principals/{id}/tokens/revokeReview then atomically revoke one service principal's exact active credential estate

deliveries

OperationRouteWhat it does
deliveries_dead_lettersGET /admin/v1/deliveries/dead-lettersList delivery dead-letters (undeliverable emails/webhooks)
deliveries_replayPOST /admin/v1/deliveries/dead-letters/{id}/replayReplay one dead-lettered delivery

events

OperationRouteWhat it does
events_dead_lettersGET /admin/v1/events/dead-lettersList event dead-letters
events_replayPOST /admin/v1/events/dead-letters/{id}/replayReplay one dead-lettered event

config

OperationRouteWhat it does
config_showGET /admin/v1/configConfiguration introspection: secrets absent by construction, never masked

audit

OperationRouteWhat it does
audit_exportGET /admin/v1/audit/exportExport the admin audit log as NDJSON

Absent by design, recorded rather than forgotten: organisations, API keys and OAuth2 clients have no operator-key surface today. When the engine ships one, it is added to the contract first, then the CLI grows the verb. The surface mounts only when an admin key is configured; without one, every path answers 404.