Roach Agent API · for AI agents

Send the roach in first.

It crawls every Solana token before your agent apes: holders, bundles, dev wallets.

paste into your agent
$ Read https://app.stillroach.com/setup.md and set up Stillroach token checks in our agent, including x402 pay-per-call.

StatusTest network for now: payments settle on Solana devnet.

Overview

The Roach Agent API reads the holders of a Solana token and returns structured JSON: top-holder share, developer stake, launch buys, snipers, linked wallets and tracked callers. It is built for AI agents and the servers they run on.

You can call it three ways: REST with an API key, MCP with the same key, or x402 pay per call with no key at all.

Base URL
https://api.stillroach.com
Format
JSON request and response bodies, UTF-8
Authentication
API key in Authorization: Bearer rk_live_…, or an x402 payment
Network
Solana devnet for payments while the API is in preview

Quickstart

  1. Get an API key. Sign in to the app with your Solana wallet and create a key. It is shown once; keep it in a secret store. Get an API key
  2. Export it. export ROACH_API_KEY=rk_live_…
  3. Make your first call. A lite read takes one to two seconds. Three fresh lite reads a day are free.
Request
curl -s -X POST https://api.stillroach.com/v1/token-analysis \
  -H "Authorization: Bearer $ROACH_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"mint":"Examp1eMint1111111111111111111111111111pump","depth":"lite"}'
Example response 200 · example data
{
  "schema": "roach.analysis.v1",
  "request_id": "req_5f1c2a9e7b3d4e10",
  "analysis_version": "bagcheck.lite.v1",
  "depth": "lite",
  "mint": "Examp1eMint1111111111111111111111111111pump",
  "data_as_of": 1793098800,
  "cached": false,
  "credits": {
    "charged": 0,
    "free_lite": true,
    "remaining": 10,
    "free_lite_left_today": 2
  },
  "result": {
    "schema": "bagcheck.lite.v1",
    "mint": "Examp1eMint1111111111111111111111111111pump",
    "scan_seconds": 1.4,
    "token": {
      "symbol": "EXAMPLE",
      "name": "Example Coin",
      "mcap_usd": 412000.0,
      "mcap_source": "dexscreener",
      "liquidity_usd": 61500.0,
      "age_hours": 30.2,
      "ath_mcap_usd": 980000.0,
      "off_ath_pct": -58.0
    },
    "verdict": {
      "label": "SKITTISH ROACH",
      "emoji": "💨",
      "line": "scatters when the lights come on"
    },
    "holders": {
      "top10_pct": 18.6,
      "top10_source": "holder_scan",
      "top10_scope": "top 10 holders excl. pool",
      "pool_pct_supply": 21.3,
      "holders": 1840
    },
    "dev": {
      "dev_pct": 0.0,
      "dev_source": "pump.fun creator",
      "launch_buy_pct": 2.1,
      "dev_sold_pct": 100.0,
      "creator_coins": 3
    },
    "callers": {
      "kol_count": 1,
      "kols": [
        "example_caller"
      ]
    },
    "not_included": [
      "holder history (never sold / sold / churn)",
      "bundles & snipers",
      "linked-wallet clusters",
      "dump impact",
      "every top-30 wallet"
    ]
  },
  "disclaimer": "Holder data from public Solana RPC. Not financial advice."
}

No key? Send the same body to /x402/v1/token-analysis and pay per call. See x402 payments.

Agents can read the whole contract in one file: setup.md.

Authentication

Keyed endpoints expect a bearer token. Keys start with rk_live_. One wallet has one active key and one credit balance, shared by REST and MCP.

Header
Authorization: Bearer rk_live_…
Storage
Shown once, stored only as a hash. Rotate it in the app if it leaks.
Origin
Call from a server with no Origin header. Other browser origins get 403 origin_not_allowed.

The x402 endpoint needs no key. The payment itself authorizes one request.

Pricing

Every call is priced in credits on a key, or in USDC over x402.

CallAPI keyx402
Lite read, fresh3 free a day, then 1 credit0.02 USDC
Lite read, cached00.02 USDC
Full read, fresh1 credit0.08 USDC
Full read, cached00.02 USDC
AI read on a full call+1 credit+0.04 USDC
Basic read (cached summary)0n/a

Monthly credits

