What a USDC transfer actually costs on Base, Polygon, Arbitrum, Ethereum and XDC, measured
What a USDC transfer actually costs on Base, Polygon, Arbitrum, Ethereum and XDC, measured rather than assumed: gas units simulated per chain against live prices and fresh chain heads, plus the rollup L1 data fee where it applies. Every figure ships with its inputs and the block it was read at, so you can recompute it. Cheapest first; a chain that cannot be measured is excluded, never estimated.
10000 (raw units)
price
13
calls / 30d
2
unique payers
2026-09-08
updated
Provider
api.402rates.com · discovered, not yet claimed by its owner
Payment (x402 accepts[])
[
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0xf567Cfe0FDb87A1D6Ca330e3f30f0D3DA0F7cb98",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "10000",
"maxTimeoutSeconds": 300
},
{
"scheme": "exact",
"network": "eip155:137",
"payTo": "0xf567Cfe0FDb87A1D6Ca330e3f30f0D3DA0F7cb98",
"asset": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
"amount": "10000",
"maxTimeoutSeconds": 300
},
{
"scheme": "exact",
"network": "eip155:42161",
"payTo": "0xf567Cfe0FDb87A1D6Ca330e3f30f0D3DA0F7cb98",
"asset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"amount": "10000",
"maxTimeoutSeconds": 300
},
{
"scheme": "exact",
"network": "eip155:50",
"payTo": "0xedb1a894761F0a142d80D09F82Ff7CF99158Bb19",
"asset": "0xfA2958CB79b0491CC627c1557F441eF849Ca8eb1",
"amount": "10000",
"maxTimeoutSeconds": 120
}
]Output schema
{
"bazaar": {
"info": {
"input": {
"method": "GET",
"queryParams": {
"chains": "base,polygon,arbitrum,ethereum,xdc"
},
"type": "http"
},
"output": {
"example": {
"cheapest": {
"caveats": [],
"chain": "xdc",
"compared_chains": [
"xdc"
],
"est_cost_usd": 0.0000188,
"excluded_chains": [],
"runner_up": null,
"scope": "transaction_fee_total",
"stability": {
"historical_claim": false,
"level": "unknown"
}
},
"data": [
{
"chain": "xdc",
"cost_basis": "complete",
"cost_bps": [
{
"fee_bps": 0.00188,
"notional_usd": 100
},
{
"fee_bps": 0.000188,
"notional_usd": 1000
},
{
"fee_bps": 0.0000188,
"notional_usd": 10000
}
],
"est_cost_usd": 0.0000188,
"fee_components": {
"execution_usd": 0.0000188,
"l1_data_usd": null,
"total_usd": 0.0000188
},
"fee_model": "single_layer",
"gas_price_wei": "250000000",
"gas_units": 46680,
"gas_units_assumed": null,
"gas_units_method": "eth_estimateGas",
"gas_units_scenario": "transfer to an address with an existing USDC balance",
"head_age_s": 3,
"l1_data_fee_included": null,
"transfer_amount_atomic": 1000000,
"tx_type": "usdc_transfer"
}
],
"meta": {
"attributions": [
{
"fallback_used": false,
"fetched_at": "2026-08-30T22:14:03.011Z",
"message": "Data provided by CoinGecko",
"quote_asset": "usd",
"source_id": "coingecko.simple.licensed.xdc",
"url": "https://www.coingecko.com/en/api"
}
],
"capability": "compass.settlement.costs",
"chains_requested": [
"xdc"
],
"chains_unavailable": [],
"fee_completeness": "complete",
"freshness": {
"all_sources_within_policy": true,
"cache_ttl_s": 119,
"oldest_source_age_s": 1,
"policy_max_age_s": 120,
"valid_until": "2026-08-30T22:16:02.904Z"
},
"generated_at": "2026-08-30T22:14:03.117Z",
"limitations": "a simulated transfer to an address that already holds the token; a first transfer to a fresh address costs more, and no bridge, mint or subscription cost is included",
"request_id": "req_example1",
"schema_version": "0.5.0",
"sources": [
{
"block": 85797652,
"fetched_at": "2026-08-30T22:14:02.904Z",
"id": "xdc.rpc.gas_price",
"kind": "onchain_read",
"max_age_s": 120
},
{
"fetched_at": "2026-08-30T22:14:02.904Z",
"id": "xdc.rpc.gas_units",
"kind": "onchain_simulation",
"max_age_s": 120,
"method": "eth_estimateGas"
},
{
"attribution": "Data provided by CoinGecko",
"fallback_used": false,
"fetched_at": "2026-08-30T22:14:03.011Z",
"id": "coingecko.simple.licensed.xdc",
"kind": "public_api",
"license_basis": "operator_attestation",
"licensed": true,
"max_age_s": 120,
"quote_asset": "usd",
"url": "https://www.coingecko.com/en/api"
}
],
"units": {
"est_cost_usd": "usd",
"fee_bps": "basis_points",
"gas_price_wei": "wei",
"transfer_amount_atomic": "usdc_atomic"
},
"version": "0.1.0"
},
"related": [
"compass.rwa.yields",
"compass.ping"
]
},
"type": "json"
}
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"method": {
"enum": [
"GET"
],
"type": "string"
},
"queryParams": {
"properties": {
"chains": {
"description": "comma-separated list of: base, polygon, arbitrum, ethereum, xdc. Order does not matter and duplicates are ignored. Omit it to price all five, which is the usual call and costs exactly the same.",
"pattern": "^(base|polygon|arbitrum|ethereum|xdc)(,(base|polygon|arbitrum|ethereum|xdc))*$",
"type": "string"
}
},
"type": "object"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}
}
}Use it
curl
curl "https://api.402rates.com/v1/settlement/costs" # -> 402 Payment Required, accepts[] lists how to pay # retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid
JavaScript
const res = await fetch("https://api.402rates.com/v1/settlement/costs");
if (res.status === 402) {
const { accepts } = await res.json();
// pay one of accepts[] via an x402 client, then retry with the payment header
}Python
import httpx
res = httpx.get("https://api.402rates.com/v1/settlement/costs")
if res.status_code == 402:
accepts = res.json()["accepts"]
# pay one of accepts[] via an x402 client, then retry with the payment headerMachine-readable
Everything on this page is also available as clean JSON at /resources/578.json, and this resource appears in /discovery/resources and /discovery/search.