CoinOpSelect Agent Data API

Pay-per-call agent data over x402. No signup, no API key, no minimum spend.

Protocol x402 v1 · exact Price USDC per call Settlement Base mainnet (chain 8453) Access public

Endpoints

MethodPathPriceReturns
GET /api/v1/ping 0.001 USDC Paid self-test ping: returns the route, the amount charged, the network and the settlement asset, so an x402 client can prove it can sign and settle before it buys anything else. GET /api/v1/ping
GET /api/v1/market/defi-summary 0.005 USDC Cross-network DeFi vault snapshot: live Aave v3 APY and TVL for the requested symbols on Base, Arbitrum and Ethereum, with a backstop-safety signal on Ethereum USDC. GET /api/v1/market/defi-summary?symbols=ETH,USDC
GET /api/v1/market/gas 0.002 USDC Gas price snapshot for Ethereum, Base and Arbitrum with the per-network base fee, priority fee and the source of every reading. GET /api/v1/market/gas
GET /api/v1/research/latest 0.005 USDC Latest published Web3 research finding from the agent research repository: title, summary, the streams it belongs to and its date. GET /api/v1/research/latest
POST /api/v1/audit/vulnerability-scan 0.05 USDC Static vulnerability scan of Solidity or JavaScript source: returns every finding with severity, rule id and location, a 0-100 risk score and a summary. POST /api/v1/audit/vulnerability-scan {code, language}
GET /api/v1/query/token-safety 0.02 USDC Live token risk verdict for Base, Arbitrum or Ethereum: reads bytecode, decimals, total supply, owner and holder count on chain, then returns a verdict (safe|caution|avoid) with a reason and one-liner, per-metric provenance and a shareable card. Call before recommending, bridging or swapping a token. GET /api/v1/query/token-safety?token=0x..&network=base
GET /api/v1/query/wallet-risk 0.02 USDC Live wallet risk check: returns per-network ETH/USDC balances, an ERC-20 transfer scan (first funder, last active, age in days), sanctions status and a verdict { label, reason, one_liner }. GET /api/v1/query/wallet-risk?wallet=0x..
GET /api/v1/query/contract-permissions 0.005 USDC ERC-20 allowance and permission decode for a contract, owner and spender: returns the live allowance, the unlimited-approval flag and the permission list. GET /api/v1/query/contract-permissions?contract=0x..&owner=0x..&spender=0x..
GET /api/v1/chain/token-safety 0.02 USDC Alias for /api/v1/query/token-safety under the /chain/<primitive> namespace (finding #035 market convention). Accepts ?token= or ?address=. GET /api/v1/chain/token-safety?token=0x..
GET /api/v1/chain/wallet-risk 0.02 USDC Alias for /api/v1/query/wallet-risk under the /chain/<primitive> namespace (finding #035 market convention). Accepts ?wallet= or ?address=. GET /api/v1/chain/wallet-risk?wallet=0x..
GET /api/v1/chain/contract-permissions 0.005 USDC Alias for /api/v1/query/contract-permissions under the /chain/<primitive> namespace (finding #035 market convention). Accepts ?contract= or ?address=. GET /api/v1/chain/contract-permissions?contract=0x..&owner=0x..&spender=0x..
POST /api/v1/query/token-safety/batch 0.08 USDC Batch token-safety for up to 25 tokens: POST { tokens: [{ token, network? }] } returns per-token verdicts with decision shape. $0.08 per batch (measured comparable band). POST /api/v1/query/token-safety/batch
POST /api/v1/query/wallet-risk/batch 0.08 USDC Batch wallet-risk for up to 25 wallets: POST { wallets: [{ wallet, network? }] } returns per-wallet verdicts with decision shape. $0.08 per batch. POST /api/v1/query/wallet-risk/batch
POST /api/v1/query/contract-permissions/batch 0.08 USDC Batch contract-permissions for up to 25 { contract, owner, spender } triples. POST { permissions: [...] } returns per-entry allowance decode with decision shape. $0.08 per batch. POST /api/v1/query/contract-permissions/batch
GET /api/v1/proof/hash 0.002 USDC SHA-256 hash of caller-supplied text
GET /api/v1/proof/merkle-verify 0.005 USDC Verify a Merkle proof against a root (POST or GET {leaf, proof, root})
GET /api/v1/proof/commit 0.002 USDC Commit-reveal commitment for any value
POST /api/v1/attestation/build 0.02 USDC Build a work attestation (POST {input, output})
POST /api/v1/attestation/verify 0.05 USDC Verify a work attestation (POST {attestation, input, output})
POST /api/v1/code/complexity 0.05 USDC Code complexity report (POST {source})
POST /api/v1/code/refactor-suggest 0.05 USDC Refactoring suggestions (POST {source})
GET /api/v1/escrow/commitment 0.02 USDC Escrow work-product commitment hash
GET /api/v1/escrow/transition 0.02 USDC Check an escrow state transition
GET /api/v1/staking/list 0.005 USDC Liquid staking protocols by network
POST /api/v1/vaults/alerts 0.005 USDC Vault APY/TVL alert check (POST {current, previous})
GET /api/v1/intent/quote 0.005 USDC Intent solver simulated fill quote
GET /api/v1/intent/surplus 0.005 USDC Intent surplus computation
GET /api/v1/treasury/stack 0.005 USDC DAO treasury stack policy
GET /api/v1/treasury/yield-policy 0.005 USDC DAO treasury yield policy
GET /api/v1/treasury/runway 0.005 USDC DAO treasury runway guard
GET /api/v1/compliance/jurisdiction 0.005 USDC Prediction-venue jurisdiction screen
POST /api/v1/mev/analyze 0.02 USDC Mempool tx MEV analysis (POST {tx})
GET /api/v1/sentiment/score 0.05 USDC Score one text for market sentiment
POST /api/v1/sentiment/aggregate 0.05 USDC Aggregate sentiment sources (POST {sources})
GET /api/v1/cover/quote 0.02 USDC Parametric cover premium quote
GET /api/v1/compute/estimate 0.02 USDC GPU compute cost estimate
GET /api/v1/compute/cheapest 0.02 USDC Cheapest GPU provider for a tier
POST /api/v1/compute/arbitrage 0.02 USDC GPU compute arbitrage check (POST {quotes})
POST /api/v1/dataset/curate 0.05 USDC Dataset curation report (POST {samples})
GET /api/v1/subscription/flow 0.005 USDC Subscription flow-rate and break-even quote
POST /api/v1/batch/net 0.005 USDC Batch payment netting preview (POST {payments})
GET /api/v1/merkle/leaf 0.005 USDC Merkle distributor leaf hash
GET /api/v1/reserves/classify 0.005 USDC Proof-of-reserves drift classifier
GET /api/v1/referral/quote 0.005 USDC Referral effective-bps quote

Free and always open: /api/v1/health (liveness) and /api/v1/catalog (machine-readable catalog with the x402 payment requirements for every paid route).

How to pay

  1. Request any paid endpoint. The API answers 402 Payment Required with the exact payment terms.
  2. Sign an EIP-3009 TransferWithAuthorization for the amount and asset in those terms, to the address they name.
  3. Replay the request with the signed payload in the X-Payment header (base64 JSON). The facilitator verifies and settles it, and the API returns the data.

See the payment terms without a wallet (this returns 402 with the terms):

curl -s 'https://coinop.publicvm.com/api/v1/query/token-safety?token=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&network=base'

Pay and fetch in one command with the reference client from this repository (needs a funded USDC payer on Base mainnet (chain 8453)):

WALLET_PRIVATE_KEY=0x... node streams/stream-2-a2a/x402-client.js \
  https://coinop.publicvm.com /api/v1/query/token-safety 'token=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&network=base'

Use it from an agent (MCP)

The same endpoints are exposed as MCP tools at https://coinop.publicvm.com/mcp (Streamable HTTP transport, JSON-RPC). Listing the tools is free; every tool call follows the same x402 terms as the REST routes above.

Point an MCP client at it:

{
  "mcpServers": {
    "coinopselect": {
      "url": "https://coinop.publicvm.com/mcp"
    }
  }
}

The payment challenge

This is the 402 body a client receives, verbatim:

{
  "error": "missing_payment",
  "x402Version": 1,
  "accepts": [
    {
      "scheme": "exact",
      "network": "base",
      "maxAmountRequired": "20000",
      "resource": "/api/v1/query/token-safety",
      "description": "Live token risk verdict for Base, Arbitrum or Ethereum: reads bytecode, decimals, total supply, owner and holder count on chain, then returns a verdict (safe|caution|avoid) with a reason and one-liner, per-metric provenance and a shareable card. Call before recommending, bridging or swapping a token. GET /api/v1/query/token-safety?token=0x..&network=base",
      "mimeType": "application/json",
      "payTo": "0xfa0B17D69c75246BFFeAaeBbbFAFE0E82e87Df11",
      "maxTimeoutSeconds": 60,
      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "extra": {
        "name": "USD Coin",
        "version": "2"
      },
      "outputSchema": {
        "input": {
          "type": "http",
          "method": "GET",
          "discoverable": true,
          "queryParams": {
            "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "network": "base"
          },
          "schema": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "method": {
                "type": "string"
              },
              "queryParams": {
                "type": "object",
                "properties": {
                  "token": {
                    "type": "string",
                    "description": "Token contract address (0x..)"
                  },
                  "network": {
                    "type": "string",
                    "description": "base|arbitrum|ethereum (default base)"
                  }
                },
                "required": [
                  "token"
                ]
              }
            },
            "required": [
              "type",
              "method"
            ]
          }
        },
        "output": {
          "query": "0x..",
          "network": "base",
          "chainId": 8453,
          "token": "0x..",
          "decimals": 6,
          "totalSupply": "0",
          "owner": "0x..",
          "flags": [],
          "verdict": {
            "label": "safe",
            "reason": "string",
            "one_liner": "string"
          },
          "decision": {
            "action": "proceed",
            "reason": "string",
            "one_liner": "string"
          },
          "metrics": [],
          "share": {
            "permalink": "https://..",
            "card_url": null
          },
          "as_of_block": null,
          "generatedAt": "2026-01-01T00:00:00.000Z",
          "fromCache": false,
          "topHolderOwnership": null,
          "topTenOwnership": null,
          "totalHolders": null,
          "warnings": [],
          "overallSafetyLevel": "OK"
        },
        "discoverable": true
      }
    }
  ]
}

Where the data comes from

Machine-readable