Free tier
Up to 10 credits a month per wallet
Bag Watch plan
400 credits a month
Watch+ plan
1,000 credits a month
Refill
1st of each month, UTC

Credit packs

Size
100 credits
Price
0.05 SOL, 5 USDC, or $STILL at 20% off
Validity
12 months; used after the monthly credits
Buy
In the app, or with the pack endpoints

x402 payments settle only after a successful scan. A failed scan settles nothing.

Endpoints

All endpoints return JSON. Analysis responses use the roach.analysis.v1 envelope: request metadata and credits on the outside, the read in result. Every result carries data_as_of.

Analyze a token: lite

A fast holder read: top-10 share, developer stake, launch buy, developer sells and tracked callers.

Request
POST /v1/token-analysis
Price
3 fresh reads a day free, then 1 credit. Cached reads are free.

Takes about one to two seconds. Send an Idempotency-Key header so a retried request never runs twice.

Parameters

NameTypeDescription
mintstring, requiredSolana token mint, base58, 32 to 44 characters.
depth"lite"Selects the lite read.
max_data_age_secondsinteger, 0 to 3600Optional. Accept a cached read up to this age.

Request

Request
curl -s -X POST https://api.stillroach.com/v1/token-analysis \
  -H "Authorization: Bearer $ROACH_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"mint":"Examp1eMint1111111111111111111111111111pump","depth":"lite"}'
Example response 200 · example data
{
  "schema": "roach.analysis.v1",
  "request_id": "req_5f1c2a9e7b3d4e10",
  "analysis_version": "bagcheck.lite.v1",
  "depth": "lite",
  "mint": "Examp1eMint1111111111111111111111111111pump",
  "data_as_of": 1793098800,
  "cached": false,
  "credits": {
    "charged": 0,
    "free_lite": true,
    "remaining": 10,
    "free_lite_left_today": 2
  },
  "result": {
    "schema": "bagcheck.lite.v1",
    "mint": "Examp1eMint1111111111111111111111111111pump",
    "scan_seconds": 1.4,
    "token": {
      "symbol": "EXAMPLE",
      "name": "Example Coin",
      "mcap_usd": 412000.0,
      "mcap_source": "dexscreener",
      "liquidity_usd": 61500.0,
      "age_hours": 30.2,
      "ath_mcap_usd": 980000.0,
      "off_ath_pct": -58.0
    },
    "verdict": {
      "label": "SKITTISH ROACH",
      "emoji": "💨",
      "line": "scatters when the lights come on"
    },
    "holders": {
      "top10_pct": 18.6,
      "top10_source": "holder_scan",
      "top10_scope": "top 10 holders excl. pool",
      "pool_pct_supply": 21.3,
      "holders": 1840
    },
    "dev": {
      "dev_pct": 0.0,
      "dev_source": "pump.fun creator",
      "launch_buy_pct": 2.1,
      "dev_sold_pct": 100.0,
      "creator_coins": 3
    },
    "callers": {
      "kol_count": 1,
      "kols": [
        "example_caller"
      ]
    },
    "not_included": [
      "holder history (never sold / sold / churn)",
      "bundles & snipers",
      "linked-wallet clusters",
      "dump impact",
      "every top-30 wallet"
    ]
  },
  "disclaimer": "Holder data from public Solana RPC. Not financial advice."
}

Errors

StatusCodeMeaning
400bad_inputThe mint is malformed, the depth is unknown, or the body has an unknown field.
401key_required, bad_keySend a valid key in the Authorization header.
409in_progressThe same scan is already running. Retry in a few seconds.
429quota_exhausted, free_lite_usedNo credits left. Buy a pack or pay per call with x402.
502scan_failedThe scan failed upstream. Nothing is charged. Retry later.

Analyze a token: full

Everything in lite, plus holder history, snipers, bundles, linked-wallet groups, dump impact and wallet memory.

Request
POST /v1/token-analysis
Price
1 credit fresh, 0 cached. AI read +1 credit.

Takes 20 to 45 seconds. Full-only fields: result.holders.bundles.operators, result.checks.dump_impact, result.checks.wallet_memory, result.verdict.info_codes. If the AI step fails mid-call you still get the holder result with ai.status = "ai_unavailable" and the AI part is refunded.

Parameters

