On this pageEvidence bundles
Evidence bundles
DocImprint ·
What is in a DocImprint evidence bundle?
manifest.json listing artifact SHA-256 hashes, EIP-191 signature, screenshot PNG, PDF, Markdown, OCR text, and optional Merkle root for citation proofs. Verify free with GET /v1/extract/{id}/verify.
How do I add a post-quantum signature to a DocImprint evidence bundle?
DocImprint is not quantum-resistant. Bind provenance.manifest_sha256 into an external ML-DSA-65 (FIPS 204) token such as FIPSign/PQ-Sign after offline verify. Evidence bundles remain the primary today integrity path; Base/EAS notarization is an optional secondary ECDSA anchor. See /docs/evidence-bundles#pq-sign-binding.
Evidence bundle
Every stored extract produces a verifiable evidence bundle: Markdown, screenshot, OCR text, structured data, a SHA-256 manifest, signature.json (EIP-191 metadata), and optional Base L2 attestation. Complete bundles require a platform signature for valid: true on deep verify. Auditors can verify offline: download the ZIP, recompute manifest.json SHA-256, verify the signature against GET /v1/keys (active and retired keys), and check Merkle citation proofs — without trusting our database.
- Deep verify —
GET /v1/extract/:id/verifyre-fetches R2 and recomputes every hash (409 on tamper; unsigned complete bundles fail) - Citation proofs —
POST .../verify-citationreturns Merkleproof[] - Version history — pass
parent_bundle_id; queryGET .../history - Legal hold —
PUT .../holdblocks delete/GC; hold and handoff events are audit-logged (handoffs are application-layer, not cryptographically signed) - Action receipts — tools/responses include
rcpt_…; list withGET .../{id}/receipts, verify withGET .../receipts/{receipt_id}/verify(free, not owner-gated)
- GET
/v1/extract/{id}FreeBundle status
Fetch bundle metadata: status, manifest_sha256, artifact refs, and notarization fields without downloading the ZIP.
- GET
/v1/extract/{id}/verifyFreeVerify bundle
Recompute SHA-256 over stored artifacts and compare to the signed manifest. Returns verified:true or 409 if anything was tampered with.
- POST
/v1/extract/{id}/verify-citationFreeVerify citation
Prove a chunk_id + quoted text is included in the bundle Merkle tree. Body: { chunk_id, text }. Use after collections ask / search citations.
- GET
/v1/extract/{id}/historyFreeVersion history
Walk parent_bundle_id / superseded_by links for re-extracts of the same source. Useful when a page changed and you need the prior version.
- GET
/v1/extract/{id}/downloadFreeDownload ZIP
Stream the full evidence package (manifest.json, signature.json, screenshot, PDF, Markdown, OCR text) as one archive.
- GET
/v1/extract/{id}/manifestFreeGet manifest
Download raw manifest.json bytes with X-Manifest-SHA256 header. Prefer verify for integrity checks; use this for offline inspection.
- POST
/v1/extract/{id}/notarize$0.05Notarize
Anchor the bundle manifest hash on Base L2 (EAS attestation). Returns tx / attestation ids for public timestamping.
- PUT
/v1/extract/{id}/holdFreeLegal hold
Freeze a bundle so retention GC and DELETE cannot remove it. Use when litigation or investigation requires preservation.
- DELETE
/v1/extract/{id}/holdFreeRelease legal hold
Clear an existing hold so normal retention and delete are allowed again.
- DELETE
/v1/extract/{id}FreeDelete bundle
Permanently delete stored evidence and artifacts. Blocked while on legal hold or after notarization until policy allows.
- POST
/v1/extract/{id}/revokeFreeRevoke
Revoke an EAS attestation for a previously notarized bundle so auditors see it as withdrawn. Notarize first.
- GET
/v1/extract/{id}/provenanceFreeProvenance log
List application-layer events (agent_id, action, query, result_summary) appended to this bundle over time.
- POST
/v1/extract/{id}/provenanceFreeAppend provenance
Record what an agent did with this bundle (action + optional query/summary). Builds an audit trail beyond the signed ZIP.
- POST
/v1/extract/{id}/handoffFreeAgent handoff
Record a from_agent → to_agent custody transfer with an optional note. Call when ownership of the workflow moves between agents.
- GET
/v1/extract/{id}/chainFreeCustody chain
Ordered list of handoffs for a bundle — who held it and when. Pair with receipts for full chain-of-custody.
- GET
/v1/extract/{id}/receiptsFreeList action receipts
Signed receipts that bind a specific agent action to this bundle’s manifest_sha256. Proof the action ran against this exact evidence.
- GET
/v1/extract/receipts/{receipt_id}/verifyFreeVerify action receipt
Independently verify a receipt_id (capability token). Not owner-gated — anyone with the id can check signature + manifest binding.
curl https://api.docimprint.com/v1/extract/ev_abc123/verify
# Deep verify (default): re-hashes manifest + artifacts from R2
# Add ?quick=true for status-only checkcurl https://api.docimprint.com/v1/keys
# Returns active and retired secp256k1 keys (key_id, signer_address, retired_at)
# Use with manifest signature + signature.json from the bundle ZIP for offline verifycurl https://api.docimprint.com/v1/extract/ev_abc123/historycurl -X POST https://api.docimprint.com/v1/extract/ev_abc123/notarize \
-H "X-Payment: <eip712-signed-usdc-transfer>"High-assurance path: external ML-DSA binding (PQ-Sign)
DocImprint evidence bundles are tamper-evident and offline-verifiable under today's classical signatures. DocImprint is not quantum-resistant. For decade-scale / post-quantum scrutiny, bind the exportable provenance.manifest_sha256 into an external ML-DSA-65 (FIPS 204) token (for example FIPSign / PQ-Sign). This is a recommended optional integration — not a DocImprint product dependency.
| Layer | Provides | Does not provide |
|---|---|---|
| Evidence bundle (SHA-256 + Merkle + DocImprint signature) | Primary today integrity / citation path; tamper-evident; offline checkable | Post-quantum signature durability |
External ML-DSA binding of manifest_sha256 | Recommended decade-scale / PQ signing path over the hash binding | Automatic DocImprint feature; replacement for Merkle citation proofs |
| Base / EAS notarization | Optional secondary ECDSA public timestamp / attestation | Primary evidence; PQ durability |
Binding seam: document_hash ← evidence_bundle.provenance.manifest_sha256. Verify the hash independently first via /tools/verify-bundle, MCP verify_bundle, or GET /v1/extract/:id/verify.
// 1) Extract with a stored bundle (API response shape)
const evidence_bundle = await fetch("https://api.docimprint.com/v1/extract?sync=true", {
method: "POST",
headers: {
Authorization: "Bearer dr_live_…",
"Content-Type": "application/json",
},
body: JSON.stringify({ source: "https://example.com/contract.pdf", store: true }),
}).then((r) => r.json())
// 2) Prefer offline verify before binding (ZIP + GET /v1/keys, or free web tool)
// https://docimprint.com/tools/verify-bundle
// MCP: verify_bundle · REST: GET /v1/extract/{bundle_id}/verify
// 3) Binding seam — real field path from ExtractProvenance (buildProvenance)
const document_hash = evidence_bundle.provenance.manifest_sha256 // 64-char hex SHA-256
// 4) Sign with an external ML-DSA-65 (FIPS 204) provider (e.g. FIPSign / PQ-Sign)
// Pseudocode — swap for your vendor's API; DocImprint does not ship ML-DSA keys.
await pqSign.createToken({
algorithm: "ML-DSA-65",
document_hash, // binds the PQ signature to the DocImprint evidence bundle
metadata: { bundle_id: evidence_bundle.bundle_id },
})Bundle output details: Extract guide → Outputs