Skip to content
Development documentation
This describes Keydra as it is being built and is not a released version. What it documents can change before a release.

API reference

A REST surface under /api/v1 and a GraphQL one beside it, both calling the same services under the same permissions, plus the sockets and streams.

The two surfaces, and which is which#

Keydra answers on two surfaces, and they are not two halves of one thing.

GraphQL at /graphql

135 operations. This is what the Keydra interface uses. Nearly every page — the connection catalog, the key browser’s tree and its mutations, monitoring, migrations, schedules, alerts, backups, tunnels, access control, the audit log, sessions — asks its questions here.

REST under /api/v1

161 endpoints. The complete surface, and the one to write a script or another tool against. Versioned in the path, so /api/v1 is a promise in a way an internal query is not.

Both call the same services and return the same shapes: a GraphQL type is the DTO the REST endpoint already returns, which is what keeps the two from drifting into disagreeing about what a field is called. Every operation on both carries the same permission check — a resolver that reached a repository directly would be a second door into the same house.

Why the interface moved#

A page that needs three unrelated things made three requests, and a page showing six columns of a long list downloaded all of every row. /api/v1/migrations answers 31 KB and /api/v1/schedules/runs 22 KB; a table showing six columns of each reads perhaps a tenth of it.

Pages moved one at a time, and whole — half a page on each surface is two caches to reason about. A REST endpoint stays until nothing calls it, which is why the list below is longer than what the interface uses.

What the interface still asks over REST#

Not leftovers, in most cases, but the things GraphQL is the wrong shape for:

Files

Exporting keys, and importing them. A file is not a field.

Values

Reading and writing the contents of a key, and the list of encodings.

Signing in

The form post, sign-out, first-run setup, the provider redirect, and the invitation and password-reset pages. These run before there is a session to ask a question with.

/api/v1/about

One small record, read once.

The sockets

The notification hub, the console and the command watch. Each carries a kind of event to whoever is listening; a subscription per page would be a second socket saying the same thing.

Authentication#

Both surfaces are authenticated by the session cookie the interface already holds. There is no separate API token mechanism: a script runs as somebody, and that somebody signs in.

GraphQL refuses GET. A query in a URL is a query in a proxy log, a browser history and a referrer header, and Keydra’s queries name connection ids and key patterns.

Introspection and the schema document are on in development and off in production. Neither is a vulnerability by itself — an authenticated caller reaches what they may reach either way — but a schema is a map of every field and argument, and a production deployment has nobody who needs the map.

OpenAPI#

A running Keydra publishes its own OpenAPI document:

bash
curl -s http://localhost:8181/api/openapi > keydra-openapi.yaml

In the development profile, /q/swagger-ui browses it interactively.

That document is the authoritative schema: request and response shapes, status codes and validation rules come from the code that serves them. The tables below name the endpoints and what each requires; the document names the fields.

The GraphQL schema is served at /graphql/schema.graphql in development, where introspection is also on. Both are off in production.

WebSockets and streams#

Path Description

/api/v1/connections/{connectionId}/commands

The target’s own MONITOR stream, with secrets redacted before they leave the engine. Off until asked for, because it costs the server work while it is on.

/api/v1/connections/{connectionId}/console

A command console session against one target. Typed results are streamed back as they arrive.

/api/v1/notifications

The notification hub. One socket for the whole interface, carrying every server-side change as an envelope of a category, a payload and a timestamp. A broadcast about one target reaches only the sockets whose owner may see it.

The notification envelope#

Everything on the hub is the same shape:

json
{
  "category": "ConnectionStatusChanged",
  "payload": { },
  "ts": "2026-01-01T00:00:00Z"
}

A broadcast about one target reaches only the sockets whose owner may see that target.

Category Description

ConnectionCreated

A connection profile was added.

ConnectionUpdated

A connection profile changed. Its pooled clients and its tunnel are closed, because it may now point somewhere else.

ConnectionDeleted

A connection profile was removed.

ConnectionStatusChanged

A target went up, went down, or reported a different flavor or version.

