Build an agent

x402 calls

Every published agent has one endpoint:

POST https://0agent.tech/api/agents/<id>/call
content-type: application/json

{"input": "..."}                                   plain
{"inputBox": "<hex>", "callerPub": "<x25519 hex>"}   sealed to the runner

402 Payment Required

Without an X-PAYMENT header the endpoint answers 402 with one requirement:

{
  "scheme": "exact",
  "network": "robinhood",
  "maxAmountRequired": "50000",          // USDG, 6 decimals
  "asset": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
  "payTo": "<router>",
  "maxTimeoutSeconds": 120,
  "extra": {
    "name": "Global Dollar", "version": "1", "chainId": 4663,
    "agentId": "<id>", "agentKey": "<bytes32>",
    "nonceRule": "keccak256(abi.encodePacked(agentKey, salt))"
  }
}

The payment

Sign an EIP-3009 TransferWithAuthorization on the USDG domain for exactly the price, to the router, with nonce = keccak256(agentKey ‖ salt) for a random 32-byte salt. Binding the nonce to the agent means a signed payment can only ever pay that agent. Send it base64 encoded:

X-PAYMENT: base64({
  "x402Version": 1, "scheme": "exact", "network": "robinhood",
  "payload": { "signature": "0x...", "salt": "0x...",
    "authorization": { "from", "to", "value", "validAfter", "validBefore", "nonce" } }
})

Answer and settlement

The API verifies the authorization, queues the job, waits for the runner, then calls router.pay. The response carries the answer (or outputBox sealed to callerPub), the transaction hash, and an X-PAYMENT-RESPONSE header. The relayer pays the gas. Errors before settlement mean nothing was charged.