TrustGraph

Browse api referenceAPI referenceAttestationsBind a deviceContent certificatesDevice authorityEdgesEpoch commitmentsExternal signing keysGit signer membershipGraph keysPublic handlesHealth and readinessNodes and account deletionReachabilityRelationship tags

Device authority

Read and append device approval history.

Auth: Device-signed read, operation device-log-read.

Request and response

Angle-bracket values describe placeholders, including nested objects and numeric types; these are wire shapes, not captured service data. Replace them before sending.

POST /v1/devices/log HTTP/1.1
Host: trust-staging.rebellion.systems
Content-Type: application/json

{
  "graphNodeId": "<directory-node-id>",
  "limit": 256,
  "authorization": {
    "graphKeyId": "<device-id>",
    "nonce": "<fresh-random-nonce>",
    "signedAt": "<current-ISO-timestamp>",
    "signature": "<base64-DER-signature>"
  }
}

Response shape:

{
  "chain": [
    "<signed-authority-record>"
  ],
  "head": "<authority-head>",
  "nextAfterSequence": "<cursor-or-null>",
  "signingKeys": "<signing-key-map>"
}

A device chain is a node's signed approval history. Binding proves persona membership; approval determines whether a device may act for a chained node. Existing chains remain enforced even when creation of new chains is disabled.

Read the directory

POST /v1/devices/log uses signed read device-log-read over {graphNodeId, afterSequence?, limit?}. Add authorization to send the request. graphNodeId is the directory being requested. The requester may read its own directory or a directory connected to its node by an active, unexpired edge in either direction.

afterSequence is an optional integer from 0 through 4294967295; limit is 1–256, default 256. The response excerpt and table list the core authority fields:

FieldContents
chainSigned authority records for this page
headCurrent sequence, record hash, epoch, root and approved/revoked state
nextAfterSequencePagination cursor
signingKeysPublic signing JWKs and lifecycle/recovery metadata

Fetching or parsing this response does not verify its chain. Use the SDK device verification helpers with persisted trusted pins, and continue pagination until the verified state reaches the advertised head.

Append an authority record

POST /v1/devices/log/append takes {action, signature}. The device-log-append action contains graphKeyId, record, recordSignature, nonce and signedAt.

These records are required for clients to bootstrap a root when the server requires one, or approve a new device on an existing chain. Use buildDeviceRecord and the SDK signer’s signFeedRecord helper. The helper name and signing domain are compatibility identifiers for this core device-authority operation.

The inner record has kind, graphNodeId, epoch, sequence, previousRecordHash, issuerGraphKeyId, subjectGraphKeyId and issuedAt. Sign canonical JSON with v: "omnibus-feed-authority-v1"; then sign the outer action in the normal action domain. All signatures on these routes are canonical base64, low-S P-256 DER. Success returns {recordHash, head}.

KindAuthority and effect
rootGenesis key opens epoch 1
approveApproved usable device admits a sibling
revokeApproved device revokes a subject; a usable device may revoke itself
resetEligible recovered, unapproved key closes the old epoch and opens another

Each sequence is consecutive and links the preceding hash. Reset additionally includes closesRootRecordHash and resetReason, one of all-devices-lost, user-choice, or bootstrap. Eligibility requires a durable recovery marker for the current root and no chain revocation. A reset revokes displaced devices.

Limits and errors

A node can have at most 64 approved devices. Daily rolling limits are 8 approvals, 16 revocations and 2 resets per node. Responses use Cache-Control: no-store.

Device-authority codes include DEVICE_LOG_CONFLICT (409; refresh the head), DEVICE_LOG_NOT_APPROVED (403), DEVICE_LIMIT (409) and DEVICE_CHAINS_DISABLED (409). Also handle authentication failures, nonce replay, rate limits and unavailable responses by their HTTP status; this is not an exhaustive error-code list.

Does not establishA quarantined key may read its own directory, device list and handle, renew under lifecycle rules, and revoke itself. It cannot perform ordinary graph operations. Successful AuthenSee recovery alone does not approve it, and a signed directory must still be verified locally.
Checked against server 9f47f2d · SDK 12053abLast updated 2026-11-04Edit on GitHub