Agent Margin Router
by NovaNest
checking…
x402 · Base · USDC / USDT · from $0.005 / request

Agent Margin RouterData infrastructure for autonomous AI agents

Web search & extraction, PDF text, SEO, e-mail & DNS checks, market data, gas fees, DeFi yields, wallet balances and more — 38 endpoints routed across multiple providers and paid 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.

per request
$0.005+
requests / wallet
3 free
endpoints
38
terminal — first call, free tier
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": "ETH", "buy_venue": "binance", "sell_venue": "coinbase"}'
Beispielaufruf · keine Live-Ausführung3 Gratis-Calls / Wallet
How it works

Three HTTP round-trips. Zero onboarding.

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.

01

Request

Your agent calls an endpoint over plain HTTPS with a JSON body. No signup, no API key.

POST /extract-clean
02

x402 Payment

The API answers 402 with exact payment terms. The agent signs a $0.005–$0.05 USDC or USDT transfer on Base and retries with the X-PAYMENT header.

402 → X-PAYMENT: <payload>
03

Data Response

The facilitator verifies the payment, the router picks the healthiest provider and returns strict JSON — with provenance and billing metadata.

200 OK · application/json

Free tier: 3 requests per wallet — no payment required

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.005 per request. Perfect for integration tests and CI.

Free-Tier: 3 kostenlose Anfragen pro Wallet, danach ab $0.005 pro Request.

Read the auth flow
Endpoints

38 endpoints. From $0.005.

Per-endpoint pricing from $0.005 to $0.05. HTTP schemas and prices synchronized with router 0.6.0; examples are documentation samples, not live market readings.

38 Endpunkte mit geprüften Zahlungsanforderungen. Kein Abo, Abrechnung pro Call.

POST/extract-clean

Web Extraction

Clean page extraction from any public URL: title, meta description, main text, JSON-LD, language. Optional `schema` keeps only the listed top-level keys. Apify (JS-rendered) with direct-fetch fallback.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.02
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
extract_clean
Schema & Details →
/extract-clean · request
{  "url": "https://example.com"}
POST/market-spread

Cross-exchange Spread Analysis

Cross-exchange crypto spread from live tickers: gross spread, fees, modelled slippage, transfer cost and net edge in bps for a given trade size. Ticker/volume based (no full order book).

Analyse, keine Ausführung oder Renditegarantie.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.05
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
market_spread
Schema & Details →
/market-spread · request
{  "asset": "ETH",  "buy_venue": "binance",  "sell_venue": "coinbase",  "size_usd": 1000}
POST/gas-fees

Gas Fees (EIP-1559)

Live EIP-1559 gas fees (slow/standard/fast tiers) plus USD cost per transaction type (transfer, ERC-20 transfer, swap, NFT mint) for Base, Ethereum, Arbitrum, Optimism and Polygon. Aggregated from public RPC nodes – no API key.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
gas_fees
Schema & Details →
/gas-fees · request
{  "chain": "base"}
POST/token-price

Token Price (multi-venue median)

Multi-venue median spot price for any major crypto asset (Binance, Coinbase, Kraken, CoinGecko) with min/max, deviation and confidence score – one call instead of four. No API key.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
token_price
Schema & Details →
/token-price · request
{  "asset": "ETH",  "quote": "USD"}
POST/wallet-balance

Wallet Balance (native + stablecoins)