KeysChanged

Keys on a target were created, renamed, expired or deleted.

ValueChanged

The contents of a key changed.

ChannelMessage

A message arrived on a subscribed channel.

SubscriptionChanged

A subscription opened, closed, or dropped because its connection did.

MetricsSample

A fresh reading of a watched target.

MonitoringChanged

Sampling started or stopped for a target.

MigrationProgress

How far a migration between two targets has got. Broadcast rather than answered on the request that started it, so a page reloaded halfway through does not lose sight of a job that is still running.

ScheduleFailed

A scheduled job did not do what it was arranged to do. Only the failures — a toast per successful run every five minutes would bury the one that matters.

ScheduleRan

A scheduled job finished, whatever it did. For a table drawing a "last run" column, which has to change on a success as much as on a failure.

AlertChanged

An alert rule moved between quiet, pending and firing. Only the transitions, so a rule firing for six hours sends one message.

SessionEnded

A session was ended, here or elsewhere. The browser holding it stops working on its next request.

SignInFlagged

A sign-in that succeeded looked unlike the ones before it.

PurgeProgress

How far a purge has got. A glob delete walks the keyspace a batch at a time, so it reports as it goes rather than answering once at the end — a page that showed nothing for four minutes would be indistinguishable from one that had stopped.

ApprovalRequested

Somebody asked for an operation on a target that waits for a second person. It carries the request’s id and the target, and nothing else: the audience is everybody who can see that target, which is wider than the set of people who could answer it.

ApprovalChanged

A request was approved, declined, withdrawn, expired, or finished running. Every ending, including the ones nobody pressed, because the person waiting for an answer is the one who most needs to see it arrive.

Server-Sent Events#

Key enumeration streams as Server-Sent Events rather than being buffered into a response, so the interface renders the first keys while a SCAN is still running. The GraphQL subscription beside it sends only the fields the caller named — a browser showing names and types is sent names and types, not the TTL and size of every key in a million-key database.

REST endpoints#

Grouped by the tag each resource carries. Required names the permission the endpoint checks; where a coarse role is the only gate, the role is named instead.

This is the whole surface, including the endpoints the interface no longer calls. They stay until nothing calls them — deleting one the day its last caller moved is how a client nobody remembered gets broken.

About
Method Path Required What it does

GET

/api/v1/about

Being signed in

Get application name, version and build metadata

Alert deliveries
Method Path Required What it does

GET

/api/v1/alert-deliveries

admin

Every configured delivery, and how many rules use it

POST

/api/v1/alert-deliveries

admin

Add somewhere to send alerts

DELETE

/api/v1/alert-deliveries/{id}

admin

Remove a delivery

PUT

/api/v1/alert-deliveries/{id}

admin

Change a delivery

POST

/api/v1/alert-deliveries/{id}/check

admin

Send a test message

GET

/api/v1/alert-deliveries/instance-notices

admin

Which destinations hear about Keydra itself

PUT

/api/v1/alert-deliveries/instance-notices

admin

Choose which destinations hear about Keydra itself

Alerts
Method Path Required What it does

GET

/api/v1/alerts

viewer, operator, admin

Every rule, with where it currently stands

POST

/api/v1/alerts

alert:manage

Watch for a condition

DELETE

/api/v1/alerts/{id}

alert:manage

Remove a rule, and the record of what it said

PUT

/api/v1/alerts/{id}

alert:manage

Change a rule

GET

/api/v1/alerts/events

viewer, operator, admin

What the rules have said

GET

/api/v1/alerts/metrics

viewer, operator, admin

The metrics a rule can watch

Analysis
Method Path Required What it does

GET

/api/v1/connections/{connectionId}/analysis/keyspace

analysis:read

Where this target’s memory went

Approvals
Method Path Required What it does

GET

/api/v1/approvals

operator, admin

Operations waiting for a second person

DELETE

/api/v1/approvals/{id}

operator, admin

Withdraw a request you made

GET

/api/v1/approvals/{id}

operator, admin

One request, with what it would do

POST

/api/v1/approvals/{id}/approve

