ProofLedger records a SHA-256 fingerprint of a file on a public blockchain and hands back a certificate anyone can check. Put it behind a button in your own product. The file never leaves your servers; only the fingerprint does.
If your users face a counterparty, a dispute, or a claim, a dated record of the exact file is a feature they will thank you for. You already hold the file; the proof is one call away.
Anchor the signed split sheet, the demo and each stem the moment they are uploaded. When two writers disagree later about who had what when, the record is on a public chain, not in your database.
Timestamp every beat at listing time, in batches of a hundred per call. A producer who sent a preview can show the full file existed first, without handing anyone the stems.
Your audit trail says what your servers say. A blockchain anchor adds a timestamp that does not depend on your company existing, and a certificate the other party can verify on their own.
Inspection photos, condition reports, before-and-after sets. Anchor them as they are captured so the date is fixed by the network, not by a device clock anyone can change.
When software acts on someone's behalf, anchoring the log or the output gives a tamper-evident record of what was produced and when. One hash per run, or one batch per day.
It hashes bytes. There is no file-type pipeline and nothing to configure per format. If your product stores files and the date matters, it fits.
Plain HTTPS and JSON with a Bearer key. Everything else is optional.
POST /api/v1/proofs/batch takes up to 100 SHA-256 hashes at once, each with your own record id. Resend the same id and you get the same proof back, so retries are safe. One hash at a time works too.
Register a webhook once. When a proof's Polygon anchor lands, usually within a minute, we POST a signed event to you with the proof and its bundle. Or poll GET /api/v1/proofs?anchored_since=.
Every proof has a public certificate page and a verify link. Put the link behind a button. Approved partners see their own name on it: Recorded through YourApp · Anchored by ProofLedger.
Replace sk_your_key with a key from your account page. The free plan includes 25 API proofs a month, enough to wire the whole flow.
curl -X POST https://proofledger.io/api/v1/proofs/batch \
-H "Authorization: Bearer sk_your_key" \
-H "Content-Type: application/json" \
-d '{"items": [
{"sha256": "<sha256 of file A>", "external_id": "song-42", "filename": "demo.mp3"},
{"sha256": "<sha256 of file B>", "external_id": "split-42", "filename": "split-sheet.pdf"}
]}'
Compute the hash on your side (sha256sum file, or crypto.createHash('sha256') in Node). The file itself is never sent. The response lists each item as created, exists or invalid, with the proof id and certificate link for each.
curl -X POST https://proofledger.io/api/v1/webhooks \
-H "Authorization: Bearer sk_your_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://yourapp.example/hooks/proofledger"}'
The response includes a secret, shown once. Each event arrives with a ProofLedger-Signature header (HMAC-SHA256 over the timestamp and body) so you can confirm it came from us; the reference has the check in Node and Python. Failed deliveries retry for about a day and a half.
{
"id": "evt_123",
"type": "proof.polygon.anchored",
"data": {
"proof": { "id": 42, "external_id": "song-42", "polygon_status": "ANCHORED",
"chain_tx": "0xabc...", "certificate_url": "/cert/42", ... },
"bundle": { "hash": "...", "blockchain": "polygon", "tx_id": "0xabc...",
"anchored_at": "2026-10-15T02:11:09Z", ... }
}
}
Look the record up by external_id, save the certificate link, and store data.bundle next to the file. The bundle is the part that still works if ProofLedger does not.
https://proofledger.io/cert/42
A signed certificate page with the fingerprint, the date and a link to the transaction on a public block explorer. Anyone can open it; no account needed. Approved partners get their name on it.
pip install verify-proof
verify-proof verify demo.mp3 --proof bundle.json
The open-source verify-proof package (PyPI, source) checks the file against the bundle locally, with no network call. The transaction itself is on a public chain. Nothing in that check depends on proofledger.io being up.
No surprises in the integration review.
verify-proof packageRetry-After when you go over. One batch call carries 100 hashes.verify-proof package, an n8n community node (anchor a file from any workflow, trigger on anchored), a Zapier integration (by invite link while it is in review), a Postman collection, and an OpenAPI spec that generates a client in most languages. Plain HTTPS works too.You hash on your servers and send us 64 hex characters, a filename of your choosing and your own record id. That is the whole of what ProofLedger stores about a proof. A SHA-256 fingerprint is one way; it cannot be turned back into the file.
Wire the flow on the free plan, then pick the plan that matches your volume. Branding and higher limits are a support email away. Using the API accepts the API Terms; what we store and who handles it is on the subprocessors page.