{
  "openapi": "3.1.0",
  "info": {
    "title": "sol-meme-intel - Solana meme-coin signals for AI agents",
    "version": "1.0.0",
    "description": "Decision-support for trading meme coins on Solana: discovery, rug-safety, holder concentration, momentum, and a composite signal. Free on-chain + DexScreener data, paid per call via x402 (USDC on Base). No API key, no signup. NOT financial advice.",
    "contact": {
      "name": "sol-meme-intel",
      "email": "vanlucpdu@gmail.com",
      "url": "https://sol-meme-intel.vercel.app"
    }
  },
  "servers": [
    {
      "url": "https://sol-meme-intel.vercel.app"
    }
  ],
  "x-docs": {
    "llmsTxt": "https://sol-meme-intel.vercel.app/llms.txt"
  },
  "x-guidance": "sol-meme-intel gives AI agents decision-support for trading meme coins on Solana from free on-chain + DexScreener data. Workflow: /api/discover to find candidate tokens, /api/safety for a rug check (honeypot/tax/owner), /api/holders for concentration/LP-lock dump risk, /api/bundle for sniper/bundle detection, /api/momentum for real buy/sell flow, and /api/signal for a single safety-gated GO/CAUTION/AVOID verdict plus momentum bias. NOT financial advice and NOT a pump prediction; the agent decides and executes itself. Each endpoint is a paid POST via x402 (USDC on Base).",
  "x402Version": 2,
  "x-discovery": {
    "ownershipProofs": [
      "0xcd6b6d99b7751ff30b68fa1365488eb73fa7cefa"
    ]
  },
  "paths": {
    "/api/discover": {
      "post": {
        "operationId": "discover",
        "summary": "Discover Solana Meme Tokens",
        "description": "Discover newly surfaced meme tokens on Solana, sourced from DexScreener boosted (PAID-promoted) and newly profiled tokens, enriched with price, liquidity, volume, pair age and socials. Solana is the meme-rich chain so this feed is active. A discovery STARTING POINT only: boosts are paid promotions, many promoted tokens are scams or sniper-bundled. Body: { limit? }.",
        "x-agent-guidance": {
          "whenToUse": "Use to FIND candidate Solana meme tokens. Step 1 of the workflow: discover -> /api/safety -> /api/holders -> /api/bundle -> /api/signal before any trade.",
          "input": "POST JSON: { limit? (default 10, max 15) }.",
          "output": "tokens[] with mint, source (boosted(paid)|new-profile), symbol, priceUsd, liquidityUsd, volume24hUsd, priceChange24hPct, pairAgeHours, hasSocials. Sorted by liquidity.",
          "paymentFlow": "First call returns HTTP 402 with an x402 payment requirement (USDC on Base/Solana). Pay with an x402 client, then retry the same request to get 200."
        },
        "x-payment-info": {
          "x402Version": 2,
          "price": {
            "mode": "fixed",
            "amount": "0.01",
            "currency": "USD"
          },
          "protocols": [
            "x402"
          ],
          "network": "eip155:8453",
          "asset": "USDC",
          "payTo": "0xcd6b6d99b7751ff30b68fa1365488eb73fa7cefa"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "limit": {
                    "type": "number",
                    "description": "Max tokens, default 10, max 15."
                  }
                },
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Discover Solana Meme Tokens result.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "tokens": {
                      "type": "array"
                    },
                    "count": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - missing/invalid input."
          },
          "402": {
            "description": "Payment Required (x402, USDC on Base)."
          }
        }
      }
    },
    "/api/safety": {
      "post": {
        "operationId": "safety",
        "summary": "Solana Meme Safety / Rug Check",
        "description": "Rug/safety check for a Solana SPL token via GoPlus Solana: mint authority, freeze authority, Token-2022 powers (close/balance-mutable/default-frozen/mutable-metadata/transfer-hook), holder concentration, LP burn/lock. Returns GO/CAUTION/AVOID. GO means no red flags in checks performed, NOT a guarantee. Body: { mint }.",
        "x-agent-guidance": {
          "whenToUse": "Use as the first safety gate before trading a Solana meme token. AVOID = serious red flag (freeze authority, honeypot pattern). For launch-sniping risk add /api/bundle; full combined read is /api/signal.",
          "input": "POST JSON: { mint }.",
          "output": "verdict (GO|CAUTION|AVOID), reasons[], checks[] (id/status/detail), notChecked[].",
          "paymentFlow": "First call returns HTTP 402 with an x402 payment requirement (USDC on Base/Solana). Pay with an x402 client, then retry the same request to get 200."
        },
        "x-payment-info": {
          "x402Version": 2,
          "price": {
            "mode": "fixed",
            "amount": "0.01",
            "currency": "USD"
          },
          "protocols": [
            "x402"
          ],
          "network": "eip155:8453",
          "asset": "USDC",
          "payTo": "0xcd6b6d99b7751ff30b68fa1365488eb73fa7cefa"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "mint": {
                    "type": "string",
                    "description": "Solana token mint address (base58).",
                    "examples": [
                      "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
                    ]
                  }
                },
                "required": [
                  "mint"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Solana Meme Safety / Rug Check result.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "verdict": {
                      "type": "string",
                      "enum": [
                        "GO",
                        "CAUTION",
                        "AVOID"
                      ]
                    },
                    "reasons": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "checks": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - missing/invalid input."
          },
          "402": {
            "description": "Payment Required (x402, USDC on Base)."
          }
        }
      }
    },
    "/api/momentum": {
      "post": {
        "operationId": "momentum",
        "summary": "Solana Meme Momentum",
        "description": "Real-time momentum/activity for a Solana token from DexScreener: price change 5m/1h/6h/24h, volume, 24h buy/sell ratio, liquidity, pair age, socials. Shows real recent flow, NOT a prediction. Body: { mint }.",
        "x-agent-guidance": {
          "whenToUse": "Use to gauge whether a token has real recent buying flow and basic risk (new pair, low liquidity). Pair with /api/safety; combined read is /api/signal.",
          "input": "POST JSON: { mint }.",
          "output": "priceUsd, priceChange {m5,h1,h6,h24}, volume {h1,h24}, txns24h {buys,sells,buySellRatio}, liquidityUsd, pairAgeHours, signals[].",
          "paymentFlow": "First call returns HTTP 402 with an x402 payment requirement (USDC on Base/Solana). Pay with an x402 client, then retry the same request to get 200."
        },
        "x-payment-info": {
          "x402Version": 2,
          "price": {
            "mode": "fixed",
            "amount": "0.01",
            "currency": "USD"
          },
          "protocols": [
            "x402"
          ],
          "network": "eip155:8453",
          "asset": "USDC",
          "payTo": "0xcd6b6d99b7751ff30b68fa1365488eb73fa7cefa"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "mint": {
                    "type": "string",
                    "description": "Solana token mint address (base58).",
                    "examples": [
                      "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
                    ]
                  }
                },
                "required": [
                  "mint"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Solana Meme Momentum result.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "priceUsd": {
                      "type": "number"
                    },
                    "priceChange": {
                      "type": "object"
                    },
                    "txns24h": {
                      "type": "object"
                    },
                    "liquidityUsd": {
                      "type": "number"
                    },
                    "signals": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - missing/invalid input."
          },
          "402": {
            "description": "Payment Required (x402, USDC on Base)."
          }
        }
      }
    },
    "/api/holders": {
      "post": {
        "operationId": "holders",
        "summary": "Solana Meme Holder Concentration",
        "description": "Holder concentration for a Solana token from GoPlus: holder count, top holders with %, real (non-locked) concentration excluding LP/burn, and LP locked %. High non-locked concentration = single-wallet dump risk. Body: { mint }.",
        "x-agent-guidance": {
          "whenToUse": "Use to assess dump risk from concentrated holders and whether LP is locked, before trading. Complements /api/safety with distribution risk.",
          "input": "POST JSON: { mint }.",
          "output": "holderCount, topHolders[] (address/percent/isLocked/tag), topNonLockedConcentrationPct, lpLockedPct, reasons[].",
          "paymentFlow": "First call returns HTTP 402 with an x402 payment requirement (USDC on Base/Solana). Pay with an x402 client, then retry the same request to get 200."
        },
        "x-payment-info": {
          "x402Version": 2,
          "price": {
            "mode": "fixed",
            "amount": "0.01",
            "currency": "USD"
          },
          "protocols": [
            "x402"
          ],
          "network": "eip155:8453",
          "asset": "USDC",
          "payTo": "0xcd6b6d99b7751ff30b68fa1365488eb73fa7cefa"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "mint": {
                    "type": "string",
                    "description": "Solana token mint address (base58).",
                    "examples": [
                      "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
                    ]
                  }
                },
                "required": [
                  "mint"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Solana Meme Holder Concentration result.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "holderCount": {
                      "type": "number"
                    },
                    "topHolders": {
                      "type": "array"
                    },
                    "topNonLockedConcentrationPct": {
                      "type": "number"
                    },
                    "lpLockedPct": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - missing/invalid input."
          },
          "402": {
            "description": "Payment Required (x402, USDC on Base)."
          }
        }
      }
    },
    "/api/bundle": {
      "post": {
        "operationId": "bundle",
        "summary": "Solana Bundle / Sniper Detection",
        "description": "Bundle/sniper detection for a Solana token via Helius: analyzes recent swaps and groups buyers by slot to flag coordinated launch buys (bundle/sniper clusters). Returns CLEAN/SUSPICIOUS/LIKELY_BUNDLE. Most accurate for fresh launches. A bundle signal is a risk flag, not proof of malice. Body: { mint }.",
        "x-agent-guidance": {
          "whenToUse": "Use to detect coordinated launch buying (snipers/bundles) on a fresh Solana meme before trading. This is the #1 meme launch risk. Complements /api/safety (contract) and /api/holders (distribution).",
          "input": "POST JSON: { mint }.",
          "output": "bundleVerdict (CLEAN|SUSPICIOUS|LIKELY_BUNDLE), distinctBuyers, largestSlotCluster, clusters[], clusterBuyerShare, reasons[].",
          "paymentFlow": "First call returns HTTP 402 with an x402 payment requirement (USDC on Base/Solana). Pay with an x402 client, then retry the same request to get 200."
        },
        "x-payment-info": {
          "x402Version": 2,
          "price": {
            "mode": "fixed",
            "amount": "0.015",
            "currency": "USD"
          },
          "protocols": [
            "x402"
          ],
          "network": "eip155:8453",
          "asset": "USDC",
          "payTo": "0xcd6b6d99b7751ff30b68fa1365488eb73fa7cefa"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "mint": {
                    "type": "string",
                    "description": "Solana token mint address (base58).",
                    "examples": [
                      "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
                    ]
                  }
                },
                "required": [
                  "mint"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Solana Bundle / Sniper Detection result.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "bundleVerdict": {
                      "type": "string",
                      "enum": [
                        "CLEAN",
                        "SUSPICIOUS",
                        "LIKELY_BUNDLE",
                        "UNKNOWN"
                      ]
                    },
                    "distinctBuyers": {
                      "type": "number"
                    },
                    "clusterBuyerShare": {
                      "type": "number"
                    },
                    "reasons": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - missing/invalid input."
          },
          "402": {
            "description": "Payment Required (x402, USDC on Base)."
          }
        }
      }
    },
    "/api/signal": {
      "post": {
        "operationId": "signal",
        "summary": "Solana Meme Signal (composite)",
        "description": "Composite Solana meme signal: combines safety + holder concentration + LP lock + liquidity + buy/sell flow + bundle/sniper detection into a SAFETY-GATED verdict (GO/CAUTION/AVOID) plus a separate momentum bias, with a transparent factor breakdown and risk flags. One call for a full go/no-go read. Decision-support, NOT financial advice and NOT a pump prediction. Body: { mint }.",
        "x-agent-guidance": {
          "whenToUse": "Use as the single combined read on a Solana meme token before an agent decides to trade it itself. Replaces chaining safety + holders + momentum + bundle. verdict is safety-gated (AVOID safety or a likely bundle forces AVOID). The agent decides and executes; this does not place orders.",
          "input": "POST JSON: { mint }.",
          "output": "verdict (GO|CAUTION|AVOID), momentumBias (rising|falling|flat), summary{}, factors[] (name/reading/impact/why), riskFlags[].",
          "paymentFlow": "First call returns HTTP 402 with an x402 payment requirement (USDC on Base/Solana). Pay with an x402 client, then retry the same request to get 200."
        },
        "x-payment-info": {
          "x402Version": 2,
          "price": {
            "mode": "fixed",
            "amount": "0.02",
            "currency": "USD"
          },
          "protocols": [
            "x402"
          ],
          "network": "eip155:8453",
          "asset": "USDC",
          "payTo": "0xcd6b6d99b7751ff30b68fa1365488eb73fa7cefa"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "mint": {
                    "type": "string",
                    "description": "Solana token mint address (base58).",
                    "examples": [
                      "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
                    ]
                  }
                },
                "required": [
                  "mint"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Solana Meme Signal (composite) result.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "verdict": {
                      "type": "string",
                      "enum": [
                        "GO",
                        "CAUTION",
                        "AVOID"
                      ]
                    },
                    "momentumBias": {
                      "type": "string"
                    },
                    "summary": {
                      "type": "object"
                    },
                    "factors": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "riskFlags": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - missing/invalid input."
          },
          "402": {
            "description": "Payment Required (x402, USDC on Base)."
          }
        }
      }
    }
  }
}