operator, admin

Agree to an operation, which starts it

POST

/api/v1/approvals/{id}/decline

operator, admin

Say no, and say why

Authentication
Method Path Required What it does

POST

/api/v1/auth/logout

Being signed in

End this session

GET

/api/v1/auth/permissions

Being signed in

What the caller may do, per target

POST

/api/v1/auth/setup

Being signed in

Create the first administrator

GET

/api/v1/auth/state

Being signed in

Whether there is anything to sign into, and whether anybody has

Backup destinations
Method Path Required What it does

GET

/api/v1/backup-destinations

admin

Every configured destination

POST

/api/v1/backup-destinations

admin

Add a destination

DELETE

/api/v1/backup-destinations/{id}

admin

Remove a destination

PUT

/api/v1/backup-destinations/{id}

admin

Change a destination

POST

/api/v1/backup-destinations/{id}/check

admin

Find out whether it works

POST

/api/v1/backup-destinations/check

admin

Try a destination that has not been saved

POST

/api/v1/backup-destinations/keys

admin

Generate a key pair for encrypting backups

Connections
Method Path Required What it does

GET

/api/v1/connections

Being signed in

List all connection profiles with their last known status

POST

/api/v1/connections

connection:create

Create a connection profile

DELETE

/api/v1/connections/{id}

connection:delete

Delete a connection profile

GET

/api/v1/connections/{id}

connection:view

Get one connection profile

PUT

/api/v1/connections/{id}

connection:edit

Update a connection profile

POST

/api/v1/connections/{id}/test

connection:view

Probe a saved profile and record the result

POST

/api/v1/connections/test

connection:create

Probe a profile that has not been saved

Console
Method Path Required What it does

GET

/api/v1/connections/{connectionId}/console/denied-commands

console:run

Commands the console refuses to run on this target

DELETE

/api/v1/connections/{connectionId}/console/history

console:run

Forget your own command history on this target

GET

/api/v1/connections/{connectionId}/console/history

console:run

Command lines you have previously run against this target

Databases
Method Path Required What it does

GET

/api/v1/connections/{connectionId}/databases

Being signed in

The databases this target holds

Encryption
Method Path Required What it does

GET

/api/v1/security/encryption

admin

Which key the stored secrets are under

POST

/api/v1/security/encryption/rotate

admin

Re-encrypt everything with the key that writes now

Grants
Method Path Required What it does

GET

/api/v1/authz/grants

admin

Every grant, with names beside the ids

POST

/api/v1/authz/grants

admin

Grant a role on a scope

DELETE

/api/v1/authz/grants/{id}

admin

Take a grant back

Groups
Method Path Required What it does

GET

/api/v1/authz/groups

admin

Every group, with what is directly inside it

POST

/api/v1/authz/groups

admin

Create a group

DELETE

/api/v1/authz/groups/{id}

admin

Remove a group

POST

/api/v1/authz/groups/{id}/members

admin

Put a person, or another group, into this group

DELETE

/api/v1/authz/groups/members/{membershipId}

admin

Take something out of a group

Identity providers
Method Path Required What it does

GET

/api/v1/authz/providers

admin

Every configured provider

POST

/api/v1/authz/providers

admin

Add a provider

DELETE

/api/v1/authz/providers/{id}

admin

Remove a provider

PUT

/api/v1/authz/providers/{id}

admin

Change a provider

POST

/api/v1/authz/providers/{id}/group-mappings

admin

Map a claim value to a Keydra group

DELETE

/api/v1/authz/providers/group-mappings/{mappingId}

admin

Remove a mapping

Instances
Method Path Required What it does

GET

/api/v1/instances

instance:read

Who is running and what they depend on

DELETE

/api/v1/instances/{id}/drain

instance:drain

Put an instance back into service

POST

/api/v1/instances/{id}/drain

instance:drain

Take an instance out of service

POST

/api/v1/instances/reachability

instance:read

Ask everything Keydra reaches whether it is there, now

GET

/api/v1/instances/reachability/history

instance:read