Native + stablecoin balances (ETH, USDC, USDT, DAI, WETH) of any EVM wallet with USD valuation, read directly from public RPC nodes on Base, Ethereum, Arbitrum, Optimism or Polygon. No API key.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
wallet_balance
Schema & Details →
/wallet-balance · request
{  "address": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2",  "chain": "base"}
POST/web-search

Web Search

Live web search results (title, URL, domain, snippet) for any query, key-less, region-aware.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.02
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
web_search
Schema & Details →
/web-search · request
{  "query": "x402 micropayments AI agents",  "max_results": 5}
POST/email-validate

Email Validation

Validate an email address: RFC syntax, MX/A records via DNS-over-HTTPS, disposable and free-provider detection, role-account flag, deliverability score and verdict.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
email_validate
Schema & Details →
/email-validate · request
{  "email": "[email protected]"}
POST/dns-whois

DNS + WHOIS (RDAP)

DNS records (A, AAAA, MX, NS, TXT, CNAME, SOA, CAA) via DNS-over-HTTPS plus RDAP/WHOIS registration data (registrar, created/expires, status, nameservers, DNSSEC).

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
dns_whois
Schema & Details →
/dns-whois · request
{  "domain": "example.com",  "record_types": [    "A",    "MX",    "NS"  ]}
POST/pdf-text

PDF Text Extraction

Extract clean text (per page + full) and metadata from any public PDF URL up to 25 MB / 200 pages.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.02
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
pdf_text
Schema & Details →
/pdf-text · request
{  "url": "https://bitcoin.org/bitcoin.pdf",  "max_pages": 3}
POST/seo-check

SEO Check

On-page SEO audit of any URL: title, meta description, canonical, headings, images without alt, links, Open Graph, structured data, robots.txt/sitemap, prioritized issues and a 0-100 score with grade.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
seo_check
Schema & Details →
/seo-check · request
{  "url": "https://example.com"}
POST/defi-yields

DeFi Yields

Live DeFi pool yields (APY, TVL, stablecoin flag) across 100+ chains and protocols from DefiLlama. Filter by chain, asset, project, minimum TVL; sorted by APY.

Analyse, keine Ausführung oder Renditegarantie.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.02
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
defi_yields
Schema & Details →
/defi-yields · request
{  "chain": "Base",  "asset": "USDC",  "limit": 3}
POST/currency-convert

Currency Conversion (ECB)

Fiat currency conversion with ECB reference rates (30+ currencies): amount, source currency, one or many targets. Returns rates, converted amounts and rate date.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
currency_convert
Schema & Details →
/currency-convert · request
{  "amount": 100,  "from": "EUR",  "to": [    "USD",    "GBP"  ]}
POST/geo-ip

Geo-IP Lookup

IP geolocation for IPv4/IPv6: country, region, city, coordinates, timezone, ASN, ISP/org, EU flag, private-range detection.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
geo_ip
Schema & Details →
/geo-ip · request
{  "ip": "8.8.8.8"}
POST/rss-feed

RSS / Atom Feed → JSON

Fetch and parse any RSS 2.0 or Atom feed into clean JSON: title, link, published date, author, summary, optional full text content and categories per item.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
rss_feed
Schema & Details →
/rss-feed · request
{  "url": "https://hnrss.org/frontpage",  "max_items": 5}
POST/crypto-ohlcv

Crypto OHLCV Candles

Historical OHLCV candles for any major crypto pair (Binance, Coinbase fallback): intervals 1m-1w, up to 500 candles, with period summary (high, low, volume, change %).

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
crypto_ohlcv
Schema & Details →
/crypto-ohlcv · request
{  "symbol": "BTC",  "interval": "1h",  "limit": 3}
POST/ens-resolve

ENS Resolve

Resolve an ENS name to its Ethereum address plus text records (url, com.twitter, avatar, ...) via on-chain calls.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
ens_resolve
Schema & Details →
/ens-resolve · request
{  "name": "vitalik.eth"}
POST/html-to-markdown

HTML → Markdown

Convert any public web page into clean, LLM-ready Markdown: main content only (boilerplate, nav and ads removed), headings, lists, tables and optional links/images preserved. Trafilatura extraction with markdownify fallback, SSRF-guarded fetch, up to 3 MB HTML.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
html_to_markdown
Schema & Details →
/html-to-markdown · request
{  "url": "https://en.wikipedia.org/wiki/Markdown",  "include_links": false}
POST/youtube-transcript

YouTube Transcript

Fetch the transcript of a YouTube video (manual or auto-generated captions) as timestamped segments plus full text, with language preference and English fallback. Accepts a video id or any YouTube URL. No API key, no download.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.02
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
youtube_transcript
Schema & Details →
/youtube-transcript · request
{  "video_id": "dQw4w9WgXcQ",  "language": "en"}
POST/github-repo-summary

GitHub Repository Summary

One-call overview of any public GitHub repository: description, stars, forks, open issues, primary language and language split (%), topics, license, default branch, README excerpt and the 5 most recent commits.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
github_repo_summary
Schema & Details →
/github-repo-summary · request
{  "repo": "langchain-ai/langchain"}
POST/dex-price

DEX Token Price

Live DEX price, 24h change, volume and liquidity for any on-chain token (long-tail tokens not listed on CEXs) by contract address or symbol on Base, Ethereum, Arbitrum, Optimism, Polygon, BSC, Avalanche or Solana, with the top liquidity pairs per DEX (DexScreener).

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
dex_price
Schema & Details →
/dex-price · request
{  "token_address": "0x940181a94A35A4569E4529A3CDfB74e38FD98631",  "chain": "base"}
POST/tx-status

Transaction Status

Status of any EVM transaction on Base, Ethereum, BSC, Polygon, Arbitrum or Optimism: success/failed/pending, block number, confirmations, gas used, effective gas price, fee, from/to/value and all ERC-20 Transfer events decoded from the receipt logs (contract, symbol, decimals, amount). Public JSON-RPC nodes with fallback.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
tx_status
Schema & Details →
/tx-status · request
{  "tx_hash": "0xabababababababababababababababababababababababababababababababab",  "chain": "base"}
POST/erc20-balance

ERC-20 Token Balances

Balances of up to 20 arbitrary ERC-20 tokens for one wallet in a single Multicall3 round-trip: raw and decimal-formatted balance, decimals and symbol per token, on Base, Ethereum, BSC, Polygon, Arbitrum or Optimism.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
erc20_balance
Schema & Details →
/erc20-balance · request
{  "wallet_address": "0x1111111111111111111111111111111111111111",  "contract_addresses": [    "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"  ],  "chain": "base"}
POST/news-search

News Search

Global news article search across 65+ languages via the GDELT DOC 2.0 API: title, URL, source domain, publication time, language and country per article, with look-back window (e.g. 24h, 7d) and language filter.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.02
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
news_search
Schema & Details →
/news-search · request
{  "query": "stablecoin regulation",  "max_results": 5,  "language": "en",  "timespan": "3d"}
POST/hn-search

Hacker News Search

Search Hacker News stories and comments via the Algolia HN API: title, URL, author, points, comment count, timestamp and HN discussion link; sort by relevance or date, optional tag filter (story, comment, ask_hn, show_hn).

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
hn_search
Schema & Details →
/hn-search · request
{  "query": "x402 payments",  "max_results": 5,  "sort_by": "date"}
POST/reddit-search

Reddit Search

Search Reddit posts site-wide or within one subreddit: title, URL, subreddit, author, score, upvote ratio, comment count, timestamp and the first 500 characters of the post text; sort by relevance, hot, new, top or comments with a time filter.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
reddit_search
Schema & Details →
/reddit-search · request
{  "query": "base chain gas fees",  "subreddit": "ethereum",  "max_results": 5,  "sort": "top",  "time_filter": "month"}
POST/defi-tvl

DeFi Total Value Locked

Total value locked of a DeFi protocol (by DefiLlama slug: TVL, 1d/7d change, market cap, mcap/TVL ratio, TVL per chain, category) or of a whole chain (TVL, native token, protocol count, top-10 protocols).

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
defi_tvl
Schema & Details →
/defi-tvl · request
{  "protocol": "aerodrome"}
POST/fear-greed

Crypto Fear & Greed

Crypto market sentiment: the daily Fear & Greed index (0-100) with classification, 1d/7d change and up to 90 days of history from alternative.me.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
fear_greed
Schema & Details →
/fear-greed · request
{  "limit": 7}
POST/agent-wallet-snapshot

Agent Wallet Snapshot

One-call wallet overview for autonomous agents: native balance, ERC-20 balances (default stablecoins + WETH, or any contracts you pass), current gas price, tx count, contract check and USD values incl. total – bundles what would otherwise be 5+ RPC calls. Base, Ethereum, BSC, Polygon, Arbitrum, Optimism.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.02
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
agent_wallet_snapshot
Schema & Details →
/agent-wallet-snapshot · request
{  "wallet_address": "0x1111111111111111111111111111111111111111",  "chain": "base"}
POST/url-status

URL Status

Health check for any public URL: HTTP status, full redirect chain, response time, content type, SSL certificate validity/expiry/issuer and a security-header audit (HSTS, CSP, X-Frame-Options, …) with score. SSRF-guarded (private/internal targets are rejected).

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
url_status
Schema & Details →
/url-status · request
{  "url": "https://example.com"}
POST/web-crawl

Web Crawl

Mini crawler: fetches a start page and follows same-domain links breadth-first (max 10 pages), returning clean LLM-ready Markdown, title, word count and discovered links per page; honours robots.txt by default. SSRF-guarded.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.05
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
web_crawl
Schema & Details →
/web-crawl · request
{  "start_url": "https://docs.example.com",  "max_pages": 3}
POST/wikipedia-summary

Wikipedia Summary

Clean article summary from Wikipedia in any language: title, short description, extract (capped), canonical URL, thumbnail and coordinates; falls back to search when the title is fuzzy. Content CC BY-SA 4.0.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
wikipedia_summary
Schema & Details →
/wikipedia-summary · request
{  "title": "x402",  "language": "en"}
POST/arxiv-search

arXiv Paper Search

Search arXiv preprints: returns id, title, authors, abstract, categories, published/updated dates and PDF links, sortable by relevance or date, optionally filtered by category (e.g. cs.AI).

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
arxiv_search
Schema & Details →
/arxiv-search · request
{  "query": "agent micropayments",  "max_results": 5,  "sort_by": "date"}
POST/npm-package

npm Package Info

npm package intelligence: latest version, license, repository, maintainers, dependency count, publish dates and weekly downloads – ideal for dependency vetting by coding agents.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
npm_package
Schema & Details →
/npm-package · request
{  "name": "express"}
POST/pypi-package

PyPI Package Info

PyPI project intelligence: latest version, summary, license, author, project URLs, Python requirement, declared dependencies, release count and last release date.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
pypi_package
Schema & Details →
/pypi-package · request
{  "name": "httpx"}
POST/geocode

Geocoding (OSM Nominatim)

Turn a place name or address into coordinates, bounding box, address parts and OSM type using OpenStreetMap Nominatim (ODbL); cached 24h.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
geocode
Schema & Details →
/geocode · request
{  "query": "Brandenburger Tor, Berlin",  "max_results": 1}
POST/domain-rdap

Domain RDAP / WHOIS

Domain registration data via RDAP (the WHOIS successor): registered flag, registrar, status, registration/expiry events, nameservers and DNSSEC – for availability checks and due diligence.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.01
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
domain_rdap
Schema & Details →
/domain-rdap · request
{  "domain": "agentmarginrouter.com"}
POST/dns-lookup

DNS Lookup (DoH)

Resolve any DNS record type (A, AAAA, CNAME, MX, NS, TXT, SOA, SRV, CAA, PTR) over DNS-over-HTTPS with TTLs and DNSSEC validation flag.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.005
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
dns_lookup
Schema & Details →
/dns-lookup · request
{  "name": "agentmarginrouter.com",  "record_type": "A"}
POST/contract-info

Smart-Contract Info

Smart-contract metadata from Blockscout for Base, Ethereum, Optimism or Arbitrum: verification status, name, compiler, proxy/implementation, creator, creation tx, token details and function/event names.

Beispiele zeigen das veröffentlichte Antwortformat, keine aktuellen Messwerte.

  • HTTP JSON
  • MCP-Tool
  • x402 auf Base
  • Preis vor der Zahlung prüfen
Price
$0.02
USDC / USDT
API version
0.6.0
Catalog snapshot
MCP tool
contract_info
Schema & Details →
/contract-info · request
{  "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",  "chain": "base"}
API Documentation

API Reference

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.

Code samples

Overview

Base URL
https://agent-margin-router-production.up.railway.app
Protocol
HTTPS · JSON request & response bodies
Payment
x402 · $0.005 – $0.05 per successful request (flat per endpoint)
Tokens
USDC or USDT on Base (chain id 8453)
Free tier
3 requests per wallet via X-WALLET header
Rate limit
Anonymous: 10 req/min per IP · with X-WALLET or payment: no per-minute cap · API key: 100 req/min

Check routing, fetched_at and freshness_seconds where provided. Cache age and defaults vary by endpoint; use the request schema below. A cached response is not a fresh measurement. Catalog checked: 2026-09-15 · router 0.6.0.

Authentication — x402 payment flow

API keys are optional, not required. 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.

  1. step 1
    Probe
    POST without payment → 402 + accepts[]
  2. step 2
    Pay
    Sign transfer for maxAmountRequired to payTo
  3. step 3
    Retry
    Same request + X-PAYMENT header → 200 + data
402 response — payment requirements
HTTP/1.1 402 Payment RequiredContent-Type: application/json {  "x402Version": 1,  "error": "payment_required",  "accepts": [    {      "scheme": "exact",      "network": "base",      "asset": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",      "assetSymbol": "USDC",      "maxAmountRequired": "20000",      "priceUsd": 0.02,      "payTo": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2",      "resource": "https://agent-margin-router-production.up.railway.app/extract-clean",      "description": "Agent Margin Router – Extract Clean: Clean page extraction from any public URL: title, meta description, main text, JSON-LD, language. Optional `schema` keeps only the listed top-level keys. Apify (JS-rendered) with direct-fetch fallback. Pay per call with USDC or USDT on Base via x402 – no API key, no signup. 3 free calls per wallet.",      "mimeType": "application/json",      "maxTimeoutSeconds": 300,      "extra": {        "name": "USD Coin",        "version": "2",        "chainId": 8453,        "decimals": 6      },      "outputSchema": {        "input": {          "type": "http",          "method": "POST",          "discoverable": true,          "bodyType": "json",          "bodyFields": {            "url": {              "type": "string",              "format": "uri",              "required": true,              "description": "Public URL to extract."            },            "schema": {              "type": "object",              "required": false,              "description": "Optional JSON schema for the output."            },            "instructions": {              "type": "string",              "required": false,              "description": "Optional natural-language hints."            }          },          "example": {            "url": "https://example.com",            "schema": {              "title": "string",              "price": "number"            }          }        },        "output": {          "type": "json",          "example": {            "data": {              "url": "https://example.com/",              "title": "Example Domain",              "description": null,              "text": "Example Domain. This domain is for use in illustrative examples in documents...",              "json_ld": [],              "language": "en"            },            "sources_checked": 1,            "freshness_seconds": 0,            "confidence": 0.9,            "cost_usdc": 0.02,            "token": "USDC",            "fetched_at": "2026-09-13T10:00:00Z",            "routing": {              "provider": "httpx_direct",              "fallback_used": false,              "providers_tried": [                "httpx_direct"              ],              "cache_hit": false,              "latency_ms": 380            }          }        }      }    },    {      "scheme": "exact",      "network": "base",      "asset": "0xfde4c96c8593536e31f229ea8f37b2ada2699bb2",      "assetSymbol": "USDT",      "maxAmountRequired": "20000",      "priceUsd": 0.02,      "payTo": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2",      "resource": "https://agent-margin-router-production.up.railway.app/extract-clean",      "description": "Agent Margin Router – Extract Clean: Clean page extraction from any public URL: title, meta description, main text, JSON-LD, language. Optional `schema` keeps only the listed top-level keys. Apify (JS-rendered) with direct-fetch fallback. Pay per call with USDC or USDT on Base via x402 – no API key, no signup. 3 free calls per wallet.",      "mimeType": "application/json",      "maxTimeoutSeconds": 300,      "extra": {        "name": "Tether USD",        "version": "1",        "chainId": 8453,        "decimals": 6      },      "outputSchema": {        "input": {          "type": "http",          "method": "POST",          "discoverable": true,          "bodyType": "json",          "bodyFields": {            "url": {              "type": "string",              "format": "uri",              "required": true,              "description": "Public URL to extract."            },            "schema": {              "type": "object",              "required": false,              "description": "Optional JSON schema for the output."            },            "instructions": {              "type": "string",              "required": false,              "description": "Optional natural-language hints."            }          },          "example": {            "url": "https://example.com",            "schema": {              "title": "string",              "price": "number"            }          }        },        "output": {          "type": "json",          "example": {            "data": {              "url": "https://example.com/",              "title": "Example Domain",              "description": null,              "text": "Example Domain. This domain is for use in illustrative examples in documents...",              "json_ld": [],              "language": "en"            },            "sources_checked": 1,            "freshness_seconds": 0,            "confidence": 0.9,            "cost_usdc": 0.02,            "token": "USDC",            "fetched_at": "2026-09-13T10:00:00Z",            "routing": {              "provider": "httpx_direct",              "fallback_used": false,              "providers_tried": [                "httpx_direct"              ],              "cache_hit": false,              "latency_ms": 380            }          }        }      }    }  ],  "facilitator": "https://facilitator.payai.network/verify",  "free_tier": {    "limit": 3,    "how_to": "Send header X-WALLET: 0x<your address> (or X-API-KEY) for free requests, then pay via x402."  }}
Headers
  • X-PAYMENT — request; base64 JSON of the signed x402 payload.
  • X-WALLET — request; EVM address to claim the free tier.
  • PAYMENT-RESPONSE — response; base64 settlement receipt incl. tx hash.
  • X-Free-Remaining — response; free requests left for the wallet.
Payment constants
  • network base (8453)
  • amount 5000 – 50000 (= $0.005 – $0.05, 6 decimals — see 402 body)
  • payTo 0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2
  • USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
  • USDT 0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2
  • facilitator https://facilitator.payai.network/verify
Free tier — Python
free_tier.py
import os, httpx r = httpx.post(    "https://agent-margin-router-production.up.railway.app/extract-clean",    headers={"X-WALLET": os.environ["AGENT_WALLET"]},    json={"url": "https://example.com"}, timeout=60,)print(r.status_code, r.json())# Nach dem Gratis-Kontingent: 402 prüfen und mit x402-Wallet/SDK bezahlen.
Python request — optional pre-signed x402 payload from your wallet/SDK
manual_x402.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"asset\":\"ETH\",\"buy_venue\":\"binance\",\"sell_venue\":\"coinbase\",\"size_usd\":1000}")r = httpx.post("https://agent-margin-router-production.up.railway.app/market-spread", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()

Payment clients · direct Railway calls

Connect your own payment client directly to Railway. This page prepares commands only: it never holds a wallet, signs a payment or charges you. A client button or a discovery result is not proof of paid compatibility.

AgentCash — acceptance status

One paid DNS call verified with the version-pinned test adapter. Other endpoints and the standard CLI payment flow are not payment-tested.

Use an existing, funded AgentCash wallet. Install locally with yarn add --dev --exact [email protected]. The standard CLI may initialize wallets; do not run onboarding without reviewing its setup.

Official client documentation ↗
1. Inspect requirements · no payment
yarn agentcash check 'https://agent-margin-router-production.up.railway.app/dns-lookup' -b '{"name":"agentmarginrouter.com","record_type":"A"}'

Catalog price: 0.005 USDC. Recheck the live quote, network, token and recipient before paying. The generated command uses the documented POST method even if a discovery probe reports another method. AgentCash --max-amount is a decimal USD amount, NOT atomic units.

After a timeout or unclear result, reconcile the settlement receipt and transaction before trying again. Do not issue a fresh authorization automatically. USDT is not covered by these client examples.

Other requested clients and discovery channels

Poncho: The direct AMR launch URL returned HTTP 404 during the 15 September 2026 check. No working AMR launch button or paid acceptance is claimed. Poncho catalog ↗

Coinbase Agentic Wallet MCP: Supports checking requirements and making x402 requests using a separately authorized wallet. Connecting AMR’s data MCP server does not connect a payment wallet. No paid MCP-wallet acceptance yet. Setup documentation ↗

pay.sh: Its documented payment rail is Solana. AMR currently quotes Base only; Solana recipient, verification and settlement support are not deployed. Provider documentation ↗

Coinbase Bazaar: A discovery catalog, not a payment wallet. The official DNS validation rejected AMR because its payment challenge lacks the required Bazaar extension. MCP output schemas alone do not establish Bazaar indexing. Indexing requirements ↗

GET

/health

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.

Try it live— calls the production API from your browser
request
curl -s https://agent-margin-router-production.up.railway.app/health | jq
Recorded health example · not live
{  "status": "ok",  "version": "0.6.0",  "environment": "production",  "timestamp": "2026-09-15T15:05:46.691850Z",  "uptime_seconds": 92.7,  "redis_connected": true,  "redis_backend": "redis",  "request_count": 22,  "error_count": 0,  "error_rate": 0,  "cache_hits": 0,  "cache_misses": 0,  "cache_hit_rate": 0,  "providers": [    {      "name": "apify_web_scraper",      "capability": "extract",      "healthy": true,      "circuit_open": false,      "consecutive_failures": 0,      "success_rate": 0.9,      "avg_latency_ms": 0,      "requests": 0    },    {      "name": "coingecko",      "capability": "market_data",      "healthy": true,      "circuit_open": false,      "consecutive_failures": 0,      "success_rate": 0.9,      "avg_latency_ms": 0,      "requests": 0    },    {      "name": "coinmarketcap",      "capability": "market_data",      "healthy": true,      "circuit_open": false,      "consecutive_failures": 0,      "success_rate": 0.9,      "avg_latency_ms": 0,      "requests": 0    },    {      "name": "binance_public",      "capability": "market_data",      "healthy": true,      "circuit_open": false,      "consecutive_failures": 0,      "success_rate": 0.9,      "avg_latency_ms": 0,      "requests": 0    },    {      "name": "coinbase_public",      "capability": "market_data",      "healthy": true,      "circuit_open": false,      "consecutive_failures": 0,      "success_rate": 0.9,      "avg_latency_ms": 0,      "requests": 0    },    {      "name": "defillama",      "capability": "market_data",      "healthy": true,      "circuit_open": false,      "consecutive_failures": 0,      "success_rate": 0.9,      "avg_latency_ms": 0,      "requests": 0    },    {      "name": "httpx_direct",      "capability": "extract",      "healthy": true,      "circuit_open": false,      "consecutive_failures": 0,      "success_rate": 0.9,      "avg_latency_ms": 0,      "requests": 0    }  ]}
POST

/extract-clean

Clean page extraction from any public URL: title, meta description, main text, JSON-LD, language. Optional `schema` keeps only the listed top-level keys. Apify (JS-rendered) with direct-fetch fallback. Price: $0.02 per paid call.

Schema selects top-level fields; do not rely on it for arbitrary structured generation. CSS selectors are not part of the current request model.

Request body · published HTTP schema
urlrequiredstring (uri)Public URL of the page/document to extract. minLength: 1 maxLength: 2083
schemaobject | nullOptional JSON schema describing the desired output structure.
instructionsstring | nullOptional natural-language hints for the extractor.
max_age_secondsintegerMaximum acceptable cache age. 0 forces a fresh fetch. Default: 60. minimum: 0 maximum: 86400
request body
{  "url": "https://example.com"}
Router documentation example · not a live result
{  "data": {    "url": "https://example.com/",    "title": "Example Domain",    "description": null,    "text": "Example Domain. This domain is for use in illustrative examples in documents...",    "json_ld": [],    "language": "en"  },  "sources_checked": 1,  "freshness_seconds": 0,  "confidence": 0.9,  "cost_usdc": 0.02,  "token": "USDC",  "fetched_at": "2026-09-13T10:00:00Z",  "routing": {    "provider": "httpx_direct",    "fallback_used": false,    "providers_tried": [      "httpx_direct"    ],    "cache_hit": false,    "latency_ms": 380  }}
Response fields · published HTTP schema
datarequiredobjectExtracted page data (title, description, text, json_ld, language, ...).
sources_checkedrequiredintegerNumber of providers consulted.
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
confidencerequirednumberConfidence score between 0 and 1. minimum: 0 maximum: 1
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1).
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "url": {      "type": "string",      "maxLength": 2083,      "minLength": 1,      "format": "uri",      "title": "Url",      "description": "Public URL of the page/document to extract."    },    "schema": {      "anyOf": [        {          "additionalProperties": true,          "type": "object"        },        {          "type": "null"        }      ],      "title": "Schema",      "description": "Optional JSON schema describing the desired output structure."    },    "instructions": {      "anyOf": [        {          "type": "string",          "maxLength": 2000        },        {          "type": "null"        }      ],      "title": "Instructions",      "description": "Optional natural-language hints for the extractor."    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "description": "Maximum acceptable cache age. 0 forces a fresh fetch.",      "default": 60    }  },  "type": "object",  "required": [    "url"  ],  "title": "ExtractCleanRequest",  "description": "Request body for ``POST /extract-clean``."}
extract_clean.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"url\":\"https://example.com\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/extract-clean", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/market-spread

Cross-exchange crypto spread from live tickers: gross spread, fees, modelled slippage, transfer cost and net edge in bps for a given trade size. Ticker/volume based (no full order book). Price: $0.05 per paid call.

Read-only analysis, not trading execution or a guaranteed return. Historical yields and modelled fees/slippage do not guarantee an executable opportunity.

Request body · published HTTP schema
assetrequiredstringAsset ticker, e.g. ETH. minLength: 1 maxLength: 20
buy_venuerequiredstringVenue to buy on. minLength: 1 maxLength: 40
sell_venuerequiredstringVenue to sell on. minLength: 1 maxLength: 40
size_usdnumberNotional trade size in USD for slippage estimate. Default: 1000. exclusiveMinimum: 0 maximum: 10000000
quotestringDefault: "USDT". minLength: 1 maxLength: 10
max_age_secondsintegerDefault: 30. minimum: 0 maximum: 3600
request body
{  "asset": "ETH",  "buy_venue": "binance",  "sell_venue": "coinbase",  "size_usd": 1000}
Router documentation example · not a live result
{  "asset": "ETH",  "quote": "USDT",  "buy_venue": "binance",  "sell_venue": "coinbase",  "buy_price": 3412.1,  "sell_price": 3415.85,  "gross_spread_bps": 10.99,  "fees_bps": 20,  "slippage_bps": 4,  "transfer_cost": 1.2,  "transfer_cost_bps": 12,  "net_spread_bps": -25.01,  "estimated_net_profit_usd": -2.5,  "confidence": 0.9,  "execution_risk": "medium",  "freshness_seconds": 3,  "cost_usdc": 0.05,  "token": "USDC",  "fetched_at": "2026-09-13T10:00:00Z",  "routing": {    "provider": "binance,coinbase",    "fallback_used": false,    "providers_tried": [      "binance",      "coinbase"    ],    "cache_hit": false,    "latency_ms": 620  }}
Response fields · published HTTP schema
assetrequiredstringSiehe veröffentlichtes Schema.
quoterequiredstringSiehe veröffentlichtes Schema.
buy_venuerequiredstringSiehe veröffentlichtes Schema.
sell_venuerequiredstringSiehe veröffentlichtes Schema.
buy_pricerequirednumberSiehe veröffentlichtes Schema.
sell_pricerequirednumberSiehe veröffentlichtes Schema.
gross_spread_bpsrequirednumberSiehe veröffentlichtes Schema.
fees_bpsrequirednumberSiehe veröffentlichtes Schema.
slippage_bpsrequirednumberSiehe veröffentlichtes Schema.
transfer_costrequirednumberAbsolute transfer/gas cost in quote units.
transfer_cost_bpsrequirednumberSiehe veröffentlichtes Schema.
net_spread_bpsrequirednumberSiehe veröffentlichtes Schema.
estimated_net_profit_usdrequirednumberSiehe veröffentlichtes Schema.
confidencerequirednumberminimum: 0 maximum: 1
execution_riskrequiredstringValues: ["low","medium","high"].
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "asset": {      "type": "string",      "maxLength": 20,      "minLength": 1,      "title": "Asset",      "description": "Asset ticker, e.g. ETH."    },    "buy_venue": {      "type": "string",      "maxLength": 40,      "minLength": 1,      "title": "Buy Venue",      "description": "Venue to buy on."    },    "sell_venue": {      "type": "string",      "maxLength": 40,      "minLength": 1,      "title": "Sell Venue",      "description": "Venue to sell on."    },    "size_usd": {      "type": "number",      "maximum": 10000000,      "exclusiveMinimum": 0,      "title": "Size Usd",      "description": "Notional trade size in USD for slippage estimate.",      "default": 1000    },    "quote": {      "type": "string",      "maxLength": 10,      "minLength": 1,      "title": "Quote",      "default": "USDT"    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 30    }  },  "type": "object",  "required": [    "asset",    "buy_venue",    "sell_venue"  ],  "title": "MarketSpreadRequest",  "description": "Request body for ``POST /market-spread``."}
market_spread.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"asset\":\"ETH\",\"buy_venue\":\"binance\",\"sell_venue\":\"coinbase\",\"size_usd\":1000}")r = httpx.post("https://agent-margin-router-production.up.railway.app/market-spread", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/gas-fees

Live EIP-1559 gas fees (slow/standard/fast tiers) plus USD cost per transaction type (transfer, ERC-20 transfer, swap, NFT mint) for Base, Ethereum, Arbitrum, Optimism and Polygon. Aggregated from public RPC nodes – no API key. Price: $0.005 per paid call.

Request body · published HTTP schema
chainstringbase | ethereum | arbitrum | optimism | polygon Default: "base". minLength: 1 maxLength: 20
max_age_secondsintegerDefault: 10. minimum: 0 maximum: 300
request body
{  "chain": "base"}
Router documentation example · not a live result
{  "chain": "base",  "chain_id": 8453,  "native_token": "ETH",  "native_price_usd": 3412.5,  "block_number": 21000000,  "base_fee_gwei": 0.0051,  "gas_price_gwei": 0.0062,  "trend": "stable",  "tiers": {    "standard": {      "max_fee_gwei": 0.0071,      "priority_fee_gwei": 0.001,      "cost_usd": {        "transfer": 0.0005,        "swap": 0.0036      }    }  },  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "onchain",    "cache_hit": false,    "latency_ms": 310  }}
Response fields · published HTTP schema
chainrequiredstringSiehe veröffentlichtes Schema.
chain_idrequiredintegerSiehe veröffentlichtes Schema.
native_tokenrequiredstringSiehe veröffentlichtes Schema.
native_price_usdnumber | nullSiehe veröffentlichtes Schema.
block_numberrequiredintegerSiehe veröffentlichtes Schema.
base_fee_gweirequirednumberSiehe veröffentlichtes Schema.
gas_price_gweirequirednumberSiehe veröffentlichtes Schema.
trendrequiredstringSiehe veröffentlichtes Schema.
tiersrequiredobjectSiehe veröffentlichtes Schema.
gas_units_assumedrequiredobjectSiehe veröffentlichtes Schema.
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "chain": {      "type": "string",      "maxLength": 20,      "minLength": 1,      "title": "Chain",      "description": "base | ethereum | arbitrum | optimism | polygon",      "default": "base"    },    "max_age_seconds": {      "type": "integer",      "maximum": 300,      "minimum": 0,      "title": "Max Age Seconds",      "default": 10    }  },  "type": "object",  "title": "GasFeesRequest",  "description": "Request body for ``POST /gas-fees``."}
gas_fees.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"chain\":\"base\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/gas-fees", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/token-price

