PARALLAX

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 MCP · remote + local Chainlink + Uniswap

Pricing

Endpoint / toolWhat you getPrice (USDG)
GET /v1 · /v1/stocks
parallax_list_stocks · parallax_pricing
Discovery, prices, the 195 tracked stock tokensfree
GET /v1/gap/{symbol}
parallax_gap
One stock token: on-chain price, reference, gap, pool depth, timestamps0.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 first0.005
GET /v1/vaults
parallax_vaults
Flap Stocks Vaults and the stocks each one pays out0.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

  1. 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.

  2. 02

    We check

    Signature, amount, recipient, time window, balance and nonce, before anything touches the chain. Each nonce is claimed once; replays are refused.

  3. 03

    We settle

    Our relayer submits the transfer and pays the gas. The response carries PAYMENT-RESPONSE with the transaction hash.

402 payment_requiredNo payment attached. Read accepts[0].
402 invalid_signatureThe signed message doesn't match the authorization sent.
402 insufficient_amount / wrong_recipientSign at least amount, to payTo.
402 insufficient_fundsThe wallet doesn't hold enough USDG.
402 authorization_expired_or_not_yet_validKeep validBefore at least a few seconds in the future.
402 nonce_already_usedEvery call needs a fresh random nonce.
402 settlement_failedThe chain refused the transfer. Nothing was charged; retry with a new signature.
503 payments_not_configuredPaid 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

FreshnessThe 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.
DepthA gap in a thin pool costs a lot to trade. Filter with min_depth.
No adviceData, not advice. Stock tokens give economic exposure, not shareholder rights.