When things Keydra reaches started and stopped answering

GET

/api/v1/instances/roster

instance:read

Who is running, and what each of them is holding

Invitations
Method Path Required What it does

GET

/api/v1/invitations/{token}

Open to anybody

Whether a link can still be used

POST

/api/v1/invitations/{token}

Open to anybody

Set a password with a link

POST

/api/v1/invitations/for-user/{id}

users:manage

Send somebody a link to set their own password

POST

/api/v1/invitations/forgotten

Open to anybody

Ask for a link because a password has been forgotten

Keys
Method Path Required What it does

GET

/api/v1/connections/{connectionId}/keys

keys:read

Stream keys matching a filter

POST

/api/v1/connections/{connectionId}/keys/copy

keys:write

Copy a key to a new name

POST

/api/v1/connections/{connectionId}/keys/delete

keys:delete

Delete one or more keys

POST

/api/v1/connections/{connectionId}/keys/expire

keys:write

Set or clear a key’s TTL

POST

/api/v1/connections/{connectionId}/keys/export

transfer:export

Export keys as the store’s own serialisation

POST

/api/v1/connections/{connectionId}/keys/import

transfer:import

Restore exported keys

GET

/api/v1/connections/{connectionId}/keys/migrate

migration:run

Migrations started from this target

POST

/api/v1/connections/{connectionId}/keys/migrate

migration:run

Move keys to another target

DELETE

/api/v1/connections/{connectionId}/keys/migrate/{jobId}

migration:run

Stop a migration

POST

/api/v1/connections/{connectionId}/keys/purge

keys:delete

Delete everything a pattern matches

POST

/api/v1/connections/{connectionId}/keys/rename

keys:write

Rename a key

GET

/api/v1/connections/{connectionId}/keys/tree

keys:read

List the namespace level below a prefix

DELETE

/api/v1/connections/{connectionId}/keyspace-watch

keys:read

Give a lease back

GET

/api/v1/connections/{connectionId}/keyspace-watch

keys:read

Whether this target’s changes are being heard

POST

/api/v1/connections/{connectionId}/keyspace-watch

keys:read

Take or renew a lease on this target’s changes

POST

/api/v1/connections/{connectionId}/keyspace-watch/announce

server:configure

Ask the target to announce its changes

Migrations
Method Path Required What it does

GET

/api/v1/migrations

Being signed in

Every migration this instance knows about

Monitoring
Method Path Required What it does

DELETE

/api/v1/connections/{connectionId}/monitoring

monitoring:manage

Stop sampling this target

GET

/api/v1/connections/{connectionId}/monitoring

monitoring:read

Sampling state and the readings collected so far

POST

/api/v1/connections/{connectionId}/monitoring

monitoring:manage

Start sampling this target

GET

/api/v1/connections/{connectionId}/monitoring/big-keys

monitoring:read

The largest keys in a sample of the keyspace

GET

/api/v1/connections/{connectionId}/monitoring/clients

monitoring:read

Clients currently attached to the server

DELETE

/api/v1/connections/{connectionId}/monitoring/clients/{clientId}

monitoring:manage

Disconnect a client

GET

/api/v1/connections/{connectionId}/monitoring/history

monitoring:read

Readings over a window

GET

/api/v1/connections/{connectionId}/monitoring/info

monitoring:read

Raw server statistics, grouped by section

GET

/api/v1/connections/{connectionId}/monitoring/sample

monitoring:read

One reading of this target’s vital signs, taken now

DELETE

/api/v1/connections/{connectionId}/monitoring/slowlog

monitoring:manage

Clear the slow log

GET

/api/v1/connections/{connectionId}/monitoring/slowlog

monitoring:read

Commands the server recorded as slow, newest first

Preferences
Method Path Required What it does

GET

/api/v1/preferences

Being signed in

Everything you prefer

POST

/api/v1/preferences

Being signed in

Set one preference

DELETE

/api/v1/preferences/{name}

Being signed in

Forget one preference

Pub/Sub
Method Path Required What it does

POST

