{
  "openapi": "3.1.0",
  "info": {
    "title": "Movement Network public API",
    "version": "1.0.0",
    "summary": "Read-only supply and yield data for the Movement network.",
    "description": "Unauthenticated, read-only endpoints published by movementnetwork.xyz. Supply endpoints return bare JSON numbers in the shape market-data trackers expect; the rates endpoint returns the yield products shown on the homepage. No API key is required.\n\n**Rate limits.** Responses are CDN-cached and advertise an RFC 9331 policy of 60 requests per 60 seconds via the `RateLimit` and `RateLimit-Policy` headers. A throttled caller receives 429 with `Retry-After`.\n\n**Versioning.** This is version 1. Send `X-API-Version: 1` to pin it; omitting the header selects the current version. Breaking changes ship under a new version number and never alter an existing one. A version being retired is announced on its operations with the `Deprecation` and `Sunset` response headers (RFC 9745 and RFC 8594) at least 180 days before removal.",
    "contact": {
      "name": "Movement",
      "url": "https://www.movementnetwork.xyz/contact",
      "email": "legal@moveindustries.xyz"
    },
    "license": {
      "name": "Terms of Service",
      "url": "https://www.movementnetwork.xyz/terms-of-service"
    }
  },
  "servers": [
    {
      "url": "https://www.movementnetwork.xyz",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Developer documentation",
    "url": "https://docs.movementnetwork.xyz/"
  },
  "tags": [
    {
      "name": "Supply",
      "description": "MOVE and USDCx token supply figures."
    },
    {
      "name": "Yield",
      "description": "Current yield products and APYs."
    }
  ],
  "paths": {
    "/api/max-supply": {
      "get": {
        "operationId": "getMaxSupply",
        "parameters": [
          {
            "name": "X-API-Version",
            "in": "header",
            "required": false,
            "description": "Pins the API version. Omit to use the current version.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "tags": [
          "Supply"
        ],
        "summary": "Maximum MOVE supply",
        "description": "The fixed maximum supply of the MOVE token, as a bare JSON number of whole tokens. This value never changes.",
        "responses": {
          "200": {
            "description": "Maximum supply in whole MOVE tokens.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "number",
                  "description": "Maximum MOVE supply, in whole tokens.",
                  "examples": [
                    10000000000
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/circulating-supply": {
      "get": {
        "operationId": "getCirculatingSupply",
        "parameters": [
          {
            "name": "X-API-Version",
            "in": "header",
            "required": false,
            "description": "Pins the API version. Omit to use the current version.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "tags": [
          "Supply"
        ],
        "summary": "Circulating MOVE supply",
        "description": "Circulating supply of MOVE for the current month, as a bare JSON number of whole tokens. Follows the published unlock schedule and steps once per month.",
        "responses": {
          "200": {
            "description": "Circulating supply in whole MOVE tokens.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "number",
                  "description": "Circulating MOVE supply for the current month, in whole tokens.",
                  "examples": [
                    4331250000
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/circulating-supply/usdcx": {
      "get": {
        "operationId": "getUsdcxCirculatingSupply",
        "parameters": [
          {
            "name": "X-API-Version",
            "in": "header",
            "required": false,
            "description": "Pins the API version. Omit to use the current version.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "tags": [
          "Supply"
        ],
        "summary": "Circulating USDCx supply",
        "description": "Circulating supply of USDCx, as a bare JSON number. Read from on-chain state and cached; returns 503 when the upstream source is unavailable.",
        "responses": {
          "200": {
            "description": "Circulating USDCx supply.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "number",
                  "description": "Circulating USDCx supply."
                }
              }
            }
          },
          "404": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/rates/homepage": {
      "get": {
        "operationId": "getHomepageRates",
        "parameters": [
          {
            "name": "X-API-Version",
            "in": "header",
            "required": false,
            "description": "Pins the API version. Omit to use the current version.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "tags": [
          "Yield"
        ],
        "summary": "Current yield products and APYs",
        "description": "The yield products shown on the homepage, grouped by collateral asset (USDC, BTC, GOLD). Each product carries its symbol and current APY as a percentage; `apy` is null when the upstream rate lookup failed and `comingSoon` marks a product that is not live yet.",
        "responses": {
          "200": {
            "description": "Yield products keyed by collateral asset.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Yield products grouped by collateral asset.",
                  "required": [
                    "USDC",
                    "BTC",
                    "GOLD"
                  ],
                  "properties": {
                    "USDC": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "symbol",
                          "apy"
                        ],
                        "properties": {
                          "symbol": {
                            "type": "string",
                            "description": "Product ticker, e.g. \"savUSD\"."
                          },
                          "apy": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Current APY as a percentage (9.34 means 9.34%). Null when unavailable."
                          },
                          "iconSrc": {
                            "type": "string",
                            "description": "Site-relative token icon path."
                          },
                          "href": {
                            "type": "string",
                            "description": "Site-relative or absolute destination for the product."
                          },
                          "comingSoon": {
                            "type": "boolean",
                            "description": "True when the product is announced but not live."
                          },
                          "cardBg": {
                            "type": "string",
                            "description": "Presentational card background colour."
                          }
                        }
                      }
                    },
                    "BTC": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "symbol",
                          "apy"
                        ],
                        "properties": {
                          "symbol": {
                            "type": "string",
                            "description": "Product ticker, e.g. \"savUSD\"."
                          },
                          "apy": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Current APY as a percentage (9.34 means 9.34%). Null when unavailable."
                          },
                          "iconSrc": {
                            "type": "string",
                            "description": "Site-relative token icon path."
                          },
                          "href": {
                            "type": "string",
                            "description": "Site-relative or absolute destination for the product."
                          },
                          "comingSoon": {
                            "type": "boolean",
                            "description": "True when the product is announced but not live."
                          },
                          "cardBg": {
                            "type": "string",
                            "description": "Presentational card background colour."
                          }
                        }
                      }
                    },
                    "GOLD": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "symbol",
                          "apy"
                        ],
                        "properties": {
                          "symbol": {
                            "type": "string",
                            "description": "Product ticker, e.g. \"savUSD\"."
                          },
                          "apy": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Current APY as a percentage (9.34 means 9.34%). Null when unavailable."
                          },
                          "iconSrc": {
                            "type": "string",
                            "description": "Site-relative token icon path."
                          },
                          "href": {
                            "type": "string",
                            "description": "Site-relative or absolute destination for the product."
                          },
                          "comingSoon": {
                            "type": "boolean",
                            "description": "True when the product is announced but not live."
                          },
                          "cardBg": {
                            "type": "string",
                            "description": "Presentational card background colour."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Structured JSON error.",
            "headers": {
              "RateLimit": {
                "description": "RFC 9331 rate-limit state, e.g. `default;r=60;t=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 rate-limit policy, e.g. `default;q=60;w=60`.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "Present only when this version is deprecated (RFC 9745).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "Present only when a removal date is set (RFC 8594).",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Sent on 429 and 503.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Error envelope returned by every endpoint on failure.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message",
              "status"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable machine-readable error code.",
                "enum": [
                  "not_found",
                  "method_not_allowed",
                  "upstream_unavailable",
                  "invalid_request",
                  "rate_limited",
                  "internal_error"
                ]
              },
              "message": {
                "type": "string",
                "description": "Human-readable summary."
              },
              "hint": {
                "type": "string",
                "description": "Suggested resolution, e.g. which method to retry with."
              },
              "status": {
                "type": "integer",
                "description": "HTTP status code."
              },
              "docs": {
                "type": "string",
                "format": "uri",
                "description": "Link to this specification."
              }
            }
          }
        }
      },
      "RateProduct": {
        "type": "object",
        "required": [
          "symbol",
          "apy"
        ],
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Product ticker, e.g. \"savUSD\"."
          },
          "apy": {
            "type": [
              "number",
              "null"
            ],
            "description": "Current APY as a percentage (9.34 means 9.34%). Null when unavailable."
          },
          "iconSrc": {
            "type": "string",
            "description": "Site-relative token icon path."
          },
          "href": {
            "type": "string",
            "description": "Site-relative or absolute destination for the product."
          },
          "comingSoon": {
            "type": "boolean",
            "description": "True when the product is announced but not live."
          },
          "cardBg": {
            "type": "string",
            "description": "Presentational card background colour."
          }
        }
      },
      "HomepageRates": {
        "type": "object",
        "description": "Yield products grouped by collateral asset.",
        "required": [
          "USDC",
          "BTC",
          "GOLD"
        ],
        "properties": {
          "USDC": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "symbol",
                "apy"
              ],
              "properties": {
                "symbol": {
                  "type": "string",
                  "description": "Product ticker, e.g. \"savUSD\"."
                },
                "apy": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Current APY as a percentage (9.34 means 9.34%). Null when unavailable."
                },
                "iconSrc": {
                  "type": "string",
                  "description": "Site-relative token icon path."
                },
                "href": {
                  "type": "string",
                  "description": "Site-relative or absolute destination for the product."
                },
                "comingSoon": {
                  "type": "boolean",
                  "description": "True when the product is announced but not live."
                },
                "cardBg": {
                  "type": "string",
                  "description": "Presentational card background colour."
                }
              }
            }
          },
          "BTC": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "symbol",
                "apy"
              ],
              "properties": {
                "symbol": {
                  "type": "string",
                  "description": "Product ticker, e.g. \"savUSD\"."
                },
                "apy": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Current APY as a percentage (9.34 means 9.34%). Null when unavailable."
                },
                "iconSrc": {
                  "type": "string",
                  "description": "Site-relative token icon path."
                },
                "href": {
                  "type": "string",
                  "description": "Site-relative or absolute destination for the product."
                },
                "comingSoon": {
                  "type": "boolean",
                  "description": "True when the product is announced but not live."
                },
                "cardBg": {
                  "type": "string",
                  "description": "Presentational card background colour."
                }
              }
            }
          },
          "GOLD": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "symbol",
                "apy"
              ],
              "properties": {
                "symbol": {
                  "type": "string",
                  "description": "Product ticker, e.g. \"savUSD\"."
                },
                "apy": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Current APY as a percentage (9.34 means 9.34%). Null when unavailable."
                },
                "iconSrc": {
                  "type": "string",
                  "description": "Site-relative token icon path."
                },
                "href": {
                  "type": "string",
                  "description": "Site-relative or absolute destination for the product."
                },
                "comingSoon": {
                  "type": "boolean",
                  "description": "True when the product is announced but not live."
                },
                "cardBg": {
                  "type": "string",
                  "description": "Presentational card background colour."
                }
              }
            }
          }
        }
      }
    }
  }
}