Overview
All responses include provider, fetched_at and latency_ms for provenance. Cached results are served from Redis for up to 60 s and are marked with X-Cache: HIT. Cached hits are still billed at the same price.
Web search & extraction, PDF text, SEO, e-mail & DNS checks, market data, gas fees, DeFi yields, wallet balances and more — 16 endpoints routed across multiple providers and settled instantly with x402 micropayments in USDC or USDT on Base. No API keys, no invoices, no accounts — just HTTP and a wallet.
Daten-Infrastruktur für autonome KI-Agenten — bezahlt pro Anfrage, ohne Vertrag, ohne API-Key.
curl -s -X POST https://agent-margin-router-production.up.railway.app/market-spread \ -H "Content-Type: application/json" \ -H "X-WALLET: 0xYourAgentWallet" \ -d '{"asset": "ethereum", "buy_venue": "binance", "sell_venue": "coinbase"}'x402 turns the HTTP 402 status code into a machine-native payment rail. Your agent never leaves the request loop.
So funktioniert's: Anfrage → Zahlung → Daten. Keine Registrierung, kein Vertrag.
Your agent calls an endpoint over plain HTTPS with a JSON body. No signup, no API key.
The API answers 402 with exact payment terms. The agent signs a $0.01–$0.05 USDC or USDT transfer on Base and retries with the X-PAYMENT header.
The facilitator verifies the payment, the router picks the healthiest provider and returns strict JSON — with provenance and billing metadata.
Identify your agent with an X-WALLET: 0x… header and the first 3 calls skip the 402 step entirely. Once exhausted, the API switches to pay-per-use from $0.01 per request. Perfect for integration tests and CI.
Free-Tier: 3 kostenlose Anfragen pro Wallet, danach ab $0.01 pro Request.
Flat per-endpoint pricing from $0.01 to $0.05 per successful request, regardless of provider or payload size. Failed requests (4xx/5xx) are never charged.
Sechzehn Endpunkte ab 0,01 $ pro erfolgreicher Anfrage. Fehler werden nie berechnet.
/extract-cleanFetch any public URL and return clean, selector-scoped text as strict JSON. Rendered via Apify Web Scraper for JS-heavy pages; falls back to a direct httpx fetch when the page is static or the primary is degraded.
Saubere Web-Extraktion per CSS-Selektor als striktes JSON — mit automatischem Fallback.
{ "url": "https://example.com", "selectors": ["h1", ".price"]}/market-spreadCompare an asset’s price between two venues and receive gross spread, estimated fees, slippage, net spread in bps and an execution-risk score. CoinGecko primary, CoinMarketCap fallback — with confidence weighting.
Spread-Analyse zwischen zwei Handelsplätzen inkl. Gebühren, Slippage und Risiko-Score.
{ "asset": "ethereum", "buy_venue": "binance", "sell_venue": "coinbase"}/gas-feesLive base fee, gas price and slow / standard / fast tiers for Base, Ethereum, Arbitrum, Optimism and Polygon — plus the USD cost of a transfer, approve, swap or mint per tier. Read straight from public RPC with automatic fallback nodes.
Live-Gaspreise mit Slow/Standard/Fast-Stufen und USD-Kosten pro Transaktionstyp für 5 Chains.
{ "chain": "base"}/token-priceOne manipulation-resistant price per asset: median over Binance, Coinbase, Kraken and CoinGecko with min / max, deviation between venues, 24h change and per-venue bid / ask / volume. Failed venues are reported, never silently dropped.
Manipulationsresistenter Median-Preis über 4 Handelsplätze inkl. Abweichung und 24h-Änderung.
{ "asset": "ETH", "quote": "USD"}/wallet-balanceNative token plus USDC, USDT, DAI and WETH balances for any address on 5 chains, each with raw units, decimals, contract and USD value — and a total. Ideal for agents that must check spending power before acting.
Native- und Stablecoin-Guthaben einer Adresse mit USD-Bewertung und Gesamtsumme.
{ "address": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2", "chain": "base"}/web-searchLive web results for any query: ranked title, URL, domain and snippet, deduplicated and region-aware. No API key, no browser — one POST and the agent has citable sources.
Live-Websuche mit Rang, URL, Domain und Snippet — ohne eigenen Such-API-Key.
{ "query": "x402 payment protocol", "max_results": 3, "region": "wt-wt"}/email-validateSyntax check, disposable-domain and free-provider detection, role-account flag, live MX lookup and a 0-100 deliverability score with a single verdict: deliverable, risky, undeliverable, disposable or invalid.
Syntax, Wegwerf-Domains, MX-Check und Zustellbarkeits-Score mit klarem Verdict.
{ "email": "[email protected]", "check_mx": true}/dns-whoisAny record types (A, AAAA, MX, NS, TXT, CNAME, SOA, CAA) with TTLs plus registrar, status, creation / expiry dates, nameservers and DNSSEC from the authoritative RDAP source. Per-type errors are reported, never hidden.
DNS-Records mit TTL plus Registrar, Ablaufdatum und DNSSEC aus der offiziellen RDAP-Quelle.
{ "domain": "x402.org", "record_types": ["A", "MX", "NS"], "include_whois": true}/pdf-textFetch any public PDF up to 25 MB and return clean text per page plus a joined body, page counts, word counts and document metadata. Select specific pages or cap the page count to control context-window usage.
Öffentliche PDFs in sauberen Text pro Seite umwandeln — inkl. Metadaten und Seitenauswahl.
{ "url": "https://arxiv.org/pdf/1706.03762v7", "max_pages": 2}/seo-checkOne-shot technical SEO audit of any URL: status and redirects, HTTPS, load time, title / description lengths, canonical, headings, images without alt, link counts, Open Graph, JSON-LD, robots.txt and sitemap — condensed into a 0-100 score, a letter grade and a prioritised issue list.
Technischer SEO-Audit einer URL mit Score, Note und priorisierter Problemliste.
{ "url": "https://example.com", "check_robots": true}/defi-yieldsScreen thousands of DeFi pools by chain, asset, protocol, minimum TVL and stablecoin-only — returns APY (base / reward / 30-day mean), TVL, impermanent-loss risk and exposure per pool, sorted by APY. Built for treasury and yield agents that need a shortlist, not a data dump.
DeFi-Pool-Screener nach Chain, Asset, Protokoll, TVL und Stablecoin-Filter — sortiert nach APY.
{ "chain": "Base", "stablecoins_only": true, "min_tvl_usd": 1000000, "limit": 5}/currency-convertConvert one amount into up to 10 target currencies in a single call using official ECB reference rates — returns the raw rates, the converted amounts and the rate date. Ideal for invoicing, pricing and reporting agents that must show a defensible source.
Betrag in bis zu 10 Zielwährungen umrechnen — offizielle EZB-Referenzkurse mit Kursdatum.
{ "amount": 250, "from": "EUR", "to": ["USD", "GBP", "JPY"]}/geo-ipGeolocate any IPv4 / IPv6 address: country, region, city, postal code, coordinates, timezone with UTC offset, ASN, organisation, ISP and EU flag — with automatic provider fallback. Useful for routing, fraud checks, localisation and compliance decisions.
IP-Geolokation mit Land, Stadt, Koordinaten, Zeitzone, ASN und Provider — inkl. Fallback.
{ "ip": "8.8.8.8"}/rss-feedFetch any RSS 2.0 or Atom feed and return normalised items — title, link, ISO timestamp, author, summary and optionally full content — plus feed metadata and counts. Lets monitoring and research agents watch sources without parsing XML themselves.
RSS-/Atom-Feeds als normalisiertes JSON — Titel, Link, Zeitstempel, Autor, Zusammenfassung.
{ "url": "https://hnrss.org/frontpage", "max_items": 5, "include_content": false}/crypto-ohlcvHistorical candles for any major crypto pair at 1m to 1w intervals (up to 500 per call) with a ready-made summary: first open, last close, period high / low / volume and percentage change. Binance primary, Coinbase fallback — no exchange keys needed.
Historische Kerzen (1m–1w, bis 500) mit Zusammenfassung — Binance primär, Coinbase-Fallback.
{ "symbol": "ETH", "quote": "USDT", "interval": "1h", "limit": 24}/ens-resolveResolve an ENS name on Ethereum mainnet to its address plus selected text records (url, com.twitter, avatar, email …) via direct on-chain calls with multi-RPC fallback. Returns namehash and resolver so payment agents can verify before they send.
ENS-Namen on-chain zu Adresse und Text-Records auflösen — mit Multi-RPC-Fallback.
{ "name": "vitalik.eth", "text_keys": ["url", "com.twitter", "avatar"]}Base URL: https://agent-margin-router-production.up.railway.app — all endpoints speak JSON over HTTPS. Content-Type: application/json.
Vollständige API-Referenz: Authentifizierung, Schemas, Fehlercodes, Beispiele in Python und cURL.
All responses include provider, fetched_at and latency_ms for provenance. Cached results are served from Redis for up to 60 s and are marked with X-Cache: HIT. Cached hits are still billed at the same price.
There are no API keys. Access is granted by payment. The protocol is x402: the server replies 402 Payment Required with the exact terms; the client signs an EIP-3009 transferWithAuthorization for USDC or USDT on Base and resends the request with the signed payload base64-encoded in X-PAYMENT. Verification and settlement are performed by the PayAI x402 facilitator (facilitator.payai.network); the v2 header names PAYMENT-SIGNATURE / PAYMENT-RESPONSE are accepted as aliases.
HTTP/1.1 402 Payment RequiredContent-Type: application/json { "x402Version": 1, "error": "Payment required", "accepts": [ { "scheme": "exact", "network": "base", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "symbol": "USDC", "maxAmountRequired": "50000", "payTo": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2", "resource": "/extract-clean", "maxTimeoutSeconds": 60 }, { "scheme": "exact", "network": "base", "asset": "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2", "symbol": "USDT", "maxAmountRequired": "50000", "payTo": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2", "resource": "/extract-clean", "maxTimeoutSeconds": 60 } ], "free_tier": { "remaining": 0, "hint": "Send X-WALLET header to use 3 free requests per wallet" }}X-PAYMENT — request; base64 JSON of the signed x402 payload.X-WALLET — request; EVM address to claim the free tier.X-PAYMENT-RESPONSE — response; base64 settlement receipt incl. tx hash.X-Free-Remaining — response; free requests left for the wallet.import httpx # 3 free requests per wallet — identify yourself with X-WALLETr = httpx.post( "https://agent-margin-router-production.up.railway.app/extract-clean", headers={"X-WALLET": "0xYourWalletAddress"}, json={"url": "https://example.com", "selectors": ["h1"]},)print(r.status_code, r.json())import base64, json, httpx API = "https://agent-margin-router-production.up.railway.app"body = {"asset": "ethereum", "buy_venue": "binance", "sell_venue": "coinbase"} # 1) Probe → 402 with payment requirementsr = httpx.post(f"{API}/market-spread", json=body)assert r.status_code == 402req = r.json()["accepts"][0] # pick USDC (or [1] for USDT) # 2) Sign an EIP-3009 transferWithAuthorization for req["maxAmountRequired"]# to req["payTo"] on Base (see x402 spec) → payload dictpayload = sign_x402_payment(req) # your wallet logic / x402 SDK # 3) Retry with X-PAYMENT headerr = httpx.post( f"{API}/market-spread", json=body, headers={"X-PAYMENT": base64.b64encode(json.dumps(payload).encode()).decode()},)print(r.status_code, r.json())print("settlement:", r.headers.get("X-PAYMENT-RESPONSE"))Public, unauthenticated, never billed. Returns service status, per-provider health, Redis connectivity and uptime. Poll it from your orchestrator before dispatching paid requests; returns 503 when degraded.
curl -s https://agent-margin-router-production.up.railway.app/health | jq{ "status": "ok", "version": "1.0.0", "uptime_seconds": 864213, "redis": "connected", "providers": { "apify": "healthy", "coingecko": "healthy", "coinmarketcap": "healthy", "httpx_direct": "healthy" }, "payment": { "network": "base", "accepted": ["USDC", "USDT"], "price_per_request": "0.01-0.05" }}Extracts selector-scoped text from a URL. Payment required (or free tier). Price: $0.02. Timeout: 45 s. Response bodies larger than 1 MB are truncated per selector with meta.truncated = true.
urlrequired | string (https) | Publicly reachable URL to extract from. Max 2048 chars. |
selectors | string[] | CSS selectors. Each selector maps to an array of text values. Default: ["body"]. Max 20. |
{ "url": "https://example.com", "selectors": ["h1", ".price"]}{ "url": "https://example.com", "provider": "apify", "fetched_at": "2026-09-10T14:02:11Z", "latency_ms": 1840, "data": { "h1": ["Example Domain"], ".price": [] }, "meta": { "status_code": 200, "content_type": "text/html", "fallback_used": false }, "billing": { "charged": "0.05", "token": "USDC", "network": "base", "tx_hash": "0x9c1f…e2a4" }}datarequired | object<string, string[]> | Selector → array of trimmed text content. |
providerrequired | "apify" | "httpx_direct" | Provider that served this response. |
meta.fallback_usedrequired | boolean | True if the primary provider was unavailable. |
fetched_atrequired | ISO-8601 | Source timestamp (UTC). |
latency_msrequired | number | Upstream fetch latency. |
billing | object | Present on paid calls: charged, token, network, tx_hash. |
# pip install x402 httpx eth-accountimport httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks BASE_URL = "https://agent-margin-router-production.up.railway.app" # Agent wallet holding USDC or USDT on Baseaccount = Account.from_key("0x<AGENT_PRIVATE_KEY>") # The hook transparently handles the 402 → pay → retry loopclient = httpx.Client( base_url=BASE_URL, event_hooks=x402_payment_hooks(account), timeout=60,) resp = client.post( "/extract-clean", json={"url": "https://example.com", "selectors": ["h1", ".price"]},)resp.raise_for_status()print(resp.json()["data"])Computes the price spread of an asset between two venues with fee/slippage adjustment and a risk score. Payment required (or free tier). Price: $0.05. Quotes are at most 60 s old.Not financial advice. Spreads exclude transfer time and gas; there is no risk-free arbitrage.
assetrequired | string | CoinGecko asset id, e.g. "ethereum", "bitcoin", "solana". |
buy_venuerequired | string | Exchange id where the asset is bought, e.g. "binance". |
sell_venuerequired | string | Exchange id where the asset is sold, e.g. "coinbase". |
{ "asset": "ethereum", "buy_venue": "binance", "sell_venue": "coinbase"}{ "asset": "ethereum", "buy_venue": "binance", "sell_venue": "coinbase", "buy_price": 3412.18, "sell_price": 3416.92, "gross_spread_bps": 13.9, "fees_bps": 10.0, "slippage_bps": 2.5, "estimated_net_spread_bps": 1.4, "confidence": 0.81, "execution_risk": "high", "provider": "coingecko", "fetched_at": "2026-09-10T14:02:15Z", "billing": { "charged": "0.05", "token": "USDT", "network": "base" }}buy_price / sell_pricerequired | number (USD) | Latest quotes per venue. |
gross_spread_bpsrequired | number | Raw price difference in basis points. |
fees_bps / slippage_bpsrequired | number | Estimated taker fees and slippage for a reference size. |
estimated_net_spread_bpsrequired | number | Gross minus fees and slippage. Can be negative. |
confidencerequired | number 0–1 | Cross-provider agreement and data freshness. |
execution_riskrequired | "low" | "medium" | "high" | Heuristic based on liquidity, spread size and staleness. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),) spread = client.post( "/market-spread", json={"asset": "ethereum", "buy_venue": "binance", "sell_venue": "coinbase"},).json() if spread["estimated_net_spread_bps"] > 5 and spread["confidence"] > 0.7: print("opportunity:", spread)Live EIP-1559 gas data for 5 EVM chains with slow / standard / fast tiers and the USD cost of common transaction types. Read from public RPC with automatic node fallback. Payment required (or free tier). Price: $0.01. Freshness ≤ 10 s by default.
chain | string | "base" (default) | "ethereum" | "arbitrum" | "optimism" | "polygon". |
max_age_seconds | integer 0–300 | Accept a cached reading up to this age. Default 10. |
{ "chain": "base"}{ "chain": "base", "chain_id": 8453, "native_token": "ETH", "native_price_usd": 2609.97, "block_number": 51175271, "base_fee_gwei": 0.005, "gas_price_gwei": 0.006, "trend": "low", "tiers": { "slow": { "max_fee_gwei": 0.0051, "cost_usd": { "erc20_transfer": 0.00087, "swap": 0.0024 } }, "standard": { "max_fee_gwei": 0.0062, "cost_usd": { "erc20_transfer": 0.00105, "swap": 0.0029 } }, "fast": { "max_fee_gwei": 0.0081, "cost_usd": { "erc20_transfer": 0.00138, "swap": 0.0038 } } }, "freshness_seconds": 0, "cost_usdc": 0.01, "token": "USDC", "routing": { "provider": "onchain", "cache_hit": false, "latency_ms": 312 }}base_fee_gwei / gas_price_gweirequired | number | Current EIP-1559 base fee and legacy gas price of the latest block. |
trendrequired | "low" | "normal" | "high" | Base fee relative to the recent fee history. |
tiers.{slow,standard,fast}required | object | max_priority_fee_gwei, max_fee_gwei and cost_usd per tx type (native_transfer, erc20_transfer, erc20_approve, swap, nft_mint). |
native_price_usdrequired | number | Native token price used for USD conversion (multi-venue median). |
block_numberrequired | integer | Block the reading was taken from. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),) gas = client.post("/gas-fees", json={"chain": "base"}).json()swap_cost = gas["tiers"]["standard"]["cost_usd"]["swap"]if swap_cost < 0.01: print("cheap block — execute swap now", gas["tiers"]["standard"])Median price across Binance, Coinbase, Kraken and CoinGecko with min / max, inter-venue deviation and 24h change. Failed venues are listed in sources_failed instead of being dropped. Payment required (or free tier). Price: $0.01. Freshness ≤ 5 s by default.
assetrequired | string | Ticker, e.g. "ETH", "BTC", "SOL". Case-insensitive. |
quote | string | Quote currency. Default "USD". |
venues | string[] | Subset of binance, coinbase, kraken, coingecko. Default: all four. |
max_age_seconds | integer 0–300 | Accept a cached quote up to this age. Default 5. |
{ "asset": "ETH", "quote": "USD"}{ "asset": "ETH", "quote": "USD", "price": 2609.57, "price_min": 2607.52, "price_max": 2609.82, "max_deviation_pct": 0.078, "change_24h_pct": 6.99, "sources": [ { "venue": "binance", "price": 2609.82, "pair": "ETH/USDT", "volume_24h_usd": 1411339492 }, { "venue": "coinbase", "price": 2609.77, "pair": "ETH/USD" }, { "venue": "kraken", "price": 2609.36, "pair": "ETH/USD" }, { "venue": "coingecko", "price": 2607.52, "pair": "ETH/USD" } ], "sources_failed": {}, "freshness_seconds": 0, "cost_usdc": 0.01, "token": "USDC", "routing": { "provider": "onchain", "cache_hit": false, "latency_ms": 420 }}pricerequired | number | Median across all responding venues. |
price_min / price_max / max_deviation_pctrequired | number | Spread between venues — reject when deviation is too high. |
change_24h_pctrequired | number | null | 24h change (from venues that report it). |
sources[]required | object[] | Per venue: price, bid, ask, volume_24h_usd, pair. |
sources_failedrequired | object<string, string> | Venues that failed with the error reason. Never silently dropped. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),) quote = client.post("/token-price", json={"asset": "ETH", "quote": "USD"}).json() # Median across 4 venues — reject if venues disagree too muchif quote["max_deviation_pct"] < 0.5: print("ETH/USD", quote["price"], "from", len(quote["sources"]), "venues")Native token plus USDC, USDT, DAI and WETH balances for any address on 5 chains, USD-valued and totalled. One batched RPC round-trip. Payment required (or free tier). Price: $0.01.
addressrequired | string (0x…) | EVM address to inspect (40 hex chars). |
chain | string | "base" (default) | "ethereum" | "arbitrum" | "optimism" | "polygon". |
max_age_seconds | integer 0–300 | Accept a cached reading up to this age. |
{ "address": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2", "chain": "base"}{ "address": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2", "chain": "base", "chain_id": 8453, "block_number": 51175277, "balances": { "ETH": { "balance": 0.0, "decimals": 18, "contract": null, "usd": 0.0 }, "USDC": { "balance": 6.274089, "decimals": 6, "contract": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "usd": 6.27 }, "USDT": { "balance": 6.211248, "decimals": 6, "contract": "0xfde4c96c8593536e31f229ea8f37b2ada2699bb2", "usd": 6.21 } }, "total_usd": 12.49, "freshness_seconds": 0, "cost_usdc": 0.01, "token": "USDC", "routing": { "provider": "onchain", "cache_hit": false, "latency_ms": 740 }}balances.{ETH,USDC,USDT,DAI,WETH}required | object | balance (decimal), raw (integer string), decimals, contract, usd. |
total_usdrequired | number | Sum of all USD-valued balances. |
block_numberrequired | integer | Block the balances were read at (single batched RPC round-trip). |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),) # Let the agent check its own spending power before a taskbal = client.post( "/wallet-balance", json={"address": account.address, "chain": "base"},).json() if bal["total_usd"] < 1.0: raise SystemExit("top up USDC/USDT on Base before continuing")print("stablecoins available:", bal["total_usd"], "USD")Ranked, deduplicated live web results (title, URL, domain, snippet) for any query — region-aware, no search API key needed. Payment required (or free tier). Price: $0.02.
queryrequired | string 1–400 | Search query. |
max_results | integer 1–20 | Number of results to return (default 10). |
region | string | Region code, e.g. "wt-wt" (default, worldwide), "us-en", "de-de". |
max_age_seconds | integer 0–3600 | Accept a cached result set up to this age (default 300). |
{ "query": "x402 payment protocol", "max_results": 3, "region": "wt-wt"}{ "query": "x402 payment protocol", "region": "wt-wt", "results": [ { "rank": 1, "title": "x402", "url": "https://x402.org/", "domain": "x402.org", "snippet": "x402 is the internet's payment standard. Pay for APIs, data and compute over HTTP ..." }, { "rank": 2, "title": "x402 Payment Protocol: The Complete Guide", "url": "https://blog.payai.network/x402-payment-protocol-guide", "domain": "blog.payai.network", "snippet": "How HTTP 402 and stablecoins let agents pay per request ..." } ], "result_count": 3, "source": "duckduckgo_html", "freshness_seconds": 0, "cost_usdc": 0.02, "token": "USDC", "routing": { "provider": "webtools", "cache_hit": false, "latency_ms": 812 }}results[]required | object[] | rank, title, url, domain, snippet — deduplicated by URL. |
result_countrequired | integer | Number of results returned. |
sourcerequired | string | Upstream search source used. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Give the agent live web results it can citehits = client.post( "/web-search", json={"query": "x402 payment protocol", "max_results": 5},).json() for r in hits["results"]: print(r["rank"], r["title"], "->", r["url"])Syntax, disposable / free-provider / role detection, live MX lookup and a 0–100 deliverability score condensed into one verdict. Payment required (or free tier). Price: $0.01.
emailrequired | string | Address to validate. |
check_mx | boolean | Perform a live MX lookup (default true). |
{ "email": "[email protected]", "check_mx": true}{ "email": "[email protected]", "local_part": "jane.doe", "domain": "github.com", "valid_syntax": true, "disposable": false, "free_provider": false, "role_account": false, "mx_checked": true, "has_mx": true, "mx_records": [ { "priority": 1, "exchange": "github-com.mail.protection.outlook.com", "ttl": 3600 } ], "domain_resolves": true, "deliverability_score": 95, "verdict": "deliverable", "freshness_seconds": 0, "cost_usdc": 0.01, "token": "USDC", "routing": { "provider": "webtools", "cache_hit": false, "latency_ms": 34 }}valid_syntax / disposable / free_provider / role_accountrequired | boolean | Syntax check, disposable-domain list, free mailbox provider, role mailbox (info@, admin@ …). |
has_mx / mx_records[] / domain_resolvesrequired | boolean / object[] | Live MX records (priority, exchange, ttl) and whether the domain resolves at all. |
deliverability_scorerequired | integer 0–100 | Composite deliverability score. |
verdictrequired | string | "deliverable" | "risky" | "undeliverable" | "disposable" | "invalid" | "unknown". |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Clean a lead list before the outreach agent sends anythingfor email in ["[email protected]", "[email protected]"]: v = client.post("/email-validate", json={"email": email}).json() print(email, v["verdict"], v["deliverability_score"])DNS records with TTLs for up to 8 record types plus registrar, status, created / expires, nameservers and DNSSEC from the authoritative RDAP source. Payment required (or free tier). Price: $0.01.
domainrequired | string | Domain name; scheme and path are stripped automatically. |
record_types | string[] ≤ 8 | A, AAAA, MX, NS, TXT, CNAME, SOA, CAA (default: A, AAAA, MX, NS, TXT, CNAME). |
include_whois | boolean | Add registration data via RDAP (default true). |
max_age_seconds | integer 0–3600 | Accept a cached lookup up to this age (default 300). |
{ "domain": "x402.org", "record_types": ["A", "MX", "NS"], "include_whois": true}{ "domain": "x402.org", "records": { "A": [ { "ttl": 300, "data": "104.18.10.192" }, { "ttl": 300, "data": "104.18.11.192" } ], "MX": [ { "ttl": 3600, "data": "10 mx1.forwardemail.net.", "priority": 10, "exchange": "mx1.forwardemail.net" } ], "NS": [ { "ttl": 86400, "data": "dolly.ns.cloudflare.com." }, { "ttl": 86400, "data": "rayden.ns.cloudflare.com." } ] }, "whois": { "registered": true, "registrar": "Key-Systems GmbH", "registrar_iana_id": "269", "status": ["client transfer prohibited"], "created": "2025-02-20T17:31:14.067Z", "updated": "2026-08-12T09:36:44.39Z", "expires": "2029-02-20T17:31:14.067Z", "dnssec": false, "source": "rdap.publicinterestregistry.org" }, "errors": {}, "freshness_seconds": 0, "cost_usdc": 0.01, "token": "USDC", "routing": { "provider": "webtools", "cache_hit": false, "latency_ms": 339 }}recordsrequired | object<TYPE, object[]> | Per record type: ttl, data (+ priority / exchange for MX). |
whoisrequired | object | null | registered, registrar, registrar_iana_id, status[], created, updated, expires, nameservers[], dnssec, source. |
errorsrequired | object<TYPE, string> | Record types that failed with the reason. Never silently dropped. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Due diligence on a counterparty domain before the agent trusts itinfo = client.post( "/dns-whois", json={"domain": "x402.org", "record_types": ["A", "MX", "NS"]},).json() print("registrar:", info["whois"]["registrar"])print("expires: ", info["whois"]["expires"])print("A records:", [r["data"] for r in info["records"]["A"]])Fetches any public PDF (≤ 25 MB) and returns clean text per page plus a joined body, counts and document metadata. Select pages to protect the context window. Payment required (or free tier). Price: $0.02.
urlrequired | string (https URL) | Publicly reachable PDF, max 25 MB. |
max_pages | integer 1–200 | Cap on pages to extract (default 50). |
pages | integer[] | Explicit 1-based page selection; overrides max_pages. |
{ "url": "https://arxiv.org/pdf/1706.03762v7", "max_pages": 2}{ "url": "https://arxiv.org/pdf/1706.03762v7", "final_url": "https://arxiv.org/pdf/1706.03762v7", "bytes": 2215244, "fetch_ms": 35, "page_count": 15, "pages_extracted": 2, "truncated": true, "char_count": 7108, "word_count": 1012, "metadata": { "creator": "LaTeX with hyperref", "producer": "pdfTeX-1.40.25" }, "pages": [ { "page": 1, "text": "Attention Is All You Need\n..." }, { "page": 2, "text": "..." } ], "text": "Attention Is All You Need\n...", "freshness_seconds": 0, "cost_usdc": 0.02, "token": "USDC", "routing": { "provider": "webtools", "cache_hit": false, "latency_ms": 107 }}page_count / pages_extracted / truncatedrequired | integer / boolean | Total pages in the document, pages returned, and whether the cap cut the output. |
pages[]required | object[] | page (1-based) and text per page. |
text / char_count / word_countrequired | string / integer | Joined text of the extracted pages with counts. |
metadatarequired | object | PDF document info (creator, producer, dates …). |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Turn any public PDF into clean text for the agent's context windowdoc = client.post( "/pdf-text", json={"url": "https://arxiv.org/pdf/1706.03762v7", "max_pages": 5},).json() print(doc["page_count"], "pages,", doc["word_count"], "words extracted")print(doc["text"][:500])One-shot technical SEO audit: status, HTTPS, load time, title / description, canonical, headings, images, links, Open Graph, JSON-LD, robots.txt and sitemap — as a 0–100 score, grade and prioritised issue list. Payment required (or free tier). Price: $0.03.
urlrequired | string (URL) | Page to audit; redirects are followed. |
check_robots | boolean | Also fetch robots.txt and detect the sitemap (default true). |
{ "url": "https://example.com", "check_robots": true}{ "url": "https://example.com", "final_url": "https://example.com/", "http_status": 200, "https": true, "load_ms": 584, "title": "Example Domain", "title_length": 14, "meta_description": null, "canonical": null, "lang": "en", "viewport": "width=device-width, initial-scale=1", "h1": ["Example Domain"], "h2_count": 0, "word_count": 31, "images": { "total": 0, "missing_alt": 0 }, "links": { "internal": 0, "external": 1 }, "open_graph": {}, "structured_data_blocks": 0, "robots_txt": { "found": false }, "issues": [ { "severity": "high", "code": "missing_description", "message": "No meta description." }, { "severity": "medium", "code": "missing_canonical", "message": "No canonical link." }, { "severity": "low", "code": "no_structured_data", "message": "No JSON-LD structured data." } ], "score": 67, "grade": "C", "freshness_seconds": 0, "cost_usdc": 0.03, "token": "USDC", "routing": { "provider": "webtools", "cache_hit": false, "latency_ms": 1033 }}score / graderequired | integer 0–100 / string A–F | Composite technical SEO score and letter grade. |
issues[]required | object[] | severity (high | medium | low), code, message — sorted by severity. |
title / meta_description / canonical / lang / viewport / h1[]required | string | null | Core on-page signals with lengths. |
images / links / open_graph / structured_data_blocks / robots_txt / sitemaprequired | object / integer | Images without alt, internal / external links, OG tags, JSON-LD count, robots and sitemap status. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Let an SEO agent audit a page and act on the issuesaudit = client.post("/seo-check", json={"url": "https://example.com"}).json() print("grade:", audit["grade"], "score:", audit["score"])for issue in audit["issues"]: print(f"[{issue['severity']}] {issue['message']}")Screens DeFi pools (DefiLlama) by chain, asset, protocol, TVL and stablecoin filter, sorted by APY. Payment required (or free tier). Price: $0.02.
chain | string | Filter by chain name, e.g. Base, Ethereum, Arbitrum (case-insensitive). |
asset | string | Substring match on the pool symbol, e.g. USDC or ETH. |
project | string | Protocol slug, e.g. aave-v3, morpho, uniswap-v3. |
min_tvl_usd | number | Minimum pool TVL in USD (default 1,000,000). |
stablecoins_only | boolean | Only stablecoin pools (default false). |
limit | integer 1–50 | Number of pools to return, sorted by APY desc (default 10). |
{ "chain": "Base", "stablecoins_only": true, "min_tvl_usd": 1000000, "limit": 5}{ "filters": { "chain": "Base", "asset": null, "project": null, "min_tvl_usd": 1000000, "stablecoins_only": true }, "pools": [ { "pool": "7e0661bf-8cf3-45e6-9424-31916d4c7b84", "project": "aave-v3", "chain": "Base", "symbol": "USDC", "tvl_usd": 251340112.4, "apy": 4.12, "apy_base": 4.12, "apy_reward": null, "apy_mean_30d": 4.37, "stablecoin": true, "il_risk": "no", "exposure": "single" } ], "pool_count": 5, "total_matching": 38, "source": "defillama", "freshness_seconds": 0, "cost_usdc": 0.02, "token": "USDC", "routing": { "provider": "datatools", "cache_hit": false, "latency_ms": 640 }}pools[]required | object[] | pool id, project, chain, symbol, tvl_usd, apy, apy_base, apy_reward, apy_mean_30d, stablecoin, il_risk, exposure. |
pool_count / total_matchingrequired | integer | Returned pools vs. all pools matching the filters. |
filters / sourcerequired | object / string | Echo of the applied filters; source is always defillama. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Let a treasury agent find the best stablecoin yield on Baseyields = client.post("/defi-yields", json={"chain": "Base", "stablecoins_only": True, "limit": 5}).json() for pool in yields["pools"]: print(f"{pool['project']:<12} {pool['symbol']:<10} APY {pool['apy']:.2f}% TVL ${pool['tvl_usd']:,.0f}")Converts an amount into up to 10 currencies using ECB reference rates. Payment required (or free tier). Price: $0.01.
amountrequired | number | Amount in the source currency (> 0). |
fromrequired | string (ISO 4217) | Source currency, e.g. EUR, USD, GBP. |
torequired | string[] (1–10) | Target currencies. |
{ "amount": 250, "from": "EUR", "to": ["USD", "GBP", "JPY"]}{ "amount": 250, "from_currency": "EUR", "rates": { "USD": 1.0842, "GBP": 0.8391, "JPY": 171.62 }, "converted": { "USD": 271.05, "GBP": 209.775, "JPY": 42905.0 }, "rate_date": "2026-09-11", "source": "frankfurter_ecb", "freshness_seconds": 0, "cost_usdc": 0.01, "token": "USDC", "routing": { "provider": "datatools", "cache_hit": false, "latency_ms": 212 }}ratesrequired | object | Reference rate per target currency (1 unit of from_currency). |
convertedrequired | object | amount × rate per target currency. |
rate_date / sourcerequired | string | ECB publication date of the rates; source frankfurter_ecb. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Convert an invoice amount with ECB reference ratesfx = client.post("/currency-convert", json={"amount": 250, "from": "EUR", "to": ["USD", "GBP"]}).json() for ccy, value in fx["converted"].items(): print(f"250 EUR = {value:.2f} {ccy} (rate date {fx['rate_date']})")Geolocates an IPv4 / IPv6 address with timezone, ASN and provider fallback. Payment required (or free tier). Price: $0.01.
iprequired | string | IPv4 or IPv6 address. |
max_age_seconds | integer | Accept a cached lookup up to this age (default 86400). |
{ "ip": "8.8.8.8"}{ "ip": "8.8.8.8", "version": 4, "is_private": false, "country": "United States", "country_code": "US", "region": "California", "city": "Mountain View", "postal": "94043", "latitude": 37.4223, "longitude": -122.085, "timezone": "America/Los_Angeles", "utc_offset": "-07:00", "asn": 15169, "org": "Google LLC", "isp": "Google LLC", "is_eu": false, "source": "ipwho.is", "freshness_seconds": 0, "cost_usdc": 0.01, "token": "USDC", "routing": { "provider": "datatools", "cache_hit": false, "latency_ms": 188 }}country / country_code / region / city / postalrequired | string | null | Administrative location. |
latitude / longitude / timezone / utc_offsetrequired | number / string | Coordinates and IANA timezone. |
asn / org / isp / is_eu / is_privaterequired | mixed | Network ownership and flags. |
sourcerequired | string | ipwho.is or ip-api.com (automatic fallback). |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Geolocate a visitor / counterparty IP for routing or compliancegeo = client.post("/geo-ip", json={"ip": "8.8.8.8"}).json() print(geo["city"], geo["country_code"], geo["timezone"], "ASN", geo["asn"], geo["org"])Fetches an RSS 2.0 / Atom feed and returns normalised JSON items. Payment required (or free tier). Price: $0.01.
urlrequired | string (URL) | Feed URL (RSS 2.0 or Atom). |
max_items | integer 1–100 | Items to return (default 20). |
include_content | boolean | Include full item content when the feed provides it (default false). |
{ "url": "https://hnrss.org/frontpage", "max_items": 5, "include_content": false}{ "url": "https://hnrss.org/frontpage", "format": "rss", "feed_title": "Hacker News: Front Page", "feed_link": "https://news.ycombinator.com/", "items": [ { "title": "Show HN: An open protocol for agent payments", "link": "https://example.com/post", "published": "2026-09-11T08:14:02+00:00", "author": "someone", "summary": "Comments: https://news.ycombinator.com/item?id=…", "content": null } ], "item_count": 5, "total_items": 30, "freshness_seconds": 0, "cost_usdc": 0.01, "token": "USDC", "routing": { "provider": "datatools", "cache_hit": false, "latency_ms": 402 }}format / feed_title / feed_linkrequired | string | rss or atom plus feed metadata. |
items[]required | object[] | title, link, published (ISO-8601), author, summary, content. |
item_count / total_itemsrequired | integer | Returned vs. total items in the feed. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Monitor any RSS / Atom feed as normalised JSONfeed = client.post("/rss-feed", json={"url": "https://hnrss.org/frontpage", "max_items": 5}).json() for item in feed["items"]: print(item["published"], "-", item["title"])Returns historical OHLCV candles for a crypto pair with a summary block (Binance, Coinbase fallback). Payment required (or free tier). Price: $0.02.
symbolrequired | string | Base asset, e.g. BTC, ETH, SOL. |
quote | string | Quote asset (default USDT; USD is mapped for Coinbase fallback). |
interval | string | 1m, 5m, 15m, 1h, 4h, 1d, 1w (default 1h). |
limit | integer 1–500 | Number of candles (default 100). |
{ "symbol": "ETH", "quote": "USDT", "interval": "1h", "limit": 24}{ "symbol": "ETH", "quote": "USDT", "interval": "1h", "candles": [ { "time": "2026-09-10T10:00:00+00:00", "open": 4412.1, "high": 4431.0, "low": 4398.4, "close": 4420.7, "volume": 8123.44 } ], "candle_count": 24, "summary": { "first_open": 4412.1, "last_close": 4467.3, "period_high": 4490.0, "period_low": 4380.2, "period_volume": 191204.9, "change_pct": 1.25 }, "source": "binance", "freshness_seconds": 0, "cost_usdc": 0.02, "token": "USDC", "routing": { "provider": "datatools", "cache_hit": false, "latency_ms": 233 }}candles[]required | object[] | time (ISO-8601), open, high, low, close, volume — oldest first. |
summaryrequired | object | first_open, last_close, period_high, period_low, period_volume, change_pct. |
sourcerequired | string | binance or coinbase (automatic fallback). |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Feed a trading agent with the last 24 hourly candlesohlcv = client.post("/crypto-ohlcv", json={"symbol": "ETH", "interval": "1h", "limit": 24}).json() s = ohlcv["summary"]print(f"ETH 24h: {s['first_open']} -> {s['last_close']} ({s['change_pct']:+.2f}%) high {s['period_high']} low {s['period_low']}")Resolves an ENS name on Ethereum mainnet to its address and text records via direct on-chain calls. Payment required (or free tier). Price: $0.01.
namerequired | string | ENS name, e.g. vitalik.eth (case-insensitive). |
text_keys | string[] (≤ 8) | Text records to read (default url, com.twitter, avatar). |
{ "name": "vitalik.eth", "text_keys": ["url", "com.twitter", "avatar"]}{ "name": "vitalik.eth", "namehash": "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", "resolver": "0x4976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41", "address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "texts": { "url": "https://vitalik.ca", "com.twitter": "VitalikButerin", "avatar": "eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063" }, "chain": "ethereum", "resolved": true, "freshness_seconds": 0, "cost_usdc": 0.01, "token": "USDC", "routing": { "provider": "datatools", "cache_hit": false, "latency_ms": 356 }}addressrequired | string | null | Resolved Ethereum address (lower-case) or null. |
resolver / namehashrequired | string | Resolver contract and EIP-137 namehash used for the lookup. |
texts / resolvedrequired | object / boolean | Requested text records (null if unset) and overall success flag. |
import httpxfrom eth_account import Accountfrom x402.clients.httpx import x402_payment_hooks account = Account.from_key("0x<AGENT_PRIVATE_KEY>")client = httpx.Client( base_url="https://agent-margin-router-production.up.railway.app", event_hooks=x402_payment_hooks(account),)# Resolve a human-readable name before sending fundsens = client.post("/ens-resolve", json={"name": "vitalik.eth"}).json() if ens["resolved"]: print("send to", ens["address"], "| twitter:", ens["texts"].get("com.twitter"))Every endpoint is also exposed as an MCP tool over Streamable HTTP at POST /mcp — no SDK, no session state. Add the server to Claude Desktop, Cursor, LangChain or any MCP-capable agent; tools: extract_clean, market_spread, gas_fees, token_price, wallet_balance, web_search, email_validate, dns_whois, pdf_text, seo_check, defi_yields, currency_convert, geo_ip, rss_feed, crypto_ohlcv, ens_resolve, health, payment_info. Payment works exactly like HTTP: pass wallet (free tier) or x_payment as tool arguments; a 402 is returned as a structured result with the payment requirements.
{ "mcpServers": { "agent-margin-router": { "url": "https://agent-margin-router-production.up.railway.app/mcp" } }}# List available tools (JSON-RPC 2.0, Streamable HTTP)curl -s -X POST https://agent-margin-router-production.up.railway.app/mcp \ -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | jq # Call a tool — pass your wallet for the free tier, or an x402 payment headercurl -s -X POST https://agent-margin-router-production.up.railway.app/mcp \ -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{ "name":"market_spread", "arguments":{"asset":"ETH","buy_venue":"binance","sell_venue":"coinbase", "wallet":"0xYourWallet"}}}' | jqFor crawlers and marketplaces the catalog is published in the x402 Bazaar format (every 402 also carries outputSchema), plus an llms.txt and the full OpenAPI schema.
# Machine-readable catalog (x402 Bazaar format) + LLM-friendly summarycurl -s https://agent-margin-router-production.up.railway.app/.well-known/x402 | jqcurl -s https://agent-margin-router-production.up.railway.app/discovery/resources | jqcurl -s https://agent-margin-router-production.up.railway.app/llms.txtcurl -s https://agent-margin-router-production.up.railway.app/openapi.json | jq '.paths | keys'Errors are returned as { "error": string, "code": string, "detail"?: any }. No payment is settled on any non-2xx response — a signed authorization that was not consumed simply expires.
| Status | Meaning | What to do |
|---|---|---|
| 200 OK | Request succeeded. Payment (if any) settled. | Consume `data`; check `meta.fallback_used`. |
| 400 Bad Request | Invalid body — missing `url`/`asset`, malformed JSON or unsupported selector. | Fix payload; no charge applied. |
| 402 Payment Required | No valid payment attached and free tier exhausted (or no X-WALLET). | Read `accepts[]`, pay, retry with `X-PAYMENT`. |
| 403 Payment Invalid | X-PAYMENT present but facilitator verification failed (wrong amount, network, expired, replayed). | Sign a fresh payload with the exact `maxAmountRequired`. |
| 422 Unprocessable | Target URL unreachable / asset or venue unknown to all providers. | Check URL or use a CoinGecko asset id (e.g. `ethereum`). |
| 429 Rate Limited | Burst limit per wallet/IP exceeded. | Back off; honor `Retry-After` header. |
| 502 Provider Error | All upstream providers failed for this request. | Retry after a few seconds; payment is not settled on 5xx. |
| 503 Degraded | Service in degraded mode (e.g. Redis unavailable). | Poll `/health`; retry with backoff. |
Every request is routed to the healthiest provider based on live health checks, latency and cost. Fallbacks are automatic and transparent — the response always tells you which source served it.
Jede Anfrage wird automatisch an den gesündesten Provider geroutet — Fallbacks inklusive.
apifyHeadless-browser web scraping at scale. Handles JavaScript-rendered pages, infinite scroll and anti-bot friction.
coingeckoBroad coverage of 15k+ assets and 1k+ venues with per-exchange tickers. Used as the primary price source for spread analysis.
coinmarketcapIndependent second price feed. Activated automatically when CoinGecko is rate-limited, stale or unhealthy; also used for confidence cross-checks.
httpx_directZero-cost direct HTTP fetch with HTML parsing. Serves static pages instantly and guarantees availability if Apify is degraded.
/token-price · /crypto-ohlcv/gas-fees · /wallet-balance · /ens-resolve/defi-yields/currency-convert/web-search/email-validate · /dns-whois/geo-ip/pdf-text · /seo-check · /rss-feedLicensing & provenance. Provider terms are respected: outputs are derived, not raw redistributions; every response carries provider and fetched_at. Provider health is monitored 24/7 and exposed at /health.
No subscriptions, no tiers, no minimums. Try it for free, then pay exactly for what your agent consumes — in stablecoins.
Keine Abos, keine Mindestumsätze: erst kostenlos testen, dann pro Anfrage zahlen.
Send X-WALLET with any EVM address. No payment, no signature, full functionality.
Settled via x402 on Base. Flat price per endpoint: on-chain reads, e-mail & DNS checks, FX, geo-IP, RSS and ENS $0.01; web search, extraction, PDF text, DeFi yields and OHLCV $0.02; SEO audit $0.03; spread analysis $0.05. Only successful (2xx) responses are charged.
| Feature | Free Tier | Pay-per-use |
|---|---|---|
| Requests included | 3 per wallet | Unlimited |
| Price per request | $0.00 | $0.01 – $0.05 |
| Payment | X-WALLET header only | x402 · USDC or USDT on Base |
| /extract-clean | $0.02 | |
| /market-spread | $0.05 | |
| /gas-fees | $0.01 | |
| /token-price | $0.01 | |
| /wallet-balance | $0.01 | |
| /web-search | $0.02 | |
| /email-validate | $0.01 | |
| /dns-whois | $0.01 | |
| /pdf-text | $0.02 | |
| /seo-check | $0.03 | |
| /defi-yields | $0.02 | |
| /currency-convert | $0.01 | |
| /geo-ip | $0.01 | |
| /rss-feed | $0.01 | |
| /crypto-ohlcv | $0.02 | |
| /ens-resolve | $0.01 | |
| Multi-provider fallback | ||
| Provenance & billing metadata | ||
| Failed requests charged | ||
| Account / API key required | ||
| Settlement | — | On-chain, instant (~2 s) |
Wir glauben, dass Software-Agenten in den nächsten Jahren zu den größten API-Kunden werden — und dass sie dafür Bezahlwege brauchen, die so maschinennah sind wie HTTP selbst.
English summary: NovaNest builds pay-per-request data infrastructure for autonomous agents, settled natively via x402.
Der Agent Margin Router ist ein Daten-Broker für autonome KI-Agenten: Er bündelt mehrere Datenquellen, routet jede Anfrage an den gesündesten Provider und liefert striktes JSON — bezahlt pro Anfrage, ohne Vertrag.
Keine erfundenen Kennzahlen, keine verschleierten Lizenzen. Jede Antwort trägt Herkunft und Zeitstempel. Providerbedingungen werden maschinenlesbar eingehalten — abgeleitete Ergebnisse statt Rohdaten-Weiterverkauf.
NovaNest entwickelt Infrastruktur für die Agent Economy aus Deutschland heraus. Der Router ist unser erster Baustein: kleine, klar bepreiste Datenservices, die Agenten ohne menschliche Onboarding-Schleife nutzen können.