/api/v1/connections/{connectionId}/pubsub/publish

pubsub:publish

Publish a message

DELETE

/api/v1/connections/{connectionId}/pubsub/subscription

pubsub:subscribe

Stop listening on this target

GET

/api/v1/connections/{connectionId}/pubsub/subscription

pubsub:subscribe

What this target is currently subscribed to

POST

/api/v1/connections/{connectionId}/pubsub/subscription

pubsub:subscribe

Listen on a target’s channels

GET

/api/v1/subscriptions

viewer, operator, admin

Every subscription this server currently holds open

Roles
Method Path Required What it does

GET

/api/v1/authz/roles

admin

Every role and what it carries

POST

/api/v1/authz/roles

admin

Create a custom role

DELETE

/api/v1/authz/roles/{id}

admin

Remove a custom role

PUT

/api/v1/authz/roles/{id}

admin

Change a custom role

GET

/api/v1/authz/roles/permissions

admin

Every permission there is

Schedules
Method Path Required What it does

GET

/api/v1/schedules

operator, admin

Every schedule, with when it last ran and when it runs next

POST

/api/v1/schedules

schedule:manage

Arrange work to happen on its own

DELETE

/api/v1/schedules/{id}

schedule:manage

Remove a schedule, and the record of what it did

PUT

/api/v1/schedules/{id}

schedule:manage

Change a schedule

POST

/api/v1/schedules/{id}/run

schedule:manage

Run it now

GET

/api/v1/schedules/job-types

operator, admin

The kinds of work that can be scheduled

GET

/api/v1/schedules/runs

operator, admin

What the schedules have done

Second factor
Method Path Required What it does

DELETE

/api/v1/auth/second-factor

Being signed in

Turn off your second factor

GET

/api/v1/auth/second-factor

Being signed in

Whether you have a second factor, and how many recovery codes are left

POST

/api/v1/auth/second-factor

Being signed in

Begin pairing an authenticator

POST

/api/v1/auth/second-factor/confirm

Being signed in

Prove the pairing with one code

POST

/api/v1/auth/second-factor/recovery-codes

Being signed in

Replace your recovery codes

Security
Method Path Required What it does

GET

/api/v1/connections/{connectionId}/acl

acl:read

Users the target knows about

PUT

/api/v1/connections/{connectionId}/acl

acl:manage

Create or replace a user

DELETE

/api/v1/connections/{connectionId}/acl/{username}

acl:manage

Remove a user from the target

GET

/api/v1/connections/{connectionId}/acl/categories

acl:read

Permission categories the target defines

GET

/api/v1/security/audit

audit:read

What has been done, newest first

GET

/api/v1/security/audit/actions

audit:read

The action names recorded so far

GET

/api/v1/security/me

Open to anybody

Who Keydra thinks is asking, and what they may do

Server groups
Method Path Required What it does

GET

/api/v1/authz/server-groups

admin

Every server group, with the targets in it

POST

/api/v1/authz/server-groups

admin

Create a server group

DELETE

/api/v1/authz/server-groups/{id}

admin

Remove a server group

DELETE

/api/v1/authz/server-groups/{id}/servers/{connectionId}

admin

Take a target out of this group

POST

/api/v1/authz/server-groups/{id}/servers/{connectionId}

admin

Put a target into this group

ServerAdministration
Method Path Required What it does

GET

/api/v1/connections/{connectionId}/admin/persistence

server:read

How this target is keeping its data

POST

/api/v1/connections/{connectionId}/admin/persistence/rewrite

server:configure

Rewrite the append-only log, compacting it

POST

/api/v1/connections/{connectionId}/admin/persistence/snapshot

server:configure

Write a snapshot in the background

GET

/api/v1/connections/{connectionId}/admin/settings

server:read

Everything this target is configured to do

POST

/api/v1/connections/{connectionId}/admin/settings

server:configure

Change one setting while the server runs

POST

/api/v1/connections/{connectionId}/admin/settings/persist

server:configure

Write the running configuration back to the server’s own file

Sessions
Method Path Required What it does

DELETE

