Verify a receipt
Paste a signed report or live prune_metadata (must include receipt_signature). Dashboard request logs are unsigned and will fail.
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