NameTypeDescription
mintstring, requiredSolana token mint, base58, 32 to 44 characters.
depth"full" (default)Selects the full read. The keyed endpoint also accepts "basic".
include_aibooleanAdds a short written read. Full depth only.
max_data_age_secondsinteger, 0 to 3600Default 600. A cached scan up to this age is returned and priced as cached.

Request

Request
curl -s -X POST https://api.stillroach.com/v1/token-analysis \
  -H "Authorization: Bearer $ROACH_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"mint":"Examp1eMint1111111111111111111111111111pump","depth":"full"}'
Example response 200 · example data, trimmed
{
  "schema": "roach.analysis.v1",
  "request_id": "req_5f1c2a9e7b3d4e10",
  "analysis_version": "bagcheck.v1",
  "depth": "full",
  "mint": "Examp1eMint1111111111111111111111111111pump",
  "data_as_of": 1793098800,
  "cached": false,
  "credits": {
    "charged": 1,
    "remaining": 9
  },
  "result": {
    "schema": "bagcheck.v1",
    "mint": "Examp1eMint1111111111111111111111111111pump",
    "generated_at": 1793098800,
    "scan_seconds": 31.8,
    "token": {
      "symbol": "EXAMPLE",
      "name": "Example Coin",
      "price_usd": 0.000412,
      "liquidity_usd": 61500.0,
      "age_hours": 30.2,
      "dex_id": "pumpswap",
      "mcap_usd": 412000.0,
      "volume_24h_usd": 1250000.0
    },
    "verdict": {
      "label": "SKITTISH ROACH",
      "line": "scatters when the lights come on",
      "emoji": "💨",
      "codes": [],
      "never_sold_ratio": 0.31,
      "top10_pct": 18.6,
      "age_days": 1.26,
      "info_codes": [
        "LINKED_WALLETS_HOLD_5PCT_PLUS"
      ]
    },
    "shell_check": {
      "ok": true,
      "reasons": []
    },
    "holders": {
      "summary": {
        "scanned": 30,
        "never_sold": 9,
        "sold": 18,
        "churn": 2,
        "fresh": 1,
        "errors": 0,
        "total_accounts": 1840
      },
      "bundles": {
        "snipers": {
          "count": 4,
          "bought_pct": 9.1,
          "holds_pct": 1.2,
          "still_holding": 1,
          "sold": 3
        },
        "operators": {
          "wallets": 30,
          "people": 24,
          "people_is_upper_bound": true,
          "linked_operators": 2,
          "linked_wallets": 7,
          "top_operator_pct_supply": 6.4,
          "top_operator_wallets": 5,
          "linked_pct_supply": 8.9,
          "unit": "pct_of_supply"
        }
      },
      "wallets": [
        {
          "wallet": "7xKp…3fQa",
          "amount_raw": 18400000000000,
          "cls": "sold",
          "hold_h": 29.5,
          "swaps": 6,
          "buys": 4,
          "sells": 2
        }
      ]
    },
    "callers": [
      {
        "handle": "example_caller",
        "change_pct": -21.3
      }
    ],
    "ai": null,
    "checks": {
      "dump_impact": {
        "seller": "top_operator",
        "seller_pct_supply": 6.4,
        "unit": "pct_price_change",
        "venue": "approx",
        "price_change_pct": -38.5,
        "confidence": "low"
      },
      "wallet_memory": {
        "tokens_in_memory": 1520,
        "repeat_wallets": 3,
        "repeat_dumpers": 2,
        "repeat_dumpers_pct_supply": 1.7,
        "dev_prior_tokens": 2,
        "dev_prior_dumps": 0,
        "unit": "pct_of_supply"
      }
    }
  },
  "disclaimer": "Holder data from public Solana RPC. Not financial advice."
}

Errors

StatusCodeMeaning
400bad_inputThe mint is malformed, the depth is unknown, or the body has an unknown field.
401key_required, bad_keySend a valid key in the Authorization header.
409in_progressThe same scan is already running. Retry in a few seconds.
409ai_unavailableThe AI read is not available. Nothing is charged.
429quota_exhausted, free_lite_usedNo credits left. Buy a pack or pay per call with x402.
502scan_failedThe scan failed upstream. Nothing is charged. Retry later.

Pay per call with x402

