{
  "info": {
    "description": "Machine-readable index of xrpldashboard's LIVE read-only surface. Every endpoint listed here is publicly served today; every response either is or will be wrapped in the ProofAnnotationEnvelope schema (MCP tools today; HTTP read-only API when it lands). Free for humans and identified agents at reasonable volume \u2014 no accounts, no API keys, no payment rails. See /methodology#for-ai-agents for the full contract, and docs/AGENT_TIER_DESIGN.md in the source repo for the design behind this surface.",
    "contact": {
      "name": "xrpldashboard",
      "url": "https://xrpldashboard.com/contact",
      "email": "contact@xrpldashboard.com"
    },
    "license": {
      "name": "MIT (source); data derived from public XRPL and Ethereum ledgers",
      "url": "https://github.com/Enkryptedx/xrpldashboard/blob/main/LICENSE"
    },
    "x-agent-tier-freshness": {
      "last_verified": "2026-08-05",
      "source_of_truth": "app.py:LAST_VERIFIED_AGENT_TIER_METHODOLOGY",
      "note": "Bump the constant whenever the OpenAPI spec, llms.txt, or agents.json shape changes. Three surfaces refresh from one edit."
    },
    "x-mcp-tools": {
      "server_name": "xrpldashboard-mcp",
      "server_version": "1.0.0",
      "protocol": "MCP (Model Context Protocol) \u2014 stdio + streamable HTTP",
      "documentation": "https://xrpldashboard.com/methodology#for-ai-agents",
      "design_doc": "https://github.com/Enkryptedx/xrpldashboard/blob/main/docs/AGENT_TIER_DESIGN.md",
      "envelope_schema_ref": "#/components/schemas/ProofAnnotationEnvelope",
      "tool_count": 15,
      "tools": [
        {
          "name": "get_ledger_stats",
          "source": "local_rippled",
          "freshness": "\u2264 5min",
          "batch": "ledger-primitives"
        },
        {
          "name": "get_amendment_status",
          "source": "local_rippled",
          "freshness": "\u2264 30min",
          "batch": "ledger-primitives"
        },
        {
          "name": "get_unl_status",
          "source": "local_rippled",
          "freshness": "\u2264 30min",
          "batch": "ledger-primitives"
        },
        {
          "name": "get_whale_events",
          "source": "local_rippled_stream_capture",
          "freshness": "\u2264 5min",
          "batch": "value-flows"
        },
        {
          "name": "get_whale_watchlist",
          "source": "local_rippled_stream_capture",
          "freshness": "\u2264 5min",
          "batch": "value-flows"
        },
        {
          "name": "get_rlusd_supply",
          "source": "neon_postgres",
          "freshness": "\u2264 5min",
          "batch": "value-flows"
        },
        {
          "name": "get_rlusd_flow_24h",
          "source": "neon_postgres",
          "freshness": "finalized_only",
          "batch": "value-flows"
        },
        {
          "name": "get_amm_pool",
          "source": "neon_postgres",
          "freshness": "daily",
          "batch": "amm-tokens"
        },
        {
          "name": "get_amm_top_by_tvl",
          "source": "neon_postgres",
          "freshness": "daily",
          "batch": "amm-tokens"
        },
        {
          "name": "get_token_attestation",
          "source": "neon_postgres",
          "freshness": "daily",
          "batch": "amm-tokens"
        },
        {
          "name": "get_rwa_families",
          "source": "neon_postgres",
          "freshness": "daily",
          "batch": "amm-tokens"
        },
        {
          "name": "get_rwa_pools",
          "source": "neon_postgres",
          "freshness": "daily",
          "batch": "amm-tokens"
        },
        {
          "name": "get_mpt_snapshot",
          "source": "neon_postgres",
          "freshness": "daily",
          "batch": "amm-tokens"
        },
        {
          "name": "get_signed_snapshot",
          "source": "signed_snapshot_walker",
          "freshness": "daily",
          "batch": "signed-snapshot"
        },
        {
          "name": "verify_snapshot_signature",
          "source": "signed_snapshot.verify_envelope+pinned_pubkey",
          "freshness": "\u2264 5min",
          "batch": "signed-snapshot"
        }
      ],
      "status": "Server implementation running headless (see mcp_server.py + mcp_tools_*.py in the source repo). Public daemonization is deferred until Phase 3 of the Lenovo node migration completes (see docs/LENOVO_MIGRATION.md)."
    },
    "title": "xrpldashboard \u2014 Agent Tier (read-only)",
    "version": "v1"
  },
  "externalDocs": {
    "description": "Full methodology, per-surface freshness contracts, and the four-layer truth audit design.",
    "url": "https://xrpldashboard.com/methodology"
  },
  "servers": [
    {
      "url": "https://xrpldashboard.com",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "discovery",
      "description": "Discovery-layer surfaces \u2014 how agents find this site's machine-readable contracts."
    },
    {
      "name": "signed-snapshots",
      "description": "Tamper-evident daily Ed25519-signed database snapshots. Verify locally against the pinned public key."
    },
    {
      "name": "documentation",
      "description": "OpenAPI JSON and Swagger UI for this spec itself."
    }
  ],
  "paths": {
    "/llms.txt": {
      "get": {
        "tags": [
          "discovery"
        ],
        "summary": "llmstxt.org site directory",
        "description": "Markdown-formatted site directory following the llmstxt.org convention. Every URL listed resolves to a live public surface.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/agents.json": {
      "get": {
        "tags": [
          "discovery"
        ],
        "summary": "Agent-discovery manifest (Wildcard-AI flavor)",
        "description": "Site identity, rate limits, trust surfaces, and the proof-annotation envelope agents should expect. Status booleans stay honest \u2014 each flips to true only after the corresponding surface responds.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/security.txt": {
      "get": {
        "tags": [
          "discovery"
        ],
        "summary": "Security disclosure contact",
        "description": "RFC 9116 security.txt.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/robots.txt": {
      "get": {
        "tags": [
          "discovery"
        ],
        "summary": "Crawler directives",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "tags": [
          "discovery"
        ],
        "summary": "XML sitemap (curated public routes + per-MPT detail pages)",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/snapshots/chain.json": {
      "get": {
        "tags": [
          "signed-snapshots"
        ],
        "summary": "Chain-linked list of daily signed snapshots",
        "description": "Each entry is chain-linked to the previous day, giving a tamper-evident audit trail across the full snapshot history.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/snapshots/{date}.json": {
      "get": {
        "tags": [
          "signed-snapshots"
        ],
        "summary": "Ed25519-signed snapshot for a specific date (YYYY-MM-DD)",
        "parameters": [
          {
            "name": "date",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
            },
            "description": "UTC calendar date, YYYY-MM-DD."
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "parameters": [
        {
          "in": "path",
          "name": "date",
          "required": true,
          "schema": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "/.well-known/snapshots/pubkey.pem": {
      "get": {
        "tags": [
          "signed-snapshots"
        ],
        "summary": "Ed25519 public key for snapshot verification",
        "description": "Pin locally. Verify snapshot signatures against this key.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/x-pem-file": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "openapi": "3.0.3",
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Error code"
          },
          "status": {
            "type": "string",
            "description": "Error name"
          },
          "message": {
            "type": "string",
            "description": "Error message"
          },
          "errors": {
            "type": "object",
            "description": "Errors",
            "additionalProperties": {}
          }
        },
        "additionalProperties": false
      },
      "PaginationMetadata": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "Total number of items."
          },
          "total_pages": {
            "type": "integer",
            "description": "Total number of pages."
          },
          "first_page": {
            "type": "integer",
            "description": "First available page number."
          },
          "last_page": {
            "type": "integer",
            "description": "Last available page number."
          },
          "page": {
            "type": "integer",
            "description": "Current page number."
          },
          "previous_page": {
            "type": "integer",
            "description": "Previous page number."
          },
          "next_page": {
            "type": "integer",
            "description": "Next page number."
          }
        },
        "additionalProperties": false
      },
      "ProofAnnotationEnvelope": {
        "type": "object",
        "description": "Standard response envelope. Every MCP tool response is wrapped in this shape via mcp_server.wrap_envelope(). The `proof` block carries source, freshness, and cross-check metadata that lets agents verify the payload against ledger truth without a support ticket.",
        "required": [
          "data",
          "proof",
          "server"
        ],
        "properties": {
          "data": {
            "description": "Tool-specific payload. Shape varies per tool."
          },
          "proof": {
            "type": "object",
            "required": [
              "source",
              "as_of",
              "freshness_contract",
              "methodology_url",
              "cross_check_status",
              "honest_partial"
            ],
            "properties": {
              "source": {
                "type": "string",
                "description": "Data source identifier.",
                "examples": [
                  "local_rippled",
                  "neon_postgres",
                  "ethereum_1rpc",
                  "local_rippled_stream_capture"
                ]
              },
              "as_of": {
                "type": "string",
                "format": "date-time",
                "description": "ISO 8601 UTC timestamp for when the payload was materialized."
              },
              "freshness_contract": {
                "type": "string",
                "enum": [
                  "\u2264 5min",
                  "\u2264 30min",
                  "daily",
                  "finalized_only"
                ],
                "description": "The declared freshness bound for this payload. `finalized_only` means the tool refuses to serve partial-day rows (R1/R2 rule)."
              },
              "claims_ref": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "CLAIMS.yaml claim id where one exists. `null` when the datum isn't a public claim."
              },
              "methodology_url": {
                "type": "string",
                "format": "uri",
                "description": "Deep link to the /methodology section describing this source."
              },
              "cross_check_status": {
                "type": "string",
                "enum": [
                  "agree",
                  "disagree",
                  "not_applicable"
                ],
                "description": "Result of the tool's internal cross-check (where one is defined; `not_applicable` otherwise)."
              },
              "honest_partial": {
                "type": "boolean",
                "description": "True when the tool served a partial result because a dependency was unavailable. Always accompanied by `scope_note`."
              },
              "scope_note": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Required when honest_partial=True. Names exactly which slice is missing."
              }
            }
          },
          "server": {
            "type": "object",
            "required": [
              "name",
              "version",
              "public_key_fingerprint",
              "docs"
            ],
            "properties": {
              "name": {
                "type": "string",
                "examples": [
                  "xrpldashboard-mcp"
                ]
              },
              "version": {
                "type": "string",
                "examples": [
                  "1.0.0"
                ]
              },
              "public_key_fingerprint": {
                "type": "string",
                "description": "SHA-256 fingerprint of the signed-snapshot public key. Pin locally for tamper detection."
              },
              "docs": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}