Multi-venue median spot price for any major crypto asset (Binance, Coinbase, Kraken, CoinGecko) with min/max, deviation and confidence score – one call instead of four. No API key. Price: $0.01 per paid call.

Request body · published HTTP schema
assetrequiredstringAsset ticker, e.g. ETH. minLength: 1 maxLength: 20
quotestringQuote currency, e.g. USD or USDT. Default: "USD". minLength: 1 maxLength: 10
venuesarray | nullOptional subset of binance, coinbase, kraken, coingecko.
max_age_secondsintegerDefault: 5. minimum: 0 maximum: 300
request body
{  "asset": "ETH",  "quote": "USD"}
Router documentation example · not a live result
{  "asset": "ETH",  "quote": "USD",  "price": 3412.42,  "price_min": 3411.9,  "price_max": 3413.1,  "max_deviation_pct": 0.035,  "change_24h_pct": 1.8,  "sources_checked": 4,  "confidence": 0.98,  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "onchain",    "cache_hit": false,    "latency_ms": 420  }}
Response fields · published HTTP schema
assetrequiredstringSiehe veröffentlichtes Schema.
quoterequiredstringSiehe veröffentlichtes Schema.
pricerequirednumberSiehe veröffentlichtes Schema.
price_minrequirednumberSiehe veröffentlichtes Schema.
price_maxrequirednumberSiehe veröffentlichtes Schema.
max_deviation_pctrequirednumberSiehe veröffentlichtes Schema.
change_24h_pctnumber | nullSiehe veröffentlichtes Schema.
sourcesrequiredarraySiehe veröffentlichtes Schema.
sources_failedobjectSiehe veröffentlichtes Schema.
sources_checkedrequiredintegerSiehe veröffentlichtes Schema.
confidencerequirednumberminimum: 0 maximum: 1
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "asset": {      "type": "string",      "maxLength": 20,      "minLength": 1,      "title": "Asset",      "description": "Asset ticker, e.g. ETH."    },    "quote": {      "type": "string",      "maxLength": 10,      "minLength": 1,      "title": "Quote",      "description": "Quote currency, e.g. USD or USDT.",      "default": "USD"    },    "venues": {      "anyOf": [        {          "items": {            "type": "string"          },          "type": "array",          "maxItems": 6        },        {          "type": "null"        }      ],      "title": "Venues",      "description": "Optional subset of binance, coinbase, kraken, coingecko."    },    "max_age_seconds": {      "type": "integer",      "maximum": 300,      "minimum": 0,      "title": "Max Age Seconds",      "default": 5    }  },  "type": "object",  "required": [    "asset"  ],  "title": "TokenPriceRequest",  "description": "Request body for ``POST /token-price``."}
token_price.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"asset\":\"ETH\",\"quote\":\"USD\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/token-price", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/wallet-balance

Native + stablecoin balances (ETH, USDC, USDT, DAI, WETH) of any EVM wallet with USD valuation, read directly from public RPC nodes on Base, Ethereum, Arbitrum, Optimism or Polygon. No API key. Price: $0.01 per paid call.

Request body · published HTTP schema
addressrequiredstringEVM wallet address. pattern: ^0x[0-9a-fA-F]{40}$
chainstringDefault: "base". minLength: 1 maxLength: 20
tokensarray | nullToken symbols (USDC, USDT, DAI, WETH). Default: all known.
request body
{  "address": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2",  "chain": "base"}
Router documentation example · not a live result
{  "address": "0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2",  "chain": "base",  "chain_id": 8453,  "block_number": 21000000,  "balances": {    "ETH": {      "balance": 0.012,      "usd": 40.95    },    "USDC": {      "balance": 12.5,      "usd": 12.5    }  },  "total_usd": 53.45,  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "onchain",    "cache_hit": false,    "latency_ms": 280  }}
Response fields · published HTTP schema
addressrequiredstringSiehe veröffentlichtes Schema.
chainrequiredstringSiehe veröffentlichtes Schema.
chain_idrequiredintegerSiehe veröffentlichtes Schema.
block_numberrequiredintegerSiehe veröffentlichtes Schema.
balancesrequiredobjectSiehe veröffentlichtes Schema.
total_usdrequirednumberSiehe veröffentlichtes Schema.
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "address": {      "type": "string",      "pattern": "^0x[0-9a-fA-F]{40}$",      "title": "Address",      "description": "EVM wallet address."    },    "chain": {      "type": "string",      "maxLength": 20,      "minLength": 1,      "title": "Chain",      "default": "base"    },    "tokens": {      "anyOf": [        {          "items": {            "type": "string"          },          "type": "array",          "maxItems": 8        },        {          "type": "null"        }      ],      "title": "Tokens",      "description": "Token symbols (USDC, USDT, DAI, WETH). Default: all known."    }  },  "type": "object",  "required": [    "address"  ],  "title": "WalletBalanceRequest",  "description": "Request body for ``POST /wallet-balance``."}
wallet_balance.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"address\":\"0xf7a181bbe5d29924e800df4ba93418ef94f4e7c2\",\"chain\":\"base\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/wallet-balance", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/email-validate

Validate an email address: RFC syntax, MX/A records via DNS-over-HTTPS, disposable and free-provider detection, role-account flag, deliverability score and verdict. Price: $0.01 per paid call.

Request body · published HTTP schema
emailrequiredstringEmail address to validate. minLength: 3 maxLength: 320
check_mxbooleanResolve MX/A records via DNS-over-HTTPS. Default: true.
request body
{  "email": "[email protected]"}
Router documentation example · not a live result
{  "email": "[email protected]",  "domain": "example.com",  "valid_syntax": true,  "disposable": false,  "free_provider": false,  "role_account": false,  "has_mx": true,  "deliverability_score": 85,  "verdict": "deliverable",  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "webtools",    "cache_hit": false,    "latency_ms": 210  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
emailrequiredstringSiehe veröffentlichtes Schema.
local_partstring | nullSiehe veröffentlichtes Schema.
domainstring | nullSiehe veröffentlichtes Schema.
valid_syntaxrequiredbooleanSiehe veröffentlichtes Schema.
disposablerequiredbooleanSiehe veröffentlichtes Schema.
free_providerrequiredbooleanSiehe veröffentlichtes Schema.
role_accountrequiredbooleanSiehe veröffentlichtes Schema.
mx_checkedrequiredbooleanSiehe veröffentlichtes Schema.
has_mxboolean | nullSiehe veröffentlichtes Schema.
null_mxbooleanDefault: false.
mx_recordsarraySiehe veröffentlichtes Schema.
domain_resolvesboolean | nullSiehe veröffentlichtes Schema.
deliverability_scorerequiredintegerSiehe veröffentlichtes Schema.
verdictrequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "email": {      "type": "string",      "maxLength": 320,      "minLength": 3,      "title": "Email",      "description": "Email address to validate."    },    "check_mx": {      "type": "boolean",      "title": "Check Mx",      "description": "Resolve MX/A records via DNS-over-HTTPS.",      "default": true    }  },  "type": "object",  "required": [    "email"  ],  "title": "EmailValidateRequest",  "description": "Request body for ``POST /email-validate``."}
email_validate.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"email\":\"[email protected]\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/email-validate", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/dns-whois

DNS records (A, AAAA, MX, NS, TXT, CNAME, SOA, CAA) via DNS-over-HTTPS plus RDAP/WHOIS registration data (registrar, created/expires, status, nameservers, DNSSEC). Price: $0.005 per paid call.

Request body · published HTTP schema
domainrequiredstringDomain name, e.g. example.com. minLength: 3 maxLength: 253
record_typesarray | nullA, AAAA, MX, NS, TXT, CNAME, SOA, CAA. Default: A AAAA MX NS TXT CNAME.
include_whoisbooleanInclude RDAP/WHOIS registration data. Default: true.
max_age_secondsintegerDefault: 300. minimum: 0 maximum: 3600
request body
{  "domain": "example.com",  "record_types": [    "A",    "MX",    "NS"  ]}
Router documentation example · not a live result
{  "domain": "example.com",  "records": {    "A": [      {        "ttl": 300,        "data": "93.184.215.14"      }    ],    "MX": [],    "NS": [      {        "ttl": 3600,        "data": "a.iana-servers.net."      }    ]  },  "whois": {    "registered": true,    "registrar": "RESERVED-Internet Assigned Numbers Authority",    "created": "1995-08-14T04:00:00Z"  },  "errors": {},  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "webtools",    "cache_hit": false,    "latency_ms": 380  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
domainrequiredstringSiehe veröffentlichtes Schema.
recordsrequiredobjectSiehe veröffentlichtes Schema.
whoisobject | nullSiehe veröffentlichtes Schema.
errorsobjectSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "domain": {      "type": "string",      "maxLength": 253,      "minLength": 3,      "title": "Domain",      "description": "Domain name, e.g. example.com."    },    "record_types": {      "anyOf": [        {          "items": {            "type": "string"          },          "type": "array",          "maxItems": 8        },        {          "type": "null"        }      ],      "title": "Record Types",      "description": "A, AAAA, MX, NS, TXT, CNAME, SOA, CAA. Default: A AAAA MX NS TXT CNAME."    },    "include_whois": {      "type": "boolean",      "title": "Include Whois",      "description": "Include RDAP/WHOIS registration data.",      "default": true    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 300    }  },  "type": "object",  "required": [    "domain"  ],  "title": "DnsWhoisRequest",  "description": "Request body for ``POST /dns-whois``."}
dns_whois.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"domain\":\"example.com\",\"record_types\":[\"A\",\"MX\",\"NS\"]}")r = httpx.post("https://agent-margin-router-production.up.railway.app/dns-whois", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/pdf-text

Extract clean text (per page + full) and metadata from any public PDF URL up to 25 MB / 200 pages. Price: $0.02 per paid call.

Request body · published HTTP schema
urlrequiredstring (uri)Public URL of the PDF (max 25 MB). minLength: 1 maxLength: 2083
max_pagesintegerDefault: 50. minimum: 1 maximum: 200
pagesarray | null1-based page numbers to extract.
request body
{  "url": "https://bitcoin.org/bitcoin.pdf",  "max_pages": 3}
Router documentation example · not a live result
{  "url": "https://bitcoin.org/bitcoin.pdf",  "page_count": 9,  "pages_extracted": 3,  "truncated": true,  "char_count": 9800,  "word_count": 1500,  "metadata": {    "title": "Bitcoin: A Peer-to-Peer Electronic Cash System"  },  "pages": [    {      "page": 1,      "chars": 3200,      "text": "Bitcoin: A Peer-to-Peer Electronic Cash System ..."    }  ],  "text": "Bitcoin: A Peer-to-Peer Electronic Cash System ...",  "freshness_seconds": 0,  "cost_usdc": 0.02,  "routing": {    "provider": "webtools",    "cache_hit": false,    "latency_ms": 950  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
urlrequiredstringSiehe veröffentlichtes Schema.
final_urlrequiredstringSiehe veröffentlichtes Schema.
bytesrequiredintegerSiehe veröffentlichtes Schema.
fetch_msrequiredintegerSiehe veröffentlichtes Schema.
page_countrequiredintegerSiehe veröffentlichtes Schema.
pages_extractedrequiredintegerSiehe veröffentlichtes Schema.
truncatedrequiredbooleanSiehe veröffentlichtes Schema.
char_countrequiredintegerSiehe veröffentlichtes Schema.
word_countrequiredintegerSiehe veröffentlichtes Schema.
metadatarequiredobjectSiehe veröffentlichtes Schema.
pagesrequiredarraySiehe veröffentlichtes Schema.
textrequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "url": {      "type": "string",      "maxLength": 2083,      "minLength": 1,      "format": "uri",      "title": "Url",      "description": "Public URL of the PDF (max 25 MB)."    },    "max_pages": {      "type": "integer",      "maximum": 200,      "minimum": 1,      "title": "Max Pages",      "default": 50    },    "pages": {      "anyOf": [        {          "items": {            "type": "integer"          },          "type": "array",          "maxItems": 200        },        {          "type": "null"        }      ],      "title": "Pages",      "description": "1-based page numbers to extract."    }  },  "type": "object",  "required": [    "url"  ],  "title": "PdfTextRequest",  "description": "Request body for ``POST /pdf-text``."}
pdf_text.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"url\":\"https://bitcoin.org/bitcoin.pdf\",\"max_pages\":3}")r = httpx.post("https://agent-margin-router-production.up.railway.app/pdf-text", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/seo-check

On-page SEO audit of any URL: title, meta description, canonical, headings, images without alt, links, Open Graph, structured data, robots.txt/sitemap, prioritized issues and a 0-100 score with grade. Price: $0.01 per paid call.

Request body · published HTTP schema
urlrequiredstring (uri)Page URL to audit. minLength: 1 maxLength: 2083
check_robotsbooleanAlso probe robots.txt and sitemap.xml. Default: true.
request body
{  "url": "https://example.com"}
Router documentation example · not a live result
{  "url": "https://example.com",  "http_status": 200,  "https": true,  "title": "Example Domain",  "title_length": 14,  "meta_description": null,  "h1": [    "Example Domain"  ],  "word_count": 30,  "images": {    "total": 0,    "missing_alt": 0  },  "issues": [    {      "severity": "high",      "code": "missing_meta_description",      "message": "No meta description."    }  ],  "score": 62,  "grade": "C",  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "webtools",    "cache_hit": false,    "latency_ms": 720  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
urlrequiredstringSiehe veröffentlichtes Schema.
final_urlrequiredstringSiehe veröffentlichtes Schema.
http_statusrequiredintegerSiehe veröffentlichtes Schema.
redirectsrequiredintegerSiehe veröffentlichtes Schema.
httpsrequiredbooleanSiehe veröffentlichtes Schema.
load_msrequiredintegerSiehe veröffentlichtes Schema.
html_bytesrequiredintegerSiehe veröffentlichtes Schema.
titlestring | nullSiehe veröffentlichtes Schema.
title_lengthrequiredintegerSiehe veröffentlichtes Schema.
meta_descriptionstring | nullSiehe veröffentlichtes Schema.
meta_description_lengthrequiredintegerSiehe veröffentlichtes Schema.
meta_robotsstring | nullSiehe veröffentlichtes Schema.
canonicalstring | nullSiehe veröffentlichtes Schema.
langstring | nullSiehe veröffentlichtes Schema.
viewportstring | nullSiehe veröffentlichtes Schema.
h1requiredarraySiehe veröffentlichtes Schema.
h2_countrequiredintegerSiehe veröffentlichtes Schema.
word_countrequiredintegerSiehe veröffentlichtes Schema.
imagesrequiredobjectSiehe veröffentlichtes Schema.
linksrequiredobjectSiehe veröffentlichtes Schema.
open_graphrequiredobjectSiehe veröffentlichtes Schema.
twitter_cardstring | nullSiehe veröffentlichtes Schema.
structured_data_blocksrequiredintegerSiehe veröffentlichtes Schema.
hreflang_countrequiredintegerSiehe veröffentlichtes Schema.
robots_txtobject | nullSiehe veröffentlichtes Schema.
sitemapobject | nullSiehe veröffentlichtes Schema.
issuesrequiredarraySiehe veröffentlichtes Schema.
scorerequiredintegerSiehe veröffentlichtes Schema.
graderequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "url": {      "type": "string",      "maxLength": 2083,      "minLength": 1,      "format": "uri",      "title": "Url",      "description": "Page URL to audit."    },    "check_robots": {      "type": "boolean",      "title": "Check Robots",      "description": "Also probe robots.txt and sitemap.xml.",      "default": true    }  },  "type": "object",  "required": [    "url"  ],  "title": "SeoCheckRequest",  "description": "Request body for ``POST /seo-check``."}
seo_check.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"url\":\"https://example.com\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/seo-check", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/defi-yields

