$npx -y skills add berabuddies/Semia --skill market-snapshotFetch a token market snapshot (price/liquidity/volume) and return stable JSON (backed by Jupiter).
| 1 | # Market Snapshot (Skill-Only, OpenClaw) |
| 2 | |
| 3 | This skill is designed for OpenClaw/ClawHub bots that need a fast, low-friction market snapshot. |
| 4 | |
| 5 | ## What This Skill Does |
| 6 | |
| 7 | - Calls a hosted market snapshot endpoint (`/skills/market-snapshot`) with one or more token queries. |
| 8 | - The API resolves tokens + fetches pricing/metadata server-side (backed by Jupiter Tokens V2 + Price V3). |
| 9 | - Emits a **stable JSON object** (no prose) so other agents/bots can parse it reliably. |
| 10 | |
| 11 | ## What This Skill Will Not Do |
| 12 | |
| 13 | - It will not create or manage wallets. |
| 14 | - It will not request, store, or handle private keys / seed phrases. |
| 15 | - It will not execute swaps or provide "trade recommendations". |
| 16 | |
| 17 | ## How To Use |
| 18 | |
| 19 | When the user asks for prices, market snapshots, token metadata, or "what is X doing", run a snapshot. |
| 20 | |
| 21 | Input formats supported: |
| 22 | |
| 23 | - Symbols: `SOL`, `USDC`, `JUP` |
| 24 | - Names: `solana`, `jupiter` |
| 25 | - Mints: `So11111111111111111111111111111111111111112` |
| 26 | |
| 27 | If multiple tokens are provided, resolve all of them and return a combined snapshot. |
| 28 | |
| 29 | ## Data Sources (GET, No Headers Needed) |
| 30 | |
| 31 | - Market snapshot: |
| 32 | - `https://app.vecstack.com/api/skills/market-snapshot?q=<CSV_TOKENS>&source=openclaw` |
| 33 | |
| 34 | Examples (copy/paste): |
| 35 | |
| 36 | - Single token: |
| 37 | - `https://app.vecstack.com/api/skills/market-snapshot?q=SOL&source=openclaw` |
| 38 | - Multiple tokens (comma-separated, no spaces): |
| 39 | - `https://app.vecstack.com/api/skills/market-snapshot?q=SOL,USDC,JUP&source=openclaw` |
| 40 | |
| 41 | Notes: |
| 42 | |
| 43 | - `web_fetch` caches by URL. If the user explicitly needs "fresh right now" data, append a cache-buster query param like `&_t=<unix>` to the URL. |
| 44 | - Do not invent values. If a fetch fails, keep `null` fields and include an entry in `warnings`/`errors`. |
| 45 | |
| 46 | ## Output Contract (Return JSON Only) |
| 47 | |
| 48 | Return a single JSON object with this shape: |
| 49 | |
| 50 | ```json |
| 51 | { |
| 52 | "as_of_unix": 0, |
| 53 | "provider": "jupiter", |
| 54 | "inputs": ["SOL", "USDC"], |
| 55 | "tokens": [ |
| 56 | { |
| 57 | "query": "SOL", |
| 58 | "mint": "So11111111111111111111111111111111111111112", |
| 59 | "symbol": "SOL", |
| 60 | "name": "Wrapped SOL", |
| 61 | "decimals": 9, |
| 62 | "verified": true, |
| 63 | "tags": [], |
| 64 | "liquidity_usd": null, |
| 65 | "mcap_usd": null, |
| 66 | "fdv_usd": null, |
| 67 | "usd_price": null, |
| 68 | "price_change_24h_pct": null, |
| 69 | "stats": { |
| 70 | "5m": { |
| 71 | "price_change_pct": null, |
| 72 | "volume_usd": null, |
| 73 | "buy_volume_usd": null, |
| 74 | "sell_volume_usd": null |
| 75 | }, |
| 76 | "1h": { |
| 77 | "price_change_pct": null, |
| 78 | "volume_usd": null, |
| 79 | "buy_volume_usd": null, |
| 80 | "sell_volume_usd": null |
| 81 | }, |
| 82 | "24h": { |
| 83 | "price_change_pct": null, |
| 84 | "volume_usd": null, |
| 85 | "buy_volume_usd": null, |
| 86 | "sell_volume_usd": null |
| 87 | } |
| 88 | }, |
| 89 | "sources": { |
| 90 | "token_search_url": null, |
| 91 | "price_url": null |
| 92 | } |
| 93 | } |
| 94 | ], |
| 95 | "warnings": [], |
| 96 | "errors": [] |
| 97 | } |
| 98 | ``` |
| 99 | |
| 100 | Field rules: |
| 101 | |
| 102 | - `as_of_unix`: set to current Unix time when you finish assembling the response. |
| 103 | - `liquidity_usd`, `mcap_usd`, `fdv_usd`, and `stats.*` are populated from Tokens V2 search when present. |
| 104 | - `usd_price` and `price_change_24h_pct` are populated from Price V3 when present. |
| 105 | - `warnings`: non-fatal issues (missing price, ambiguous match, rate limits, etc). |
| 106 | - `errors`: fatal issues that prevented a snapshot (e.g., all sources failed). |
| 107 | |
| 108 | ## Implementation Notes For OpenClaw |
| 109 | |
| 110 | - Prefer the `web_fetch` tool for the endpoint, using `extractMode=text` so the body stays parseable as JSON. |
| 111 | - If `web_fetch` returns non-JSON content, retry once with a cache-buster (append `&_t=<unix>`). |
| 112 | - Keep the final response strictly JSON. |