TESTNET / MOCK: Base Sepolia test USDC only. Codes are mocks, not real Amazon gift cards.
Docs
1. Quote (unpaid request)
curl -i -X POST https://gift-by-crypto-agent.kitano787.workers.dev/v1/egift/amazon-jp/1000
Response: 402 Payment Required. The PAYMENT-REQUIRED header is base64 JSON. This is the header this server returns right now:
PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6MiwiZXJyb3IiOiJQYXltZW50IHJlcXVpcmVkIiwicmVzb3VyY2UiOnsidXJsIjoiaHR0cHM6Ly9naWZ0LWJ5LWNyeXB0by1hZ2VudC5raXRhbm83ODcud29ya2Vycy5kZXYvdjEvZWdpZnQvYW1hem9uLWpwLzEwMDAiLCJkZXNjcmlwdGlvbiI6IlRFU1RORVQgLyBNT0NLLiBBbWF6b24uY28uanAgZUdpZnQgY2FyZCwgSlBZIDEsMDAwIGZhY2UgdmFsdWUsIGZvciA2LjY3IFVTREMgb24gQmFzZSBTZXBvbGlhIChkZW1vIHJhdGUgMSBVU0RDID0gSlBZIDE1MCkuIFBPU1Qgd2l0aCBubyBib2R5OyB0aGUgNDAyIGlzIHRoZSBxdW90ZS4gUmV0dXJucyBhIE1PQ0sgY29kZSB0aGF0IGlzIG5vdCBhIHJlYWwgZ2lmdCBjYXJkLiIsIm1pbWVUeXBlIjoiYXBwbGljYXRpb24vanNvbiIsInNlcnZpY2VOYW1lIjoiR2lmdCBieSBDcnlwdG8gKFRFU1RORVQpIiwidGFncyI6WyJnaWZ0LWNhcmQiLCJhbWF6b24tamFwYW4iLCJlZ2lmdCIsInRlc3RuZXQiLCJtb2NrIl0sImljb25VcmwiOiJodHRwczovL2dpZnQtYnktY3J5cHRvLWFnZW50LmtpdGFubzc4Ny53b3JrZXJzLmRldi9pY29uLnN2ZyJ9LCJhY2NlcHRzIjpbeyJzY2hlbWUiOiJleGFjdCIsIm5ldHdvcmsiOiJlaXAxNTU6ODQ1MzIiLCJhbW91bnQiOiI2NjcwMDAwIiwiYXNzZXQiOiIweDAzNkNiRDUzODQyYzU0MjY2MzRlNzkyOTU0MWVDMjMxOGYzZENGN2UiLCJwYXlUbyI6IjB4OGFDMjBhQjJBRjY5MWI4NWMwZWZmMUQzOWJiNGViRkVGMTY0YUUyOCIsIm1heFRpbWVvdXRTZWNvbmRzIjozMDAsImV4dHJhIjp7Im5hbWUiOiJVU0RDIiwidmVyc2lvbiI6IjIifX1dLCJleHRlbnNpb25zIjp7ImJhemFhciI6eyJpbmZvIjp7ImlucHV0Ijp7InR5cGUiOiJodHRwIiwiYm9keVR5cGUiOiJqc29uIiwiYm9keSI6e30sIm1ldGhvZCI6IlBPU1QifSwib3V0cHV0Ijp7InR5cGUiOiJqc29uIiwiZXhhbXBsZSI6eyJ0ZXN0bmV0Ijp0cnVlLCJtb2NrIjp0cnVlLCJub3RpY2UiOiJURVNUTkVUIC8gTU9DSzogQmFzZSBTZXBvbGlhIHRlc3QgVVNEQyBvbmx5LiBDb2RlcyBhcmUgbW9ja3MsIG5vdCByZWFsIEFtYXpvbiBnaWZ0IGNhcmRzLiIsInNrdSI6ImFtYXpvbi1qcC0xMDAwIiwicHJvZHVjdCI6IkFtYXpvbi5jby5qcCBlR2lmdCBjYXJkIEpQWSAxMDAwIChNT0NLKSIsImZhY2VWYWx1ZSI6eyJhbW91bnQiOjEwMDAsImN1cnJlbmN5IjoiSlBZIn0sInByaWNlIjp7ImFtb3VudCI6IjYuNjciLCJhc3NldCI6IlVTREMiLCJuZXR3b3JrIjoiZWlwMTU1Ojg0NTMyIn0sInBheWVyIjoiMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiY29kZSI6Ik1PQ0stMDEyMzQ1Njc4OWFiY2RlZiIsInR4IjoiMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiZXhwbG9yZXIiOiJodHRwczovL3NlcG9saWEuYmFzZXNjYW4ub3JnL3R4LzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJ9fX0sInNjaGVtYSI6eyIkc2NoZW1hIjoiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAyMC0xMi9zY2hlbWEiLCJ0eXBlIjoib2JqZWN0IiwicHJvcGVydGllcyI6eyJpbnB1dCI6eyJ0eXBlIjoib2JqZWN0IiwicHJvcGVydGllcyI6eyJ0eXBlIjp7InR5cGUiOiJzdHJpbmciLCJjb25zdCI6Imh0dHAifSwibWV0aG9kIjp7InR5cGUiOiJzdHJpbmciLCJlbnVtIjpbIlBPU1QiXX0sImJvZHlUeXBlIjp7InR5cGUiOiJzdHJpbmciLCJlbnVtIjpbImpzb24iLCJmb3JtLWRhdGEiLCJ0ZXh0Il19LCJib2R5Ijp7InR5cGUiOiJvYmplY3QiLCJwcm9wZXJ0aWVzIjp7fSwiYWRkaXRpb25hbFByb3BlcnRpZXMiOmZhbHNlfX0sInJlcXVpcmVkIjpbInR5cGUiLCJtZXRob2QiLCJib2R5VHlwZSIsImJvZHkiXSwiYWRkaXRpb25hbFByb3BlcnRpZXMiOmZhbHNlfSwib3V0cHV0Ijp7InR5cGUiOiJvYmplY3QiLCJwcm9wZXJ0aWVzIjp7InR5cGUiOnsidHlwZSI6InN0cmluZyJ9LCJleGFtcGxlIjp7InR5cGUiOiJvYmplY3QiLCJyZXF1aXJlZCI6WyJ0ZXN0bmV0IiwibW9jayIsInNrdSIsImNvZGUiXSwicHJvcGVydGllcyI6eyJ0ZXN0bmV0Ijp7InR5cGUiOiJib29sZWFuIiwiY29uc3QiOnRydWV9LCJtb2NrIjp7InR5cGUiOiJib29sZWFuIiwiY29uc3QiOnRydWV9LCJub3RpY2UiOnsidHlwZSI6InN0cmluZyJ9LCJza3UiOnsidHlwZSI6InN0cmluZyJ9LCJwcm9kdWN0Ijp7InR5cGUiOiJzdHJpbmcifSwiZmFjZVZhbHVlIjp7InR5cGUiOiJvYmplY3QiLCJwcm9wZXJ0aWVzIjp7ImFtb3VudCI6eyJ0eXBlIjoiaW50ZWdlciJ9LCJjdXJyZW5jeSI6eyJ0eXBlIjoic3RyaW5nIn19fSwicHJpY2UiOnsidHlwZSI6Im9iamVjdCIsInByb3BlcnRpZXMiOnsiYW1vdW50Ijp7InR5cGUiOiJzdHJpbmcifSwiYXNzZXQiOnsidHlwZSI6InN0cmluZyJ9LCJuZXR3b3JrIjp7InR5cGUiOiJzdHJpbmcifX19LCJwYXllciI6eyJ0eXBlIjoic3RyaW5nIiwiZGVzY3JpcHRpb24iOiJFSVAtMzAwOSBzaWduZXIgYWRkcmVzcyJ9LCJjb2RlIjp7InR5cGUiOiJzdHJpbmciLCJwYXR0ZXJuIjoiXk1PQ0stWzAtOWEtZl17MTZ9JCIsImRlc2NyaXB0aW9uIjoiTW9jayBnaWZ0IGNvZGUgKG5vdCByZWRlZW1hYmxlKSJ9LCJ0eCI6eyJ0eXBlIjoic3RyaW5nIiwicGF0dGVybiI6Il4weFswLTlhLWZBLUZdezY0fSQiLCJkZXNjcmlwdGlvbiI6IlNldHRsZW1lbnQgdHggaGFzaCAodGhlIG9yZGVyIElEKTsgYWxzbyBpbiBQQVlNRU5ULVJFU1BPTlNFIn0sImV4cGxvcmVyIjp7InR5cGUiOiJzdHJpbmciLCJmb3JtYXQiOiJ1cmkiLCJkZXNjcmlwdGlvbiI6IlNldHRsZW1lbnQgdHggb24gU2Vwb2xpYSBCYXNlc2NhbiJ9fX19LCJyZXF1aXJlZCI6WyJ0eXBlIl19fSwicmVxdWlyZWQiOlsiaW5wdXQiXX19fX0=
Decoded:
{
"x402Version": 2,
"error": "Payment required",
"resource": {
"url": "https://gift-by-crypto-agent.kitano787.workers.dev/v1/egift/amazon-jp/1000",
"description": "TESTNET / MOCK. Amazon.co.jp eGift card, JPY 1,000 face value, for 6.67 USDC on Base Sepolia (demo rate 1 USDC = JPY 150). POST with no body; the 402 is the quote. Returns a MOCK code that is not a real gift card.",
"mimeType": "application/json",
"serviceName": "Gift by Crypto (TESTNET)",
"tags": [
"gift-card",
"amazon-japan",
"egift",
"testnet",
"mock"
],
"iconUrl": "https://gift-by-crypto-agent.kitano787.workers.dev/icon.svg"
},
"accepts": [
{
"scheme": "exact",
"network": "eip155:84532",
"amount": "6670000",
"asset": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
"payTo": "0x8aC20aB2AF691b85c0eff1D39bb4ebFEF164aE28",
"maxTimeoutSeconds": 300,
"extra": {
"name": "USDC",
"version": "2"
}
}
],
"extensions": {
"bazaar": {
"info": {
"input": {
"type": "http",
"bodyType": "json",
"body": {},
"method": "POST"
},
"output": {
"type": "json",
"example": {
"testnet": true,
"mock": true,
"notice": "TESTNET / MOCK: Base Sepolia test USDC only. Codes are mocks, not real Amazon gift cards.",
"sku": "amazon-jp-1000",
"product": "Amazon.co.jp eGift card JPY 1000 (MOCK)",
"faceValue": {
"amount": 1000,
"currency": "JPY"
},
"price": {
"amount": "6.67",
"asset": "USDC",
"network": "eip155:84532"
},
"payer": "0x0000000000000000000000000000000000000000",
"code": "MOCK-0123456789abcdef",
"tx": "0x0000000000000000000000000000000000000000000000000000000000000000",
"explorer": "https://sepolia.basescan.org/tx/0x0000000000000000000000000000000000000000000000000000000000000000"
}
}
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"input": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "http"
},
"method": {
"type": "string",
"enum": [
"POST"
]
},
"bodyType": {
"type": "string",
"enum": [
"json",
"form-data",
"text"
]
},
"body": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"additionalProperties": false
},
"output": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"example": {
"type": "object",
"required": [
"testnet",
"mock",
"sku",
"code"
],
"properties": {
"testnet": {
"type": "boolean",
"const": true
},
"mock": {
"type": "boolean",
"const": true
},
"notice": {
"type": "string"
},
"sku": {
"type": "string"
},
"product": {
"type": "string"
},
"faceValue": {
"type": "object",
"properties": {
"amount": {
"type": "integer"
},
"currency": {
"type": "string"
}
}
},
"price": {
"type": "object",
"properties": {
"amount": {
"type": "string"
},
"asset": {
"type": "string"
},
"network": {
"type": "string"
}
}
},
"payer": {
"type": "string",
"description": "EIP-3009 signer address"
},
"code": {
"type": "string",
"pattern": "^MOCK-[0-9a-f]{16}$",
"description": "Mock gift code (not redeemable)"
},
"tx": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{64}$",
"description": "Settlement tx hash (the order ID); also in PAYMENT-RESPONSE"
},
"explorer": {
"type": "string",
"format": "uri",
"description": "Settlement tx on Sepolia Basescan"
}
}
}
},
"required": [
"type"
]
}
},
"required": [
"input"
]
}
}
}
}
2. Pay and receive the code
Use any x402 v2 client. With the Coinbase Agentic Wallet CLI, keys stay with Coinbase: a human signs in once by email and sets the wallet's spending limits, then an agent pays.
npx awal@2.12.2 auth login you@example.com # human, once (email one-time code)
npx awal@2.12.2 auth verify <code>
npx awal@2.12.2 x402 pay https://gift-by-crypto-agent.kitano787.workers.dev/v1/egift/amazon-jp/1000 -X POST --max-amount 7000000 --json
# --max-amount is in USDC base units (7000000 = 7 USDC); the wallet refuses anything above it.
# The CLI wraps this API's response body in "data": { "code": "MOCK-...", "tx": "0x...", "explorer": "https://sepolia.basescan.org/tx/0x..." }
The 200 body carries the settlement tx hash as tx and a Basescan link as explorer. The response header PAYMENT-RESPONSE (base64 JSON) holds the full settlement: transaction and payer.
Real settlement on Base Sepolia: 0xf36189c5f21e9d6d4ae3b1681ee29b3c969d1ef37295cd849817f398de30a310
Prices
| Face value | Price | Endpoint |
|---|---|---|
| JPY 1,000 | 6.67 USDC | POST https://gift-by-crypto-agent.kitano787.workers.dev/v1/egift/amazon-jp/1000 |
| JPY 5,000 | 33.34 USDC | POST https://gift-by-crypto-agent.kitano787.workers.dev/v1/egift/amazon-jp/5000 |
| JPY 10,000 | 66.67 USDC | POST https://gift-by-crypto-agent.kitano787.workers.dev/v1/egift/amazon-jp/10000 |
Network and payment
- Protocol: x402 v2, scheme
exact(EIP-3009transferWithAuthorization) - Network: Base Sepolia
eip155:84532 - Asset: USDC
0x036CbD53842c5426634e7929541eC2318f3dCF7e(6 decimals) - Facilitator: Coinbase CDP
- One fixed
payToaddress for all buyers; the payer is the EIP-3009 signer and the order is the tx hash.
Limits
- Testnet only. Codes are mocks in the form
MOCK-+ 16 hex characters and cannot be redeemed. - One code per payment: replaying a payment signature does not return another code.
- If issuing fails, the payment is not settled and no USDC moves.
- No refunds, accounts or order history: the chain is the ledger.
Machine-readable
- /openapi.json (OpenAPI 3.1 with
x-payment-info) - /.well-known/x402
- /v1/products