Live DeFi pool yields (APY, TVL, stablecoin flag) across 100+ chains and protocols from DefiLlama. Filter by chain, asset, project, minimum TVL; sorted by APY. Price: $0.02 per paid call.

Read-only analysis, not trading execution or a guaranteed return. Historical yields and modelled fees/slippage do not guarantee an executable opportunity.

Request body · published HTTP schema
chainstring | nullChain filter, e.g. Base, Ethereum, Arbitrum.
assetstring | nullAsset symbol contained in the pool, e.g. USDC.
projectstring | nullProtocol filter, e.g. aave-v3, morpho.
min_tvl_usdnumberMinimum pool TVL in USD. Default: 100000. minimum: 0
stablecoins_onlybooleanDefault: false.
limitintegerDefault: 10. minimum: 1 maximum: 50
max_age_secondsintegerDefault: 600. minimum: 0 maximum: 3600
request body
{  "chain": "Base",  "asset": "USDC",  "limit": 3}
Router documentation example · not a live result
{  "filters": {    "chain": "Base",    "asset": "USDC",    "project": null,    "min_tvl_usd": 100000,    "stablecoins_only": false  },  "pools": [    {      "project": "aave-v3",      "chain": "Base",      "symbol": "USDC",      "tvl_usd": 250000000,      "apy": 4.12,      "apy_base": 4.12,      "apy_reward": null,      "stablecoin": true,      "il_risk": "no",      "pool_id": "..."    }  ],  "pool_count": 1,  "total_matching": 27,  "source": "defillama",  "freshness_seconds": 0,  "cost_usdc": 0.02,  "routing": {    "provider": "datatools",    "cache_hit": false,    "latency_ms": 640  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
filtersrequiredobjectSiehe veröffentlichtes Schema.
poolsrequiredarraySiehe veröffentlichtes Schema.
pool_countrequiredintegerSiehe veröffentlichtes Schema.
total_matchingrequiredintegerSiehe veröffentlichtes Schema.
filtered_outliersintegerDefault: 0.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "chain": {      "anyOf": [        {          "type": "string",          "maxLength": 40        },        {          "type": "null"        }      ],      "title": "Chain",      "description": "Chain filter, e.g. Base, Ethereum, Arbitrum."    },    "asset": {      "anyOf": [        {          "type": "string",          "maxLength": 40        },        {          "type": "null"        }      ],      "title": "Asset",      "description": "Asset symbol contained in the pool, e.g. USDC."    },    "project": {      "anyOf": [        {          "type": "string",          "maxLength": 60        },        {          "type": "null"        }      ],      "title": "Project",      "description": "Protocol filter, e.g. aave-v3, morpho."    },    "min_tvl_usd": {      "type": "number",      "minimum": 0,      "title": "Min Tvl Usd",      "description": "Minimum pool TVL in USD.",      "default": 100000    },    "stablecoins_only": {      "type": "boolean",      "title": "Stablecoins Only",      "default": false    },    "limit": {      "type": "integer",      "maximum": 50,      "minimum": 1,      "title": "Limit",      "default": 10    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 600    }  },  "type": "object",  "title": "DefiYieldsRequest",  "description": "Request body for ``POST /defi-yields``."}
defi_yields.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"chain\":\"Base\",\"asset\":\"USDC\",\"limit\":3}")r = httpx.post("https://agent-margin-router-production.up.railway.app/defi-yields", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/currency-convert

Fiat currency conversion with ECB reference rates (30+ currencies): amount, source currency, one or many targets. Returns rates, converted amounts and rate date. Price: $0.005 per paid call.

Request body · published HTTP schema
amountnumberAmount in the source currency. Default: 1. exclusiveMinimum: 0
fromrequiredstringISO-4217 source currency, e.g. EUR. minLength: 3 maxLength: 3
torequiredarrayTarget currencies, e.g. ["USD", "GBP"]. minItems: 1 maxItems: 10
request body
{  "amount": 100,  "from": "EUR",  "to": [    "USD",    "GBP"  ]}
Router documentation example · not a live result
{  "amount": 100,  "from_currency": "EUR",  "rates": {    "USD": 1.0842,    "GBP": 0.8391  },  "converted": {    "USD": 108.42,    "GBP": 83.91  },  "rate_date": "2026-09-11",  "source": "frankfurter_ecb",  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "datatools",    "cache_hit": false,    "latency_ms": 210  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
amountrequirednumberSiehe veröffentlichtes Schema.
from_currencyrequiredstringSiehe veröffentlichtes Schema.
ratesrequiredobjectSiehe veröffentlichtes Schema.
convertedrequiredobjectSiehe veröffentlichtes Schema.
rate_datestring | nullSiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "amount": {      "type": "number",      "exclusiveMinimum": 0,      "title": "Amount",      "description": "Amount in the source currency.",      "default": 1    },    "from": {      "type": "string",      "maxLength": 3,      "minLength": 3,      "title": "From",      "description": "ISO-4217 source currency, e.g. EUR."    },    "to": {      "items": {        "type": "string"      },      "type": "array",      "maxItems": 10,      "minItems": 1,      "title": "To",      "description": "Target currencies, e.g. [\"USD\", \"GBP\"]."    }  },  "type": "object",  "required": [    "from",    "to"  ],  "title": "CurrencyConvertRequest",  "description": "Request body for ``POST /currency-convert``."}
currency_convert.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"amount\":100,\"from\":\"EUR\",\"to\":[\"USD\",\"GBP\"]}")r = httpx.post("https://agent-margin-router-production.up.railway.app/currency-convert", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/geo-ip

IP geolocation for IPv4/IPv6: country, region, city, coordinates, timezone, ASN, ISP/org, EU flag, private-range detection. Price: $0.005 per paid call.

Request body · published HTTP schema
iprequiredstringIPv4 or IPv6 address. minLength: 3 maxLength: 45
max_age_secondsintegerDefault: 86400. minimum: 0 maximum: 604800
request body
{  "ip": "8.8.8.8"}
Router documentation example · not a live result
{  "ip": "8.8.8.8",  "version": 4,  "is_private": false,  "country": "United States",  "country_code": "US",  "region": "California",  "city": "Mountain View",  "latitude": 37.386,  "longitude": -122.0838,  "timezone": "America/Los_Angeles",  "asn": 15169,  "org": "Google LLC",  "source": "ipwho.is",  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "datatools",    "cache_hit": false,    "latency_ms": 180  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
iprequiredstringSiehe veröffentlichtes Schema.
versionrequiredintegerSiehe veröffentlichtes Schema.
is_privaterequiredbooleanSiehe veröffentlichtes Schema.
countrystring | nullSiehe veröffentlichtes Schema.
country_codestring | nullSiehe veröffentlichtes Schema.
regionstring | nullSiehe veröffentlichtes Schema.
citystring | nullSiehe veröffentlichtes Schema.
postalstring | nullSiehe veröffentlichtes Schema.
latitudenumber | nullSiehe veröffentlichtes Schema.
longitudenumber | nullSiehe veröffentlichtes Schema.
timezonestring | nullSiehe veröffentlichtes Schema.
utc_offsetstring | nullSiehe veröffentlichtes Schema.
asnstring | integer | nullSiehe veröffentlichtes Schema.
orgstring | nullSiehe veröffentlichtes Schema.
ispstring | nullSiehe veröffentlichtes Schema.
is_euboolean | nullSiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "ip": {      "type": "string",      "maxLength": 45,      "minLength": 3,      "title": "Ip",      "description": "IPv4 or IPv6 address."    },    "max_age_seconds": {      "type": "integer",      "maximum": 604800,      "minimum": 0,      "title": "Max Age Seconds",      "default": 86400    }  },  "type": "object",  "required": [    "ip"  ],  "title": "GeoIpRequest",  "description": "Request body for ``POST /geo-ip``."}
geo_ip.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"ip\":\"8.8.8.8\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/geo-ip", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/rss-feed

Fetch and parse any RSS 2.0 or Atom feed into clean JSON: title, link, published date, author, summary, optional full text content and categories per item. Price: $0.01 per paid call.

Request body · published HTTP schema
urlrequiredstring (uri)RSS 2.0 or Atom feed URL. minLength: 1 maxLength: 2083
max_itemsintegerDefault: 20. minimum: 1 maximum: 100
include_contentbooleanInclude full item content (text-only, truncated). Default: false.
max_age_secondsintegerDefault: 300. minimum: 0 maximum: 3600
request body
{  "url": "https://hnrss.org/frontpage",  "max_items": 5}
Router documentation example · not a live result
{  "url": "https://hnrss.org/frontpage",  "format": "rss",  "feed_title": "Hacker News: Front Page",  "feed_link": "https://news.ycombinator.com/",  "items": [    {      "title": "Example story",      "link": "https://example.com",      "published": "2026-09-11T08:00:00Z",      "author": "user",      "summary": "...",      "categories": []    }  ],  "item_count": 5,  "total_items": 30,  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "datatools",    "cache_hit": false,    "latency_ms": 400  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
urlrequiredstringSiehe veröffentlichtes Schema.
formatrequiredstringSiehe veröffentlichtes Schema.
feed_titlestring | nullSiehe veröffentlichtes Schema.
feed_linkstring | nullSiehe veröffentlichtes Schema.
itemsrequiredarraySiehe veröffentlichtes Schema.
item_countrequiredintegerSiehe veröffentlichtes Schema.
total_itemsrequiredintegerSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "url": {      "type": "string",      "maxLength": 2083,      "minLength": 1,      "format": "uri",      "title": "Url",      "description": "RSS 2.0 or Atom feed URL."    },    "max_items": {      "type": "integer",      "maximum": 100,      "minimum": 1,      "title": "Max Items",      "default": 20    },    "include_content": {      "type": "boolean",      "title": "Include Content",      "description": "Include full item content (text-only, truncated).",      "default": false    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 300    }  },  "type": "object",  "required": [    "url"  ],  "title": "RssFeedRequest",  "description": "Request body for ``POST /rss-feed``."}
rss_feed.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"url\":\"https://hnrss.org/frontpage\",\"max_items\":5}")r = httpx.post("https://agent-margin-router-production.up.railway.app/rss-feed", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/crypto-ohlcv

Historical OHLCV candles for any major crypto pair (Binance, Coinbase fallback): intervals 1m-1w, up to 500 candles, with period summary (high, low, volume, change %). Price: $0.005 per paid call.

Request body · published HTTP schema
symbolrequiredstringBase asset, e.g. BTC, ETH, SOL. minLength: 2 maxLength: 12
quotestringQuote asset (USD is mapped to USDT on Binance). Default: "USDT". minLength: 3 maxLength: 6
intervalstring1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w. Default: "1h".
limitintegerDefault: 100. minimum: 1 maximum: 500
request body
{  "symbol": "BTC",  "interval": "1h",  "limit": 3}
Router documentation example · not a live result
{  "symbol": "BTC",  "quote": "USDT",  "interval": "1h",  "candles": [    {      "time": "2026-09-11T06:00:00Z",      "open": 64000.1,      "high": 64210,      "low": 63950.5,      "close": 64100.2,      "volume": 812.4    }  ],  "candle_count": 3,  "summary": {    "first_open": 64000.1,    "last_close": 64100.2,    "period_high": 64210,    "period_low": 63950.5,    "period_volume": 2400.1,    "change_pct": 0.1564  },  "source": "binance",  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "datatools",    "cache_hit": false,    "latency_ms": 260  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
symbolrequiredstringSiehe veröffentlichtes Schema.
quoterequiredstringSiehe veröffentlichtes Schema.
intervalrequiredstringSiehe veröffentlichtes Schema.
candlesrequiredarraySiehe veröffentlichtes Schema.
candle_countrequiredintegerSiehe veröffentlichtes Schema.
summaryrequiredobjectSiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "symbol": {      "type": "string",      "maxLength": 12,      "minLength": 2,      "title": "Symbol",      "description": "Base asset, e.g. BTC, ETH, SOL."    },    "quote": {      "type": "string",      "maxLength": 6,      "minLength": 3,      "title": "Quote",      "description": "Quote asset (USD is mapped to USDT on Binance).",      "default": "USDT"    },    "interval": {      "type": "string",      "title": "Interval",      "description": "1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w.",      "default": "1h"    },    "limit": {      "type": "integer",      "maximum": 500,      "minimum": 1,      "title": "Limit",      "default": 100    }  },  "type": "object",  "required": [    "symbol"  ],  "title": "CryptoOhlcvRequest",  "description": "Request body for ``POST /crypto-ohlcv``."}
crypto_ohlcv.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"symbol\":\"BTC\",\"interval\":\"1h\",\"limit\":3}")r = httpx.post("https://agent-margin-router-production.up.railway.app/crypto-ohlcv", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/ens-resolve

Resolve an ENS name to its Ethereum address plus text records (url, com.twitter, avatar, ...) via on-chain calls. Price: $0.01 per paid call.

Request body · published HTTP schema
namerequiredstringENS name, e.g. vitalik.eth. minLength: 3 maxLength: 255
text_keysarrayENS text records to read. maxItems: 8
max_age_secondsintegerDefault: 3600. minimum: 0 maximum: 86400
request body
{  "name": "vitalik.eth"}
Router documentation example · not a live result
{  "name": "vitalik.eth",  "namehash": "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835",  "resolver": "0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41",  "address": "0xd8dA6BF26964aF9D7eEd9e03E46415D37aA96045",  "texts": {    "url": "https://vitalik.ca",    "com.twitter": "VitalikButerin",    "avatar": null  },  "chain": "ethereum",  "resolved": true,  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "datatools",    "cache_hit": false,    "latency_ms": 900  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
namerequiredstringSiehe veröffentlichtes Schema.
namehashrequiredstringSiehe veröffentlichtes Schema.
resolverstring | nullSiehe veröffentlichtes Schema.
addressstring | nullSiehe veröffentlichtes Schema.
textsobjectSiehe veröffentlichtes Schema.
chainrequiredstringSiehe veröffentlichtes Schema.
resolvedrequiredbooleanSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "name": {      "type": "string",      "maxLength": 255,      "minLength": 3,      "title": "Name",      "description": "ENS name, e.g. vitalik.eth."    },    "text_keys": {      "items": {        "type": "string"      },      "type": "array",      "maxItems": 8,      "title": "Text Keys",      "description": "ENS text records to read."    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 3600    }  },  "type": "object",  "required": [    "name"  ],  "title": "EnsResolveRequest",  "description": "Request body for ``POST /ens-resolve``."}
ens_resolve.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"name\":\"vitalik.eth\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/ens-resolve", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/html-to-markdown

