← Documentation

EVIDIQ Notary

Cryptographic receipts for AI outputs. Submit a prompt + response + model id and receive a signed, timestamped, 0G-anchored receipt that proves existence, integrity, and provenance — verifiable offline by anyone.

Quickstart

Connect the EVIDIQ Notary MCP server to any MCP-capable agent:

claude mcp add --transport http evidiq-notary https://mcp.evidiq.dev/notary/mcp

Or probe the live pricing discovery endpoint:

curl -s https://mcp.evidiq.dev/notary/x402

MCP server

The remote MCP endpoint is https://mcp.evidiq.dev/notary/mcp (Streamable HTTP). It exposes six tools — two paid, four free:

{
  "mcpServers": {
    "evidiq-notary": { "url": "https://mcp.evidiq.dev/notary/mcp" }
  }
}

notarize_inference

Submit a single AI inference and receive a signed receipt anchored on 0G Storage.

{
  "prompt": "What is the capital of France?",
  "response": "The capital of France is Paris.",
  "modelId": "glm-5.2",
  "agentId": "0x1234…",
  "context": "User query via chat"
}

prompt, response, and modelId are required. agentId, trustReportHash, and context are optional.

It returns a receipt:

{
  "attestationId": "0xfbd95c81…eeb1",
  "contentHash": "0xfbd95c81…eeb1",
  "promptHash": "0x1c8aff…",
  "responseHash": "0x8452c9…",
  "signature": "0x2f012d7f… (EIP-191)",
  "notaryAddress": "0x8a3c7524Aaed081825aC88eC7f4cCECFc583ee7D",
  "timestamp": "2026-07-17T00:41:15.303Z",
  "modelId": "glm-5.2",
  "merkleRoot": "0xfbd95c81…eeb1",
  "merkleProof": ["0x…"],
  "storageRoot": "0xae8526f7…e894",
  "storageTx": "0xa43c8186…1a5e1"
}

Paying from your agent (x402)

notarize_inference and notarize_batch are metered with x402 v2 (scheme exact, EIP-3009, USDT0 on X Layer / eip155:196). An unpaid call returns HTTP 402 with the payment requirements; the agent signs a gasless authorization and retries with a PAYMENT-SIGNATURE header. The four free tools need no payment — a plain application/json request works.

// 1. Unpaid call -> HTTP 402 with payment requirements
const { accepts: [req] } = await (await callNotarize()).json();

// 2. Sign EIP-3009 transferWithAuthorization (gasless for the payer)
const authorization = {
  from: account.address, to: req.payTo, value: req.amount,
  validAfter: "0", validBefore: String(now + 600), nonce: randomHex32(),
};
const signature = await account.signTypedData({
  domain: { name: req.extra.name, version: req.extra.version,
    chainId: Number(req.network.split(":")[1]), verifyingContract: req.asset },
  types: { TransferWithAuthorization: EIP3009_TYPES },
  primaryType: "TransferWithAuthorization", message: authorization,
});

// 3. Retry with PAYMENT-SIGNATURE -> server settles, returns receipt + settlement tx
const paid = await callNotarize({
  "PAYMENT-SIGNATURE": base64({ x402Version: 2, accepted: req,
    payload: { signature, authorization } }),
});

Per-tool pricing lives at https://mcp.evidiq.dev/notary/x402 — it returns the full 6-tool pricing table in one call.

verify_attestation (free)

Verify any receipt offline-style: recompute keccak256(prompt ‖ response), recover the EIP-191 signer, and brute-force the Merkle proof against the root.

{
  "attestationId": "0xfbd95c81…eeb1",
  "prompt": "What is the capital of France?",
  "response": "The capital of France is Paris.",
  "modelId": "glm-5.2"
}

Returns:

{
  "valid": true,
  "contentMatch": true,
  "signatureValid": true,
  "merkleValid": true,
  "notaryAddress": "0x8a3c7524…3ee7D",
  "note": "Receipt verified: content hash matches, EIP-191 signature valid, Merkle proof valid."
}

What a receipt proves

0G Storage anchoring

Every paid receipt is anchored on 0G mainnet (Aristotle, chain 16661) via the @0gfoundation/0g-ts-sdk. The receipt JSON is uploaded as a ZgFile through the turbo indexer; the returned storageRoot and storageTx are durable, tamper-evident, and fetchable by anyone.

Offline verification

Anyone can verify a receipt without contacting the notary:

  1. Fetch the notary address: notary_pubkey tool.
  2. Recompute contentHash = keccak256(prompt ‖ response).
  3. Recover the EIP-191 signer from signature over the attestation message — must equal notaryAddress.
  4. Verify the Merkle proof against merkleRoot.

Pricing

ToolCostTokenChain
notarize_inference$0.001USDT0X Layer (196)
notarize_batch$0.005USDT0X Layer (196)
verify_attestationFree
get_receiptFree
notary_statsFree
notary_pubkeyFree

Proven on-chain

Every notarization is verifiable end-to-end — the payment settles on X Layer and the receipt is anchored on 0G Storage.

EVIDIQ Notary produces evidence, not permission. A receipt proves the output existed — it does not vouch for the output's correctness. Pair receipts with the EVIDIQ trust layer when you need a capability/risk verdict on the agent that produced it.

← Back to docs