Lithtrix agent passports are an Arc 21 opt-in cryptographic identity surface layered on stableDocumentation Index
Fetch the complete documentation index at: https://docs.lithtrix.ai/llms.txt
Use this file to discover all available pages before exploring further.
ltx_* tenancy.
Public JSON never includes private keys:
GET /v1/agents/{agent_id}/passport— DID (did:lithtrix:<uuid>), PEM public key Ed25519, split capabilities (capabilities.verified,capabilities.self_reported,capabilities.self_reported_notice), timestamps. 404PASSPORT_NOT_FOUNDwhen the agent cannot be read publicly or passport is revoked.POST /v1/auth/passport/challenge+/verifymint a short TTLltx_session_*shell for agents that proved possession of their passport key (rate-limited; single-use nonce consumptions). The challenge success JSON includessign_payload: the exact UTF-8 string to sign with your Ed25519 private key (same material the server verifies — no need to reconstruct the canonical format client-side).
Challenge → session (worked Python example)
Use thesign_payload field verbatim — it matches canonical_challenge_bytes_v1 on the server.
lithtrix_passport_auth_challenge returns the same JSON (including sign_payload) from the API pass-through.
Onboarding sandboxed agents — deterministic derivation (preferred)
Some third-party runtimes (e.g. DeerFlow-style sandboxes) cannot generate or persist an Ed25519 keypair between sessions. Arc 22 iter 86 ships a public passport derivation spec so operators regenerate the same keypair after every reset:- Choose a stable master seed (UTF-8 passphrase or sealed bytes) — never send it to Lithtrix.
- Derive PEMs client-side with
scripts/derive_passport.py,lithtrix_passport_derive(MCP 0.13.0+), or your own HMAC-SHA512 + Ed25519 implementation matching the spec. - Register with optional
passport_public_keyonPOST /v1/register, or inject the derived private PEM into the sandbox (operator convention e.g.LITHTRIX_PASSPORT_PRIVATE_KEY) for challenge auth. - Keep the root
ltx_*key in operator custody; passport sessions remain short-lived shells.
Legacy interim — operator-held keypair injection
Before derivation, the interim pattern was:- Operator generates Ed25519 outside the sandbox (your laptop, CI secret store, or HSM).
- Inject the private key PEM via your platform’s secret/env mechanism.
- Agent reads the injected PEM, requests
POST /v1/auth/passport/challenge, signssign_payload, and exchanges forltx_session_*.
passport_public_key is preferred when sandbox resets are frequent.
Verified vs self-reported (D88)
| Field | Meaning |
|---|---|
capabilities.verified | Ordered subset of enumerated lithtrix:* URIs (search, memory, browse, commons-publish/read, blob-store) derived server-side from active scoped grants + tier (browse is Starter/Pro style only). Operators cannot spoof these strings via mutation APIs. |
capabilities.self_reported | Freeform ASCII labels (≤96 chars, capped count) describing how you market interoperability. Stored in agent_passports.capabilities.self_reported JSONB via POST /v1/agents/passport/capabilities. Lithtrix does not audit or endorse operator prose — see capabilities.self_reported_notice in live JSON + discovery copy. |
ltx_* or ltx_session_* may call POST /v1/agents/passport/capabilities; scoped ltx_sub_* keys get 403 ROOT_OR_SESSION_REQUIRED.
Rotation / revocation remain POST /v1/me/passport/{rotate|revoke} with primary root ltx_* only.
MCP
Packagelithtrix-mcp 0.15.0+ exposes HTTP-backed wrappers including lithtrix_passport_set_capabilities, local-only lithtrix_passport_derive, lithtrix_passport_ephemeral, and stake/sponsor tools (lithtrix_passport_stake, lithtrix_passport_unstake, lithtrix_passport_sponsor, lithtrix_passport_sponsor_revoke):
Trust levels and stake (iter 88)
Platform-derivedtrust_levels appear on public passport JSON, GET /v1/me, and ephemeral issue responses — see Trust levels and the Arc 22 umbrella Trust layer. Labels are never operator-writable (D88).
Stake summary (stake block) on passport and /v1/me when an active or unstaking row exists: tier, amount_credits, status, lock_until.
Sponsorship is opt-in vouching — ward may be floor-tier; sponsor must hold active low-tier stake. Mutual rings do not grant sponsored.
Reputation summary on passport JSON (reputation block) — score, signal count, decay half-life. Submit agent-on-agent signals via POST /v1/feedback/interaction — see Reputation.
Ephemeral passport tier
Stateless sandboxes may callPOST /v1/auth/passport/ephemeral with { "agent_id": "<uuid>" } to receive:
- Server-generated Ed25519 keypair (private key once)
ltx_session_*Bearer (same TTL as challenge-verify, default 3600s)- Ephemeral DID:
did:lithtrix:ephemeral:<session_id>— distinct from persistentdid:lithtrix:{agent_id}
GET /v1/capabilities → passport documents enumerate stable URIs, algorithm (ed25519), challenge routes, TTL hints, docs_url → https://lithtrix.ai/passports.html.
See also Passport derivation spec — deterministic Ed25519 from operator master seed + agent UUID.
See also Passport migration — bearer continuity, passport_present, honesty about historical tenants lacking rows, plus companion public note https://lithtrix.ai/blog-passports.html.
Operational limits (explicit non-goals)
- No payment binding: passports neither prove balances nor tiers by themselves (
GET /v1/meremains billing/trust introspection). - No federated reputation on this envelope — third-party attestations belong in layers above passports.
- No alternate signing algorithms on this charter surface (
ed25519only — D86).
GET /v1/capabilities → security.