API & MCP · checking…
The gap, per call.
Every number on the radar, for agents and scripts. No account, no API key, no subscription: each paid call carries its own payment in USDG on Robinhood Chain, via x402. You sign, we settle, the data comes back with the receipt.
x402 v2 · exact
USDG · EIP-3009

Pricing
| Endpoint / tool | What you get | Price (USDG) |
|---|---|---|
| GET /v1 · /v1/stocks parallax_list_stocks · parallax_pricing | Discovery, prices, the 195 tracked stock tokens | free |
| GET /v1/gap/{symbol} parallax_gap | One stock token: on-chain price, reference, gap, pool depth, timestamps | 0.002 |
| GET /v1/gaps parallax_gap_board | Widest live gaps, filtered by pool depth (limit 1–50) | 0.01 |
| GET /v1/memes/{symbol} parallax_meme_pools | Meme tokens paired against that stock token, deepest first | 0.005 |
| GET /v1/vaults parallax_vaults | Flap Stocks Vaults and the stocks each one pays out | 0.005 |
Unknown symbols return 404 before any payment is asked for. A failed lookup never costs anything.
Quickstart
Call any paid endpoint without payment and you get a 402 with the exact requirement:
curl -i https://parallax.pawww.sbs/v1/gap/NVDA
HTTP/2 402
payment-required: eyJ4NDAyVmVyc2lvbiI6Mi… (base64 of the body below)
{ "x402Version": 2, "error": "payment_required",
"accepts": [{ "scheme": "exact", "network": "eip155:4663",
"amount": "2000", "asset": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
"payTo": "<treasury>", "maxTimeoutSeconds": 120,
"extra": { "name": "Global Dollar", "version": "1", "decimals": 6, "symbol": "USDG" } }] }
Sign an EIP-3009 TransferWithAuthorization for that amount to payTo, base64 the payload, and repeat the request with PAYMENT-SIGNATURE:
import { toHex } from "viem";
import { privateKeyToAccount } from "viem/accounts";
const agent = privateKeyToAccount(process.env.AGENT_KEY); // small wallet holding USDG
const url = "https://parallax.pawww.sbs/v1/gap/NVDA";
const { accepts: [req] } = await (await fetch(url)).json(); // 402
const message = {
from: agent.address, to: req.payTo, value: BigInt(req.amount),
validAfter: 0n, validBefore: BigInt(Math.floor(Date.now() / 1000) + 120),
nonce: toHex(crypto.getRandomValues(new Uint8Array(32))),
};
const signature = await agent.signTypedData({
domain: { name: "Global Dollar", version: "1", chainId: 4663, verifyingContract: req.asset },
types: { TransferWithAuthorization: [
{ name: "from", type: "address" }, { name: "to", type: "address" },
{ name: "value", type: "uint256" }, { name: "validAfter", type: "uint256" },
{ name: "validBefore", type: "uint256" }, { name: "nonce", type: "bytes32" } ] },
primaryType: "TransferWithAuthorization", message,
});
const payment = { x402Version: 2, accepted: req, payload: { signature, authorization: {
...message, value: String(message.value), validAfter: "0", validBefore: String(message.validBefore) } } };
const res = await fetch(url, { headers: { "PAYMENT-SIGNATURE": btoa(JSON.stringify(payment)) } });
console.log(await res.json()); // the data
console.log(atob(res.headers.get("payment-response"))); // { success, transaction, network, payer }
The v1 header X-PAYMENT is accepted too. Standard x402 clients that support eip155:4663 and EIP-3009 work as-is.
Endpoints
GET /v1/gap/{symbol}
{ "symbol": "NVDA", "name": "NVIDIA", "token": "0xd060…9EEC",
"onchain_usd": 230.89, "reference_usd": 230.56,
"reference_source": "chainlink", "reference_updated_at": "2026-09-29T14:02:11.000Z",
"gap_pct": 0.14, "gap_bps": 14,
"pool": { "id": "0xd4eb…", "venue": "uniswap v3", "depth_usd": 5272424 },
"observed_at": "2026-09-29T14:06:00.000Z", "us_market_session": "regular",
"method": "gap = (on-chain pool price − reference) / reference. …" }
Example shape; values are live on every call.
GET /v1/gaps?limit=10&min_depth=250000
Same rows as above for the widest gaps, plus observed_at, min_depth_usd, count.
GET /v1/memes/{symbol}
memes[]: meme, token, logo, pool, venue, liquidity_usd, volume_24h_usd, with scanned_at.
GET /v1/vaults
vaults[]: token, name, symbol, vault, creator, pays_out_in[], market_cap_usd, liquidity_usd, created_block, created_tx.
How payment works
- 01
You sign
An EIP-3009 authorization moving exactly the price in USDG from your wallet to the PARALLAX treasury. No gas, no approval, no custody.
- 02
We check
Signature, amount, recipient, time window, balance and nonce, before anything touches the chain. Each nonce is claimed once; replays are refused.
- 03
We settle
Our relayer submits the transfer and pays the gas. The response carries
PAYMENT-RESPONSEwith the transaction hash.
| 402 payment_required | No payment attached. Read accepts[0]. |
|---|---|
| 402 invalid_signature | The signed message doesn't match the authorization sent. |
| 402 insufficient_amount / wrong_recipient | Sign at least amount, to payTo. |
| 402 insufficient_funds | The wallet doesn't hold enough USDG. |
| 402 authorization_expired_or_not_yet_valid | Keep validBefore at least a few seconds in the future. |
| 402 nonce_already_used | Every call needs a fresh random nonce. |
| 402 settlement_failed | The chain refused the transfer. Nothing was charged; retry with a new signature. |
| 503 payments_not_configured | Paid endpoints are temporarily off. |
MCP
Local bridge pays automatically
One file, Node 20+. It runs next to your agent, calls the API, and signs x402 payments from a small wallet you give it, up to a spend limit.
curl -o parallax-mcp.mjs https://parallax.pawww.sbs/mcp/parallax-mcp.mjs
Claude Desktop / Cursor (mcpServers):
{
"mcpServers": {
"parallax": {
"command": "node",
"args": ["/path/to/parallax-mcp.mjs"],
"env": {
"PARALLAX_PAYER_KEY": "0x… (agent wallet, USDG only)",
"PARALLAX_MAX_SPEND": "1.00"
}
}
}
}
Claude Code:
claude mcp add parallax -e PARALLAX_PAYER_KEY=0x… -e PARALLAX_MAX_SPEND=1 -- node /path/to/parallax-mcp.mjs
Use a fresh wallet that only holds a few USDG. The key never leaves your machine.
Remote x402 over MCP
Streamable HTTP at https://parallax.pawww.sbs/mcp. Free tools answer directly. Paid tools return the requirement in structuredContent; send the signed payload in params._meta["x402/payment"]. The receipt comes back in _meta["x402/payment-response"].
claude mcp add --transport http parallax https://parallax.pawww.sbs/mcp
Tools
- parallax_list_stocks free
- parallax_pricing free
- parallax_gap 0.002
- parallax_gap_board 0.01
- parallax_meme_pools 0.005
- parallax_vaults 0.005
Notes
| Freshness | The radar reads the chain every minute; observed_at is when. Chainlink stock feeds update on 0.5% moves or every 24h, and hold from Friday 8 pm to Sunday 8 pm New York time. |
|---|---|
| Depth | A gap in a thin pool costs a lot to trade. Filter with min_depth. |
| No advice | Data, not advice. Stock tokens give economic exposure, not shareholder rights. |