CarryPilot is a trading platform for humans, but it's also a research service other AI agents can call: current Hyperliquid funding rates, and market-neutral arbitrage opportunities net of every cost. The free tier is read-only, no auth required; the full report is metered via x402. Pick whichever of the three protocols fits your stack.
Every row below is independently verifiable real chain data / transactions — not screenshots or made-up numbers. Address and tx pages are public Blockscout explorer links.
| Item | Address / Hash | Note |
|---|---|---|
| USDC contract (testnet) | 0x0C38…4C5d ↗ | Circle FiatTokenV2_2, EIP-3009 gasless auth |
| x402 payer wallet | 0x55Fb…93Ac ↗ | Simulates an "external AI-agent payer", holds 20 testnet USDC |
| x402 treasury / facilitator | 0xF352…86cE ↗ | The 402 quote's payTo / settler, holds 1 testnet INJ for gas |
| INJ deposit tx (facilitator gas) | 0x6272…a76d ↗ | 1 INJ → facilitator · block 134,670,989 · 2026-07-25 16:24:49 UTC · success |
| x402 settlement tx (paid call) | 0xbdf6…dd73 ↗ | 0.01 USDC · payer→facilitator · gas sponsored via EIP-3009 · confirmed on-chain |
20.00→19.99, facilitator 0→0.01, balances reconcile). Injective testnet RPC/LCD reachable directly, no geo-block.Any caller's first step should be fetching this file — a machine-readable "business card": identity, skills, constraints, and the entry point for each of the three protocols below.
GET/.well-known/agent-card.json
Both skills sit on top of the same deterministic engine: real net APR after fees + slippage + a funding-drift reserve, never the gross rate. When there's no opportunity it says so honestly instead of manufacturing one for the sake of an answer.
One sentence in, one JSON object out. No protocol overhead — fine for scripts, curl, or wrapping inside your own agent.
GET/api/agent/query?q=<text> or POST /api/agent/query {"query":"..."}
Arbitrage-opportunity queries hit the same endpoint, just phrase it differently: ?q=any arbitrage opportunities right now or ?q=is BTC worth it.
Standard A2A JSON-RPC 2.0, message/send method. Fits a host that's already in the A2A ecosystem (agent-card discovery + multi-agent orchestration).
/api/a2a
The result is a role: "agent" message with two parts: text (a human-readable sentence) + data (structured fields for your code to parse).
Every call on this agent completes synchronously — no long-running task state is kept. tasks/get / tasks/cancel return -32001.
Streamable HTTP, stateless. If your agent host is Claude / Codex / anything else with MCP support, this is the path of least resistance — no HTTP client to write, just point a URL.
| Tool | Args | Description |
|---|---|---|
get_funding_rates | coin?: string | Current funding rate / annualized / hedgeable for one coin (or the highest-|rate| coins market-wide) |
find_arbitrage | coin?: string | Market-neutral carry candidates after full costs: net APR, cost coverage, rejection reasons |
Test it directly with the official SDK:
The three free entry points only answer "the one thing you asked." The full report (every market-wide candidate + the whole rate table, not a summary) is metered in USDC via x402 — HTTP 402 kicks it off, on-chain EIP-3009 gasless signed payment settles it, no human in the loop. An AI agent can pay for its own data.
/api/agent/report
Current status: Injective testnet (eip155:1439) — the full x402 flow is verified end-to-end and confirmed on-chain: 402 quote → EIP-3009 gasless signing → facilitator-sponsored on-chain settlement, 0.01 USDC moved payer→facilitator (see scripts/x402-a2a-test.ts, settlement tx 0xbdf6030e…459dd73).
amount: "10000" = 0.01 USDC (6 decimals). network: eip155:1439 is Injective EVM Testnet.
transferWithAuthorization against the quote, then replayHand-rolling the signature (EIP-712 typed data) is fiddly — we recommend the official client (this is also how we test it):
What the client does under the hood: parse accepts from the 402 → build EIP-712 typed data → sign with your private key (off-chain, no gas) → retry the request with the signature in a PAYMENT-SIGNATURE header → the server's facilitator verifies signature/balance/nonce → submits on-chain settlement → you get 200 + full data + a settlement receipt.
The header is PAYMENT-SIGNATURE (current) or X-PAYMENT (legacy-compatible), base64-encoded PaymentPayload (scheme/network/payload.authorization + payload.signature). The EIP-712 domain belongs to the USDC contract itself (name "USDC", version "2"); the signed object is a standard EIP-3009 TransferWithAuthorization (from/to/value/validAfter/validBefore/nonce).
| Value | |
|---|---|
| Chain ID | 1439 (eip155:1439) |
| RPC | https://k8s.testnet.json-rpc.injective.network |
| USDC contract | 0x0C382e685bbeeFE5d3d9C29e29E341fEE8E84C5d (Circle FiatTokenV2_2, EIP-3009 capable) |
| Testnet USDC faucet | faucet.circle.com (select Injective Testnet) |
| Testnet INJ faucet (gas, only needed if you self-host a facilitator) | testnet.faucet.injective.network |
Source reference: scripts/x402-spike.ts (feasibility spike), scripts/x402-settle-demo.ts (real-payment settlement demo, prints the on-chain tx hash).
| code | meaning | trigger |
|---|---|---|
-32700 | Parse error | request body isn't valid JSON |
-32600 | Invalid Request | jsonrpc field isn't "2.0" |
-32601 | Method not found | method isn't message/send |
-32602 | Invalid params | no text part inside message.parts |
-32001 | Task not found | tasks/get/tasks/cancel called — this agent completes synchronously and keeps no task state |
| HTTP | meaning |
|---|---|
402 + insufficient_funds | payer wallet's USDC balance is too low |
402 + Payment network not accepted | signed network/asset doesn't match the quote |
501 | this deployment has x402 disabled (treasury/facilitator key missing) |