The same reads with no account and no key. The first reply is a 402 with payment terms; your x402 client pays and retries.

Request
POST /x402/v1/token-analysis
Price
Lite 0.02 USDC · full 0.08 USDC · cached full 0.02 USDC · AI read +0.04 USDC

Parameters

NameTypeDescription
mintstring, requiredSolana token mint, base58, 32 to 44 characters.
depth"lite" | "full"Default "full".
include_aibooleanFull depth only.
max_data_age_secondsinteger, 0 to 3600Default 600. A cached scan up to this age is returned and priced as cached.

Request

Request
curl -s -X POST https://api.stillroach.com/x402/v1/token-analysis \
  -H 'content-type: application/json' \
  -d '{"mint":"Examp1eMint1111111111111111111111111111pump","depth":"lite"}'
Example response 402 · decoded PAYMENT-REQUIRED header, example data
{
  "x402Version": 2,
  "error": "payment required",
  "resource": {
    "url": "https://api.stillroach.com/x402/v1/token-analysis",
    "description": "Roach token holder analysis (Solana)",
    "mimeType": "application/json"
  },
  "accepts": [
    {
      "scheme": "exact",
      "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
      "amount": "20000",
      "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",
      "payTo": "8c4EfJbJXb14irYvHfMBaXd4vMh6uq7eHq7gbfM9F8UU",
      "maxTimeoutSeconds": 120,
      "extra": {
        "feePayer": "CKPKJWNdJEqa81x7CkZ14BVPiY6y16Sxs7owznqtWYp5",
        "roach": {
          "request_hash": "8de63b1f…",
          "nonce": "83e739cc…",
          "expires": 1793100783,
          "binding": "35c753b7…"
        }
      }
    }
  ],
  "price": {
    "usdc": 0.02,
    "depth": "lite",
    "cached": false,
    "ai": false
  }
}
Example response 200 · after payment, trimmed
{
  "schema": "roach.analysis.v1",
  "request_id": "req_5f1c2a9e7b3d4e10",
  "depth": "lite",
  "mint": "Examp1eMint1111111111111111111111111111pump",
  "cached": false,
  "channel": "x402",
  "paid": {
    "usdc": 0.02,
    "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
    "transaction": "5wHu1qwD4kJ…example"
  },
  "result": {
    "schema": "bagcheck.lite.v1",
    "…": "same result as the lite example"
  }
}

Errors

StatusCodeMeaning
402payment_not_verified, settle_failedThe payment was rejected. Nothing is charged. Request a new challenge.
409challenge_used, payment_for_another_requestA payment is valid for one request with one body.
502scan_failedThe scan failed. The payment is not settled.

Check your credits

Credits left this month, where they come from, and what each call costs.

Request
GET /v1/quota
Price
Free

Parameters

No parameters.

Request

Request
curl -s https://api.stillroach.com/v1/quota \
  -H "Authorization: Bearer $ROACH_API_KEY"
Example response 200 · example data, trimmed
{
  "schema": "roach.quota.v1",
  "wallet": "Examp1eWa11et111111111111111111111111111111",
  "key_id": "key_3a9f12c07e55",
  "month": "2026-10",
  "credits": {
    "allowance": 410,
    "sources": {
      "free": 10,
      "watch_watch": 400
    },
    "granted": 0,
    "used": 12,
    "monthly_remaining": 398,
    "pack_remaining": 100,
    "remaining": 498
  },
  "lite_free_today": {
    "used": 1,
    "per_day": 3
  },
  "costs": {
    "basic": 0,
    "lite": "0 for 3 fresh/day, then 1",
    "lite_cached": 0,
    "full": 1,
    "full_cached": 0,
    "ai_read": 1
  },
  "pack_url": "https://app.stillroach.com/watch#keys",
  "x402_url": "https://api.stillroach.com/x402/v1/token-analysis",
  "docs_url": "https://app.stillroach.com/docs"
}

Errors

StatusCodeMeaning
401key_required, bad_keySend a valid key.

List credit packs

Current pack size, prices per asset and the payment network.

Request
GET /v1/packs
Price
Free

Parameters

No parameters.

Request

