{
  "openapi": "3.1.0",
  "info": {
    "title": "PolyPump public API",
    "version": "1.0.0",
    "description": "Read-only API for the PolyPump bonding-curve launchpad on Polygon PoS (chain 137). Bots and AI agents are welcome: no API key, CORS open, generous rate limits. The /api/tx/* endpoints return UNSIGNED transactions ({to, data, value, gasLimit}) for you to sign and send with your own wallet. The server never holds keys. Each token is quoted in POL or BZB (fixed at launch; see `quote` on every token). BZB-quoted tokens are bought with BZB after an ERC-20 approve and graduate into a QuickSwap V2 TOKEN/BZB pool; POL tokens graduate into TOKEN/WPOL. Verify every returned tx before signing: chainId 137, `to` is the pinned PolyPump / LPFeeLocker / QuickSwap router (or the token being approved), `value` is what you asked to spend, and the calldata decodes to the expected call (see /BOTS.md). Tokens removed by the admin return 410 everywhere."
  },
  "servers": [
    {
      "url": "https://launch.blazarforce.net"
    }
  ],
  "paths": {
    "/api/config": {
      "get": {
        "operationId": "getConfig",
        "summary": "Chain id, contract addresses (incl. BZB), graduation targets per quote asset, indexer height",
        "responses": {
          "200": {
            "description": "Config",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/fees": {
      "get": {
        "operationId": "getFees",
        "summary": "Live trade fee (bps), launch fee (POL), pause flags, quote assets (POL, BZB) with their graduation targets, slippage and deadline limits",
        "responses": {
          "200": {
            "description": "Fees",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/prices": {
      "get": {
        "operationId": "getPrices",
        "summary": "BZB price in POL and USD and POL in USD from on-chain QuickSwap reserves (display only), and the value of each graduation target",
        "responses": {
          "200": {
            "description": "Prices",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/tokens": {
      "get": {
        "operationId": "listTokens",
        "summary": "List and search tokens by volume, age, market cap, trades or curve progress",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Name/symbol search, or an exact token address",
            "schema": {
              "type": "string",
              "maxLength": 64
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "volume = 24h volume (POL-equivalent across assets); mcap = POL-equivalent market cap; age = launch time",
            "schema": {
              "type": "string",
              "enum": [
                "volume",
                "age",
                "mcap",
                "trades",
                "progress"
              ],
              "default": "volume"
            }
          },
          {
            "name": "quote",
            "in": "query",
            "required": false,
            "description": "Only tokens quoted in this asset",
            "schema": {
              "type": "string",
              "enum": [
                "POL",
                "BZB"
              ]
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Only bonding-curve or only graduated tokens",
            "schema": {
              "type": "string",
              "enum": [
                "curve",
                "graduated"
              ]
            }
          },
          {
            "name": "minMcap",
            "in": "query",
            "required": false,
            "description": "Min market cap in POL (BZB tokens converted at the on-chain BZB/WPOL price)",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxMcap",
            "in": "query",
            "required": false,
            "description": "Max market cap in POL (POL-equivalent)",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minMcapUsd",
            "in": "query",
            "required": false,
            "description": "Min market cap in USD (on-chain WPOL/USDC.e price; 503 if unavailable)",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxMcapUsd",
            "in": "query",
            "required": false,
            "description": "Max market cap in USD",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "minVolume24h",
            "in": "query",
            "required": false,
            "description": "Min 24h volume in POL (POL-equivalent)",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxAgeSec",
            "in": "query",
            "required": false,
            "description": "Only tokens launched in the last N seconds",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "minAgeSec",
            "in": "query",
            "required": false,
            "description": "Only tokens older than N seconds",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tokens",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tokens/{address}": {
      "get": {
        "operationId": "getToken",
        "summary": "Token detail (indexed): price, market cap, volume, holders, progress",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "Token address"
          }
        ],
        "responses": {
          "200": {
            "description": "Token",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Token"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "410": {
            "$ref": "#/components/responses/Removed"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tokens/{address}/curve": {
      "get": {
        "operationId": "getCurve",
        "summary": "Live on-chain bonding-curve state, fee and pause flags, recommended venue",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "Token address"
          }
        ],
        "responses": {
          "200": {
            "description": "Curve",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "410": {
            "$ref": "#/components/responses/Removed"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tokens/{address}/quote": {
      "get": {
        "operationId": "quote",
        "summary": "Quote a buy or sell including fee, refund, minOut and recommended gasLimit (curve or QuickSwap after graduation)",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "Token address"
          },
          {
            "name": "side",
            "in": "query",
            "required": false,
            "description": "",
            "schema": {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ],
              "default": "buy"
            }
          },
          {
            "name": "amount",
            "in": "query",
            "required": false,
            "description": "Decimal amount (18 decimals): the token's quote asset (POL or BZB) for buys, tokens for sells. Use this or amountWei.",
            "schema": {
              "type": "string",
              "example": "1.5"
            }
          },
          {
            "name": "amountWei",
            "in": "query",
            "required": false,
            "description": "Integer amount in wei. Takes precedence over amount.",
            "schema": {
              "type": "string",
              "pattern": "^\\d+$"
            }
          },
          {
            "name": "slippageBps",
            "in": "query",
            "required": false,
            "description": "Slippage tolerance used to compute minOut (never 0).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Quote",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Quote"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "409": {
            "$ref": "#/components/responses/Error"
          },
          "410": {
            "$ref": "#/components/responses/Removed"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tokens/{address}/trades": {
      "get": {
        "operationId": "getTrades",
        "summary": "Recent trades (curve and QuickSwap)",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "Token address"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "",
            "schema": {
              "type": "integer",
              "maximum": 200,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Trades",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "410": {
            "$ref": "#/components/responses/Removed"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tokens/{address}/candles": {
      "get": {
        "operationId": "getCandles",
        "summary": "OHLCV candles in the token's quote asset (POL or BZB)",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "Token address"
          },
          {
            "name": "tf",
            "in": "query",
            "required": false,
            "description": "Timeframe seconds",
            "schema": {
              "type": "integer",
              "enum": [
                60,
                300,
                900,
                3600,
                14400,
                86400
              ],
              "default": 300
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Candles",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "410": {
            "$ref": "#/components/responses/Removed"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tokens/{address}/holders": {
      "get": {
        "operationId": "getHolders",
        "summary": "Top 50 holders",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "Token address"
          }
        ],
        "responses": {
          "200": {
            "description": "Holders",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "410": {
            "$ref": "#/components/responses/Removed"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tx/buy": {
      "get": {
        "operationId": "buildBuyTx",
        "summary": "Unsigned buy transaction(s): PolyPump.buy (POL) or BZB approve + PolyPump.buyBzb on the curve, or a QuickSwap V2 swap after graduation; with fee cap, minOut, deadline and gasLimit",
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "description": "Token address",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "amount",
            "in": "query",
            "required": false,
            "description": "Decimal amount (18 decimals): the token's quote asset (POL or BZB) for buys, tokens for sells. Use this or amountWei.",
            "schema": {
              "type": "string",
              "example": "1.5"
            }
          },
          {
            "name": "amountWei",
            "in": "query",
            "required": false,
            "description": "Integer amount in wei. Takes precedence over amount.",
            "schema": {
              "type": "string",
              "pattern": "^\\d+$"
            }
          },
          {
            "name": "slippageBps",
            "in": "query",
            "required": false,
            "description": "Slippage tolerance used to compute minOut (never 0).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Your wallet. Optional on the curve; required for graduated (QuickSwap) tokens. When set, the server adds gas estimates and checks allowance.",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "deadlineSec",
            "in": "query",
            "required": false,
            "description": "Seconds until the tx deadline.",
            "schema": {
              "type": "integer",
              "minimum": 30,
              "maximum": 3600,
              "default": 300
            }
          },
          {
            "name": "approve",
            "in": "query",
            "required": false,
            "description": "BZB approval size (BZB-quoted tokens only)",
            "schema": {
              "type": "string",
              "enum": [
                "exact",
                "max",
                "none"
              ],
              "default": "exact"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Unsigned tx bundle",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TxBundle"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "409": {
            "$ref": "#/components/responses/Error"
          },
          "410": {
            "$ref": "#/components/responses/Removed"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tx/sell": {
      "get": {
        "operationId": "buildSellTx",
        "summary": "Unsigned sell transaction(s): an approve step when needed, then PolyPump.sell (pays the quote asset) or a QuickSwap swap",
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "description": "Token address",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "amount",
            "in": "query",
            "required": false,
            "description": "Decimal amount (18 decimals): the token's quote asset (POL or BZB) for buys, tokens for sells. Use this or amountWei.",
            "schema": {
              "type": "string",
              "example": "1.5"
            }
          },
          {
            "name": "amountWei",
            "in": "query",
            "required": false,
            "description": "Integer amount in wei. Takes precedence over amount.",
            "schema": {
              "type": "string",
              "pattern": "^\\d+$"
            }
          },
          {
            "name": "slippageBps",
            "in": "query",
            "required": false,
            "description": "Slippage tolerance used to compute minOut (never 0).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Your wallet. Optional on the curve; required for graduated (QuickSwap) tokens. When set, the server adds gas estimates and checks allowance.",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "deadlineSec",
            "in": "query",
            "required": false,
            "description": "Seconds until the tx deadline.",
            "schema": {
              "type": "integer",
              "minimum": 30,
              "maximum": 3600,
              "default": 300
            }
          },
          {
            "name": "approve",
            "in": "query",
            "required": false,
            "description": "Approval size",
            "schema": {
              "type": "string",
              "enum": [
                "exact",
                "max",
                "none"
              ],
              "default": "exact"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Unsigned tx bundle",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TxBundle"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "409": {
            "$ref": "#/components/responses/Error"
          },
          "410": {
            "$ref": "#/components/responses/Removed"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tx/create": {
      "get": {
        "operationId": "buildCreateTx",
        "summary": "Unsigned PolyPump.createToken (POL) or createTokenBzb (BZB; plus a BZB approve for a dev buy) with launch-fee cap and optional first (dev) buy. Reserved names/symbols (USDC, WPOL, BZB, ...) are refused",
        "parameters": [
          {
            "name": "quote",
            "in": "query",
            "required": false,
            "description": "Quote asset, fixed forever: POL graduates to TOKEN/WPOL, BZB to TOKEN/BZB (QuickSwap V2). Launch fee is always POL",
            "schema": {
              "type": "string",
              "enum": [
                "POL",
                "BZB"
              ],
              "default": "POL"
            }
          },
          {
            "name": "name",
            "in": "query",
            "required": true,
            "description": "Max 32 bytes",
            "schema": {
              "type": "string",
              "maxLength": 32
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "required": true,
            "description": "Max 10 bytes",
            "schema": {
              "type": "string",
              "maxLength": 10
            }
          },
          {
            "name": "description",
            "in": "query",
            "required": false,
            "description": "Max 280 bytes",
            "schema": {
              "type": "string",
              "maxLength": 280
            }
          },
          {
            "name": "devBuy",
            "in": "query",
            "required": false,
            "description": "Optional first buy in the quote asset (decimal). Or devBuyWei.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "devBuyWei",
            "in": "query",
            "required": false,
            "description": "Optional first buy in wei",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slippageBps",
            "in": "query",
            "required": false,
            "description": "",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Your wallet. Optional on the curve; required for graduated (QuickSwap) tokens. When set, the server adds gas estimates and checks allowance.",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "deadlineSec",
            "in": "query",
            "required": false,
            "description": "Seconds until the tx deadline.",
            "schema": {
              "type": "integer",
              "minimum": 30,
              "maximum": 3600,
              "default": 300
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Unsigned tx bundle",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TxBundle"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "409": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tx/swap-pol-bzb": {
      "get": {
        "operationId": "buildSwapPolForBzbTx",
        "summary": "Unsigned QuickSwap V2 POL -> BZB swap (BZB/WPOL pair), to fund BZB-quoted trades",
        "parameters": [
          {
            "name": "amount",
            "in": "query",
            "required": false,
            "description": "Decimal amount (18 decimals): the token's quote asset (POL or BZB) for buys, tokens for sells. Use this or amountWei.",
            "schema": {
              "type": "string",
              "example": "1.5"
            }
          },
          {
            "name": "amountWei",
            "in": "query",
            "required": false,
            "description": "Integer amount in wei. Takes precedence over amount.",
            "schema": {
              "type": "string",
              "pattern": "^\\d+$"
            }
          },
          {
            "name": "slippageBps",
            "in": "query",
            "required": false,
            "description": "Slippage tolerance used to compute minOut (never 0).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Your wallet. Optional on the curve; required for graduated (QuickSwap) tokens. When set, the server adds gas estimates and checks allowance.",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "deadlineSec",
            "in": "query",
            "required": false,
            "description": "Seconds until the tx deadline.",
            "schema": {
              "type": "integer",
              "minimum": 30,
              "maximum": 3600,
              "default": 300
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Unsigned tx bundle",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TxBundle"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/wallet/{address}/holdings": {
      "get": {
        "operationId": "getWalletHoldings",
        "summary": "Wallet holdings: native POL, BZB and every PolyPump token held (bonding-curve or graduated) with balance, approximate value in its quote asset / POL / USD (spot price), pair asset, status (curve progress or graduated + QuickSwap link). Indexer + one balanceOf multicall.",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "Wallet address (any; read-only)"
          }
        ],
        "responses": {
          "200": {
            "description": "Holdings",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/wallet/{address}/created": {
      "get": {
        "operationId": "getWalletCreated",
        "summary": "Tokens this wallet launched (newest first): status, progress, market cap, pair asset",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "Wallet address (any; read-only)"
          }
        ],
        "responses": {
          "200": {
            "description": "Created tokens",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/wallet/{address}/fees": {
      "get": {
        "operationId": "getWalletFees",
        "summary": "Fee rights of a wallet, read live from PolyPump and LPFeeLocker: claimable POL/BZB, per-token creator-share and LP-fee recipients, harvestable LP fees of graduated tokens, and the on-chain actions this wallet may call (each with its /api/tx/* builder). Plain-language notes when the wallet has no rights.",
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            },
            "description": "Wallet address (any; read-only)"
          }
        ],
        "responses": {
          "200": {
            "description": "Fees",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/protocol/fees": {
      "get": {
        "operationId": "getProtocolFees",
        "summary": "Protocol-level fee summary: settings, platform claimable POL/BZB, totals owed to curves and claimants, sweepable surplus, graduated tokens with harvestable LP fees",
        "responses": {
          "200": {
            "description": "Protocol fees",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/tx/harvest": {
      "get": {
        "operationId": "buildHarvestTx",
        "summary": "Unsigned LPFeeLocker.harvest(token, minAmount0, minAmount1) for a graduated token: collects locked-LP fee growth (never principal) and pays the token's LP fee recipient. Only that recipient or the PolyPump owner may call it (403 otherwise).",
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "description": "Graduated token address",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Caller wallet (LP fee recipient or owner); adds a gas estimate",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "slippageBps",
            "in": "query",
            "required": false,
            "description": "Min-out tolerance on both pool assets",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Unsigned tx bundle",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TxBundle"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "409": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tx/claim": {
      "get": {
        "operationId": "buildClaimTx",
        "summary": "Unsigned claim of your accrued creator fees: claim/claimBzb to yourself, or claimTo/claimBzbTo with `to`. A `to` with no code and nonce 0 returns warnings + requiresAcknowledgement; a known pending pair address is refused (400)",
        "parameters": [
          {
            "name": "quote",
            "in": "query",
            "required": false,
            "description": "Which fees to claim",
            "schema": {
              "type": "string",
              "enum": [
                "POL",
                "BZB"
              ],
              "default": "POL"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Optional other recipient. Funds sent to a not-yet-deployed pair are lost (POL) or swept to surplus (BZB).",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Your wallet. Optional on the curve; required for graduated (QuickSwap) tokens. When set, the server adds gas estimates and checks allowance.",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          },
          {
            "name": "deadlineSec",
            "in": "query",
            "required": false,
            "description": "Seconds until the tx deadline.",
            "schema": {
              "type": "integer",
              "minimum": 30,
              "maximum": 3600,
              "default": 300
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Unsigned tx bundle",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TxBundle"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/api/tx/check-recipient": {
      "get": {
        "operationId": "checkRecipient",
        "summary": "Is this address safe to send claims to? blocked = a known pending pair address; fresh = no code and nonce 0 (warn)",
        "parameters": [
          {
            "name": "address",
            "in": "query",
            "required": true,
            "description": "Destination to check",
            "schema": {
              "type": "string",
              "pattern": "^0x[0-9a-fA-F]{40}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Recipient check",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/tokenlist.json": {
      "get": {
        "operationId": "getTokenList",
        "summary": "Uniswap-standard token list (tokenlists.org) of graduated, non-removed PolyPump tokens (POL- and BZB-paired) with pair, quoteAsset and quoteToken extensions; all tagged unverified",
        "responses": {
          "200": {
            "description": "Token list",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "Error": {
        "description": "Error",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "error": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "Removed": {
        "description": "Token removed from PolyPump by the admin (on-chain contract unaffected)",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "error": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "schemas": {
      "Token": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "pattern": "^0x[0-9a-fA-F]{40}$"
          },
          "creator": {
            "type": "string",
            "pattern": "^0x[0-9a-fA-F]{40}$"
          },
          "name": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "pair": {
            "type": "string",
            "pattern": "^0x[0-9a-fA-F]{40}$"
          },
          "quote": {
            "type": "string",
            "enum": [
              "POL",
              "BZB"
            ],
            "description": "Quote asset, fixed at launch"
          },
          "quoteToken": {
            "type": "string",
            "pattern": "^0x[0-9a-fA-F]{40}$"
          },
          "createdAt": {
            "type": "integer"
          },
          "graduated": {
            "type": "boolean"
          },
          "price": {
            "type": "number",
            "description": "Quote asset per token"
          },
          "marketCap": {
            "type": "number",
            "description": "In the quote asset"
          },
          "marketCapPol": {
            "type": [
              "number",
              "null"
            ]
          },
          "marketCapUsd": {
            "type": [
              "number",
              "null"
            ]
          },
          "priceInPol": {
            "type": [
              "number",
              "null"
            ]
          },
          "volume24h": {
            "type": "number",
            "description": "In the quote asset"
          },
          "volume24hPol": {
            "type": [
              "number",
              "null"
            ]
          },
          "graduationTarget": {
            "type": "number"
          },
          "progress": {
            "type": "number"
          },
          "image": {
            "type": [
              "string",
              "null"
            ]
          },
          "thinPool": {
            "type": "boolean",
            "description": "Graduated BZB token: its TOKEN/BZB pool was seeded with only the BZB target (10k BZB); expect high price impact"
          },
          "poolSeedQuote": {
            "type": [
              "number",
              "null"
            ]
          },
          "poolSeedUsd": {
            "type": [
              "number",
              "null"
            ]
          }
        }
      },
      "TokenPage": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer"
          },
          "tokens": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Token"
            }
          }
        }
      },
      "Quote": {
        "type": "object",
        "properties": {
          "venue": {
            "type": "string",
            "enum": [
              "curve",
              "quickswap"
            ]
          },
          "side": {
            "type": "string"
          },
          "quote": {
            "type": "string",
            "enum": [
              "POL",
              "BZB"
            ]
          },
          "inputAsset": {
            "type": "string"
          },
          "outputAsset": {
            "type": "string"
          },
          "mayGraduate": {
            "type": "boolean"
          },
          "amountInWei": {
            "type": "string"
          },
          "expectedOutWei": {
            "type": "string"
          },
          "minOutWei": {
            "type": "string"
          },
          "feeWei": {
            "type": [
              "string",
              "null"
            ]
          },
          "refundWei": {
            "type": "string"
          },
          "completesCurve": {
            "type": "boolean"
          },
          "maxFeeBps": {
            "type": [
              "integer",
              "null"
            ]
          },
          "slippageBps": {
            "type": "integer"
          },
          "gasLimit": {
            "type": "string",
            "description": "Recommended gas limit"
          }
        }
      },
      "Tx": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string"
          },
          "chainId": {
            "type": "integer"
          },
          "to": {
            "type": "string",
            "pattern": "^0x[0-9a-fA-F]{40}$"
          },
          "data": {
            "type": "string"
          },
          "value": {
            "type": "string",
            "description": "wei (decimal string)"
          },
          "valueHex": {
            "type": "string"
          },
          "gasLimit": {
            "type": "string",
            "description": "Recommended gas limit (decimal string)"
          },
          "gasEstimate": {
            "type": "string"
          },
          "simulationError": {
            "type": "string"
          },
          "dependsOnPrevious": {
            "type": "boolean"
          },
          "skipIfAllowanceAtLeast": {
            "type": "string"
          }
        },
        "required": [
          "chainId",
          "to",
          "data",
          "value",
          "gasLimit"
        ]
      },
      "TxBundle": {
        "type": "object",
        "properties": {
          "action": {
            "type": "string"
          },
          "deadline": {
            "type": "integer"
          },
          "quote": {
            "$ref": "#/components/schemas/Quote"
          },
          "transactions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Tx"
            }
          }
        }
      }
    }
  }
}