Convert any public web page into clean, LLM-ready Markdown: main content only (boilerplate, nav and ads removed), headings, lists, tables and optional links/images preserved. Trafilatura extraction with markdownify fallback, SSRF-guarded fetch, up to 3 MB HTML. Price: $0.01 per paid call.

Request body · published HTTP schema
urlrequiredstring (uri)Public page URL to convert into LLM-ready Markdown. minLength: 1 maxLength: 2083
include_linksbooleanKeep hyperlinks as [text](url). Default: true.
include_imagesbooleanKeep images as ![alt](src). Default: false.
max_age_secondsintegerDefault: 300. minimum: 0 maximum: 86400
request body
{  "url": "https://en.wikipedia.org/wiki/Markdown",  "include_links": false}
Router documentation example · not a live result
{  "url": "https://en.wikipedia.org/wiki/Markdown",  "final_url": "https://en.wikipedia.org/wiki/Markdown",  "title": "Markdown - Wikipedia",  "markdown": "# Markdown\n\nMarkdown is a lightweight markup language...",  "word_count": 2140,  "char_count": 14210,  "truncated": false,  "extraction_method": "trafilatura",  "include_links": false,  "include_images": false,  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "trafilatura",    "cache_hit": false,    "latency_ms": 650  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
urlrequiredstringSiehe veröffentlichtes Schema.
final_urlrequiredstringSiehe veröffentlichtes Schema.
titlestring | nullSiehe veröffentlichtes Schema.
markdownrequiredstringSiehe veröffentlichtes Schema.
word_countrequiredintegerSiehe veröffentlichtes Schema.
char_countrequiredintegerSiehe veröffentlichtes Schema.
truncatedbooleanDefault: false.
extraction_methodrequiredstringSiehe veröffentlichtes Schema.
include_linksrequiredbooleanSiehe veröffentlichtes Schema.
include_imagesrequiredbooleanSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "url": {      "type": "string",      "maxLength": 2083,      "minLength": 1,      "format": "uri",      "title": "Url",      "description": "Public page URL to convert into LLM-ready Markdown."    },    "include_links": {      "type": "boolean",      "title": "Include Links",      "description": "Keep hyperlinks as [text](url).",      "default": true    },    "include_images": {      "type": "boolean",      "title": "Include Images",      "description": "Keep images as ![alt](src).",      "default": false    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 300    }  },  "type": "object",  "required": [    "url"  ],  "title": "HtmlToMarkdownRequest",  "description": "Request body for ``POST /html-to-markdown``."}
html_to_markdown.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"url\":\"https://en.wikipedia.org/wiki/Markdown\",\"include_links\":false}")r = httpx.post("https://agent-margin-router-production.up.railway.app/html-to-markdown", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/youtube-transcript

Fetch the transcript of a YouTube video (manual or auto-generated captions) as timestamped segments plus full text, with language preference and English fallback. Accepts a video id or any YouTube URL. No API key, no download. Price: $0.02 per paid call.

Request body · published HTTP schema
video_idrequiredstring11-char YouTube video id or any YouTube URL. minLength: 11 maxLength: 300
languagestringPreferred caption language (BCP-47, e.g. en, de, pt-BR). Default: "en". minLength: 2 maxLength: 10
include_segmentsbooleanReturn timestamped segments in addition to full_text. Default: true.
max_age_secondsintegerDefault: 86400. minimum: 0 maximum: 604800
request body
{  "video_id": "dQw4w9WgXcQ",  "language": "en"}
Router documentation example · not a live result
{  "video_id": "dQw4w9WgXcQ",  "title": "Rick Astley - Never Gonna Give You Up",  "language": "en",  "is_generated": false,  "duration_seconds": 212,  "segment_count": 61,  "segments": [    {      "start": 18.6,      "end": 21.4,      "text": "We're no strangers to love"    }  ],  "full_text": "We're no strangers to love You know the rules and so do I ...",  "word_count": 380,  "freshness_seconds": 0,  "cost_usdc": 0.02,  "routing": {    "provider": "youtube_captions",    "cache_hit": false,    "latency_ms": 1200  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
video_idrequiredstringSiehe veröffentlichtes Schema.
titlestring | nullSiehe veröffentlichtes Schema.
languagerequiredstringSiehe veröffentlichtes Schema.
is_generatedbooleanDefault: false.
duration_secondsrequiredintegerSiehe veröffentlichtes Schema.
segment_countrequiredintegerSiehe veröffentlichtes Schema.
segmentsarraySiehe veröffentlichtes Schema.
full_textrequiredstringSiehe veröffentlichtes Schema.
word_countrequiredintegerSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "video_id": {      "type": "string",      "maxLength": 300,      "minLength": 11,      "title": "Video Id",      "description": "11-char YouTube video id or any YouTube URL."    },    "language": {      "type": "string",      "maxLength": 10,      "minLength": 2,      "title": "Language",      "description": "Preferred caption language (BCP-47, e.g. en, de, pt-BR).",      "default": "en"    },    "include_segments": {      "type": "boolean",      "title": "Include Segments",      "description": "Return timestamped segments in addition to full_text.",      "default": true    },    "max_age_seconds": {      "type": "integer",      "maximum": 604800,      "minimum": 0,      "title": "Max Age Seconds",      "default": 86400    }  },  "type": "object",  "required": [    "video_id"  ],  "title": "YoutubeTranscriptRequest",  "description": "Request body for ``POST /youtube-transcript``."}
youtube_transcript.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"video_id\":\"dQw4w9WgXcQ\",\"language\":\"en\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/youtube-transcript", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/github-repo-summary

One-call overview of any public GitHub repository: description, stars, forks, open issues, primary language and language split (%), topics, license, default branch, README excerpt and the 5 most recent commits. Price: $0.01 per paid call.

Request body · published HTTP schema
reporequiredstringowner/name or a github.com repository URL. minLength: 3 maxLength: 200
include_readmebooleanInclude the first 500 characters of the README. Default: true.
include_commitsbooleanInclude the 5 most recent commits. Default: true.
max_age_secondsintegerDefault: 600. minimum: 0 maximum: 86400
request body
{  "repo": "langchain-ai/langchain"}
Router documentation example · not a live result
{  "repo": "langchain-ai/langchain",  "url": "https://github.com/langchain-ai/langchain",  "description": "Build context-aware reasoning applications",  "homepage": "https://python.langchain.com",  "stars": 112000,  "forks": 18300,  "watchers": 800,  "open_issues": 420,  "language": "Python",  "languages": {    "Python": 97.4,    "Jupyter Notebook": 2.1,    "Shell": 0.5  },  "topics": [    "ai",    "llm",    "python"  ],  "license": "MIT",  "default_branch": "master",  "archived": false,  "fork": false,  "created_at": "2022-10-17T02:58:36Z",  "last_push": "2026-09-12T18:04:11Z",  "readme_excerpt": "LangChain is a framework for building LLM-powered applications...",  "recent_commits": [    {      "sha": "a1b2c3d4e5f6",      "message": "core: fix streaming",      "author": "dev",      "date": "2026-09-12T18:04:11Z"    }  ],  "source": "github",  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "github",    "cache_hit": false,    "latency_ms": 700  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
reporequiredstringSiehe veröffentlichtes Schema.
urlrequiredstringSiehe veröffentlichtes Schema.
descriptionstring | nullSiehe veröffentlichtes Schema.
homepagestring | nullSiehe veröffentlichtes Schema.
starsrequiredintegerSiehe veröffentlichtes Schema.
forksrequiredintegerSiehe veröffentlichtes Schema.
watchersintegerDefault: 0.
open_issuesrequiredintegerSiehe veröffentlichtes Schema.
languagestring | nullSiehe veröffentlichtes Schema.
languagesobjectSiehe veröffentlichtes Schema.
topicsarraySiehe veröffentlichtes Schema.
licensestring | nullSiehe veröffentlichtes Schema.
default_branchstring | nullSiehe veröffentlichtes Schema.
archivedbooleanDefault: false.
forkbooleanDefault: false.
created_atstring | nullSiehe veröffentlichtes Schema.
last_pushstring | nullSiehe veröffentlichtes Schema.
readme_excerptstring | nullSiehe veröffentlichtes Schema.
recent_commitsarraySiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "repo": {      "type": "string",      "maxLength": 200,      "minLength": 3,      "title": "Repo",      "description": "owner/name or a github.com repository URL."    },    "include_readme": {      "type": "boolean",      "title": "Include Readme",      "description": "Include the first 500 characters of the README.",      "default": true    },    "include_commits": {      "type": "boolean",      "title": "Include Commits",      "description": "Include the 5 most recent commits.",      "default": true    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 600    }  },  "type": "object",  "required": [    "repo"  ],  "title": "GithubRepoSummaryRequest",  "description": "Request body for ``POST /github-repo-summary``."}
github_repo_summary.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"repo\":\"langchain-ai/langchain\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/github-repo-summary", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/dex-price

Live DEX price, 24h change, volume and liquidity for any on-chain token (long-tail tokens not listed on CEXs) by contract address or symbol on Base, Ethereum, Arbitrum, Optimism, Polygon, BSC, Avalanche or Solana, with the top liquidity pairs per DEX (DexScreener). Price: $0.01 per paid call.

Request body · published HTTP schema
token_addressstring | nullToken contract address (0x…, 40 hex chars). Preferred over symbol.
symbolstring | nullToken symbol, e.g. AERO (ambiguous – prefer token_address).
chainstringbase, ethereum, arbitrum, optimism, polygon, bsc, avalanche, solana. Default: "base".
max_pairsintegerDefault: 5. minimum: 1 maximum: 20
max_age_secondsintegerDefault: 30. minimum: 0 maximum: 3600
request body
{  "token_address": "0x940181a94A35A4569E4529A3CDfB74e38FD98631",  "chain": "base"}
Router documentation example · not a live result
{  "asset": {    "address": "0x940181a94A35A4569E4529A3CDfB74e38FD98631",    "symbol": "AERO",    "name": "Aerodrome"  },  "chain": "base",  "price_usd": 1.23,  "price_change_24h": -2.5,  "volume_24h": 18234567,  "liquidity_usd": 56789000,  "market_cap": 980000000,  "fdv": 2100000000,  "pair_count": 12,  "pairs": [    {      "dex": "Aerodrome",      "pair": "AERO/USDC",      "pair_address": "0x...",      "price_usd": 1.23,      "price_native": 1.23,      "volume_24h": 5000000,      "liquidity_usd": 20000000,      "price_change_24h": -2.4,      "url": "https://dexscreener.com/base/0x..."    }  ],  "source": "dexscreener",  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "dexscreener",    "cache_hit": false,    "latency_ms": 350  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
assetrequiredDexTokenSiehe veröffentlichtes Schema.
chainrequiredstringSiehe veröffentlichtes Schema.
price_usdnumber | nullSiehe veröffentlichtes Schema.
price_change_24hnumber | nullSiehe veröffentlichtes Schema.
volume_24hrequirednumberSiehe veröffentlichtes Schema.
liquidity_usdrequirednumberSiehe veröffentlichtes Schema.
market_capnumber | nullSiehe veröffentlichtes Schema.
fdvnumber | nullSiehe veröffentlichtes Schema.
pair_countrequiredintegerSiehe veröffentlichtes Schema.
pairsrequiredarraySiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "token_address": {      "anyOf": [        {          "type": "string"        },        {          "type": "null"        }      ],      "title": "Token Address",      "description": "Token contract address (0x…, 40 hex chars). Preferred over symbol."    },    "symbol": {      "anyOf": [        {          "type": "string",          "maxLength": 20,          "minLength": 1        },        {          "type": "null"        }      ],      "title": "Symbol",      "description": "Token symbol, e.g. AERO (ambiguous – prefer token_address)."    },    "chain": {      "type": "string",      "title": "Chain",      "description": "base, ethereum, arbitrum, optimism, polygon, bsc, avalanche, solana.",      "default": "base"    },    "max_pairs": {      "type": "integer",      "maximum": 20,      "minimum": 1,      "title": "Max Pairs",      "default": 5    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 30    }  },  "type": "object",  "title": "DexPriceRequest",  "description": "Request body for ``POST /dex-price``."}
dex_price.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"token_address\":\"0x940181a94A35A4569E4529A3CDfB74e38FD98631\",\"chain\":\"base\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/dex-price", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/tx-status

Status of any EVM transaction on Base, Ethereum, BSC, Polygon, Arbitrum or Optimism: success/failed/pending, block number, confirmations, gas used, effective gas price, fee, from/to/value and all ERC-20 Transfer events decoded from the receipt logs (contract, symbol, decimals, amount). Public JSON-RPC nodes with fallback. Price: $0.01 per paid call.

