ARCHIPELAGO Open the terminal

For developers · October 4, 2026

Token reports for AI agents

A program or AI agent can buy a report on any token Archipelago tracks on Arc for 0.01 USDC, one request at a time. There is no signup and no API key. It pays over x402, an open standard for paying over HTTP, and Circle settles each payment on Arc straight to Archipelago's treasury.

What you need

  • A wallet with its own private key (an EOA) holding USDC on Arc, 0.01 for each report. It needs nothing else, because Circle pays the gas. Smart-contract wallets are not supported yet.
  • A token's address. Any token on Archipelago's radar can be reported on. A token it does not track, or one without a priced pool, is turned away before any charge.

To fund the wallet, send it USDC on Arc: withdraw from an exchange on the Arc network, or bridge from another chain, for example with Relay. The FAQ covers both routes. Give the agent a wallet of its own and keep in it only what the agent will spend, since its key sits with the agent.

TypeScript

With x402's own client for fetch, which answers the 402 and signs the payment for you:

npm install @x402/fetch @x402/core @x402/evm viem
import { wrapFetchWithPayment, x402HTTPClient } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const signer = privateKeyToAccount(process.env.EVM_PRIVATE_KEY as `0x${string}`);
const client = new x402Client();
client.register("eip155:*", new ExactEvmScheme(signer));
const fetchWithPayment = wrapFetchWithPayment(fetch, client);

const token = "0x3945DF1f8dD8F753FB62e428f3AaEB2c185a6E26"; // $ISLE
const res = await fetchWithPayment(`https://idx.archipelagodex.xyz/x402/report/${token}`);
const result = await new x402HTTPClient(client).processResponse(res);
console.log(res.status, result.body); // 200 and the report, or why not (nothing was charged)
if (res.ok) console.log("paid in", result.header.transaction);

Python

With x402's Python client, on httpx:

pip install "x402[httpx,evm]"
import asyncio, os
from eth_account import Account
from x402 import x402Client
from x402.http.clients import x402HttpxClient
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact.register import register_exact_evm_client

TOKEN = "0x3945DF1f8dD8F753FB62e428f3AaEB2c185a6E26"  # $ISLE

async def main():
    client = x402Client()
    register_exact_evm_client(client, EthAccountSigner(Account.from_key(os.environ["EVM_PRIVATE_KEY"])))
    async with x402HttpxClient(client) as http:
        r = await http.get(f"https://idx.archipelagodex.xyz/x402/report/{TOKEN}")
        await r.aread()
        print(r.status_code, r.json())  # 200 and the report, or why not (nothing was charged)

asyncio.run(main())

Both were tried against this endpoint with @x402/fetch 2.28 and x402 2.25 for Python. x402's buyer quickstart has clients for Go and Axios as well.

How the payment works

A client library does all of this; it is here for anyone writing their own.

  1. The agent requests GET https://idx.archipelagodex.xyz/x402/report/<token address>. With no payment attached, the answer is 402 Payment Required, with the terms in a PAYMENT-REQUIRED header (base64-encoded JSON) and in the body. The terms, in its accepts list:
{
  "scheme": "exact",
  "network": "eip155:5042",
  "amount": "10000",
  "asset": "0x3600000000000000000000000000000000000000",
  "payTo": "0xDcf7a2683aCaaC06E85a50c15BAf59c8E8b1e681",
  "maxTimeoutSeconds": 120,
  "extra": { "name": "USDC", "version": "2", "assetTransferMethod": "eip3009" }
}

That is 10000 units of USDC on Arc (6 decimals, so 0.01 USDC), paid to Archipelago's treasury Safe.

  1. The agent signs an EIP-3009 TransferWithAuthorization for exactly that amount to payTo, under USDC's EIP-712 domain (name USDC, version 2, chain 5042, the asset's address), and sends the request again with a PAYMENT-SIGNATURE header: base64-encoded JSON with x402Version 2, the terms it accepted, and the signed authorization. The authorization must be valid already, stay valid for at least 15 more seconds, and expire within 600 seconds. x402 clients sign it for 120.
  2. Archipelago checks the terms and the signature, builds the report, and has Circle's Facilitator Service settle the transfer on Arc. Once Circle confirms it, the answer is 200 with the report as JSON, and a PAYMENT-RESPONSE header (base64-encoded JSON) holding the receipt: success, transaction (its hash on Arc), network, payer and amount.

The route allows cross-origin requests and exposes both payment headers, so an agent in a browser can use it too. Its OpenAPI description, for tools and directories that read one, is at https://idx.archipelagodex.xyz/openapi.json.

What a report holds

One JSON object, read from Arc and from Archipelago's own index of its trades. It states facts, not a rating.

FieldWhat it holds
tokenAddress, symbol, name, decimals and total supply.
marketPrice, liquidity and market cap (total supply times price) in USD; depthUsd, the USD a buy takes to move the price 2%; 24-hour volume and trade count; the price change over 1 and 24 hours, in percent; and when the index first saw it.
poolsEvery pool: Uniswap v3 or v4, its id, fee, tick spacing, hook (v4), price and liquidity.
flagsThe launchpad that launched it, whether it copies an official Arc asset, how many other tracked tokens share its ticker, whether CoinGecko lists it, and a liquidity pull of half or more in the last 24 hours.
contractWhether it is a proxy and of what kind, who can upgrade it, its owner (a wallet, a contract, or renounced), and whether its code has the standard mint and pause functions.
asOfThe last block whose trades are in the numbers, and the time.
noteThe report's limits, in its own words.

Transfer taxes and sell blocks cannot be detected from contract code, and mint and pause mean only those standard functions. Contract facts are reused for up to 10 minutes.

When you are charged

  • Only for a report you get. A token Archipelago cannot report on is answered 404, and while the index refills after a restart the answer is 503, both before any charge. The report goes out only once Circle confirms the transfer.
  • Never twice for one request. The same PAYMENT-SIGNATURE sent again gets the same report and receipt, up to 3 answers while its authorization is valid. If a client signs a fresh payment for the same token while its last paid one is still valid, it is answered on that one, free.
  • A payment that could not be confirmed yet is answered 503, asking for the same PAYMENT-SIGNATURE again. It is settled at most once, and no other payment from that wallet for that token is taken until it resolves.
  • One authorization buys one report. Sent for another token, it is refused.

Answers and errors

StatusMeaning
200The report, with the receipt in PAYMENT-RESPONSE.
402Payment required, or the payment was refused. The body's error says why, for example that the wallet's USDC balance is below the price. Nothing was charged.
404No report for this token: it is not tracked, or has no priced pool. Nothing was charged.
429More than 30 requests a minute from one address.
503Try again after the Retry-After seconds: the index is refilling, the server is busy, paid reports are paused, or a payment is still being confirmed. Nothing new was charged.

Where the money goes

Every payment goes to Archipelago's treasury Safe, 0xDcf7a2683aCaaC06E85a50c15BAf59c8E8b1e681 on Arc, and shows on the Treasury page as a paid report. Half of the revenue from paid reports is set aside to buy and burn $ISLE as the treasury grows. That is a policy, not a contract; the whitepaper has the details.

More on the protocol: x402's documentation and Circle's Facilitator Service.