---
name: assay
description: Check a Solana token's launch risk before trading it (top holders, wallets linked by direct transfers, mint and freeze authority, a verdict) with one free HTTP call. Live in beta, no key. List assays and appeal status are planned.
version: 0.2.0-beta
homepage: https://www.assayonsol.io
---

# Assay skill

## When to use
- Before your agent swaps into, markets or lists a new token: call `launch_risk` and refuse or size down when `verdict` is `high`.
- Planned, not available yet: assaying an eligibility list for farms (`list`) and reading an appeal (`appeal_status`).

## Tools
| Tool | HTTP | Status | Price |
|---|---|---|---|
| `assay.launch_risk(mint)` | `GET https://www.assayonsol.io/api/launch-risk?mint=<mint>` | live | free in beta (planned: 0.05 USDC) |
| `assay.list(wallets[], allocations?[], snapshot_slot?)` | `POST /api/assays` | planned | planned: 0.30 USDC per wallet |
| `assay.appeal_status(appeal_id)` | `GET /api/appeals/{id}` | planned | free |

## Use it today
Use the HTTP API today (curl / fetch); the MCP server and skill package ship when the API leaves beta.

```sh
curl -s "https://www.assayonsol.io/api/launch-risk?mint=<mint>"
```

## Response (launch_risk), the fields to act on
```json
{"mint":"…","name":"…","symbol":"…","verdict":"high",
 "summary":"5 of the top 10 holders are linked by direct transfers (…). Together they hold 72% of the top holders' tokens, 19% of supply.",
 "linked_share":0.72,"linked_supply_share":0.19,"linked_source":"…","linked_wallets":["…"],
 "top1_share":0.06,"top10_share":0.26,"holders":996,"holders_more":true,"holders_display":"1,000+",
 "mint_authority":false,"freeze_authority":false,"flags":["…"],
 "coverage":{"complete":false,"transactions":100,"holders":18,"traced":9,"note":"…"},
 "checked_at":"…","explorer":"https://solscan.io/token/…"}
```
`verdict` is `low` (linked_share < 0.10), `medium` (0.10 to 0.25) or `high` (> 0.25); an active freeze authority or a permanent delegate raises it to at least `medium`. It is `null` for tokens that aren't launch tokens (USDC, USDT, wrapped SOL: read `note`) and when the transfers couldn't be read. Errors are `{"error":"plain words"}` with 400, 404 (not a token; token accounts add `mint_hint`), 429 or 502 (the mint itself couldn't be read). A slow read later in the check doesn't fail it: those fields come back null and `coverage` says what wasn't read. Show `holders_display` ("347" or "1,000+"), not `holders`.

## Rules for the agent
- Treat `verdict: "high"` as a hard stop for buys unless the user explicitly overrides.
- Read `flags`: an active freeze authority means the issuer can freeze the user's tokens after the buy.
- `linked_wallets` shows transfers between wallets, not who owns them. Never present it as proof against a person; link `explorer`.
- When `coverage.complete` is false, the linked share is a lower bound.
- Answers are cached for 5 minutes per mint; `checked_at` says when mainnet was read. On 429, wait for `Retry-After`.

## Payment
Beta: calls are free; the x402 flow is the planned paid tier and is not enforced. Planned: on `402`, read `PAYMENT-REQUIRED`, pay the exact USDC amount on Solana, resend with `X-PAYMENT`; the receipt comes back in `X-PAYMENT-RESPONSE`.
