{
  "disclaimer": {
    "text": "Not investment advice.",
    "url": "https://agentpaywire.com/disclaimer.json"
  },
  "updated_at": "2026-11-10T04:29:42.812Z",
  "aggregate": {
    "count": 0,
    "mean": null,
    "weighted_mean": null,
    "unique_payers": 0,
    "self_test_count": 0
  },
  "how_to_verify": {
    "statement": "Check every review from the raw proof and signature. A negative rating is not a reason to drop a review. The same payer can replace their own earlier review. One payment proof backs one current review.",
    "x402": {
      "steps": [
        "A null comment is the empty string. Hash the published comment with keccak256 of its UTF-8 bytes. An empty comment hashes the empty byte string.",
        "Build EIP-712 typed data with the domain and Review type in this object. txHash and commentHash are bytes32. timestamp is Unix seconds. rating is uint8.",
        "Recover the signer. It must equal the published payer, compared without checksum case.",
        "On Base, eth_getTransactionReceipt for tx_hash. The receipt status must be success (0x1). The RPC chain id must be 8453.",
        "Find a USDC Transfer log on 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913. Topic0 is 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef. Topic1 is the payer. Topic2 is 0x7BB50FB9141A619961f1c29C4e0b539d60f29D20. The data word uses 6 decimals and must be at least 10000, which is 0.01 USDC.",
        "The paid route is bound by the signature. The USDC transfer does not name the route."
      ],
      "domain": {
        "name": "agentpaywire.com",
        "version": "1",
        "chainId": 8453
      },
      "types": {
        "Review": [
          {
            "name": "rating",
            "type": "uint8"
          },
          {
            "name": "route",
            "type": "string"
          },
          {
            "name": "txHash",
            "type": "bytes32"
          },
          {
            "name": "commentHash",
            "type": "bytes32"
          },
          {
            "name": "timestamp",
            "type": "uint256"
          }
        ]
      },
      "primaryType": "Review",
      "type_string": "Review(uint8 rating,string route,bytes32 txHash,bytes32 commentHash,uint256 timestamp)",
      "comment_hash": "keccak256(utf8(comment))",
      "empty_comment_hash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
      "network": "eip155:8453",
      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "pay_to": "0x7BB50FB9141A619961f1c29C4e0b539d60f29D20",
      "min_amount_atomic": "10000"
    },
    "l402": {
      "steps": [
        "Decode preimage and payment_hash as 32-byte hex. SHA-256 of the preimage bytes must equal payment_hash.",
        "This server also requires that payment_hash to be a settled row in the tokens table, and the named route to have a requests row for that token.",
        "An outside agent can check the hash without us. The settled and route checks are our record of invoices we issued."
      ]
    },
    "self_test": "Payers listed in REVIEW_SELF_TEST_PAYERS are stored with self_test true. They stay in this feed and are left out of the aggregate. The old throwaway named in the request starts with 0x7B77 and ends with 4bE5. Its full address is not in this repository, so the list is empty until that address is set."
  },
  "reviews": []
}
