EvidenodeOpenAPI ↗
DISCOVER → EVALUATE → PAY → USE

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.