Skip to content
prune.

Verify a receipt

Paste a signed report or live prune_metadata (must include receipt_signature). Dashboard request logs are unsigned and will fail.

Use a signed 7-day report from the dashboard (Shield → Reports) or prune_metadata from a live API response. Dashboard log copies and the homepage walkthrough are not signed and will fail. How receipts work

Check it offline

You never have to take this page's word for it. Fetch the published Ed25519 public key and check the signature yourself:

curl https://api.withprune.com/v1/public-key -o prune-public-key.pem

pip install cryptography
python -c "
import base64, json
from cryptography.hazmat.primitives.serialization import load_pem_public_key
pub = load_pem_public_key(open('prune-public-key.pem','rb').read())
receipt = json.load(open('receipt.json'))
sig = base64.b64decode(receipt['receipt_signature'])
payload = {k: v for k, v in receipt.items()
           if k not in ('receipt_signature','receipt_signed_at','receipt_signing_key_id')}
canonical = json.dumps(payload, sort_keys=True, separators=(',', ':')).encode()
pub.verify(sig, canonical)
print('valid')
"

The signature covers every receipt field except the three receipt_sign* fields, as canonical JSON (sorted keys, compact separators). GET /v1/public-key · POST /v1/receipts/verify