Guide

Pay a route. Read the body.

Every service on this desk is an HTTP resource. An unpaid call returns 402 with a USDC price on Arc testnet. A wallet signs transferWithAuthorization, the desk settles it, and the same URL returns 200.

Pay on this site

  1. Open the desk and choose a service.
  2. Press Dispatch agent. The handshake shows HTTP 402 and the amount in atomic units. USDC has 6 decimals, so 0.040 USDC is 40000.
  3. Press Pay with wallet. Approve Arc testnet if the wallet asks, then sign the typed data. Do not send a normal transfer.
  4. When settlement lands, the return pane shows the body and an ArcScan link.

The cap and gate on the desk are the agent’s spend policy. They do not block a wallet payment. The server accepts the posted price.

Arc testnet

Add this network in the wallet before signing. Gas on Arc is USDC.

Network
Arc Testnet
Chain id
5042002 · eip155:5042002
RPC
https://rpc.testnet.arc.network
Explorer
https://testnet.arcscan.app
USDC
0x3600000000000000000000000000000000000000
Scheme
exact · EIP-3009 · name USDC · version 2

Testnet USDC

Take USDC from faucet.circle.com and choose Arc Testnet. The paying wallet needs enough USDC for the price. The desk wallet also needs a little USDC, because it pays gas when it submits the authorization. The client panel on the home page shows that gas balance.

Routes

Prices are exact. Call any of them with GET and Accept: application/json.

  • GET /v1/brief — Research brief — 0.040 USDC
  • GET /v1/evidence — Evidence pack — 0.020 USDC
  • GET /v1/embed — Embedding batch — 0.012 USDC
  • GET /v1/board — Direction board — 0.060 USDC
  • GET /v1/calendar — Calendar hold — 0.010 USDC
  • GET /v1/voice — Transcription — 0.018 USDC
  • GET /v1/micro — Microstructure — 0.090 USDC
  • GET /v1/patch — Patch review — 0.070 USDC
  • GET /v1/search — Bazaar search — 0.005 USDC
  • GET /v1/dossier — Long dossier — 0.140 USDC
  • GET /v1/legal — Legal translation — 0.025 USDC
  • GET /v1/receipt — Receipt explain — 0.030 USDC

GET /api/desk lists the payee, network, and prices. GET /facilitator/supported lists what this desk can settle: exact payments on eip155:5042002. POST /facilitator/verify and POST /facilitator/settle are the facilitator endpoints. The resource server calls them for you when you retry with PAYMENT-SIGNATURE.

Call it from code

First request, unpaid:

curl -i https://YOUR_HOST/v1/brief

The response status is 402. Decode the PAYMENT-REQUIRED header. It is base64 JSON. accepts[0] holds the scheme, network, amount, asset, and payee.

Sign EIP-712 typed data with primary type TransferWithAuthorization:

domain
  name               USDC
  version            2
  chainId            5042002
  verifyingContract  0x3600000000000000000000000000000000000000

message
  from         the payer
  to           payTo from the 402
  value        amount from the 402
  validAfter   0
  validBefore  now + maxTimeoutSeconds
  nonce        32 random bytes, hex

Retry the same URL with the signature. The header value is base64 JSON:

{
  "x402Version": 2,
  "resource": { "url": "...", "description": "Research brief", "mimeType": "application/json" },
  "accepted": { "scheme": "exact", "network": "eip155:5042002", "amount": "40000", "asset": "0x3600…", "payTo": "0x…" },
  "payload": {
    "authorization": { "from": "0x…", "to": "0x…", "value": "40000", "validAfter": "0", "validBefore": "…", "nonce": "0x…" },
    "signature": "0x…"
  }
}
curl -i https://YOUR_HOST/v1/brief \
  -H "PAYMENT-SIGNATURE: <base64>"

A paid response is 200 with PAYMENT-RESPONSE. That header is base64 JSON and includes transaction, the Arc transaction hash.

Official clients can do the same dance. Register @x402/evm/exact/client for eip155:5042002 and point the resource URL at this origin. The 402 already carries the EIP-712 domain, so the client does not need a separate asset list for Arc.

$Aroex rewards

Each settled payment is USDC. The desk sends that USDC to the Aroex contract and calls sync(). Holders share it in proportion to their balance. Look up an address on the desk, then call claim() from that wallet. The supply starts with the desk treasury. A transfer of $Aroex is what makes a new holder.

What you get

The JSON body is the goods: service, name, and body. Settlement does not change the price. One authorization pays one call. A second call needs a new 402 and a new nonce.

If it fails

  • 402 again after signing. The signature did not verify, or the payer has less USDC than the amount. Read the response body for invalidReason.
  • Desk gas is 0. The payee address on the home page must hold a little Arc testnet USDC so it can submit the transaction. Drip that address from the faucet.
  • Wrong network. The typed data chain id has to be 5042002. A signature from another chain will not verify.
  • Expired authorization. validBefore must be at least a few seconds in the future. Sign again from a fresh 402.
  • Browser blocks the wallet. Use a wallet that injects window.ethereum, then press Pay with wallet again.