{
  "schemaVersion": "1.0",
  "item": {
    "slug": "opendex",
    "name": "OpenDEX Solana Token API",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/solpenguin/opendex",
    "canonicalUrl": "https://clawhub.ai/solpenguin/opendex",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/opendex",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=opendex",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/opendex"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/opendex",
    "agentPageUrl": "https://openagent3.xyz/skills/opendex/agent",
    "manifestUrl": "https://openagent3.xyz/skills/opendex/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/opendex/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "OpenDex API Skill",
        "body": "You can interact with the OpenDex API to retrieve Solana token data, community-curated content, market sentiment, and more."
      },
      {
        "title": "Base URL",
        "body": "https://opendex-api-dy30.onrender.com\n\nFrontend: https://opendex.online"
      },
      {
        "title": "Public Endpoints (No API Key Required)",
        "body": "Token data, search, price, chart, sentiment, and watchlist endpoints are open and do not require authentication. They are rate-limited to 100 requests/minute per IP."
      },
      {
        "title": "Authenticated Endpoints (API Key Required)",
        "body": "Community content endpoints under /api/v1/ require an API key passed via the X-API-Key header.\n\nRate limits:\n\nStandard endpoints: 100 requests/minute\nKey registration: 10 requests/minute\nSearch: 30 requests/minute"
      },
      {
        "title": "Obtaining an API Key",
        "body": "Register a free API key by sending a POST request with a Solana wallet address:\n\nPOST /api/v1/keys/register\nContent-Type: application/json\n\n{\n  \"wallet\": \"<SOLANA_WALLET_ADDRESS>\",\n  \"name\": \"OpenClaw\"\n}\n\nResponse (201):\n\n{\n  \"success\": true,\n  \"message\": \"API key created successfully\",\n  \"data\": {\n    \"apiKey\": \"abc123...full64hexchars\",\n    \"keyPrefix\": \"abc123\",\n    \"owner\": \"<SOLANA_WALLET_ADDRESS>\",\n    \"name\": \"OpenClaw\",\n    \"createdAt\": \"2026-02-26T12:00:00Z\"\n  }\n}\n\nThe full API key is only returned once at creation. Store it securely. One key per wallet.\n\nUsers can also obtain keys through the web UI at https://opendex.online/api.html by connecting their wallet."
      },
      {
        "title": "Using the API Key",
        "body": "Include the key in the X-API-Key header on all /api/v1/ requests:\n\ncurl -H \"X-API-Key: YOUR_API_KEY\" \\\n  https://opendex-api-dy30.onrender.com/api/v1/community/<mint>"
      },
      {
        "title": "Key Management",
        "body": "EndpointMethodDescription/api/v1/keys/infoGETGet your key's usage stats (requires X-API-Key)/api/v1/keys/status/:walletGETCheck if a wallet has a key (public)/api/v1/keys/revokeDELETERevoke your key (requires X-API-Key)"
      },
      {
        "title": "Token Data (No Auth)",
        "body": "List Tokens\n\nGET /api/tokens?filter=trending&limit=50&offset=0&order=desc\n\nFilters: trending, new, gainers, losers, most_viewed\n\nResponse: Array of token objects with mintAddress, name, symbol, price, priceChange24h, volume24h, marketCap, logoUri, views, sentimentScore, sentimentBullish, sentimentBearish.\n\nSearch Tokens\n\nGET /api/tokens/search?q=<query>\n\nQuery must be 2-100 characters. Rate limit: 30/minute. Returns matching tokens by name, symbol, or address.\n\nGet Token Details\n\nGET /api/tokens/:mint\n\nReturns full token data including price, priceChange24h, volume24h, liquidity, marketCap, fdv, supply, circulatingSupply, holders, decimals, logoUri, and community submissions (banners and socials).\n\nGet Token Price\n\nGET /api/tokens/:mint/price\n\nReturns current price data: price, marketCap, fdv, volume24h, priceChange24h, liquidity.\n\nGet Price Chart\n\nGET /api/tokens/:mint/chart?interval=1h&limit=100\n\nIntervals: 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w\n\nGet OHLCV Data\n\nGET /api/tokens/:mint/ohlcv?interval=1h&limit=100\n\nReturns candlestick data (open, high, low, close, volume).\n\nGet Liquidity Pools\n\nGET /api/tokens/:mint/pools\n\nBatch Get Tokens\n\nPOST /api/tokens/batch\nContent-Type: application/json\n\n{ \"mints\": [\"mint1\", \"mint2\", ...] }\n\nMax 50 tokens per request.\n\nCheck Token Holder\n\nGET /api/tokens/:mint/holder/:wallet\n\nReturns balance, holdsToken, percentageHeld, totalSupply, circulatingSupply.\n\nRecord Page View\n\nPOST /api/tokens/:mint/view\n\nGet View Count\n\nGET /api/tokens/:mint/views"
      },
      {
        "title": "Community Content (Requires API Key)",
        "body": "Get Community Content for a Token\n\nGET /api/v1/community/:mint\n\nReturns the top-voted banner and social links for a token.\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": {\n    \"token\": \"So11111111111111111111111111111111111111112\",\n    \"banner\": {\n      \"url\": \"https://i.imgur.com/example.png\",\n      \"score\": 15,\n      \"submittedAt\": \"2026-02-26T12:00:00Z\"\n    },\n    \"links\": {\n      \"twitter\": { \"url\": \"https://twitter.com/solana\", \"score\": 12 },\n      \"telegram\": null,\n      \"discord\": { \"url\": \"https://discord.gg/solana\", \"score\": 8 },\n      \"tiktok\": null,\n      \"website\": { \"url\": \"https://solana.com\", \"score\": 10 }\n    },\n    \"submissionCount\": 4\n  }\n}\n\nGet All Approved Submissions\n\nGET /api/v1/community/:mint/all?type=banner\n\nOptional type filter: banner, twitter, telegram, discord, tiktok, website\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": {\n    \"token\": \"...\",\n    \"count\": 3,\n    \"submissions\": [\n      {\n        \"id\": 123,\n        \"type\": \"banner\",\n        \"url\": \"https://i.imgur.com/example.png\",\n        \"score\": 15,\n        \"upvotes\": 20,\n        \"downvotes\": 5,\n        \"submittedAt\": \"2026-02-26T12:00:00Z\"\n      }\n    ]\n  }\n}\n\nBatch Community Content\n\nGET /api/v1/community/batch?mints=mint1,mint2,mint3\n\nMax 20 tokens per request. Returns a map of mint address to community content (banner URL and link URLs as strings, not objects)."
      },
      {
        "title": "Sentiment (No Auth)",
        "body": "Get Sentiment\n\nGET /api/sentiment/:mint?wallet=<optional_wallet>\n\nReturns bullish/bearish counts and the user's vote if wallet is provided.\n\nResponse:\n\n{\n  \"tally\": { \"bullish\": 245, \"bearish\": 53, \"score\": 192 },\n  \"userVote\": \"bullish\"\n}\n\nCast Sentiment Vote\n\nPOST /api/sentiment/:mint\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"sentiment\": \"bullish\" }\n\nSentiment values: bullish or bearish. No token holder requirement.\n\nBulk Sentiment\n\nPOST /api/sentiment/bulk\nContent-Type: application/json\n\n{ \"mints\": [\"mint1\", \"mint2\", ...] }\n\nMax 100 mints. Returns sentiment tallies for each."
      },
      {
        "title": "Submissions (Signature Required)",
        "body": "Get Submissions for a Token\n\nGET /api/submissions/token/:mint?status=approved&type=banner\n\nStatuses: pending, approved, rejected, all\n\nCreate Submission\n\nPOST /api/submissions\nContent-Type: application/json\n\n{\n  \"tokenMint\": \"<MINT>\",\n  \"type\": \"twitter\",\n  \"contentUrl\": \"https://twitter.com/example\",\n  \"walletAddress\": \"<WALLET>\",\n  \"signature\": [...],\n  \"timestamp\": 1709012400000\n}\n\nTypes: banner, twitter, telegram, discord, tiktok, website\n\nRequires Ed25519 wallet signature. Submissions are community-moderated through voting."
      },
      {
        "title": "Voting (Signature + Holder Required)",
        "body": "Cast Vote\n\nPOST /api/votes\nContent-Type: application/json\n\n{\n  \"submissionId\": 123,\n  \"voterWallet\": \"<WALLET>\",\n  \"voteType\": \"up\",\n  \"signature\": [...],\n  \"timestamp\": 1709012400000\n}\n\nVoter must hold the token (minimum 0.1% of supply). Vote weight scales by holdings (1x-3x).\n\nCheck Vote Status\n\nGET /api/votes/check?submissionId=123&wallet=<WALLET>\n\nBulk Check Votes\n\nPOST /api/votes/bulk-check\nContent-Type: application/json\n\n{ \"submissionIds\": [1, 2, 3], \"wallet\": \"<WALLET>\" }\n\nMax 50. Returns { [submissionId]: { hasVoted, voteType } }."
      },
      {
        "title": "Watchlist (No Auth)",
        "body": "Get Watchlist\n\nGET /api/watchlist/:wallet\n\nAdd to Watchlist\n\nPOST /api/watchlist\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"mint\": \"<MINT>\" }\n\nMax 100 tokens per wallet.\n\nRemove from Watchlist\n\nDELETE /api/watchlist\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"mint\": \"<MINT>\" }\n\nCheck if Token in Watchlist\n\nPOST /api/watchlist/check\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"mint\": \"<MINT>\" }"
      },
      {
        "title": "Health & Status (No Auth)",
        "body": "EndpointDescriptionGET /healthBasic health checkGET /health/detailedFull dependency status (DB, RPC, cache, APIs)GET /health/readyReadiness probeGET /health/liveLiveness probeGET /api/statsCache and database statisticsGET /api/announcements/activeActive site announcements"
      },
      {
        "title": "Error Responses",
        "body": "All errors follow this format:\n\n{\n  \"error\": \"User-facing message\",\n  \"code\": \"ERROR_CODE\",\n  \"requestId\": \"trace-id\",\n  \"timestamp\": \"2026-02-26T12:00:00Z\"\n}\n\nCodeMeaning400Bad request (invalid parameters)401Missing or invalid API key403Access denied (revoked key, insufficient holder balance)404Resource not found409Conflict (duplicate submission, wallet already has key)429Rate limit exceeded (check Retry-After header)503Service temporarily unavailable"
      },
      {
        "title": "Solana Address Format",
        "body": "Valid Solana addresses are base58-encoded, 43-44 characters, using characters 1-9 A-H J-N P-Z a-k m-z (no 0, I, O, l)."
      },
      {
        "title": "External Links",
        "body": "For any token with mint address <MINT>:\n\nOpenDex token page: https://opendex.online/token.html?mint=<MINT>\nSolscan: https://solscan.io/token/<MINT>\nJupiter swap: https://jup.ag/swap/SOL-<MINT>\nRaydium swap: https://raydium.io/swap/?outputMint=<MINT>"
      }
    ],
    "body": "OpenDex API Skill\n\nYou can interact with the OpenDex API to retrieve Solana token data, community-curated content, market sentiment, and more.\n\nBase URL\nhttps://opendex-api-dy30.onrender.com\n\n\nFrontend: https://opendex.online\n\nAuthentication\nPublic Endpoints (No API Key Required)\n\nToken data, search, price, chart, sentiment, and watchlist endpoints are open and do not require authentication. They are rate-limited to 100 requests/minute per IP.\n\nAuthenticated Endpoints (API Key Required)\n\nCommunity content endpoints under /api/v1/ require an API key passed via the X-API-Key header.\n\nRate limits:\n\nStandard endpoints: 100 requests/minute\nKey registration: 10 requests/minute\nSearch: 30 requests/minute\nObtaining an API Key\n\nRegister a free API key by sending a POST request with a Solana wallet address:\n\nPOST /api/v1/keys/register\nContent-Type: application/json\n\n{\n  \"wallet\": \"<SOLANA_WALLET_ADDRESS>\",\n  \"name\": \"OpenClaw\"\n}\n\n\nResponse (201):\n\n{\n  \"success\": true,\n  \"message\": \"API key created successfully\",\n  \"data\": {\n    \"apiKey\": \"abc123...full64hexchars\",\n    \"keyPrefix\": \"abc123\",\n    \"owner\": \"<SOLANA_WALLET_ADDRESS>\",\n    \"name\": \"OpenClaw\",\n    \"createdAt\": \"2026-02-26T12:00:00Z\"\n  }\n}\n\n\nThe full API key is only returned once at creation. Store it securely. One key per wallet.\n\nUsers can also obtain keys through the web UI at https://opendex.online/api.html by connecting their wallet.\n\nUsing the API Key\n\nInclude the key in the X-API-Key header on all /api/v1/ requests:\n\ncurl -H \"X-API-Key: YOUR_API_KEY\" \\\n  https://opendex-api-dy30.onrender.com/api/v1/community/<mint>\n\nKey Management\nEndpoint\tMethod\tDescription\n/api/v1/keys/info\tGET\tGet your key's usage stats (requires X-API-Key)\n/api/v1/keys/status/:wallet\tGET\tCheck if a wallet has a key (public)\n/api/v1/keys/revoke\tDELETE\tRevoke your key (requires X-API-Key)\nAPI Endpoints\nToken Data (No Auth)\nList Tokens\nGET /api/tokens?filter=trending&limit=50&offset=0&order=desc\n\n\nFilters: trending, new, gainers, losers, most_viewed\n\nResponse: Array of token objects with mintAddress, name, symbol, price, priceChange24h, volume24h, marketCap, logoUri, views, sentimentScore, sentimentBullish, sentimentBearish.\n\nSearch Tokens\nGET /api/tokens/search?q=<query>\n\n\nQuery must be 2-100 characters. Rate limit: 30/minute. Returns matching tokens by name, symbol, or address.\n\nGet Token Details\nGET /api/tokens/:mint\n\n\nReturns full token data including price, priceChange24h, volume24h, liquidity, marketCap, fdv, supply, circulatingSupply, holders, decimals, logoUri, and community submissions (banners and socials).\n\nGet Token Price\nGET /api/tokens/:mint/price\n\n\nReturns current price data: price, marketCap, fdv, volume24h, priceChange24h, liquidity.\n\nGet Price Chart\nGET /api/tokens/:mint/chart?interval=1h&limit=100\n\n\nIntervals: 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w\n\nGet OHLCV Data\nGET /api/tokens/:mint/ohlcv?interval=1h&limit=100\n\n\nReturns candlestick data (open, high, low, close, volume).\n\nGet Liquidity Pools\nGET /api/tokens/:mint/pools\n\nBatch Get Tokens\nPOST /api/tokens/batch\nContent-Type: application/json\n\n{ \"mints\": [\"mint1\", \"mint2\", ...] }\n\n\nMax 50 tokens per request.\n\nCheck Token Holder\nGET /api/tokens/:mint/holder/:wallet\n\n\nReturns balance, holdsToken, percentageHeld, totalSupply, circulatingSupply.\n\nRecord Page View\nPOST /api/tokens/:mint/view\n\nGet View Count\nGET /api/tokens/:mint/views\n\nCommunity Content (Requires API Key)\nGet Community Content for a Token\nGET /api/v1/community/:mint\n\n\nReturns the top-voted banner and social links for a token.\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": {\n    \"token\": \"So11111111111111111111111111111111111111112\",\n    \"banner\": {\n      \"url\": \"https://i.imgur.com/example.png\",\n      \"score\": 15,\n      \"submittedAt\": \"2026-02-26T12:00:00Z\"\n    },\n    \"links\": {\n      \"twitter\": { \"url\": \"https://twitter.com/solana\", \"score\": 12 },\n      \"telegram\": null,\n      \"discord\": { \"url\": \"https://discord.gg/solana\", \"score\": 8 },\n      \"tiktok\": null,\n      \"website\": { \"url\": \"https://solana.com\", \"score\": 10 }\n    },\n    \"submissionCount\": 4\n  }\n}\n\nGet All Approved Submissions\nGET /api/v1/community/:mint/all?type=banner\n\n\nOptional type filter: banner, twitter, telegram, discord, tiktok, website\n\nResponse:\n\n{\n  \"success\": true,\n  \"data\": {\n    \"token\": \"...\",\n    \"count\": 3,\n    \"submissions\": [\n      {\n        \"id\": 123,\n        \"type\": \"banner\",\n        \"url\": \"https://i.imgur.com/example.png\",\n        \"score\": 15,\n        \"upvotes\": 20,\n        \"downvotes\": 5,\n        \"submittedAt\": \"2026-02-26T12:00:00Z\"\n      }\n    ]\n  }\n}\n\nBatch Community Content\nGET /api/v1/community/batch?mints=mint1,mint2,mint3\n\n\nMax 20 tokens per request. Returns a map of mint address to community content (banner URL and link URLs as strings, not objects).\n\nSentiment (No Auth)\nGet Sentiment\nGET /api/sentiment/:mint?wallet=<optional_wallet>\n\n\nReturns bullish/bearish counts and the user's vote if wallet is provided.\n\nResponse:\n\n{\n  \"tally\": { \"bullish\": 245, \"bearish\": 53, \"score\": 192 },\n  \"userVote\": \"bullish\"\n}\n\nCast Sentiment Vote\nPOST /api/sentiment/:mint\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"sentiment\": \"bullish\" }\n\n\nSentiment values: bullish or bearish. No token holder requirement.\n\nBulk Sentiment\nPOST /api/sentiment/bulk\nContent-Type: application/json\n\n{ \"mints\": [\"mint1\", \"mint2\", ...] }\n\n\nMax 100 mints. Returns sentiment tallies for each.\n\nSubmissions (Signature Required)\nGet Submissions for a Token\nGET /api/submissions/token/:mint?status=approved&type=banner\n\n\nStatuses: pending, approved, rejected, all\n\nCreate Submission\nPOST /api/submissions\nContent-Type: application/json\n\n{\n  \"tokenMint\": \"<MINT>\",\n  \"type\": \"twitter\",\n  \"contentUrl\": \"https://twitter.com/example\",\n  \"walletAddress\": \"<WALLET>\",\n  \"signature\": [...],\n  \"timestamp\": 1709012400000\n}\n\n\nTypes: banner, twitter, telegram, discord, tiktok, website\n\nRequires Ed25519 wallet signature. Submissions are community-moderated through voting.\n\nVoting (Signature + Holder Required)\nCast Vote\nPOST /api/votes\nContent-Type: application/json\n\n{\n  \"submissionId\": 123,\n  \"voterWallet\": \"<WALLET>\",\n  \"voteType\": \"up\",\n  \"signature\": [...],\n  \"timestamp\": 1709012400000\n}\n\n\nVoter must hold the token (minimum 0.1% of supply). Vote weight scales by holdings (1x-3x).\n\nCheck Vote Status\nGET /api/votes/check?submissionId=123&wallet=<WALLET>\n\nBulk Check Votes\nPOST /api/votes/bulk-check\nContent-Type: application/json\n\n{ \"submissionIds\": [1, 2, 3], \"wallet\": \"<WALLET>\" }\n\n\nMax 50. Returns { [submissionId]: { hasVoted, voteType } }.\n\nWatchlist (No Auth)\nGet Watchlist\nGET /api/watchlist/:wallet\n\nAdd to Watchlist\nPOST /api/watchlist\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"mint\": \"<MINT>\" }\n\n\nMax 100 tokens per wallet.\n\nRemove from Watchlist\nDELETE /api/watchlist\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"mint\": \"<MINT>\" }\n\nCheck if Token in Watchlist\nPOST /api/watchlist/check\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"mint\": \"<MINT>\" }\n\nHealth & Status (No Auth)\nEndpoint\tDescription\nGET /health\tBasic health check\nGET /health/detailed\tFull dependency status (DB, RPC, cache, APIs)\nGET /health/ready\tReadiness probe\nGET /health/live\tLiveness probe\nGET /api/stats\tCache and database statistics\nGET /api/announcements/active\tActive site announcements\nError Responses\n\nAll errors follow this format:\n\n{\n  \"error\": \"User-facing message\",\n  \"code\": \"ERROR_CODE\",\n  \"requestId\": \"trace-id\",\n  \"timestamp\": \"2026-02-26T12:00:00Z\"\n}\n\nCode\tMeaning\n400\tBad request (invalid parameters)\n401\tMissing or invalid API key\n403\tAccess denied (revoked key, insufficient holder balance)\n404\tResource not found\n409\tConflict (duplicate submission, wallet already has key)\n429\tRate limit exceeded (check Retry-After header)\n503\tService temporarily unavailable\nSolana Address Format\n\nValid Solana addresses are base58-encoded, 43-44 characters, using characters 1-9 A-H J-N P-Z a-k m-z (no 0, I, O, l).\n\nExternal Links\n\nFor any token with mint address <MINT>:\n\nOpenDex token page: https://opendex.online/token.html?mint=<MINT>\nSolscan: https://solscan.io/token/<MINT>\nJupiter swap: https://jup.ag/swap/SOL-<MINT>\nRaydium swap: https://raydium.io/swap/?outputMint=<MINT>"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/solpenguin/opendex",
    "publisherUrl": "https://clawhub.ai/solpenguin/opendex",
    "owner": "solpenguin",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/opendex",
    "downloadUrl": "https://openagent3.xyz/downloads/opendex",
    "agentUrl": "https://openagent3.xyz/skills/opendex/agent",
    "manifestUrl": "https://openagent3.xyz/skills/opendex/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/opendex/agent.md"
  }
}