{"skill":{"slug":"opendex","displayName":"OpenDEX Solana Token API","summary":"Retrieve Solana token data, community content, market sentiment, watchlists, and perform token-related actions via OpenDEX API endpoints.","description":"# OpenDex API Skill\n\nYou can interact with the OpenDex API to retrieve Solana token data, community-curated content, market sentiment, and more.\n\n## Base URL\n\n```\nhttps://opendex-api-dy30.onrender.com\n```\n\nFrontend: `https://opendex.online`\n\n## Authentication\n\n### Public 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\n### Authenticated Endpoints (API Key Required)\n\nCommunity content endpoints under `/api/v1/` require an API key passed via the `X-API-Key` header.\n\n**Rate limits:**\n- Standard endpoints: 100 requests/minute\n- Key registration: 10 requests/minute\n- Search: 30 requests/minute\n\n## Obtaining an API Key\n\nRegister a free API key by sending a POST request with a Solana wallet address:\n\n```\nPOST /api/v1/keys/register\nContent-Type: application/json\n\n{\n  \"wallet\": \"<SOLANA_WALLET_ADDRESS>\",\n  \"name\": \"OpenClaw\"\n}\n```\n\n**Response (201):**\n```json\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\n### Using the API Key\n\nInclude the key in the `X-API-Key` header on all `/api/v1/` requests:\n\n```\ncurl -H \"X-API-Key: YOUR_API_KEY\" \\\n  https://opendex-api-dy30.onrender.com/api/v1/community/<mint>\n```\n\n### Key Management\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/api/v1/keys/info` | GET | Get your key's usage stats (requires `X-API-Key`) |\n| `/api/v1/keys/status/:wallet` | GET | Check if a wallet has a key (public) |\n| `/api/v1/keys/revoke` | DELETE | Revoke your key (requires `X-API-Key`) |\n\n---\n\n## API Endpoints\n\n### Token Data (No Auth)\n\n#### List Tokens\n```\nGET /api/tokens?filter=trending&limit=50&offset=0&order=desc\n```\nFilters: `trending`, `new`, `gainers`, `losers`, `most_viewed`\n\n**Response:** Array of token objects with `mintAddress`, `name`, `symbol`, `price`, `priceChange24h`, `volume24h`, `marketCap`, `logoUri`, `views`, `sentimentScore`, `sentimentBullish`, `sentimentBearish`.\n\n#### Search 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\n#### Get 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\n#### Get Token Price\n```\nGET /api/tokens/:mint/price\n```\nReturns current price data: `price`, `marketCap`, `fdv`, `volume24h`, `priceChange24h`, `liquidity`.\n\n#### Get Price Chart\n```\nGET /api/tokens/:mint/chart?interval=1h&limit=100\n```\nIntervals: `1m`, `5m`, `15m`, `30m`, `1h`, `4h`, `1d`, `1w`\n\n#### Get OHLCV Data\n```\nGET /api/tokens/:mint/ohlcv?interval=1h&limit=100\n```\nReturns candlestick data (open, high, low, close, volume).\n\n#### Get Liquidity Pools\n```\nGET /api/tokens/:mint/pools\n```\n\n#### Batch Get Tokens\n```\nPOST /api/tokens/batch\nContent-Type: application/json\n\n{ \"mints\": [\"mint1\", \"mint2\", ...] }\n```\nMax 50 tokens per request.\n\n#### Check Token Holder\n```\nGET /api/tokens/:mint/holder/:wallet\n```\nReturns `balance`, `holdsToken`, `percentageHeld`, `totalSupply`, `circulatingSupply`.\n\n#### Record Page View\n```\nPOST /api/tokens/:mint/view\n```\n\n#### Get View Count\n```\nGET /api/tokens/:mint/views\n```\n\n---\n\n### Community Content (Requires API Key)\n\n#### 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\n**Response:**\n```json\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```\n\n#### Get All Approved Submissions\n```\nGET /api/v1/community/:mint/all?type=banner\n```\nOptional `type` filter: `banner`, `twitter`, `telegram`, `discord`, `tiktok`, `website`\n\n**Response:**\n```json\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```\n\n#### Batch 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).\n\n---\n\n### Sentiment (No Auth)\n\n#### 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\n**Response:**\n```json\n{\n  \"tally\": { \"bullish\": 245, \"bearish\": 53, \"score\": 192 },\n  \"userVote\": \"bullish\"\n}\n```\n\n#### Cast 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\n#### Bulk Sentiment\n```\nPOST /api/sentiment/bulk\nContent-Type: application/json\n\n{ \"mints\": [\"mint1\", \"mint2\", ...] }\n```\nMax 100 mints. Returns sentiment tallies for each.\n\n---\n\n### Submissions (Signature Required)\n\n#### Get Submissions for a Token\n```\nGET /api/submissions/token/:mint?status=approved&type=banner\n```\nStatuses: `pending`, `approved`, `rejected`, `all`\n\n#### Create 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.\n\n---\n\n### Voting (Signature + Holder Required)\n\n#### 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\n#### Check Vote Status\n```\nGET /api/votes/check?submissionId=123&wallet=<WALLET>\n```\n\n#### Bulk 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 } }`.\n\n---\n\n### Watchlist (No Auth)\n\n#### Get Watchlist\n```\nGET /api/watchlist/:wallet\n```\n\n#### Add to Watchlist\n```\nPOST /api/watchlist\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"mint\": \"<MINT>\" }\n```\nMax 100 tokens per wallet.\n\n#### Remove from Watchlist\n```\nDELETE /api/watchlist\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"mint\": \"<MINT>\" }\n```\n\n#### Check if Token in Watchlist\n```\nPOST /api/watchlist/check\nContent-Type: application/json\n\n{ \"wallet\": \"<WALLET>\", \"mint\": \"<MINT>\" }\n```\n\n---\n\n### Health & Status (No Auth)\n\n| Endpoint | Description |\n|----------|-------------|\n| `GET /health` | Basic health check |\n| `GET /health/detailed` | Full dependency status (DB, RPC, cache, APIs) |\n| `GET /health/ready` | Readiness probe |\n| `GET /health/live` | Liveness probe |\n| `GET /api/stats` | Cache and database statistics |\n| `GET /api/announcements/active` | Active site announcements |\n\n---\n\n## Error Responses\n\nAll errors follow this format:\n\n```json\n{\n  \"error\": \"User-facing message\",\n  \"code\": \"ERROR_CODE\",\n  \"requestId\": \"trace-id\",\n  \"timestamp\": \"2026-02-26T12:00:00Z\"\n}\n```\n\n| Code | Meaning |\n|------|---------|\n| 400 | Bad request (invalid parameters) |\n| 401 | Missing or invalid API key |\n| 403 | Access denied (revoked key, insufficient holder balance) |\n| 404 | Resource not found |\n| 409 | Conflict (duplicate submission, wallet already has key) |\n| 429 | Rate limit exceeded (check `Retry-After` header) |\n| 503 | Service temporarily unavailable |\n\n## Solana 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\n## External Links\n\nFor any token with mint address `<MINT>`:\n- OpenDex token page: `https://opendex.online/token.html?mint=<MINT>`\n- Solscan: `https://solscan.io/token/<MINT>`\n- Jupiter swap: `https://jup.ag/swap/SOL-<MINT>`\n- Raydium swap: `https://raydium.io/swap/?outputMint=<MINT>`\n","tags":{"latest":"1.0.0"},"stats":{"comments":0,"downloads":586,"installsAllTime":22,"installsCurrent":0,"stars":0,"versions":1},"createdAt":1772155122340,"updatedAt":1778491652688},"latestVersion":{"version":"1.0.0","createdAt":1772155122340,"changelog":"You can interact with the OpenDex API to retrieve Solana token data, community-curated content, market sentiment, and more.","license":null},"metadata":null,"owner":{"handle":"solpenguin","userId":"s177khfabhz3d2tkkpe3t9635d8851k1","displayName":"The Sol Penguin","image":"https://avatars.githubusercontent.com/u/255988213?v=4"},"moderation":null}