Request body · published HTTP schema
tx_hashrequiredstringTransaction hash (0x + 64 hex). pattern: ^0x[0-9a-fA-F]{64}$
chainstringbase, ethereum, bsc, polygon, arbitrum, optimism. Default: "base". minLength: 1 maxLength: 20
max_age_secondsintegerDefault: 0. minimum: 0 maximum: 3600
request body
{  "tx_hash": "0xabababababababababababababababababababababababababababababababab",  "chain": "base"}
Router documentation example · not a live result
{  "tx_hash": "0xabab...",  "chain": "base",  "chain_id": 8453,  "status": "success",  "block_number": 21000000,  "confirmations": 42,  "from_address": "0x1111...",  "to_address": "0x8335...",  "value_wei": "0",  "value": 0,  "native_token": "ETH",  "gas_used": 52000,  "gas_price_gwei": 0.012,  "fee_native": 6.24e-7,  "nonce": 7,  "input_selector": "0xa9059cbb",  "transfers": [    {      "contract": "0x8335...",      "symbol": "USDC",      "decimals": 6,      "from_address": "0x1111...",      "to_address": "0x2222...",      "raw": "25000000",      "amount": 25,      "log_index": 0    }  ],  "log_count": 1,  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "onchain",    "cache_hit": false,    "latency_ms": 310  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
tx_hashrequiredstringSiehe veröffentlichtes Schema.
chainrequiredstringSiehe veröffentlichtes Schema.
chain_idrequiredintegerSiehe veröffentlichtes Schema.
statusrequiredstringValues: ["success","failed","pending"].
block_numberinteger | nullSiehe veröffentlichtes Schema.
confirmationsrequiredintegerSiehe veröffentlichtes Schema.
from_addressrequiredstringSiehe veröffentlichtes Schema.
to_addressstring | nullSiehe veröffentlichtes Schema.
value_weirequiredstringSiehe veröffentlichtes Schema.
valuerequirednumberSiehe veröffentlichtes Schema.
native_tokenrequiredstringSiehe veröffentlichtes Schema.
gas_usedinteger | nullSiehe veröffentlichtes Schema.
gas_price_weistring | nullSiehe veröffentlichtes Schema.
gas_price_gweinumber | nullSiehe veröffentlichtes Schema.
fee_nativenumber | nullSiehe veröffentlichtes Schema.
noncerequiredintegerSiehe veröffentlichtes Schema.
input_selectorstring | nullSiehe veröffentlichtes Schema.
contract_createdstring | nullSiehe veröffentlichtes Schema.
transfersrequiredarraySiehe veröffentlichtes Schema.
log_countrequiredintegerSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "tx_hash": {      "type": "string",      "pattern": "^0x[0-9a-fA-F]{64}$",      "title": "Tx Hash",      "description": "Transaction hash (0x + 64 hex)."    },    "chain": {      "type": "string",      "maxLength": 20,      "minLength": 1,      "title": "Chain",      "description": "base, ethereum, bsc, polygon, arbitrum, optimism.",      "default": "base"    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 0    }  },  "type": "object",  "required": [    "tx_hash"  ],  "title": "TxStatusRequest",  "description": "Request body for ``POST /tx-status``."}
tx_status.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"tx_hash\":\"0xabababababababababababababababababababababababababababababababab\",\"chain\":\"base\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/tx-status", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/erc20-balance

Balances of up to 20 arbitrary ERC-20 tokens for one wallet in a single Multicall3 round-trip: raw and decimal-formatted balance, decimals and symbol per token, on Base, Ethereum, BSC, Polygon, Arbitrum or Optimism. Price: $0.01 per paid call.

Request body · published HTTP schema
wallet_addressrequiredstringEVM wallet address. pattern: ^0x[0-9a-fA-F]{40}$
contract_addressesrequiredarrayUp to 20 ERC-20 contract addresses. minItems: 1 maxItems: 20
chainstringDefault: "base". minLength: 1 maxLength: 20
max_age_secondsintegerDefault: 0. minimum: 0 maximum: 3600
request body
{  "wallet_address": "0x1111111111111111111111111111111111111111",  "contract_addresses": [    "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"  ],  "chain": "base"}
Router documentation example · not a live result
{  "wallet_address": "0x1111...",  "chain": "base",  "chain_id": 8453,  "block_number": 21000000,  "tokens": [    {      "contract": "0x8335...",      "symbol": "USDC",      "decimals": 6,      "raw": "125000000",      "balance": 125,      "error": null    }  ],  "token_count": 1,  "source": "multicall3",  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "onchain",    "cache_hit": false,    "latency_ms": 280  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
wallet_addressrequiredstringSiehe veröffentlichtes Schema.
chainrequiredstringSiehe veröffentlichtes Schema.
chain_idrequiredintegerSiehe veröffentlichtes Schema.
block_numberrequiredintegerSiehe veröffentlichtes Schema.
tokensrequiredarraySiehe veröffentlichtes Schema.
token_countrequiredintegerSiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "wallet_address": {      "type": "string",      "pattern": "^0x[0-9a-fA-F]{40}$",      "title": "Wallet Address",      "description": "EVM wallet address."    },    "contract_addresses": {      "items": {        "type": "string"      },      "type": "array",      "maxItems": 20,      "minItems": 1,      "title": "Contract Addresses",      "description": "Up to 20 ERC-20 contract addresses."    },    "chain": {      "type": "string",      "maxLength": 20,      "minLength": 1,      "title": "Chain",      "default": "base"    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 0    }  },  "type": "object",  "required": [    "wallet_address",    "contract_addresses"  ],  "title": "Erc20BalanceRequest",  "description": "Request body for ``POST /erc20-balance``."}
erc20_balance.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"wallet_address\":\"0x1111111111111111111111111111111111111111\",\"contract_addresses\":[\"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\"],\"chain\":\"base\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/erc20-balance", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/defi-tvl

Total value locked of a DeFi protocol (by DefiLlama slug: TVL, 1d/7d change, market cap, mcap/TVL ratio, TVL per chain, category) or of a whole chain (TVL, native token, protocol count, top-10 protocols). Price: $0.005 per paid call.

Request body · published HTTP schema
protocolstring | nullDefiLlama protocol slug, e.g. aave, uniswap, aerodrome.
chainstring | nullChain name, e.g. base, ethereum, arbitrum.
max_age_secondsintegerDefault: 300. minimum: 0 maximum: 3600
request body
{  "protocol": "aerodrome"}
Router documentation example · not a live result
{  "kind": "protocol",  "slug": "aerodrome",  "name": "Aerodrome",  "symbol": "AERO",  "category": "Dexes",  "url": "https://aerodrome.finance",  "tvl_usd": 1234567890,  "change_1d_pct": 1.2,  "change_7d_pct": -3.4,  "mcap_usd": 980000000,  "mcap_tvl_ratio": 0.79,  "chains": [    "Base"  ],  "chain_tvls": {    "Base": 1234567890  },  "source": "defillama",  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "defillama",    "cache_hit": false,    "latency_ms": 700  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
kindrequiredstringValues: ["protocol","chain"].
slugrequiredstringSiehe veröffentlichtes Schema.
namerequiredstringSiehe veröffentlichtes Schema.
symbolstring | nullSiehe veröffentlichtes Schema.
categorystring | nullSiehe veröffentlichtes Schema.
urlstring | nullSiehe veröffentlichtes Schema.
tvl_usdrequirednumberSiehe veröffentlichtes Schema.
change_1d_pctnumber | nullSiehe veröffentlichtes Schema.
change_7d_pctnumber | nullSiehe veröffentlichtes Schema.
mcap_usdnumber | nullSiehe veröffentlichtes Schema.
mcap_tvl_rationumber | nullSiehe veröffentlichtes Schema.
chainsrequiredarraySiehe veröffentlichtes Schema.
chain_tvlsrequiredobjectSiehe veröffentlichtes Schema.
chain_idinteger | nullSiehe veröffentlichtes Schema.
native_tokenstring | nullSiehe veröffentlichtes Schema.
protocol_countinteger | nullSiehe veröffentlichtes Schema.
top_protocolsarraySiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "protocol": {      "anyOf": [        {          "type": "string",          "maxLength": 60        },        {          "type": "null"        }      ],      "title": "Protocol",      "description": "DefiLlama protocol slug, e.g. aave, uniswap, aerodrome."    },    "chain": {      "anyOf": [        {          "type": "string",          "maxLength": 40        },        {          "type": "null"        }      ],      "title": "Chain",      "description": "Chain name, e.g. base, ethereum, arbitrum."    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 300    }  },  "type": "object",  "title": "DefiTvlRequest",  "description": "Request body for ``POST /defi-tvl`` – either ``protocol`` or ``chain``."}
defi_tvl.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"protocol\":\"aerodrome\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/defi-tvl", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/fear-greed

Crypto market sentiment: the daily Fear & Greed index (0-100) with classification, 1d/7d change and up to 90 days of history from alternative.me. Price: $0.005 per paid call.

Request body · published HTTP schema
limitintegerNumber of daily data points (1 = latest only). Default: 1. minimum: 1 maximum: 90
max_age_secondsintegerDefault: 600. minimum: 0 maximum: 3600
request body
{  "limit": 7}
Router documentation example · not a live result
{  "value": 62,  "value_classification": "Greed",  "timestamp": 1757721600,  "date": "2026-09-13",  "time_until_update_seconds": 43000,  "change_1d": 3,  "change_7d": -5,  "history": [    {      "value": 62,      "classification": "Greed",      "timestamp": 1757721600,      "date": "2026-09-13"    }  ],  "source": "alternative.me",  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "alternative.me",    "cache_hit": false,    "latency_ms": 180  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
valuerequiredintegerSiehe veröffentlichtes Schema.
value_classificationrequiredstringSiehe veröffentlichtes Schema.
timestamprequiredintegerSiehe veröffentlichtes Schema.
daterequiredstringSiehe veröffentlichtes Schema.
time_until_update_secondsinteger | nullSiehe veröffentlichtes Schema.
change_1dinteger | nullSiehe veröffentlichtes Schema.
change_7dinteger | nullSiehe veröffentlichtes Schema.
historyrequiredarraySiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "limit": {      "type": "integer",      "maximum": 90,      "minimum": 1,      "title": "Limit",      "description": "Number of daily data points (1 = latest only).",      "default": 1    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 600    }  },  "type": "object",  "title": "FearGreedRequest",  "description": "Request body for ``POST /fear-greed``."}
fear_greed.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"limit\":7}")r = httpx.post("https://agent-margin-router-production.up.railway.app/fear-greed", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/agent-wallet-snapshot

One-call wallet overview for autonomous agents: native balance, ERC-20 balances (default stablecoins + WETH, or any contracts you pass), current gas price, tx count, contract check and USD values incl. total – bundles what would otherwise be 5+ RPC calls. Base, Ethereum, BSC, Polygon, Arbitrum, Optimism. Price: $0.02 per paid call.

Request body · published HTTP schema
wallet_addressrequiredstringEVM wallet address. pattern: ^0x[0-9a-fA-F]{40}$
chainstringDefault: "base". minLength: 1 maxLength: 20
token_contractsarray | nullERC-20 contracts to include. Default: well-known stablecoins + WETH on the chain.
max_age_secondsintegerDefault: 0. minimum: 0 maximum: 600
request body
{  "wallet_address": "0x1111111111111111111111111111111111111111",  "chain": "base"}
Router documentation example · not a live result
{  "wallet_address": "0x1111...",  "chain": "base",  "chain_id": 8453,  "block_number": 21000000,  "native_token": "ETH",  "native_balance": {    "raw": "50000000000000000",    "balance": 0.05,    "usd": 125,    "decimals": 18  },  "token_balances": [    {      "contract": "0x8335...",      "symbol": "USDC",      "decimals": 6,      "raw": "125000000",      "balance": 125,      "error": null,      "usd": 125,      "price_usd": 1    }  ],  "gas_price_gwei": 0.012,  "gas_price_wei": "12000000",  "native_price_usd": 2500,  "total_usd_value": 250,  "tx_count": 42,  "is_contract": false,  "freshness_seconds": 0,  "cost_usdc": 0.02,  "routing": {    "provider": "onchain",    "cache_hit": false,    "latency_ms": 420  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
wallet_addressrequiredstringSiehe veröffentlichtes Schema.
chainrequiredstringSiehe veröffentlichtes Schema.
chain_idrequiredintegerSiehe veröffentlichtes Schema.
block_numberrequiredintegerSiehe veröffentlichtes Schema.
native_tokenrequiredstringSiehe veröffentlichtes Schema.
native_balancerequiredobjectSiehe veröffentlichtes Schema.
token_balancesrequiredarraySiehe veröffentlichtes Schema.
gas_price_gweirequirednumberSiehe veröffentlichtes Schema.
gas_price_weirequiredstringSiehe veröffentlichtes Schema.
native_price_usdnumber | nullSiehe veröffentlichtes Schema.
total_usd_valuerequirednumberSiehe veröffentlichtes Schema.
tx_countrequiredintegerSiehe veröffentlichtes Schema.
is_contractrequiredbooleanSiehe veröffentlichtes Schema.
calls_bundledrequiredarraySiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "wallet_address": {      "type": "string",      "pattern": "^0x[0-9a-fA-F]{40}$",      "title": "Wallet Address",      "description": "EVM wallet address."    },    "chain": {      "type": "string",      "maxLength": 20,      "minLength": 1,      "title": "Chain",      "default": "base"    },    "token_contracts": {      "anyOf": [        {          "items": {            "type": "string"          },          "type": "array",          "maxItems": 20        },        {          "type": "null"        }      ],      "title": "Token Contracts",      "description": "ERC-20 contracts to include. Default: well-known stablecoins + WETH on the chain."    },    "max_age_seconds": {      "type": "integer",      "maximum": 600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 0    }  },  "type": "object",  "required": [    "wallet_address"  ],  "title": "AgentWalletSnapshotRequest",  "description": "Request body for ``POST /agent-wallet-snapshot``."}
agent_wallet_snapshot.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"wallet_address\":\"0x1111111111111111111111111111111111111111\",\"chain\":\"base\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/agent-wallet-snapshot", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/url-status

Health check for any public URL: HTTP status, full redirect chain, response time, content type, SSL certificate validity/expiry/issuer and a security-header audit (HSTS, CSP, X-Frame-Options, …) with score. SSRF-guarded (private/internal targets are rejected). Price: $0.005 per paid call.

Request body · published HTTP schema
urlrequiredstring (uri)Public URL to probe. minLength: 1 maxLength: 2083
max_age_secondsintegerDefault: 0. minimum: 0 maximum: 3600
request body
{  "url": "https://example.com"}
Router documentation example · not a live result
{  "url": "https://example.com",  "final_url": "https://example.com/",  "reachable": true,  "status_code": 200,  "ok": true,  "method_used": "HEAD",  "response_time_ms": 120,  "redirect_count": 0,  "redirect_chain": [],  "content_type": "text/html; charset=UTF-8",  "content_length": 1256,  "server": "ECS",  "ssl": {    "checked": true,    "valid": true,    "expires_at": "2027-01-15T23:59:59Z",    "days_until_expiry": 124,    "issuer": "DigiCert Inc",    "subject": "example.com",    "error": null  },  "security_headers": {    "strict-transport-security": null,    "content-security-policy": null,    "x-frame-options": null,    "x-content-type-options": null,    "referrer-policy": null,    "permissions-policy": null,    "x-xss-protection": null  },  "security_score": 0,  "missing_security_headers": [    "strict-transport-security",    "content-security-policy",    "x-frame-options",    "x-content-type-options",    "referrer-policy",    "permissions-policy"  ],  "error": null,  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "direct_fetch",    "cache_hit": false,    "latency_ms": 130  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
urlrequiredstringSiehe veröffentlichtes Schema.
final_urlrequiredstringSiehe veröffentlichtes Schema.
reachablerequiredbooleanSiehe veröffentlichtes Schema.
status_codeinteger | nullSiehe veröffentlichtes Schema.
okrequiredbooleanSiehe veröffentlichtes Schema.
method_usedrequiredstringSiehe veröffentlichtes Schema.
response_time_msrequiredintegerSiehe veröffentlichtes Schema.
redirect_countrequiredintegerSiehe veröffentlichtes Schema.
redirect_chainrequiredarraySiehe veröffentlichtes Schema.
content_typestring | nullSiehe veröffentlichtes Schema.
content_lengthinteger | nullSiehe veröffentlichtes Schema.
serverstring | nullSiehe veröffentlichtes Schema.
sslrequiredSslInfoSiehe veröffentlichtes Schema.
security_headersrequiredobjectSiehe veröffentlichtes Schema.
security_scorerequiredintegerSiehe veröffentlichtes Schema.
missing_security_headersrequiredarraySiehe veröffentlichtes Schema.
errorstring | nullSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "url": {      "type": "string",      "maxLength": 2083,      "minLength": 1,      "format": "uri",      "title": "Url",      "description": "Public URL to probe."    },    "max_age_seconds": {      "type": "integer",      "maximum": 3600,      "minimum": 0,      "title": "Max Age Seconds",      "default": 0    }  },  "type": "object",  "required": [    "url"  ],  "title": "UrlStatusRequest",  "description": "Request body for ``POST /url-status``."}
url_status.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"url\":\"https://example.com\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/url-status", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/web-crawl

Mini crawler: fetches a start page and follows same-domain links breadth-first (max 10 pages), returning clean LLM-ready Markdown, title, word count and discovered links per page; honours robots.txt by default. SSRF-guarded. Price: $0.05 per paid call.