Request
curl -s https://api.stillroach.com/v1/packs
Example response 200 · example data
{
  "schema": "roach.packs.v1",
  "cluster": "devnet",
  "pack": {
    "credits": 100,
    "expires_after_days": 365
  },
  "prices": {
    "sol": {
      "asset": "SOL",
      "amount": 50000000,
      "decimals": 9,
      "display": "0.05 SOL"
    },
    "usdc": {
      "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",
      "amount": 5000000,
      "decimals": 6,
      "display": "5 USDC"
    },
    "still": {
      "asset": "5q1ZfQHjGXfHYP6hKVbmSRobWsJa6R1TeVj8Tc2pump",
      "amount": null,
      "decimals": 6,
      "display": "$STILL worth 0.04 SOL (20% off)",
      "available": false
    }
  },
  "treasury": "8c4EfJbJXb14irYvHfMBaXd4vMh6uq7eHq7gbfM9F8UU"
}

Buy a credit pack

Request a quote, send the exact amount with the memo from your key wallet, then verify the transaction.

Request
POST /v1/packs/quote
Price
The pack price; no extra fee

Then call POST /v1/packs/verify with {"quote_id", "signature"}.

Verify
curl -s -X POST https://api.stillroach.com/v1/packs/verify \
  -H "Authorization: Bearer $ROACH_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"quote_id":"q_d0a20fd5259340aa","signature":"<transaction signature>"}'
Example response 200 · verify, example data
{
  "schema": "roach.pack_receipt.v1",
  "quote_id": "q_d0a20fd5259340aa",
  "signature": "3Jm9Example…",
  "credits_added": 100,
  "pack_remaining": 200,
  "remaining": 598,
  "expires_after_days": 365
}

Parameters

NameTypeDescription
kind"sol" | "usdc" | "still"Asset to pay with.

Request

Request
curl -s -X POST https://api.stillroach.com/v1/packs/quote \
  -H "Authorization: Bearer $ROACH_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"kind":"usdc"}'
Example response 200 · example data
{
  "schema": "roach.pack_quote.v1",
  "quote_id": "q_d0a20fd5259340aa",
  "kind": "usdc",
  "asset": "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",
  "amount": 5000000,
  "decimals": 6,
  "credits": 100,
  "recipient": "8c4EfJbJXb14irYvHfMBaXd4vMh6uq7eHq7gbfM9F8UU",
  "memo": "roachapi:q_d0a20fd5259340aa",
  "network": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
  "cluster": "devnet",
  "expires_at": 1793101556
}

Errors

StatusCodeMeaning
402payment_not_verifiedVerify: the transaction is not confirmed yet. Retry in a few seconds.
409receipt_used, quote_paidEach payment and each quote is credited once.
429too_many_quotesToo many open quotes. Use or let one expire.

Health

Liveness, version and the payment network.

Request
GET /v1/health
Price
Free

Parameters

No parameters.

Request

Request
curl -s https://api.stillroach.com/v1/health
Example response 200 · example data
{
  "ok": true,
  "version": "agentapi-0.2.0",
  "entitlements_error": null,
  "cluster": "devnet",
  "test_prices": false,
  "ai_available": true
}

Bag Watch endpoints

Reports, alerts and webhooks for the coins you watch. These need a Bag Watch plan and cost no credits.

RequestPurpose
GET /v1/watch/report/{mint}Bag Watch report for a coin you watch.
GET /v1/alerts?since=Alerts after a cursor.
GET /v1/webhooksList alert webhooks.
POST /v1/webhooksAdd a signed alert webhook. Up to 3.
DELETE /v1/webhooks/{id}Remove a webhook.

Full schemas are in the OpenAPI contract.

MCP

The same reads as MCP tools, for agents that speak the Model Context Protocol.

Endpoint
https://api.stillroach.com/mcp
Transport
Streamable HTTP, stateless JSON-RPC. POST only; no SSE stream, no session.
Auth
Authorization: Bearer rk_live_…
Without a key
Only check_solana_token_basic works.
Agent-readable version
mcp-setup.md

Tools

ToolCostReturns
check_solana_token_basicFreeCached holder summary for a mint.
check_solana_token_lite3 fresh a day free, then 1 creditThe lite read.
analyze_solana_token1 credit fresh, 0 cachedThe full read. Set max_data_age_seconds to allow cache.
watch_report0, Bag Watch planReport for a coin you watch.
alerts_since0, Bag Watch planAlerts after a cursor, plus webhook dead letters.
get_quota0Credits left.
get_credit_packs0Pack prices and the x402 option.

