The private relay is live on Solana. Point your wallet or bot at it and your RPC provider stops seeing your IP.Set it up →

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/ticksEvery 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/statusSlot, priority fee, SOL price, mints, programs and every pool the engine watches.
POST/api/exposureExposure 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/keyTrade a wallet signature for an API key.
GET/api/passportAttester public key and the exact signed text, for offline ed25519 checks.
POST/api/passportIssue a passport for an agent.
POST/api/relayPrivate Solana JSON-RPC relay. Same body as any Solana RPC.
POST/api/passport/verifyCheck 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/ticks

Errors

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": "" }
    }
  }
}