Request body · published HTTP schema
start_urlrequiredstring (uri)Public page to start from. minLength: 1 maxLength: 2083
max_pagesintegerHard cap on fetched pages (max 10). Default: 5. minimum: 1 maximum: 10
follow_linksbooleanFollow same-domain links found on crawled pages. Default: true.
include_linksbooleanDefault: true.
respect_robotsbooleanHonour robots.txt Disallow rules for '*'. Default: true.
max_age_secondsintegerDefault: 600. minimum: 0 maximum: 86400
request body
{  "start_url": "https://docs.example.com",  "max_pages": 3}
Router documentation example · not a live result
{  "start_url": "https://docs.example.com",  "domain": "docs.example.com",  "pages": [    {      "url": "https://docs.example.com/",      "final_url": "https://docs.example.com/",      "title": "Docs",      "status_code": 200,      "markdown": "# Docs\n…",      "word_count": 850,      "links_found": 24,      "internal_links": [        "https://docs.example.com/getting-started"      ],      "depth": 0,      "error": null    }  ],  "page_count": 3,  "pages_failed": 0,  "max_pages": 3,  "follow_links": true,  "robots_blocked": 0,  "queued_not_fetched": 12,  "total_words": 2400,  "freshness_seconds": 0,  "cost_usdc": 0.05,  "routing": {    "provider": "direct_fetch",    "cache_hit": false,    "latency_ms": 2400  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
start_urlrequiredstringSiehe veröffentlichtes Schema.
domainrequiredstringSiehe veröffentlichtes Schema.
pagesrequiredarraySiehe veröffentlichtes Schema.
page_countrequiredintegerSiehe veröffentlichtes Schema.
pages_failedrequiredintegerSiehe veröffentlichtes Schema.
max_pagesrequiredintegerSiehe veröffentlichtes Schema.
follow_linksrequiredbooleanSiehe veröffentlichtes Schema.
robots_blockedrequiredintegerSiehe veröffentlichtes Schema.
queued_not_fetchedrequiredintegerSiehe veröffentlichtes Schema.
total_wordsrequiredintegerSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "start_url": {      "type": "string",      "maxLength": 2083,      "minLength": 1,      "format": "uri",      "title": "Start Url",      "description": "Public page to start from."    },    "max_pages": {      "type": "integer",      "maximum": 10,      "minimum": 1,      "title": "Max Pages",      "description": "Hard cap on fetched pages (max 10).",      "default": 5    },    "follow_links": {      "type": "boolean",      "title": "Follow Links",      "description": "Follow same-domain links found on crawled pages.",      "default": true    },    "include_links": {      "type": "boolean",      "title": "Include Links",      "default": true    },    "respect_robots": {      "type": "boolean",      "title": "Respect Robots",      "description": "Honour robots.txt Disallow rules for '*'.",      "default": true    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 600    }  },  "type": "object",  "required": [    "start_url"  ],  "title": "WebCrawlRequest",  "description": "Request body for ``POST /web-crawl``."}
web_crawl.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"start_url\":\"https://docs.example.com\",\"max_pages\":3}")r = httpx.post("https://agent-margin-router-production.up.railway.app/web-crawl", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/wikipedia-summary

Clean article summary from Wikipedia in any language: title, short description, extract (capped), canonical URL, thumbnail and coordinates; falls back to search when the title is fuzzy. Content CC BY-SA 4.0. Price: $0.005 per paid call.

Request body · published HTTP schema
titlerequiredstringArticle title or search phrase. minLength: 1 maxLength: 300
languagestringWikipedia language code (default en). Default: "en". pattern: ^[a-z]{2,3}(-[a-z]{2,8})?$
max_charsintegerMax characters of the extract (default 1200). Default: 1200. minimum: 100 maximum: 5000
max_age_secondsintegerDefault: 3600. minimum: 0 maximum: 86400
request body
{  "title": "x402",  "language": "en"}
Router documentation example · not a live result
{  "query": "x402",  "language": "en",  "title": "HTTP 402",  "description": "HTTP status code",  "extract": "HTTP 402 Payment Required is ...",  "page_url": "https://en.wikipedia.org/wiki/HTTP_402",  "thumbnail_url": null,  "coordinates": null,  "page_type": "standard",  "last_modified": "2026-01-10T12:00:00Z",  "resolved_from_search": true,  "source": "wikipedia",  "license": "CC BY-SA 4.0",  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "wikipedia",    "cache_hit": false,    "latency_ms": 210  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
queryrequiredstringSiehe veröffentlichtes Schema.
languagerequiredstringSiehe veröffentlichtes Schema.
titlestring | nullSiehe veröffentlichtes Schema.
descriptionstring | nullSiehe veröffentlichtes Schema.
extractstring | nullSiehe veröffentlichtes Schema.
page_urlstring | nullSiehe veröffentlichtes Schema.
thumbnail_urlstring | nullSiehe veröffentlichtes Schema.
coordinatesobject | nullSiehe veröffentlichtes Schema.
page_typestring | nullSiehe veröffentlichtes Schema.
last_modifiedstring | nullSiehe veröffentlichtes Schema.
resolved_from_searchbooleanDefault: false.
sourcerequiredstringSiehe veröffentlichtes Schema.
licensestring | nullSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "title": {      "type": "string",      "maxLength": 300,      "minLength": 1,      "title": "Title",      "description": "Article title or search phrase."    },    "language": {      "type": "string",      "pattern": "^[a-z]{2,3}(-[a-z]{2,8})?$",      "title": "Language",      "description": "Wikipedia language code (default en).",      "default": "en"    },    "max_chars": {      "type": "integer",      "maximum": 5000,      "minimum": 100,      "title": "Max Chars",      "description": "Max characters of the extract (default 1200).",      "default": 1200    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 3600    }  },  "type": "object",  "required": [    "title"  ],  "title": "WikipediaSummaryRequest",  "description": "Request body for ``POST /wikipedia-summary``."}
wikipedia_summary.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"title\":\"x402\",\"language\":\"en\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/wikipedia-summary", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/npm-package

npm package intelligence: latest version, license, repository, maintainers, dependency count, publish dates and weekly downloads – ideal for dependency vetting by coding agents. Price: $0.005 per paid call.

Request body · published HTTP schema
namerequiredstringnpm package name, scoped allowed. minLength: 1 maxLength: 214 pattern: ^(@[a-z0-9\-_.]+/)?[a-z0-9\-_.]+$
max_age_secondsintegerDefault: 3600. minimum: 0 maximum: 86400
request body
{  "name": "express"}
Router documentation example · not a live result
{  "name": "express",  "latest_version": "5.1.0",  "description": "Fast, unopinionated, minimalist web framework",  "license": "MIT",  "homepage": "https://expressjs.com/",  "repository_url": "https://github.com/expressjs/express",  "npm_url": "https://www.npmjs.com/package/express",  "keywords": [    "express",    "framework",    "web"  ],  "maintainers": [    "wesleytodd"  ],  "created_at": "2010-12-29T19:38:25.450Z",  "latest_published_at": "2025-03-31T00:00:00Z",  "version_count": 280,  "dependency_count": 27,  "dependencies": {    "accepts": "^2.0.0"  },  "weekly_downloads": 40000000,  "deprecated": null,  "source": "npm_registry",  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "npm",    "cache_hit": false,    "latency_ms": 380  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
namerequiredstringSiehe veröffentlichtes Schema.
latest_versionstring | nullSiehe veröffentlichtes Schema.
descriptionstring | nullSiehe veröffentlichtes Schema.
licensestring | nullSiehe veröffentlichtes Schema.
homepagestring | nullSiehe veröffentlichtes Schema.
repository_urlstring | nullSiehe veröffentlichtes Schema.
npm_urlrequiredstringSiehe veröffentlichtes Schema.
keywordsarraySiehe veröffentlichtes Schema.
maintainersarraySiehe veröffentlichtes Schema.
created_atstring | nullSiehe veröffentlichtes Schema.
latest_published_atstring | nullSiehe veröffentlichtes Schema.
version_countintegerDefault: 0.
dependency_countintegerDefault: 0.
dependenciesobjectSiehe veröffentlichtes Schema.
weekly_downloadsinteger | nullSiehe veröffentlichtes Schema.
deprecatedstring | nullSiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "name": {      "type": "string",      "maxLength": 214,      "minLength": 1,      "pattern": "^(@[a-z0-9\\-_.]+/)?[a-z0-9\\-_.]+$",      "title": "Name",      "description": "npm package name, scoped allowed."    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 3600    }  },  "type": "object",  "required": [    "name"  ],  "title": "NpmPackageRequest",  "description": "Request body for ``POST /npm-package``."}
npm_package.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"name\":\"express\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/npm-package", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/pypi-package

PyPI project intelligence: latest version, summary, license, author, project URLs, Python requirement, declared dependencies, release count and last release date. Price: $0.005 per paid call.

Request body · published HTTP schema
namerequiredstringPyPI project name. minLength: 1 maxLength: 214 pattern: ^[A-Za-z0-9][A-Za-z0-9._\-]*$
max_age_secondsintegerDefault: 3600. minimum: 0 maximum: 86400
request body
{  "name": "httpx"}
Router documentation example · not a live result
{  "name": "httpx",  "latest_version": "0.28.1",  "summary": "The next generation HTTP client.",  "license": "BSD-3-Clause",  "author": "Tom Christie",  "homepage": "https://github.com/encode/httpx",  "project_urls": {    "Homepage": "https://github.com/encode/httpx"  },  "pypi_url": "https://pypi.org/project/httpx/",  "requires_python": ">=3.8",  "requires_dist": [    "anyio",    "certifi",    "httpcore==1.*",    "idna"  ],  "dependency_count": 4,  "keywords": null,  "classifiers": [    "Programming Language :: Python :: 3"  ],  "release_count": 70,  "latest_released_at": "2024-12-06T15:37:21Z",  "yanked": false,  "source": "pypi",  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "pypi",    "cache_hit": false,    "latency_ms": 260  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
namerequiredstringSiehe veröffentlichtes Schema.
latest_versionstring | nullSiehe veröffentlichtes Schema.
summarystring | nullSiehe veröffentlichtes Schema.
licensestring | nullSiehe veröffentlichtes Schema.
authorstring | nullSiehe veröffentlichtes Schema.
homepagestring | nullSiehe veröffentlichtes Schema.
project_urlsobjectSiehe veröffentlichtes Schema.
pypi_urlrequiredstringSiehe veröffentlichtes Schema.
requires_pythonstring | nullSiehe veröffentlichtes Schema.
requires_distarraySiehe veröffentlichtes Schema.
dependency_countintegerDefault: 0.
keywordsstring | nullSiehe veröffentlichtes Schema.
classifiersarraySiehe veröffentlichtes Schema.
release_countintegerDefault: 0.
latest_released_atstring | nullSiehe veröffentlichtes Schema.
yankedbooleanDefault: false.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "name": {      "type": "string",      "maxLength": 214,      "minLength": 1,      "pattern": "^[A-Za-z0-9][A-Za-z0-9._\\-]*$",      "title": "Name",      "description": "PyPI project name."    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 3600    }  },  "type": "object",  "required": [    "name"  ],  "title": "PypiPackageRequest",  "description": "Request body for ``POST /pypi-package``."}
pypi_package.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"name\":\"httpx\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/pypi-package", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/geocode

Turn a place name or address into coordinates, bounding box, address parts and OSM type using OpenStreetMap Nominatim (ODbL); cached 24h. Price: $0.01 per paid call.

