docimprint

← All docs

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 verifyGET /v1/extract/:id/verify re-fetches R2 and recomputes every hash (409 on tamper; unsigned complete bundles fail)
  • Citation proofsPOST .../verify-citation returns Merkle proof[]
  • Version history — pass parent_bundle_id; query GET .../history
  • Legal holdPUT .../hold blocks delete/GC; hold and handoff events are audit-logged (handoffs are application-layer, not cryptographically signed)
  • Action receipts — tools/responses include rcpt_…; list with GET .../{id}/receipts, verify with GET .../receipts/{receipt_id}/verify (free, not owner-gated)
  • GET/v1/extract/{id}Free

    Bundle status

    Fetch bundle metadata: status, manifest_sha256, artifact refs, and notarization fields without downloading the ZIP.

  • GET/v1/extract/{id}/verifyFree

    Verify 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-citationFree

    Verify 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}/historyFree

    Version 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}/downloadFree

    Download ZIP

    Stream the full evidence package (manifest.json, signature.json, screenshot, PDF, Markdown, OCR text) as one archive.

  • GET/v1/extract/{id}/manifestFree

    Get 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.05

    Notarize

    Anchor the bundle manifest hash on Base L2 (EAS attestation). Returns tx / attestation ids for public timestamping.

  • PUT/v1/extract/{id}/holdFree

    Legal hold

    Freeze a bundle so retention GC and DELETE cannot remove it. Use when litigation or investigation requires preservation.

  • DELETE/v1/extract/{id}/holdFree

    Release legal hold

    Clear an existing hold so normal retention and delete are allowed again.

  • DELETE/v1/extract/{id}Free

    Delete bundle

    Permanently delete stored evidence and artifacts. Blocked while on legal hold or after notarization until policy allows.

  • POST/v1/extract/{id}/revokeFree

    Revoke

    Revoke an EAS attestation for a previously notarized bundle so auditors see it as withdrawn. Notarize first.

  • GET/v1/extract/{id}/provenanceFree

    Provenance log

    List application-layer events (agent_id, action, query, result_summary) appended to this bundle over time.

  • POST/v1/extract/{id}/provenanceFree

    Append 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}/handoffFree

    Agent 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}/chainFree

    Custody 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}/receiptsFree

    List 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}/verifyFree

    Verify action receipt

    Independently verify a receipt_id (capability token). Not owner-gated — anyone with the id can check signature + manifest binding.

bashDeep verify (free)
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 check
bashPublished signing keys
curl 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 verify
bashVersion history
curl https://api.docimprint.com/v1/extract/ev_abc123/history
bashNotarize ($0.05)
curl -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.

LayerProvidesDoes not provide
Evidence bundle (SHA-256 + Merkle + DocImprint signature)Primary today integrity / citation path; tamper-evident; offline checkablePost-quantum signature durability
External ML-DSA binding of manifest_sha256Recommended decade-scale / PQ signing path over the hash bindingAutomatic DocImprint feature; replacement for Merkle citation proofs
Base / EAS notarizationOptional secondary ECDSA public timestamp / attestationPrimary 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.

typescriptBind manifest_sha256 into ML-DSA-65
// 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

Related