Proof of Data
App
Open the app
Seal, rent, verify, waitlist.
Seal a plate
Encrypt a file in this browser to the enclave key.
402
Rent a query
Quote an aggregate and pay it over x402 in USDG.
Verify the enclave
Check a TDX quote against the onchain registry.
The Armour
The model its uploaders own. Trains when the enclave is live.
Join the waitlist
Uploads open in waves, in sign-up order.
Read
Protocol
Documentation
Dev log
X
Docs · Get started

Quickstart

Quote an aggregate, pay it, check the receipt. Five minutes with the SDK served from this site.

  1. Load the SDK from /sdk/pod.mjs. It has no dependencies.
  2. Ask for a quote. Quotes are free and show the plates in scope.
  3. Run the query with any account that can sign typed data. The SDK answers the 402 with an EIP-3009 authorization in USDG.
  4. Check the output against the receipt the Meter recorded.

Load the SDK

agent.mjs
import { createClient } from "https://proofofdata.app/sdk/pod.mjs";
import { privateKeyToAccount } from "viem/accounts";

const pod = createClient({ base: "https://proofofdata.app", meter: process.env.POD_METER });
const account = privateKeyToAccount(process.env.RENTER_KEY);

Get a quote

quote
const q = await pod.quote("commute-minutes-by-weekday");
// 503 { error: "enclave_not_running", quote: { platesInScope, priceUsdg } } until an enclave is live

Run and pay

query
const r = await pod.query({ aggregate: "commute-minutes-by-weekday", account });
// r.body.output   { aggregate, groups: { Mon: { value: 27, plates: 30 }, ... } }
// r.body.receipt  { queryId, platesRead, price, outputHash, ... }

The renter's deposit (5 USDG minimum) must be in the Meter first: call deposit(amount) or depositWithAuthorization. It is what a canary slashes.

Verify the receipt

verify
const v = await pod.verifyReceipt({ queryId: r.body.receipt.queryId, output: r.body.output });
// { settled: true, matches: true, platesRead, price, tx }