/api/v1/auth/sessions

Being signed in

End every session except this one

GET

/api/v1/auth/sessions

Being signed in

The browsers you are signed in on

DELETE

/api/v1/auth/sessions/{id}

Being signed in

End one of your sessions

Sign-in policy
Method Path Required What it does

GET

/api/v1/auth/policy

policy:manage

What is asked of whoever signs in

PUT

/api/v1/auth/policy

policy:manage

Require a second factor, or stop requiring one

Sign-in providers
Method Path Required What it does

GET

/api/v1/auth/providers

Being signed in

The ways in this instance offers

GET

/api/v1/auth/providers/{key}/callback

Being signed in

Where the provider sends people back to

GET

/api/v1/auth/providers/{key}/start

Being signed in

Begin signing in through a provider

Topology
Method Path Required What it does

GET

/api/v1/connections/{connectionId}/topology

connection:view

How this target is arranged and what it supports

Tunnels
Method Path Required What it does

GET

/api/v1/tunnels

admin

Every configured tunnel

POST

/api/v1/tunnels

admin

Add a tunnel

DELETE

/api/v1/tunnels/{id}

admin

Remove a tunnel

PUT

/api/v1/tunnels/{id}

admin

Change a tunnel

POST

/api/v1/tunnels/{id}/check

admin

Find out whether it works

POST

/api/v1/tunnels/check

admin

Try a jump host that has not been saved

Users
Method Path Required What it does

GET

/api/v1/authz/users

admin

Everybody, with the groups they are directly in

POST

/api/v1/authz/users

admin

Create a local account

DELETE

/api/v1/authz/users/{id}

admin

Remove an account

PUT

/api/v1/authz/users/{id}

admin

Change an account

Values
Method Path Required What it does

GET

/api/v1/connections/{connectionId}/value

values:read

Read a page of a key’s value

POST

/api/v1/connections/{connectionId}/value

values:write

Change a value

GET

/api/v1/connections/{connectionId}/value/encodings

viewer, operator, admin

List the decoders a client may request

GraphQL operations#

What the Keydra interface actually asks. Mutations are here too: the surface is not read-only.

query
Operation Required What it does

accounts

users:manage

Every account, with the roles it holds

aclCategories

acl:read

The command categories a rule can name, as this server spells them

aclUsers

acl:read

The accounts the server itself knows about, and what each may run

alertDeliveries

alert-delivery:manage

The channels a firing rule can send word through

alertEvents

viewer, operator, admin

What has fired and what has cleared, newest first

alertMetrics

viewer, operator, admin

The metrics a rule can watch, each with its unit

alertRules

viewer, operator, admin

The rules, with what each one is reading now and which state it is in

askableCommands

admin

Commands a target can be allowed to run, each with what allowing it means

auditActions

audit:read

Every kind of action that has been recorded, for a filter to offer

auditLog

audit:read

A page of the audit log, newest first

authState

Being signed in

What this instance expects of whoever is asking

backup

transfer:import

One backup’s header, read without downloading the whole file

backupDestinations

backup:manage

Every destination, without the credentials they hold

backups

transfer:import

What is already in a destination, newest first

biggestKeys

monitoring:read

The biggest keys found by sampling the keyspace

capabilities

connection:view

What a target can do, which decides which tools are offered for it

clients

monitoring:read

Who is connected to the target right now

connection

connection:view

One target, by id

connections

viewer, operator, admin

Every target the caller can see, with its last known status

consoleHistory

console:run

What you have run against this target, newest first, with values redacted

databases

connection:view

The numbered databases on a target, with how many keys each holds

deniedCommands

console:run

The commands this target refuses to run, whoever is asking

effectivePermissions

Being signed in

What the caller may do, over Keydra itself and over each target

encryptionStatus

crypto:rotate

Which key the stored secrets are under, and how many are not

flaggedSignInCount

audit:read

How many flagged sign-ins there are in the window

flaggedSignIns

audit:read

Sign-ins that worked but did not look like the ones before them

fleet

viewer, operator, admin

