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 valuePriceEndpoint
JPY 1,0006.67 USDCPOST https://gift-by-crypto-agent.kitano787.workers.dev/v1/egift/amazon-jp/1000
JPY 5,00033.34 USDCPOST https://gift-by-crypto-agent.kitano787.workers.dev/v1/egift/amazon-jp/5000
JPY 10,00066.67 USDCPOST https://gift-by-crypto-agent.kitano787.workers.dev/v1/egift/amazon-jp/10000

Network and payment

Limits

Machine-readable