InvoanceInvoance
Log inStart free
Developers
Search docs…⌘K
Getting started
OverviewConceptsAuthenticationCreate an API key
API reference
EndpointsErrors
Audit Logs
Quick startEvent schemaExporting eventsSDK reference
AI Attestations
Quick startAttestation schemaVerification & proofSDK reference
Events
OverviewSDK reference
Documents
OverviewSDK reference
Traces
OverviewSDK reference
SDKs
PythonNode.jsGoJavaRubyRust.NETPHPcURL
Verification
How it works
Support
API FAQ

Traces SDK

The traces namespace lives under client.traces. A trace groups events, documents, and AI attestations into a single verifiable process. When you seal it, Invoance computes a composite hash over every item and locks the trace so no further items can be added — the result is a self-contained proof bundle anyone can independently verify. A key needs the write scope to create, seal, and delete, and the read scope to list, get, and export proofs.

Base URL and authentication

All endpoints live under https://api.invoance.com/v1. Authenticate every request with your API key, either as Authorization: Bearer invoance_live_... or as X-API-Key: invoance_live_....

Install

Python
pip install invoance

# The Ed25519 signature verifier additionally needs PyNaCl:
pip install pynacl

Initialize the client

Both SDKs read INVOANCE_API_KEY from the environment automatically. You can also pass the key explicitly.

Python
import asyncio
from invoance import InvoanceClient

async def main() -> None:
    # Reads INVOANCE_API_KEY from the environment
    async with InvoanceClient() as client:
        ...
    # Or pass it explicitly:
    # async with InvoanceClient(api_key="invoance_live_...") as client:

asyncio.run(main())

Methods

Create a trace

POST/traces

Create a new open trace to group events, documents, and AI attestations into a verifiable process proof.

Python
result = await client.traces.create(
    label="Vendor Onboarding, Acme Corp",
    metadata={
        "department": "procurement",
        "initiated_by": "j.smith@acme.com"
    }
)
print(result.trace_id)

Add items to a trace

Items are not added through client.traces. Instead, pass the trace_id (traceId in the Node SDK) when you ingest an event, document, or AI attestation, and it is grouped into that open trace. The trace_id is a grouping reference, not part of the item's content hash. Add as many items as you need before sealing.

Python
await client.events.ingest(
    event_type="vendor.form.submitted",
    payload={"vendor": "Acme Corp"},
    trace_id="tr_abc123…",  # groups this event into the trace
)

List traces

GET/traces

Paginated listing of traces with optional status filter.

Python
page = await client.traces.list(page=1, limit=50, status="open")
for t in page.traces:
    print(t.trace_id, t.label, t.status)

Get a trace

GET/traces/{trace_id}

Retrieve a single trace with event summaries.

Python
trace = await client.traces.get("tr_abc123…")
print(trace.trace_id, trace.event_count, trace.status)

Seal a trace

POST/traces/{trace_id}/seal

Initiate sealing to compute the composite hash and lock the trace from further items.

Python
result = await client.traces.seal("tr_abc123…")
print(result.status)  # "sealing"
# Poll for completion:
while True:
    trace = await client.traces.get("tr_abc123…")
    if trace.status == "sealed":
        break

Export proof — JSON

GET/traces/{trace_id}/proof

Retrieve the complete proof bundle for a sealed trace with all events and signatures.

Python
bundle = await client.traces.proof("tr_abc123…")
print(bundle.composite_hash, bundle.event_count)
for event in bundle.events:
    print(event.event_id, event.signature)

Export proof — PDF

GET/traces/{trace_id}/proof.pdf

Retrieve the same sealed proof bundle rendered as a signed, human-readable PDF certificate. The SDK returns the raw bytes; write them to disk.

Python
data = await client.traces.proof_pdf("tr_abc123…")
with open("trace-proof.pdf", "wb") as f:
    f.write(data)

Delete a trace

DELETE/traces/{trace_id}

Delete an open trace. Sealed traces are immutable and cannot be deleted; their items remain in the append-only ledger. Deleting an open trace only removes the grouping — any events, documents, or attestations already anchored to it stay anchored.

Python
await client.traces.delete("tr_abc123…")

Errors

Every error is a JSON body of { "error": code, "message": text }. The full catalog, including quota and rate-limit behavior, lives in the error reference.

Next steps

Traces quick startSDK overview
Invoance

Neutral digital proof infrastructure for business. Tamper-evident, independently verifiable records.

Subscribe to our newsletter

Products
Platform
How It Works
Developers
Verify
Resources
Help & Legal
Products
  • Event Ledger
  • Document Anchoring
  • AI Attestation
  • Audit Logs
Platform
  • Why Invoance
  • For Compliance Teams
  • For Finance Teams
  • Pricing
How It Works
  • Overview
  • Event Ledger
  • Document Anchoring
  • AI Attestation
Developers
  • Overview
  • Endpoints
  • Authentication
  • Concepts
Verify
  • Verify Document
  • Verify AI Attestation
  • Verify Event
  • Verify Trace
Resources
  • All Resources
  • SOC 2 Guide
  • HIPAA Guide
  • ISO 27001 Guide
Help & Legal
  • Support
  • Status
  • Verification Help
  • FAQ

Invoance provides technical verification and proof infrastructure for digital records. Invoance does not issue legal, financial, or regulatory advice.

Records anchored through Invoance are cryptographically signed and tamper-evident by design. Invoance does not verify the accuracy, legality, or authenticity of document contents, only that a record existed in a specific form at a specific time. Verification links are publicly resolvable and do not require authentication. Invoance does not act as a custodian of funds, a legal authority, or a regulated financial entity. Use of Invoance does not constitute legal compliance. Consult qualified counsel for your specific obligations.

© 2025 – 2026 Invoance, Inc. All rights reserved.••