One reading from every target the caller can see

grants

grants:manage

Who holds which role, over what

groups

groups:manage

Every group, with who is in it

identityProviders

idp:manage

Every provider, with the redirect URI each one has to be told about

keyspaceReport

analysis:read

What the keyspace holds, worked out by sampling it

keyspaceWatch

keys:read

Whether a target announces its changes, and whether anybody is listening

me

Being signed in

Who is asking, the roles they hold, and whether access is being enforced

migrations

viewer, operator, admin

A page of migrations, newest first, filtered to what the caller can see

monitoring

monitoring:read

Whether a target is being sampled, and since when

monitoringHistory

monitoring:read

Readings between two moments, evenly divided into points

monitoringSample

monitoring:read

One reading, taken now

mySessionCount

Being signed in

How many browsers there are to page through

mySessions

Being signed in

Every browser that can act as you right now, the one reading this first

mySignInCount

Being signed in

How many sign-ins there are to page through

mySignIns

Being signed in

Your own recent sign-ins, newest first

namespaceTree

keys:read

One level of the keyspace, grouped by a delimiter

permissionCatalogue

grants:manage

Every permission a role can carry, with the level it applies at

persistence

server:read

Whether the server is writing to disk, and when it last did

refusedSignIns

audit:read

Sign-ins that were refused, newest first

roles

grants:manage

Every role, built in or defined here, with the permissions it carries

scheduleJobTypes

operator, admin

The kinds of work that can be scheduled, with the permission each one needs

scheduleRuns

operator, admin

What became of the arranged work, newest first

schedules

operator, admin

Every schedule, with when it last ran and when it runs next

serverGroups

groups:manage

Every server group, with which targets are in it

serverSettings

server:read

The server’s own configuration, as it reports it

signInOptions

Being signed in

The ways of signing in this instance offers, other than a password here

signInPolicy

policy:manage

What this instance asks of whoever signs in

slowLog

monitoring:read

The commands the server itself recorded as slow

subscription

pubsub:subscribe

What this target is being listened to for, or nothing

topology

connection:view

The shape of the target: standalone, replicated, sentinel or clustered

tunnels

tunnel:manage

Every jump host, without the keys they hold

mutation
Operation Required What it does

addGroupMember

groups:manage

Puts an account, or another group, inside a group

addProviderGroupMapping

idp:manage

Says which local group a claim value puts somebody in

addServerToGroup

groups:manage

Puts a target in a server group

announceKeyspaceChanges

server:configure

Asks a target to announce its changes, keeping whatever its setting already said

cancelMigration

migration:run

Stops a migration; what has moved stays moved

changeServerSetting

server:configure

Changes one setting on the running server

checkAlertDelivery

alert-delivery:manage

Sends a test message through a channel and reports what happened

checkBackupDestination

backup:manage

Reaches the destination and reports what happened

checkConnection

connection:create

Opens a connection to the target and reports what came back

checkTunnel

tunnel:manage

Opens the tunnel and reports what happened

clearConsoleHistory

console:run

Empties your own command history on this target

clearSlowLog

monitoring:manage

Empties the server’s own slow log

copyKey

keys:write

Copies a key, here or to another target

createAccount

users:manage

Adds an account; the password is set by whoever accepts the invitation

createAlertDelivery

alert-delivery:manage

Adds a channel for firing rules to send word through

createAlertRule

alert:manage

Adds a rule watching one metric on one target

createBackupDestination

backup:manage

Adds a destination for backups to be written to

createConnection

connection:create

Adds a target

createGroup

groups:manage

Adds a group

createIdentityProvider

idp:manage

Adds a provider people can sign in through

createRole

grants:manage

Defines a role

createSchedule

schedule:manage

Arranges a job to run on a cron expression

createServerGroup

groups:manage

Adds a server group, so a grant can name several targets at once

createTunnel

tunnel:manage

Adds a jump host

deleteAccount

users:manage

Removes an account and every grant it held

deleteAclUser

acl:manage

Removes one of the server’s own accounts

deleteAlertDelivery

