Rate a call you paid for
POST /api/feedbackTell this server whether a call you paid for delivered what it promised. Send POST /api/feedback with the required fields tx and verdict and pay $0.001 per call over x402 with USDC on an EVM chain (the paying wallet is the identity). It returns a JSON object with recorded, replaced, item, verdict, settlementTx and 4 more.
Bound to the receipt: give it the settlement transaction from that call's PAYMENT-RESPONSE (or Payment-Receipt) header and a verdict of "good" or "bad", and only the wallet the ledger records as having paid for that exact call can write it - so a rating here is always a real customer about a real purchase. One verdict per settlement transaction (sending another replaces yours, it never stacks). A "bad" verdict requires a reason of at least ten characters and is logged for a human with the sha256 of the bytes that call actually served, so the complaint names a specific answer rather than a bad day. Your words are stored for the operator and are never published; the public tally is counts only. Requires an EIP-3009 payment from the same wallet; the $0.001 is the settlement floor, not a charge for complaining, and every refusal is free.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
tx | string | yes | Settlement transaction of the call you are rating, as carried in that response's PAYMENT-RESPONSE (x402) or Payment-Receipt (MPP) header. |
verdict | string | yes | "good" (it delivered what it promised) or "bad" (it did not). |
reason | string | no | What happened, in your own words. Optional on "good", required on "bad" (10 characters minimum, 1000 maximum). Stored for the operator, never published. |
Example request
curl -i -X POST https://agent402.tools/api/feedback \
-H "Content-Type: application/json" \
-d '{"tx":"0x2f1fecade9bd945e7817c11e5a34cafe6b349dd8c92a7587efed1de476bddfeb","verdict":"good"}'
Without payment this returns HTTP 402 Payment Required with the exact price for feedback; any x402 v2 or MPP client pays it and retries.
Example response
{
"recorded": true,
"replaced": false,
"item": "crypto-price",
"verdict": "good",
"settlementTx": "0x2f1fecade9bd945e7817c11e5a34cafe6b349dd8c92a7587efed1de476bddfeb",
"settledAt": "2026-09-03T15:16:06.000Z",
"amountUsd": 0.01,
"responseSha256": "7d2a9b1c4e6f8a0b2c4d6e8f0a1b3c5d7e9f1a3b5c7d9e1f3a5b7c9d1e3f5a7b",
"note": "responseSha256 is sha256 over the exact JSON bytes that call returned. It identifies the answer your verdict is about."
}
| Field | Type | Always present | In the example |
|---|---|---|---|
recorded | boolean | yes | true |
replaced | boolean | yes | false |
item | string | yes | crypto-price |
verdict | string | yes | good |
settlementTx | string | yes | 0x2f1fecade9bd945e7817c11e5a34cafe6b349dd8c92a7587efed1de476bddfeb |
settledAt | string | yes | 2026-09-03T15:16:06.000Z |
amountUsd | number | yes | 0.01 |
responseSha256 | string | yes | 7d2a9b1c4e6f8a0b2c4d6e8f0a1b3c5d7e9f1a3b5c7d9e1f3a5b7c9d1e3f5a7b |
note | string | yes | responseSha256 is sha256 over the exact JSON bytes that call returned. It ide... |
From an MCP client
catalog.call {
"slug": "feedback",
"params": {
"tx": "0x2f1fecade9bd945e7817c11e5a34cafe6b349dd8c92a7587efed1de476bddfeb",
"verdict": "good"
}
}
The hosted connector at https://agent402.tools/mcp needs a payment for feedback; the stdio package pays it from a wallet or from AGENT402_CREDITS_KEY (wallet only for this tool). Local install: npx -y agent402-mcp.
Errors and behavior
txandverdictare required. An input the tool rejects returns an HTTP 4xx whose body carrieserror,tool,expected,requiredandexample, so the caller can correct it.- A paid call that ends in any status of 400 or above is not charged over x402 or MPP: settlement is cancelled when the tool fails.
- Wallet-only: this tool reaches the network or stored state, so it has no proof-of-work tier.
- Identity-bound: results are keyed to the wallet that signed the payment, so only EVM x402 payments are accepted; credits keys and Tempo are refused.
- A
GETorHEADto /api/feedback returns the same 402 quote, so the price can be read without a body. - An
Idempotency-Keyheader makes a retried paid call replay the first 200 instead of charging again (an answer larger than 1 MB is not replayed).
Paid call (JavaScript agent)
import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const client = new x402Client();
client.setSpendControls?.(false); // keep your own spending ceiling in code
registerExactEvmScheme(client, { signer: privateKeyToAccount(KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);
const res = await payFetch("https://agent402.tools/api/feedback", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"tx": "0x2f1fecade9bd945e7817c11e5a34cafe6b349dd8c92a7587efed1de476bddfeb",
"verdict": "good"
}),
});
Related tools
Feedback tally by tool
GET /api/feedback/summaryWhat paying buyers said about each tool on this server: good and bad counts and the number of distinct wallets behind th…
Verify x402 settlement
GET /api/x402-verifyConfirm a USDC payment actually settled: given a tx hash (and network), returns whether it succeeded and the USDC transf…
My usage (wallet-keyed purchase history)
POST /api/my-usageYour own purchase history, keyed to the wallet that pays for the call - no wallet parameter, no signup: the x402 payment…
Build USDC transfer authorization
POST /api/transfer-authorizationBuild the EIP-3009 transferWithAuthorization typed data for a gasless USDC transfer on Base/Polygon/Arbitrum/Optimism/Et…
Transaction status
GET /api/tx-statusCheck the confirmation status of a transaction by hash on Base/Polygon/Arbitrum/Optimism/Ethereum/Monad/Celo/Avalanche/S…
x402 security audit
GET /api/x402-auditGrade any x402 seller's payment-security posture from the outside - a read-only black-box check mapped to the 'Five Atta…