Client setup

Claude Code
claude mcp add --transport http roach https://api.stillroach.com/mcp --header "Authorization: Bearer $ROACH_API_KEY"
Cursor · ~/.cursor/mcp.json
{
  "mcpServers": {
    "roach": {
      "url": "https://api.stillroach.com/mcp",
      "headers": { "Authorization": "Bearer ${env:ROACH_API_KEY}" }
    }
  }
}
Claude Desktop and clients without remote headers
{
  "mcpServers": {
    "roach": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.stillroach.com/mcp", "--header", "Authorization:Bearer ${ROACH_API_KEY}"],
      "env": { "ROACH_API_KEY": "rk_live_…" }
    }
  }
}

Grok Bot: add a custom MCP connector with the endpoint above and the header Authorization: Bearer <key>. The "Roach Bag Watch" template sets this up with a daily alert routine.

Check it works

Request
curl -s https://api.stillroach.com/mcp \
  -H "Authorization: Bearer $ROACH_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_quota","arguments":{}}}'
Example response 200 · example data, trimmed
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"schema\":\"roach.quota.v1\", …}"
      }
    ],
    "structuredContent": {
      "schema": "roach.quota.v1",
      "credits": {
        "remaining": 498
      },
      "…": "same fields as GET /v1/quota"
    },
    "isError": false
  }
}

When credits run out, tool results carry isError: true with pack_url and x402_url.

x402 payments

x402 lets an agent pay for a single request over HTTP. There is no account and no key.

Version
x402 v2, scheme exact
Asset
USDC on Solana (devnet while in preview)
Challenge lifetime
120 seconds

Flow

  1. Send the request. The reply is 402 with a PAYMENT-REQUIRED header: base64 JSON with the amount, asset and recipient.
  2. Your x402 client signs the payment. Retry the same body within 120 seconds with the PAYMENT-SIGNATURE header.
  3. The reply is 200 with the result and a PAYMENT-RESPONSE header once the payment settles.
Retry with payment
curl -s -i -X POST https://api.stillroach.com/x402/v1/token-analysis \
  -H 'content-type: application/json' \
  -H "PAYMENT-SIGNATURE: $PAYMENT_SIGNATURE" \
  -d '{"mint":"Examp1eMint1111111111111111111111111111pump","depth":"lite"}'

A payment is bound to one request. Reusing it with a different body returns 409 payment_for_another_request.

Rate limits

Per wallet
60 calls a minute and 600 an hour, shared by REST and MCP
When limited
429 with a Retry-After header, in seconds
Retries
Send an Idempotency-Key header; a retry with the same key and body never runs twice

Errors

Errors are JSON with a stable error code and a readable message. Some add links to fix the problem.

Example response 429 · example
{
  "error": "quota_exhausted",
  "message": "no credits left this month",
  "pack_url": "https://app.stillroach.com/watch#keys",
  "x402_url": "https://api.stillroach.com/x402/v1/token-analysis"
}
StatusCodesWhat to do
400bad_input, bad_jsonFix the body: mint format, depth, unknown fields.
401key_required, bad_keySend a valid key.
402x402 challenge, payment_not_verified, settle_failed, watch_requiredPay per PAYMENT-REQUIRED and retry. A rejected payment charges nothing. Watch endpoints need a plan.
403origin_not_allowedCall from a server with no Origin header.
404not_found, not_watchedUnknown path, or the coin is not on your watch list.
405method_not_allowedWrong method, for example GET on /mcp.
409in_progress, challenge_used, payment_for_another_request, ai_unavailable, receipt_used, quote_paid, webhook_limitA scan is running, a payment was already used, or the AI read is unavailable.
413too_largeSend a smaller body.
422idempotency_mismatchThe same Idempotency-Key was sent with a different body.
429rate_limited, quota_exhausted, free_lite_used, key_daily_cap, too_many_quotesWait per Retry-After, buy a pack, or pay with x402.
502scan_failedThe scan failed upstream. Nothing is charged.
503busy, capacity, rpc_unavailable, facilitator_unavailable, ai_unavailable, price_unavailableTemporary. Retry after Retry-After.

Changelog

  • v1, initial public release.