Verify a receipt.
Successful metered responses carry an Ed25519-signed receipt. Paste a request id to fetch its receipt and check the signature against the published public key. Receipts hold SHA-256 hashes and token counts, without prompt or completion content. Content logs are stored separately under our data-handling policy.
A valid signature proves the receipt is ours and untampered. To test the model claim itself against OpenAI directly, run the model verification audit.
Verify it yourself.
This page checks signatures in your browser, but you should not have to trust it. The signing key is Ed25519; the public half is published here and the check is four lines of Node.
Ed25519 public key (raw 32 bytes, base64url)
JSl3dcdGcMcr0A92fXtJEdIRLYbJ9yHp-AQUixzqJO8import { createPublicKey, verify } from "node:crypto";
const receipt = await fetch(
"https://api.draftworks.dev/v1/receipts/" + requestId,
).then((r) => r.json());
const key = createPublicKey({
format: "jwk",
key: { kty: "OKP", crv: "Ed25519", x: "JSl3dcdGcMcr0A92fXtJEdIRLYbJ9yHp-AQUixzqJO8" },
});
const valid = verify(
null,
Buffer.from(receipt.payload, "utf8"),
key,
Buffer.from(receipt.signature, "base64url"),
);prompt_sha256 is the SHA-256 of the raw request body bytes, exactly as you sent them. For non-streaming requests, response_sha256 is the SHA-256 of the raw response body. For streaming requests, it is the SHA-256 of every SSE data payload concatenated with a trailing newline each, [DONE] excluded.
Full specification: /docs/verification.