Crypto Data API
Surf was withdrawn on 2026-09-06
The Surf crypto-data service that this page used to document was retired by its upstream on 2026-09-06. Every /v1/marketplace/surf/* path now answers 404 service no longer available: surf. Nothing under that prefix can be called or paid for.
The capabilities people used it for are served by three live services, documented below: DeFi (TVL, yields, chains), DEX swap quotes, and spot prices. For prediction markets see the dedicated Prediction Markets API.
| Need | Service | Base URL | Price |
|---|---|---|---|
| DeFi TVL, chains, yields, protocol detail, token prices | DeFi (DefiLlama) | /v1/marketplace/defi | $0.0055/call |
| DEX swap price and quote, gasless swaps | DEX (0x) | /v1/marketplace/dex | $0.0011/call |
| Spot price and history for crypto, FX and commodities | Markets | /v1/marketplace/markets | $0.0011/call |
| Polymarket, Kalshi and more | Prediction Markets | /v1/marketplace/prediction | $0.00935/call |
Prices are the live x402 quotes measured 2026-09-29. The exact charge for a call is in the 402 challenge (accepts[].amount, in micro-USDC) and in price.amount on the response.
All three services on this page are GET-only.
Authentication
Both methods are supported — all requests settle via x402 on-chain:
| Method | Header | Description |
|---|---|---|
| API Key | Authorization: Bearer sk-... | Platform signs x402 from your HD wallet automatically |
| Private Key (x402) | Automatic via SDK | Agent signs x402 directly from its own wallet |
See Agent Payments (x402) for full details on how both methods work.
DeFi (DefiLlama)
Base URL: https://api.jarvisclaw.ai/v1/marketplace/defi
| Method | Path | Returns |
|---|---|---|
| GET | /protocols | Every tracked protocol with TVL and chain breakdown |
| GET | /protocol/{slug} | One protocol's TVL history and metadata |
| GET | /chains | TVL per chain |
| GET | /yields | Pool yields (APY, TVL) across protocols — large response |
| GET | /prices/{coins} | Token prices, e.g. coingecko:ethereum,coingecko:bitcoin |
An unknown path answers 404 with the list of available endpoints in the body.
DEX (0x)
Base URL: https://api.jarvisclaw.ai/v1/marketplace/dex
| Method | Path | Returns |
|---|---|---|
| GET | /price | Indicative swap price (no commitment) |
| GET | /quote | Firm, executable swap quote |
| GET | /gasless/price | Indicative gasless swap price |
| GET | /gasless/quote | Firm gasless swap quote |
| GET | /gasless/status/{trade_hash} | Status of a submitted gasless trade |
| GET | /gasless/approval-tokens | Tokens eligible for gasless approval |
| GET | /gasless/chains | Chains that support gasless swaps |
/price and /quote take chainId, sellToken, buyToken and sellAmount (in the sell token's base units).
Markets (spot prices)
Base URL: https://api.jarvisclaw.ai/v1/marketplace/markets
| Method | Path | Returns |
|---|---|---|
| GET | /crypto/list | Supported crypto symbols |
| GET | /crypto/price/{symbol} | Latest price, e.g. BTC-USD |
| GET | /crypto/history/{symbol} | Price history |
| GET | /fx/list, /fx/price/{pair}, /fx/history/{pair} | The same for FX, e.g. EUR-USD |
| GET | /commodity/list, /commodity/price/{symbol}, /commodity/history/{symbol} | The same for commodities, e.g. XAU-USD |
Code Examples
# BTC spot price
curl "https://api.jarvisclaw.ai/v1/marketplace/markets/crypto/price/BTC-USD" \
-H "Authorization: Bearer sk-..."
# TVL per chain
curl "https://api.jarvisclaw.ai/v1/marketplace/defi/chains" \
-H "Authorization: Bearer sk-..."
# Swap price: 1 USDC -> WETH on Base
curl "https://api.jarvisclaw.ai/v1/marketplace/dex/price?chainId=8453&sellToken=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&buyToken=0x4200000000000000000000000000000000000006&sellAmount=1000000" \
-H "Authorization: Bearer sk-..."from jarvisclaw import MarketplaceClient
# Hex private key -> USDC on Base; a base58 keypair -> USDC on Solana.
client = MarketplaceClient(private_key="0x<evm-private-key>")
btc = client.call("markets", "/crypto/price/BTC-USD")
print(btc["price"])
chains = client.call("defi", "/chains")
print(chains[0]["name"], chains[0]["tvl"])
quote = client.call("dex", "/price", params={
"chainId": "8453",
"sellToken": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", # USDC
"buyToken": "0x4200000000000000000000000000000000000006", # WETH
"sellAmount": "1000000",
})
print(quote["buyAmount"])package main
import (
"context"
"fmt"
jc "github.com/api-jarvisclaw/go-sdk/v2"
)
func main() {
ctx := context.Background()
mc, _ := jc.NewMarketplaceClient(jc.WithPrivateKey("0x<evm-private-key>"))
btc, _ := mc.Call(ctx, "markets", "/crypto/price/BTC-USD", nil)
fmt.Println(btc["price"])
quote, _ := mc.Call(ctx, "dex", "/price", jc.WithParams(map[string]string{
"chainId": "8453",
"sellToken": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"buyToken": "0x4200000000000000000000000000000000000006",
"sellAmount": "1000000",
}))
fmt.Println(quote["buyAmount"])
}What Surf covered that has no replacement yet
On-chain SQL, wallet labels, social/CT mindshare, VC fund data and the Surf news feed have no live equivalent on the platform. The upstream said it is looking for a new vendor. Until one is published, calls under /v1/marketplace/surf/* return 404 and are never charged.
Errors
| Code | Meaning | Resolution |
|---|---|---|
| 402 | x402 payment required | Pay the challenge, or call with an API key backed by USDC |
| 404 | Unknown path, or a withdrawn service (surf) | Use a path from the tables above |
| 429 | Rate limited | Back off and retry with exponential delay |