TrustGraph

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

Bind a device

Register a device key through an AuthenSee ceremony.

Auth: Two matching one-time bind proofs.

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/graph-keys/bind/<bind-id>/finalize HTTP/1.1
Host: trust-staging.rebellion.systems
Content-Type: application/json

{
  "initiationProof": "<gbi-proof>",
  "completionProof": "<gbc-proof>"
}

Response shape:

{
  "status": "complete",
  "graphKey": "<completed-graph-key-object>"
}

Binding associates a P-256 public key with an AuthenSee-authenticated persona. Generate and retain the private key on the device. A bearer credential cannot replace this ceremony.

Start

POST /v1/graph-keys/bind/start

FieldRequirement
publicKeyJwkRequired public P-256 JWK
appOriginExact allowlisted application origin, including scheme and port
nodeKindhuman (default) or agent
labelOptional device label, at most 200 characters
metadataOptional JSON object; identity-routing fields are not accepted
ttlSecondsOptional integer, 300–604800; device lifetime
recoverNodeIdOptional existing 64-character lowercase hex node ID
recoverByPersonaOptional boolean persona recovery selector
purposegraph or content-signing; content signing needs a dedicated fresh key and recoverNodeId
nativeReturnOptional boolean; requires an origin with configured native return support

Use the SDK's recovery flow to select recoverNodeId or recoverByPersona; do not initiate an unrelated first bind to recover an account. Incompatible recovery combinations are rejected. Caller-selected provider identities and the removed deviceAdd field are rejected.

POST /v1/graph-keys/bind/start
Content-Type: application/json

{
  "publicKeyJwk": { "kty": "EC", "crv": "P-256", "x": "public-x", "y": "public-y" },
  "appOrigin": "https://your-app.example",
  "nodeKind": "human"
}

The response supplies bindId, graphKeyId, graphNodeId, hostedUrl, expiresAt and initiationProof. Persist the initiation proof, intended public key, exact origins and expiry before opening hostedUrl. The start response's node ID is provisional; the completed key supplies the authoritative node.

Complete

After the person authenticates, GET /v1/authensee/callback exchanges the provider result and returns the completion proof through the configured relay. The web return path is /trust-graph/bind/callback; bindId and completionProof arrive in its fragment. Remove the fragment promptly and match the saved bind and origins.

POST /v1/graph-keys/bind/:bindId/finalize accepts:

{
  "initiationProof": "gbi_one-time-proof-from-start",
  "completionProof": "gbc_one-time-proof-from-callback"
}

Successful completion returns {status: "complete", graphKey}. Both proofs must match the same unexpired bind. For a first bind with device-chain creation required, also supply root: {record, signature}. Use the SDK bind helpers to construct and persist that prospective root and handle supported root corrections.

GET /v1/graph-keys/bind/:bindId returns status, expiresAt and, when complete, graphKey. Status is pending, exchanged, complete, expired or failed. Polling does not reveal either proof. Match a recovered completion to the public key and node saved in the pending intent.

Recovery and errors

Fresh recovery devices on chained nodes start quarantined. Existing expired graph-purpose keys can use the ceremony to refresh their binding when the authenticated persona matches; revoked keys cannot be revived. Ordinary active-key rebinds return GRAPH_KEY_REBIND_NOT_DUE, except where the independent authentication horizon makes reauthentication eligible.

ResponseMeaning
403 GRAPH_RECOVERY_NOT_FOUNDRecovery found no existing account
403 GRAPH_BIND_SESSION_MISMATCH / GRAPH_BIND_ACCOUNT_MISMATCHProvider result does not match the pending ceremony
403 GRAPH_BIND_PERSONA_FORBIDDENAuthenticated persona does not own the selected node
409 GRAPH_KEY_REVOKEDSame-key recovery cannot revive this key
400 BIND_ROOT_REQUIREDFirst-bind root is required
400 BIND_ROOT_UNSUPPORTEDChain creation is disabled
409 BIND_ROOT_UNEXPECTEDCeremony resolved to an existing node
409 BIND_RECEIPT_MISMATCHRetry differs from the committed bind receipt
503 BIND_IDENTITY_UNAVAILABLEIdentity routing is temporarily unavailable

Recovery starts have a separate per-reference budget, with 429 and retry-after. Callback errors are HTML with the corresponding HTTP status, rather than the JSON format used by bind API calls.

Does not establishThis ceremony is scoped to its initiating client and application origin. A forwarded hosted URL is not a supported cross-device binding flow. The human or agent classification does not independently establish humanhood or delegated authority.
Checked against server 9f47f2d · SDK 12053abLast updated 2026-11-04Edit on GitHub