Arc 21 passports are opt-in for agents that already hold a rootDocumentation 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_* key. Nothing in billing, memory, or search requires a passport today — it adds a public DID + PEM surface, split capabilities (lithtrix:* verified vs operator self_reported), and short-lived ltx_session_* shells after a signed challenge.
Do I have to migrate?
No. Keep using your root API key exactly as before. Passports are additive identity for integrators who want:- A stable public document —
GET /v1/agents/{agent_id}/passport(no private key in JSON). - Capability transparency — verified URIs derived from scoped keys + tier; operator labels you control via
POST /v1/agents/passport/capabilities(never confused with Lithtrix verification — see Passports). - Rotation without sharing the long-term API key broadly — peers can use
ltx_session_*afterPOST /v1/auth/passport/challenge+/verifyinstead of embeddingltx_*.
New agent (register)
On HTTP 201 fromPOST /v1/register you receive a passport block alongside your API key. When Lithtrix generates the keypair (default), the private PEM appears once — store it alongside ltx_* using the same secret posture. When you supply optional passport_public_key (operator-derived per Passport derivation spec), the 201 body omits private_key; you hold keys client-side. The API never persists the private key server-side.
Existing agent (registered before passports mattered)
Your API continues to run on rootltx_*. Passports layer on top:
-
GET /v1/me→passport_presenttells you whether an active (non-revoked)agent_passportsrow exists.true→ teammates can probeGET /v1/agents/{your_agent_id}/passportpublicly;false→ passport JSON is intentionally absent (404) until issuance catches up operationally. -
Public read —
GET /v1/agents/{agent_id}/passportexposes DID + PEM + capability object only when above row exists (never echoes private PEM). -
Bearer vs session — keep
Authorization: Bearer ltx_*. Optionalltx_session_*shells come fromPOST /v1/auth/passport/challenge+/verifyfor flows that dislike embedding root secrets broadly. Challenge responses includesign_payload(the exact UTF-8 string to sign) — see Passports for a worked Python example. -
Sandboxed agents — prefer Passport derivation spec: derive Ed25519 outside the sandbox, optional
passport_public_keyon register, or inject private PEM for challenge auth. Legacy injection summary: Passports § sandboxed agents. -
Rotate / revoke —
POST /v1/me/passport/rotateandPOST /v1/me/passport/revokerequire primary rootltx_*only (reject scoped keys + passport sessions).
Operational nuance: today’s happiest path mints passports alongside successful registration-era issuance. Older tenants lacking a row still need deterministic issuance—coordinate with Lithtrix operators if passport_present blocks a partner rollout; forcing extra identity ceremony is deliberately outside autonomous API scope (honest migration framing > magical self-serve for every retroactive row).
What’s newly possible?
- Public discovery for another agent reading your passport JSON (capabilities split + honest operator notice).
- MCP helpers (
npx -y lithtrix-mcp0.13.0+) wrapping challenge + passport capability updates + locallithtrix_passport_derive. - Structured operator labels (
self_reported) for human-readable interoperability claims — never mistaken for enumeratedlithtrix:*verification.
What does not change?
- Credits, tiers, referrals, Stripe state — passports carry no payment binding (D89).
- No federated reputation, registry ceremony, or third-party attestations on this envelope (Arc 22 topics).
passports.html. Blog-style paragraph: https://lithtrix.ai/blog-passports.html.