{
  "openapi": "3.1.0",
  "info": {
    "title": "poolproof",
    "version": "1.0.0",
    "description": "Three checks that answer one question: is this actually what it says it is?\n\nEvery response is verifiable fact plus flags for what does not line up. No ratings, no advice, no predicted returns.\n\nPaid endpoints use x402: call without payment to receive a 402 listing terms, then retry with an X-PAYMENT header. Settlement is USDC on Base.\n\nFree endpoints under /free/ need no payment and are rate limited.",
    "x-disclaimer": "Facts only. Not investment advice. No profit is implied."
  },
  "servers": [
    {
      "url": "https://poolproof.ru"
    }
  ],
  "paths": {
    "/v1/pool": {
      "get": {
        "operationId": "v1_pool",
        "summary": "Is this yield pool what it claims to be?",
        "description": "Prices every underlying asset against its peg, compares current APY to its own history, reports whether the yield survives without token emissions, and checks exit depth. Catches pools labelled 'stablecoin' that hold assets trading well below $1.",
        "parameters": [
          {
            "name": "pool",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "DefiLlama pool id (uuid), from https://yields.llama.fi/pools",
            "example": "747c1d2a-c668-4682-b9f9-296708a3dd90"
          }
        ],
        "x-price-usdc": 0.005,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/free/pool": {
      "get": {
        "operationId": "free_free_pool",
        "summary": "Is this yield pool what it claims to be? (free tier)",
        "description": "Identical to /v1/pool, no payment. Rate limited per IP and globally.",
        "parameters": [
          {
            "name": "pool",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "DefiLlama pool id (uuid), from https://yields.llama.fi/pools",
            "example": "747c1d2a-c668-4682-b9f9-296708a3dd90"
          }
        ],
        "x-price-usdc": 0,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/v1/exit-cost": {
      "get": {
        "operationId": "v1_exit_cost",
        "summary": "What does exiting this Solana position actually cost at your size?",
        "description": "Quotes your real size against a live router and compares it to the price at negligible size. Returns the true cost of leaving, not a theoretical slippage assumption. Built after a sniping bot lost 59% by estimating this instead of measuring it.",
        "parameters": [
          {
            "name": "mint",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Solana token mint address",
            "example": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"
          },
          {
            "name": "size",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number"
            },
            "description": "Position size in whole tokens. This is the point: the quote is for YOUR size.",
            "example": 50000000
          }
        ],
        "x-price-usdc": 0.01,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/free/exit-cost": {
      "get": {
        "operationId": "free_free_exit_cost",
        "summary": "What does exiting this Solana position actually cost at your size? (free tier)",
        "description": "Identical to /v1/exit-cost, no payment. Rate limited per IP and globally.",
        "parameters": [
          {
            "name": "mint",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Solana token mint address",
            "example": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"
          },
          {
            "name": "size",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number"
            },
            "description": "Position size in whole tokens. This is the point: the quote is for YOUR size.",
            "example": 50000000
          }
        ],
        "x-price-usdc": 0,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/v1/chain": {
      "get": {
        "operationId": "v1_chain",
        "summary": "Is this chain alive or abandoned?",
        "description": "TVL across 1y/6m/90d/30d windows. Separates a quiet ecosystem from one the capital has left.",
        "parameters": [
          {
            "name": "chain",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Chain name as used by DefiLlama",
            "example": "Bitlayer"
          }
        ],
        "x-price-usdc": 0.003,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/free/chain": {
      "get": {
        "operationId": "free_free_chain",
        "summary": "Is this chain alive or abandoned? (free tier)",
        "description": "Identical to /v1/chain, no payment. Rate limited per IP and globally.",
        "parameters": [
          {
            "name": "chain",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Chain name as used by DefiLlama",
            "example": "Bitlayer"
          }
        ],
        "x-price-usdc": 0,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/v1/launch": {
      "get": {
        "operationId": "v1_launch",
        "summary": "Who launched this pump.fun token and what happened to their previous ones?",
        "description": "Launch count from the same creator wallet, how many of their tokens reached the exchange, the graduation rate of that creator group against the overall base rate, and whether the creator filled the bonding curve with their own purchase. Observation starts 2026-08-10; a wallet active before that appears unseen, and the response states it.",
        "parameters": [
          {
            "name": "mint",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Solana mint address of the pump.fun token",
            "example": "BDrLFokZMihhwUJiQEkShDZboShajH1P9tf14eG9pump"
          }
        ],
        "x-price-usdc": 0.005,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/free/launch": {
      "get": {
        "operationId": "free_free_launch",
        "summary": "Who launched this pump.fun token and what happened to their previous ones? (free tier)",
        "description": "Identical to /v1/launch, no payment. Rate limited per IP and globally.",
        "parameters": [
          {
            "name": "mint",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Solana mint address of the pump.fun token",
            "example": "BDrLFokZMihhwUJiQEkShDZboShajH1P9tf14eG9pump"
          }
        ],
        "x-price-usdc": 0,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/v1/launches": {
      "get": {
        "operationId": "v1_launches",
        "summary": "What is launching on pump.fun right now, and who is behind it?",
        "description": "A live feed of the last 24 hours of pump.fun launches, newest first, each with the creator's record: how many tokens that wallet launched before, how many reached the exchange, and whether the creator's own first buy was large enough to fill the bonding curve alone. Poll with ?since= to receive only what appeared since your last call. Authorship at the moment of launch cannot be reconstructed after the fact — we checked four public sources; the one that indexes these pools anchors them up to 33 hours late.",
        "parameters": [
          {
            "name": "since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Unix timestamp. Return only launches recorded after it. Use next_since from the previous response to poll incrementally.",
            "example": 1786663198
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            },
            "description": "How many launches to return, newest first. Default 50.",
            "example": 50
          },
          {
            "name": "only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "first_time",
                "serial",
                "bought_curve",
                "graduated",
                "clean"
              ]
            },
            "description": "Keep only launches carrying this trait. clean = no flags raised.",
            "example": "bought_curve"
          }
        ],
        "x-price-usdc": 0.01,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/free/launches": {
      "get": {
        "operationId": "free_free_launches",
        "summary": "What is launching on pump.fun right now, and who is behind it? (free tier)",
        "description": "Identical to /v1/launches, no payment. Rate limited per IP and globally.",
        "parameters": [
          {
            "name": "since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Unix timestamp. Return only launches recorded after it. Use next_since from the previous response to poll incrementally.",
            "example": 1786663198
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            },
            "description": "How many launches to return, newest first. Default 50.",
            "example": 50
          },
          {
            "name": "only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "first_time",
                "serial",
                "bought_curve",
                "graduated",
                "clean"
              ]
            },
            "description": "Keep only launches carrying this trait. clean = no flags raised.",
            "example": "bought_curve"
          }
        ],
        "x-price-usdc": 0,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/v1/known": {
      "get": {
        "operationId": "v1_known",
        "summary": "Do we know something about this that no data feed reports?",
        "description": "Curated research notes covering what prices and TVL cannot express: redemption bridges that no longer exist, tickers shared by unrelated projects, points programmes that have quietly ended, marketplaces that shut down, and roles whose real capital gate is not in any documentation. An empty result means we have not investigated it, not that it is safe.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Asset symbol, protocol name, chain name or contract address",
            "example": "renBTC"
          }
        ],
        "x-price-usdc": 0.02,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    },
    "/free/known": {
      "get": {
        "operationId": "free_free_known",
        "summary": "Do we know something about this that no data feed reports? (free tier)",
        "description": "Identical to /v1/known, no payment. Rate limited per IP and globally.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Asset symbol, protocol name, chain name or contract address",
            "example": "renBTC"
          }
        ],
        "x-price-usdc": 0,
        "x-payment-protocol": "x402",
        "responses": {
          "200": {
            "description": "Check completed. Facts and flags. Never advice.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. Body lists accepted terms; retry with X-PAYMENT header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentRequired"
                }
              }
            }
          },
          "429": {
            "description": "Free tier limit reached (free endpoints only)."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Result": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "flags": {
            "type": "array",
            "description": "Empty means nothing failed the checks.",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "enum": [
                    "DEPEG",
                    "OPAQUE",
                    "SPIKE",
                    "UNSTABLE",
                    "EMISSION",
                    "THIN",
                    "SIZE_WALL",
                    "EXIT_COST",
                    "COLLAPSED",
                    "STILL_FALLING",
                    "TINY"
                  ]
                },
                "msg": {
                  "type": "string"
                }
              }
            }
          },
          "verdict": {
            "type": "string",
            "example": "2 FLAGS"
          },
          "disclaimer": {
            "type": "string"
          }
        }
      },
      "PaymentRequired": {
        "type": "object",
        "properties": {
          "x402Version": {
            "type": "integer",
            "example": 1
          },
          "error": {
            "type": "string"
          },
          "accepts": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "scheme": {
                  "type": "string",
                  "example": "exact"
                },
                "network": {
                  "type": "string",
                  "example": "base"
                },
                "maxAmountRequired": {
                  "type": "string",
                  "description": "Atomic units of the asset (USDC has 6 decimals)"
                },
                "payTo": {
                  "type": "string"
                },
                "asset": {
                  "type": "string"
                },
                "maxTimeoutSeconds": {
                  "type": "integer"
                }
              }
            }
          }
        }
      }
    }
  }
}