Payment verification for x402
Payment verification for x402: verify a USDC transaction on Base — did this payment really settle, and did it pay the right address the right amount? Send a tx hash (or x402 authorization): confirmations, real-USDC transfer check, expectedPayTo/expectedAmount match, fake-USDC and lookalike-address warnings, who funded the payer (external, self_funded, unknown), plain-English summary and a receipt. Body {txHash|authorization, expectedPayTo?, expectedAmount?}. Free demo: POST /demo.
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
POST https://kertivo.com/check
| Category | Everything else |
|---|---|
| Provider host | kertivo.com |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 3 from 2 payers (the provider's figure, not ours) |
Our checks, last 30 days
We never call tools that send, buy, move money or file anything, not even without paying.
Example input (from the provider)
{
"body": {
"expectedAmount": "1",
"expectedPayTo": "0x509E55c4F898B43C856Fb0E51048B1b7bFBC9eDE",
"txHash": "0xc37cbdfa44230f05129348d5160254abf354791d79de68228b201ba09de143c1"
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"description": "Provide txHash, or authorization (EIP-3009) when you have no tx hash, or both.",
"properties": {
"authorization": {
"description": "Optional EIP-3009 authorization (x402 exact payload) to check when there is no tx or the tx is not found",
"properties": {
"from": {
"pattern": "^0x[0-9a-fA-F]{40}$",
"type": "string"
},
"nonce": {
"pattern": "^0x[0-9a-fA-F]{64}$",
"type": "string"
},
"validAfter": {
"type": [
"string",
"integer"
]
},
"validBefore": {
"description": "unix seconds",
"type": [
"string",
"integer"
]
}
},
"required": [
"from",
"nonce"
],
"type": "object"
},
"expectedAmount": {
"description": "Expected USDC amount, decimal (e.g. \"0.01\")",
"type": [
"string",
"number"
]
},
"expectedPayTo": {
"description": "Expected recipient (full-address, case-insensitive compare)",
"pattern": "^0x[0-9a-fA-F]{40}$",
"type": "string"
},
"expectedPayer": {
"description": "Optional expected payer (aliases from, payer): the USDC Transfer's from must equal it",
"pattern": "^0x[0-9a-fA-F]{40}$",
"type": "string"
},
"minAmount": {
"description": "Optional floor (aliases min_amount, min): payment must be at least this many USDC; unlike expectedAmount it is not exact",
"type": [
"string",
"number"
]
},
"selfAddresses": {
"description": "Optional: other addresses you control; funding from them counts as self_funded",
"items": {
"type": "string"
},
"maxItems": 10,
"type": "array"
},
"token": {
"description": "Optional (aliases asset, currency): \"USDC\" or the Base USDC contract 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (apexfaucet-style). Any other token is a 400 unsupported_token, not charged. Responses always echo token \"USDC\".",
"type": "string"
},
"txHash": {
"description": "Base mainnet transaction hash",
"pattern": "^0x[0-9a-fA-F]{64}$",
"type": "string"
}
},
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"properties": {
"attestation": {
"description": "Signed response (EIP-191 by the key at /.well-known/attestation, not a wallet) over sha256 of this body minus attestation; present when signing is enabled",
"type": "object"
},
"authorization": {
"description": "Present when authorization was given: {from, nonce, used, chainTime, validBefore, expired}",
"type": "object"
},
"block": {
"type": [
"integer",
"null"
]
},
"confirmations": {
"type": "integer"
},
"confirmed": {
"type": "boolean"
},
"found": {
"type": "boolean"
},
"funding": {
"properties": {
"payeeFundedPayer": {
"type": "boolean"
},
"reason": {
"description": "Only present when verdict=unknown",
"enum": [
"no_inbound_in_window",
"scan_incomplete"
],
"type": "string"
},
"scannedBlocks": {
"properties": {
"complete": {
"type": "boolean"
},
"from": {
"type": "integer"
},
"to": {
"type": "integer"
}
},
"type": "object"
},
"topFunders": {
"type": "array"
},
"verdict": {
"enum": [
"external",
"self_funded",
"unknown"
],
"type": "string"
}
},
"type": [
"object",
"null"
]
},
"ignoredFields": {
"description": "Request fields Kertivo Check did not use (they did not affect the answer); only present when there were any",
"items": {
"type": "s