{"openapi":"3.1.0","info":{"title":"XR-Trust™","description":"Public directory and explorer for XRPL Permissioned Domains (XLS-80). Lists active domains, their accepted credentials, and credential issuers. Descriptive only; not a compliance verdict, certification, or endorsement of any domain or its members. Provided by XRPL-Utilities™ LLC.","termsOfService":"https://trust.xrpl-utilities.io/tos","version":"2026-15"},"paths":{"/domains":{"get":{"summary":"List Domains","description":"Paginated list of all PermissionedDomain ledger objects.\n\nFree for the marketing-site origin; $0.10 USD via x402 for everyone else.\nEmpty result is the expected initial state - the XRPL permissioning\nstack activated 2026-02 and adoption is in early days.","operationId":"list_domains_domains_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domain/{domain_id}":{"get":{"summary":"Get Domain","description":"Single-domain drill-down. Same auth shape as /domains.","operationId":"get_domain_domain__domain_id__get","parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","title":"Domain Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/events":{"get":{"summary":"List Events","description":"Stream of XLS-70/80 lifecycle events captured by the subscribe loop.\n\nUsed by Pulse to ingest the permissioned_domain_lifecycle event source\nwithout having to maintain its own XRPL subscription. Free for all\ncallers - this endpoint is the public substrate other XR-* services\nconsume; the value is in /scan and /domain/{id}, not in the raw\nevent stream.\n\nPagination: pass `since=<last_event_id>` to get only new events,\noldest-first. Empty list when there's nothing new (a normal idle\nstate, not an error).","operationId":"list_events_events_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"tx_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tx Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/credentials/issuers":{"get":{"summary":"List Credential Issuers","description":"List of all addresses that have issued at least one credential\ncurrently in use by a domain.","operationId":"list_credential_issuers_credentials_issuers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/scan":{"post":{"summary":"Scan","description":"Paid x402: takes either a domain_id or an owner_address.\n\nPricing is differentiated by query type:\n  - domain_id:      paid always (O(1) ledger_entry lookup, independent of snapshot state)\n  - owner_address:  free while the directory is empty (would always\n                    return 0 matches), paid once data exists","operationId":"scan_scan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/agents.json":{"get":{"summary":"Get Agents Json","description":"Serve the agents.json manifest from disk (single source of truth).","operationId":"get_agents_json__well_known_agents_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/agents.json":{"get":{"summary":"Get Agents Json","description":"Serve the agents.json manifest from disk (single source of truth).","operationId":"get_agents_json_agents_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/schema":{"get":{"summary":"Get Schema","operationId":"get_schema_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tos":{"get":{"summary":"Get Tos","operationId":"get_tos_tos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"summary":"Get Llms Txt","operationId":"get_llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/robots.txt":{"get":{"summary":"Get Robots Txt","operationId":"get_robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/healthz":{"get":{"summary":"Healthz","description":"Liveness + dependency probe. Reports overall status; details per check.","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/stats":{"get":{"summary":"Stats","operationId":"stats_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/seed":{"post":{"summary":"Admin Seed","description":"Single-owner backfill. Calls _refresh_owner_inline for one\naddress: fetches their PermissionedDomain ledger objects via\naccount_objects (O(1), cheap) and upserts into the materialized\nsnapshot + DB.\n\nUse case: a PermissionedDomainSet from a brand-new owner landed\nin the events log but the snapshot didn't pick it up - typically\nbecause the subscribe-loop inline-seed code wasn't deployed yet,\nor the WSS connection bounced over a deploy gap. Closes the same\ngap the inline path closes for live events, just on-demand for a\nhistorical address.\n\nNo auth: the operation is read-only on-chain (account_objects\nis a public XRPL RPC) and idempotent in our DB (upsert-only;\nno delete or exfiltration path). Worst-case abuse is burning\n~25 QuickNode credits per call, which the standard /scan rate\nlimiter already covers since it shares the same FastAPI app\nmiddleware. Returns the count of records added/updated and\nthe resulting domain_ids under that owner.","operationId":"admin_seed_admin_seed_post","parameters":[{"name":"owner","in":"query","required":true,"schema":{"type":"string","title":"Owner"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"post":{"summary":"X402 Discovery","operationId":"x402_discovery__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ScanRequest":{"properties":{"domain_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain Id","examples":["A1B2C3..."]},"owner_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Address","examples":["rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv"]}},"type":"object","title":"ScanRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}