alert-delivery:manage

Removes a channel

deleteAlertRule

alert:manage

Removes a rule

deleteBackupDestination

backup:manage

Removes a destination

deleteConnection

connection:delete

Removes a target and everything Keydra kept about it

deleteGroup

groups:manage

Removes a group and every grant it held

deleteIdentityProvider

idp:manage

Removes a provider; accounts it created stay, and can no longer sign in with it

deleteKeys

keys:delete

Removes the named keys

deleteRole

grants:manage

Removes a role and every grant of it

deleteSchedule

schedule:manage

Removes a schedule

deleteServerGroup

groups:manage

Removes a server group and every grant scoped to it

deleteTunnel

tunnel:manage

Removes a jump host

endOtherSessions

Being signed in

Ends every session but this one, and answers how many

endSession

Being signed in

Ends one of your sessions; it stops on that browser’s next request

expireKey

keys:write

Sets or clears a key’s time to live

generateBackupKeyPair

backup:manage

Makes a key pair; the private half is shown once and never stored

grant

grants:manage

Gives a role to an account or a group, over an instance, group or target

holdKeyspaceWatch

keys:read

Takes or renews a lease on a target’s changes

importKeys

transfer:import

Writes keys into a target from what was exported

inviteAccount

users:manage

Makes a link that lets an account set its own password

killClient

monitoring:manage

Closes one client’s connection to the target

persistServerSettings

server:configure

Writes the running configuration to the server’s own file

publish

pubsub:publish

Sends a message to a channel and answers how many subscribers took it

purgeKeys

keys:delete

Removes every key matching a glob, a batch at a time

reencryptSecrets

crypto:rotate

Rewrites every stored secret under the current key

releaseKeyspaceWatch

keys:read

Gives a lease back, closing the watch when it was the last

removeGroupMember

groups:manage

Takes a member out of a group

removeProviderGroupMapping

idp:manage

Removes a mapping; it stops applying at the next sign-in through that provider

removeServerFromGroup

groups:manage

Takes a target out of a server group

renameKey

keys:write

Renames a key

requireSecondFactor

policy:manage

Require a second factor of every local account, or stop requiring one

restoreBackup

transfer:import

Writes a backup’s keys into a target

revoke

grants:manage

Takes a grant back; it stops applying on the holder’s next request

rewriteAppendLog

server:configure

Asks the server to rewrite its append-only file

runSchedule

schedule:manage

Runs a scheduled job now, without waiting for its cron

setAclUser

acl:manage

Creates or replaces one of the server’s own accounts

startMigration

migration:run

Starts moving keys from one target to another; answers before any have moved

startMonitoring

monitoring:manage

Starts sampling a target on a clock

stopMonitoring

monitoring:manage

Stops sampling a target

subscribe

pubsub:subscribe

Starts listening to channels or patterns on a target

takeBackup

transfer:export

Writes a backup of a target into a destination

takeSnapshot

server:configure

Asks the server to write a snapshot in the background

unsubscribe

pubsub:subscribe

Stops listening; answers whether anything was listening

updateAccount

users:manage

Changes an account

updateAlertDelivery

alert-delivery:manage

Changes a channel

updateAlertRule

alert:manage

Changes a rule

updateBackupDestination

backup:manage

Changes a destination

updateConnection

connection:edit

Changes a target

updateIdentityProvider

idp:manage

Changes a provider

updateRole

grants:manage

Changes what a role carries

updateSchedule

schedule:manage

Changes a schedule

updateTunnel

tunnel:manage

Changes a jump host

subscription
Operation Required What it does

keys

keys:read

Walks a target’s keyspace with SCAN, one key at a time. KEYS is never used.

Note:Limits

The schema sets a limit for every documented way of turning one request into much work: how deep a query may nest, how many fields one may name in total — which is the alias attack that depth alone does not catch — and what the parser accepts before it stops reading. Each is set rather than left at a default meant for a public API with large documents.

An unexpected failure answers one generic sentence. An exception message from inside the application is a description of the application, and the log is where that belongs.

Edit this page