Request body · published HTTP schema
queryrequiredstringPlace name or address. minLength: 2 maxLength: 300
max_resultsintegerDefault: 5. minimum: 1 maximum: 10
country_codesstring | nullComma-separated ISO country codes, e.g. de,at.
languagestringDefault: "en". pattern: ^[a-z]{2,3}(-[a-zA-Z]{2,8})?$
max_age_secondsintegerDefault: 86400. minimum: 0 maximum: 86400
request body
{  "query": "Brandenburger Tor, Berlin",  "max_results": 1}
Router documentation example · not a live result
{  "query": "Brandenburger Tor, Berlin",  "results": [    {      "display_name": "Brandenburger Tor, Pariser Platz, Mitte, Berlin, 10117, Deutschland",      "lat": 52.5162746,      "lon": 13.3777041,      "type": "attraction",      "category": "tourism",      "importance": 0.72,      "bounding_box": [        52.516,        52.5165,        13.3774,        13.378      ],      "address": {        "city": "Berlin",        "country_code": "de"      },      "osm_id": 518071791,      "osm_type": "way"    }  ],  "result_count": 1,  "source": "nominatim",  "attribution": "Data (c) OpenStreetMap contributors, ODbL 1.0",  "domain": "nominatim.openstreetmap.org",  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "nominatim",    "cache_hit": false,    "latency_ms": 420  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
queryrequiredstringSiehe veröffentlichtes Schema.
resultsrequiredarraySiehe veröffentlichtes Schema.
result_countrequiredintegerSiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
attributionstring | nullSiehe veröffentlichtes Schema.
domainstring | nullSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "query": {      "type": "string",      "maxLength": 300,      "minLength": 2,      "title": "Query",      "description": "Place name or address."    },    "max_results": {      "type": "integer",      "maximum": 10,      "minimum": 1,      "title": "Max Results",      "default": 5    },    "country_codes": {      "anyOf": [        {          "type": "string",          "maxLength": 60,          "pattern": "^[a-zA-Z]{2}(,[a-zA-Z]{2})*$"        },        {          "type": "null"        }      ],      "title": "Country Codes",      "description": "Comma-separated ISO country codes, e.g. de,at."    },    "language": {      "type": "string",      "pattern": "^[a-z]{2,3}(-[a-zA-Z]{2,8})?$",      "title": "Language",      "default": "en"    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 86400    }  },  "type": "object",  "required": [    "query"  ],  "title": "GeocodeRequest",  "description": "Request body for ``POST /geocode``."}
geocode.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"query\":\"Brandenburger Tor, Berlin\",\"max_results\":1}")r = httpx.post("https://agent-margin-router-production.up.railway.app/geocode", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/domain-rdap

Domain registration data via RDAP (the WHOIS successor): registered flag, registrar, status, registration/expiry events, nameservers and DNSSEC – for availability checks and due diligence. Price: $0.01 per paid call.

Request body · published HTTP schema
domainrequiredstringRegistrable domain, e.g. example.com. minLength: 3 maxLength: 253 pattern: ^([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,}$
max_age_secondsintegerDefault: 86400. minimum: 0 maximum: 86400
request body
{  "domain": "agentmarginrouter.com"}
Router documentation example · not a live result
{  "domain": "agentmarginrouter.com",  "registered": true,  "status": [    "client transfer prohibited"  ],  "events": {    "registration": "2026-02-01T10:00:00Z",    "expiration": "2027-02-01T10:00:00Z",    "last changed": "2026-02-01T10:00:00Z"  },  "registrar": "Example Registrar, Inc.",  "registrar_iana_id": "1234",  "nameservers": [    "ns1.example.net",    "ns2.example.net"  ],  "dnssec_signed": false,  "rdap_url": "https://rdap.org/domain/agentmarginrouter.com",  "note": null,  "source": "rdap",  "freshness_seconds": 0,  "cost_usdc": 0.01,  "routing": {    "provider": "rdap",    "cache_hit": false,    "latency_ms": 510  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
domainrequiredstringSiehe veröffentlichtes Schema.
registeredrequiredbooleanSiehe veröffentlichtes Schema.
statusarraySiehe veröffentlichtes Schema.
eventsobjectSiehe veröffentlichtes Schema.
registrarstring | nullSiehe veröffentlichtes Schema.
registrar_iana_idstring | nullSiehe veröffentlichtes Schema.
nameserversarraySiehe veröffentlichtes Schema.
dnssec_signedboolean | nullSiehe veröffentlichtes Schema.
rdap_urlstring | nullSiehe veröffentlichtes Schema.
notestring | nullSiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "domain": {      "type": "string",      "maxLength": 253,      "minLength": 3,      "pattern": "^([a-zA-Z0-9\\-]+\\.)+[a-zA-Z]{2,}$",      "title": "Domain",      "description": "Registrable domain, e.g. example.com."    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 86400    }  },  "type": "object",  "required": [    "domain"  ],  "title": "DomainRdapRequest",  "description": "Request body for ``POST /domain-rdap``."}
domain_rdap.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"domain\":\"agentmarginrouter.com\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/domain-rdap", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/dns-lookup

Resolve any DNS record type (A, AAAA, CNAME, MX, NS, TXT, SOA, SRV, CAA, PTR) over DNS-over-HTTPS with TTLs and DNSSEC validation flag. Price: $0.005 per paid call.

Request body · published HTTP schema
namerequiredstringHost name to resolve. minLength: 1 maxLength: 253 pattern: ^([a-zA-Z0-9_\-]+\.)*[a-zA-Z0-9\-]+\.?$
record_typestringDefault: "A". pattern: ^(A|AAAA|CNAME|MX|NS|TXT|SOA|SRV|CAA|PTR)$
max_age_secondsintegerDefault: 300. minimum: 0 maximum: 86400
request body
{  "name": "agentmarginrouter.com",  "record_type": "A"}
Router documentation example · not a live result
{  "name": "agentmarginrouter.com",  "record_type": "A",  "status": "NOERROR",  "answers": [    {      "name": "agentmarginrouter.com.",      "type": "A",      "ttl": 300,      "data": "203.0.113.10"    }  ],  "answer_count": 1,  "authority": [],  "dnssec_validated": false,  "resolver": "dns.google",  "source": "google_doh",  "freshness_seconds": 0,  "cost_usdc": 0.005,  "routing": {    "provider": "google_doh",    "cache_hit": false,    "latency_ms": 90  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
namerequiredstringSiehe veröffentlichtes Schema.
record_typerequiredstringSiehe veröffentlichtes Schema.
statusstring | integer | nullSiehe veröffentlichtes Schema.
answersrequiredarraySiehe veröffentlichtes Schema.
answer_countrequiredintegerSiehe veröffentlichtes Schema.
authorityarraySiehe veröffentlichtes Schema.
dnssec_validatedboolean | nullSiehe veröffentlichtes Schema.
resolverstring | nullSiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "name": {      "type": "string",      "maxLength": 253,      "minLength": 1,      "pattern": "^([a-zA-Z0-9_\\-]+\\.)*[a-zA-Z0-9\\-]+\\.?$",      "title": "Name",      "description": "Host name to resolve."    },    "record_type": {      "type": "string",      "pattern": "^(A|AAAA|CNAME|MX|NS|TXT|SOA|SRV|CAA|PTR)$",      "title": "Record Type",      "default": "A"    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 300    }  },  "type": "object",  "required": [    "name"  ],  "title": "DnsLookupRequest",  "description": "Request body for ``POST /dns-lookup``."}
dns_lookup.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"name\":\"agentmarginrouter.com\",\"record_type\":\"A\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/dns-lookup", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()
POST

/contract-info

Smart-contract metadata from Blockscout for Base, Ethereum, Optimism or Arbitrum: verification status, name, compiler, proxy/implementation, creator, creation tx, token details and function/event names. Price: $0.02 per paid call.

Request body · published HTTP schema
addressrequiredstringEVM contract or wallet address. pattern: ^0x[a-fA-F0-9]{40}$
chainstringDefault: "base". pattern: ^(base|ethereum|optimism|arbitrum)$
max_age_secondsintegerDefault: 3600. minimum: 0 maximum: 86400
request body
{  "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",  "chain": "base"}
Router documentation example · not a live result
{  "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",  "chain": "base",  "is_contract": true,  "is_verified": true,  "contract_name": "FiatTokenProxy",  "compiler_version": "v0.6.12+commit.27d51765",  "language": "solidity",  "optimization_enabled": true,  "license_type": "mit",  "is_proxy": true,  "proxy_type": "eip1967",  "implementations": [    {      "address": "0x2Ce6311ddAE708829bc0784C967b7d77D19FD779",      "name": "FiatTokenV2_2"    }  ],  "creator_address": "0x...",  "creation_tx_hash": "0x...",  "verified_at": "2023-08-01T00:00:00Z",  "token_info": {    "name": "USD Coin",    "symbol": "USDC",    "type": "ERC-20",    "decimals": "6",    "holders": 1200000,    "total_supply": "4000000000000000"  },  "function_names": [    "admin",    "changeAdmin",    "implementation",    "upgradeTo"  ],  "event_names": [    "AdminChanged",    "Upgraded"  ],  "abi_available": true,  "source_code_available": true,  "explorer_url": "https://base.blockscout.com/address/0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",  "source": "blockscout",  "freshness_seconds": 0,  "cost_usdc": 0.02,  "routing": {    "provider": "blockscout",    "cache_hit": false,    "latency_ms": 700  }}
Response fields · published HTTP schema
freshness_secondsrequiredintegerAge of the underlying data in seconds (0 = fetched live).
cost_usdcrequirednumberPrice charged in stablecoin units (USDC/USDT 1:1); 0 on the free tier.
tokenstringToken actually used for payment (USDC, USDT or FREE). Default: "USDC".
fetched_atstring (date-time)UTC timestamp when the data was fetched.
routingrequiredRoutingMetaHow the request was routed (provider, fallback, cache, latency).
addressrequiredstringSiehe veröffentlichtes Schema.
chainrequiredstringSiehe veröffentlichtes Schema.
is_contractrequiredbooleanSiehe veröffentlichtes Schema.
is_verifiedbooleanDefault: false.
contract_namestring | nullSiehe veröffentlichtes Schema.
compiler_versionstring | nullSiehe veröffentlichtes Schema.
languagestring | nullSiehe veröffentlichtes Schema.
optimization_enabledboolean | nullSiehe veröffentlichtes Schema.
license_typestring | nullSiehe veröffentlichtes Schema.
is_proxybooleanDefault: false.
proxy_typestring | nullSiehe veröffentlichtes Schema.
implementationsarraySiehe veröffentlichtes Schema.
creator_addressstring | nullSiehe veröffentlichtes Schema.
creation_tx_hashstring | nullSiehe veröffentlichtes Schema.
verified_atstring | nullSiehe veröffentlichtes Schema.
token_infoobject | nullSiehe veröffentlichtes Schema.
function_namesarraySiehe veröffentlichtes Schema.
event_namesarraySiehe veröffentlichtes Schema.
abi_availablebooleanDefault: false.
source_code_availablebooleanDefault: false.
explorer_urlstring | nullSiehe veröffentlichtes Schema.
sourcerequiredstringSiehe veröffentlichtes Schema.
Complete request schema (defaults and validation limits)
request schema
{  "properties": {    "address": {      "type": "string",      "pattern": "^0x[a-fA-F0-9]{40}$",      "title": "Address",      "description": "EVM contract or wallet address."    },    "chain": {      "type": "string",      "pattern": "^(base|ethereum|optimism|arbitrum)$",      "title": "Chain",      "default": "base"    },    "max_age_seconds": {      "type": "integer",      "maximum": 86400,      "minimum": 0,      "title": "Max Age Seconds",      "default": 3600    }  },  "type": "object",  "required": [    "address"  ],  "title": "ContractInfoRequest",  "description": "Request body for ``POST /contract-info``."}
contract_info.py
import json, os, httpx # Optionale Werte aus deiner Umgebung; keine privaten Schlüssel im Code.headers = {}if os.getenv("AGENT_WALLET"):    headers["X-WALLET"] = os.environ["AGENT_WALLET"]if os.getenv("X402_PAYMENT_SIGNATURE"):    headers["PAYMENT-SIGNATURE"] = os.environ["X402_PAYMENT_SIGNATURE"] body = json.loads("{\"address\":\"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\",\"chain\":\"base\"}")r = httpx.post("https://agent-margin-router-production.up.railway.app/contract-info", json=body, headers=headers, timeout=60)print(r.status_code, r.json())if r.status_code == 402:    print("Keine Zahlung ausgeführt. Anforderungen prüfen und mit x402-Wallet/SDK signieren.")elif r.is_success:    print("Settlement:", r.headers.get("PAYMENT-RESPONSE"))else:    r.raise_for_status()

MCP server & discovery

Every endpoint is also exposed as an MCP tool over Streamable HTTP at POST /mcp — no SDK, no session state. Connect using a client that supports remote Streamable HTTP. Client configuration syntax varies; the JSON below is an example, not a universal installation file. Router 0.6.0: 40 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, html_to_markdown, youtube_transcript, github_repo_summary, dex_price, tx_status, erc20_balance, news_search, hn_search, reddit_search, defi_tvl, fear_greed, agent_wallet_snapshot, url_status, web_crawl, wikipedia_summary, arxiv_search, npm_package, pypi_package, geocode, domain_rdap, dns_lookup, contract_info, 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.

Remote HTTP configuration · client-specific
{  "mcpServers": {    "agent-margin-router": {      "url": "https://agent-margin-router-production.up.railway.app/mcp"    }  }}
mcp.sh
# Streamable HTTP: Verbindung initialisieren, danach Werkzeuge auflisten.curl -s -X POST https://agent-margin-router-production.up.railway.app/mcp \  -H 'Content-Type: application/json' \  -H 'Accept: application/json, text/event-stream' \  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"my-agent","version":"1.0"}}}' curl -s -X POST https://agent-margin-router-production.up.railway.app/mcp \  -H 'Content-Type: application/json' \  -H 'Accept: application/json, text/event-stream' \  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' | jq

For crawlers and marketplaces, AMR publishes discovery metadata, an llms.txt and the full OpenAPI schema. All 40 MCP tools advertised an outputSchema in the 15 September 2026 check. Coinbase Bazaar requires a separate payment-challenge extension and indexing flow; the current DNS endpoint did not pass that validation.

discovery.sh
curl -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'

Error codes

Inspect the returned error body; input-validation errors can use a detail array. If a paid request times out, check its settlement receipt and transaction status before creating another payment authorization. An HTTP error alone is not proof that no transfer occurred.

StatusMeaning
200
OK
Anfrage erfolgreich; Gratisantwort oder bezahlter Aufruf.
400
Bad Request
Ungültige Anfrage.
402
Payment Required
Zahlung erforderlich oder nicht akzeptiert.
403
Forbidden
Anfrage abgelehnt.
422
Validation Error
Eingabedaten entsprechen nicht dem Request-Schema.
429
Rate Limited
Anfragelimit erreicht.
502
Provider Error
Fehler bei der vorgelagerten Datenquelle.
503
Unavailable
Dienst vorübergehend nicht verfügbar.
Provider routing

Multi-provider by design

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.

Apify

Primary · Web extraction
apify

Headless-browser web scraping at scale. Handles JavaScript-rendered pages, infinite scroll and anti-bot friction.

  • JS rendering (Chromium)
  • CSS selector extraction
  • Proxy rotation
  • Structured JSON output
used by/extract-clean

CoinGecko

Primary · Market data
coingecko

Broad coverage of 15k+ assets and 1k+ venues with per-exchange tickers. Used as the primary price source for spread analysis.

  • Per-venue tickers
  • 15k+ assets
  • Volume & liquidity
  • Sub-minute freshness
used by/market-spread

CoinMarketCap

Fallback · Market data
coinmarketcap

Independent second price feed. Activated automatically when CoinGecko is rate-limited, stale or unhealthy; also used for confidence cross-checks.

  • Independent price feed
  • Exchange pair quotes
  • Cross-check weighting
  • Auto-failover
used by/market-spread

httpx direct

Fallback · Web extraction
httpx_direct

Zero-cost direct HTTP fetch with HTML parsing. Serves static pages instantly and guarantees availability if Apify is degraded.

  • Static HTML fetch
  • Sub-second latency
  • No upstream cost
  • Always available
used by/extract-clean
More upstream sources · all key-less, all with fallbacks
  • Binance · Coinbase · Kraken (median)/token-price · /crypto-ohlcv
  • Public JSON-RPC nodes (Base, Ethereum, Arbitrum, Optimism, Polygon)/gas-fees · /wallet-balance · /ens-resolve
  • DefiLlama Yields/defi-yields
  • ECB reference rates (Frankfurter)/currency-convert
  • DuckDuckGo HTML/web-search
  • DNS-over-HTTPS (Cloudflare, Google) · RDAP/email-validate · /dns-whois
  • ip-api · ipwho.is/geo-ip
  • Direct HTTPS fetch + parsers/pdf-text · /seo-check · /rss-feed

Licensing & 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.

Pricing

Kostenlos starten. Passenden Tarif wählen.

Drei kostenlose x402-Aufrufe pro Wallet, flexible Einzelzahlungen oder ein monatliches Abo in US-Dollar.

Free

$0

Einmalig pro Wallet

  • 3 kostenlose API-Aufrufe
  • x402 auf Base
  • Kein Stripe-Abo nötig
Kostenlos starten

Micro

$9 / Monat

Monatlich abgerechnet · USD

  • 50.000 Requests/Monat
  • Hosted Stripe Checkout
  • Kündigung zum Laufzeitende

Startup

$49 / Monat

Monatlich abgerechnet · USD

  • 500.000 Requests/Monat
  • Hosted Stripe Checkout
  • Kündigung zum Laufzeitende

Pro

$199 / Monat

Monatlich abgerechnet · USD

  • Unlimited Requests
  • Hosted Stripe Checkout
  • Kündigung zum Laufzeitende

Einrichtungsstatus: Abo-Schlüssel werden nach bestätigter Zahlung verschlüsselt gespeichert. E-Mail-Zustellung und Router-Freischaltung sind noch nicht automatisch angebunden. Die Abo-Kontingente gelten nicht automatisch für bestehende x402-Aufrufe.

Abo-Verwaltung ist im Checkout-Browser verfügbar. Bei verlorenem Browserzugang wende dich an den Anbieter über die Kontaktdaten auf deinem Stripe-Beleg.

Weiterhin verfügbar: x402 Pay-per-use

Ohne Abo: $0.005 – $0.05 pro Aufruf, bezahlt in USDC oder USDT auf Base. Die folgende Tabelle zeigt ausschließlich die x402-Einzelpreise, nicht die Stripe-Abo-Kontingente.

FeatureFree TierPay-per-use
Requests included3 total per walletEach successful call billed separately
Price per request$0.00$0.005 – $0.05
PaymentX-WALLET header onlyx402 · USDC or USDT on Base
/extract-clean$0.02
/market-spread$0.05
/gas-fees$0.005
/token-price$0.01
/wallet-balance$0.01
/web-search$0.02
/email-validate$0.01
/dns-whois$0.005
/pdf-text$0.02
/seo-check$0.01
/defi-yields$0.02
/currency-convert$0.005
/geo-ip$0.005
/rss-feed$0.01
/crypto-ohlcv$0.005
/ens-resolve$0.01
/html-to-markdown$0.01
/youtube-transcript$0.02
/github-repo-summary$0.01
/dex-price$0.01
/tx-status$0.01
/erc20-balance$0.01
/news-search$0.02
/hn-search$0.01
/reddit-search$0.01
/defi-tvl$0.005
/fear-greed$0.005
/agent-wallet-snapshot$0.02
/url-status$0.005
/web-crawl$0.05
/wikipedia-summary$0.005
/arxiv-search$0.01
/npm-package$0.005
/pypi-package$0.005
/geocode$0.01
/domain-rdap$0.01
/dns-lookup$0.005
/contract-info$0.02
Multi-provider fallback
Provenance & billing metadata
Failed requests charged
Account / API key required
Settlement—On-chain; verify settlement receipt
Über uns · About

Infrastruktur für die Agent Economy

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.

Was wir bauen

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.

Wofür wir stehen

Keine erfundenen Kennzahlen, keine verschleierten Lizenzen. Jede Antwort trägt Herkunft und Zeitstempel. Providerbedingungen werden maschinenlesbar eingehalten — abgeleitete Ergebnisse statt Rohdaten-Weiterverkauf.

Wer dahinter steht

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.