API & MCP
Plain JSON. No key to start.
Every number on this site comes from these endpoints. Reads are cached for 12 seconds, so polling faster gets you the same slot.
Endpoints
| GET | /api/ticks | Every tracked xStock. Add ?pools=1 for per-pool reads. |
| GET | /api/tick/{TICKER} | One token with all its pools and why each was counted or left out. |
| GET | /api/status | Slot, priority fee, SOL price, mints, programs and every pool the engine watches. |
| POST | /api/exposure | Exposure score for a Solana wallet. Send { address } in the body so it never appears in a URL or access log. |
| GET | /api/token?wallet={address} | $VTICK settings, tiers, and that wallet's power. |
| POST | /api/key | Trade a wallet signature for an API key. |
| GET | /api/passport | Attester public key and the exact signed text, for offline ed25519 checks. |
| POST | /api/passport | Issue a passport for an agent. |
| POST | /api/relay | Private Solana JSON-RPC relay. Same body as any Solana RPC. |
| POST | /api/passport/verify | Check a passport. |
Example
The shape is exact. The numbers are illustrative.
curl https://www.veiltick.com/api/tick/NVDA{
"chain": "solana",
"slot": "466799934",
"readAt": 1794200000000,
"solUsd": 89.16,
"tick": {
"ticker": "NVDA",
"symbol": "NVDAx",
"address": "Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh",
"price": 187.42,
"driftPct30m": 0.18,
"spreadBps": 22.4,
"depthUsd": 3453175,
"livePools": 8,
"totalPools": 8,
"label": "steady",
"labelReason": "spot is within ±0.5% of its 30-min average",
"gapPct": null,
"oracle": null,
"spark": [187.1, 187.2, 187.3, 187.2, 187.4, 187.5, 187.42],
"pools": [ { "address": "6ZsF…mQ2v", "venue": "raydium-clmm", "source": "onchain",
"quote": "USDC", "feeBps": null, "priceUsd": 187.40,
"included": true, "excludedReason": null } ]
},
"rules": { "minPoolSideUsd": 200, "thinDepthUsd": 5000, "splitSpreadBps": 150,
"trendDriftPct": 0.5, "twapWindowSec": 1800, "cacheMs": 12000 }
}price is in USD per xStock token. source is onchain when Veiltick decoded the pool account itself and indexed when the numbers come from DexScreener. oracle is Pyth’s price for the underlying share, and is null while Pyth’s Solana account for it is stale. A null means the value could not be computed, never zero.
Limits and keys
Without a key you get the Free tier, counted per IP. With a key, requests count against your wallet and get its $VTICK tier. Every response carries x-ratelimit-limit, x-ratelimit-remaining and x-veiltick-tier. Before $VTICK launches, everyone is on the open tier.
curl -H "Authorization: Bearer vt2_…" https://www.veiltick.com/api/ticksErrors
Always the same shape, with a message written for people:
{ "error": { "code": "rate_limited", "message": "Limit is 30 requests per minute on the Free tier. Retry in 41s." } }MCP server
Gives Claude, Cursor or any MCP client five tools: list_stock_tokens, get_stock_token, solana_status, scan_wallet_exposure and verify_passport. It calls the HTTP API, so point it at your deployment.
{
"mcpServers": {
"veiltick": {
"command": "npx",
"args": ["tsx", "/path/to/veiltick/mcp/server.ts"],
"env": { "VEILTICK_API_URL": "https://www.veiltick.com", "VEILTICK_API_KEY": "" }
}
}
}