Evidence for
your execution log.
One Base token address. Fixed-block observations, raw RPC evidence, and a receipt you can keep alongside an agent decision.
Preview · payments are not enabled yet
Try the shape. Then buy live evidence.
The free sample is a historical USDC snapshot. Paid responses collect new observations at a pinned Base block. No account or API key is required.
curl https://www.evidenode.com/v1/sample
curl https://www.evidenode.com/v1/token-evidence \
-H 'Content-Type: application/json' \
-d '{"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}'An unpaid request returns 402 with PAYMENT-REQUIRED when payments are enabled. An x402 buyer signs the stated payment and retries with PAYMENT-SIGNATURE. After successful settlement, receive JSON and the PAYMENT-RESPONSE transaction hash.
Use the official buyer SDK.
Run on your machine with a dedicated buyer wallet holding Base USDC. The example restricts payment to the expected seller, USDC, Base and at most $0.02 per call. Set CLIENT_PRIVATE_KEY locally and EVIDENODE_PAY_TO to the seller address shown in the service manifest. Never send your key to Evidenode.
npm install @x402/fetch @x402/evm viem # Set the environment variables locally, then run your saved example: node buy-evidence.mjs
import {
x402Client,
wrapFetchWithPayment,
decodePaymentResponseHeader,
} from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
import { getAddress, isAddress } from "viem";
// Run on the buyer's machine. This secret never goes to Evidenode.
const secret = process.env.CLIENT_PRIVATE_KEY;
const recipient = process.env.EVIDENODE_PAY_TO;
if (!secret || !/^0x[0-9a-fA-F]{64}$/.test(secret))
throw new Error(
"Set CLIENT_PRIVATE_KEY locally for a dedicated buyer wallet",
);
if (!recipient || !isAddress(recipient))
throw new Error(
"Set EVIDENODE_PAY_TO to the seller address you expect to pay",
);
const origin = new URL(process.env.EVIDENODE_URL ?? "https://evidenode.com");
if (origin.protocol !== "https:" && origin.hostname !== "localhost")
throw new Error("HTTPS is required");
const address = process.argv[2] ?? "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
if (!isAddress(address, { strict: true }))
throw new Error("Invalid token contract address");
const network = process.env.EVIDENODE_PAYMENT_NETWORK ?? "eip155:8453";
if (!["eip155:8453", "eip155:84532"].includes(network))
throw new Error("Unsupported payment network");
const asset =
network === "eip155:8453"
? "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
: "0x036CbD53842c5426634e7929541eC2318f3dCF7e";
const client = new x402Client().register(
network,
new ExactEvmScheme(privateKeyToAccount(secret)),
);
client.registerPolicy((version, requirements) =>
version === 2
? requirements.filter(
(r) =>
r.scheme === "exact" &&
r.network === network &&
getAddress(r.asset) === getAddress(asset) &&
getAddress(r.payTo) === getAddress(recipient) &&
BigInt(r.amount) > 0n &&
BigInt(r.amount) <= 20000n,
)
: [],
);
const paidFetch = wrapFetchWithPayment(fetch, client);
const response = await paidFetch(new URL("/v1/token-evidence", origin), {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify({ address }),
});
if (!response.ok)
throw new Error(`API returned ${response.status}: ${await response.text()}`);
const header = response.headers.get("payment-response");
if (header)
console.error(
JSON.stringify({
settlement: decodePaymentResponseHeader(header),
receipt: response.headers.get("x-evidenode-receipt"),
}),
);
console.log(JSON.stringify(await response.json(), null, 2));
Know what you are buying.
Checks cover bytecode, ERC-20 metadata, owner(), EIP-1967 slots and canonical EIP-1167 proxies. Findings include unknowns and explicit limitations. No honeypot, liquidity, tax, holder or simulation checks. This is not a security audit or permission to trade.
Failed input validation and failed analyses are not settled. If delivery fails after a payment, inspect its transaction before buying again. Public receipts are retained for 30 days from the latest purchase. Save your result: a storage outage after settlement can make the receipt unavailable while the purchased JSON is delivered.