sebbi: a receipt for every AI agent action
Your agent refunds a customer, sends an email, moves money or answers a patient. Add one line and every one of those actions gets a sealed receipt with a public link anyone can check: your customer, your auditor, your insurer, a regulator.
pip install sebbi
import sebbi
@sebbi.receipt("refund-decision")
def decide_refund(order):
return {"refund": True, "amount": 42}
decide_refund({"id": 7})
print(sebbi.last().url) # https://sebbi.pro/r/... anyone can check it
No account needed to start. Zero dependencies. Python 3.8+.
Why teams add it
- Proof, not logs. Each receipt sits in a Merkle tree sealed into the sebbi.pro chain, witnessed by independent chains, timestamped into Bitcoin and signed post-quantum. Nobody can quietly edit it afterwards.
- Your data stays yours. Inputs and outputs are fingerprinted (SHA-256) on your machine. Only fingerprints, a short label and a timestamp are sent.
- Never slows your agent. Sealing runs on a background thread in batches. If the network is down, your code carries on.
- A link anyone can check.
receipt.urlworks straight away. Put it in the email, the ticket or the audit file. - Ready for the EU AI Act and UK GDPR. Record-keeping, logging and the right to an explanation all start with being able to show what your AI actually did.
Your framework, one line
LangChain / LangGraph
from sebbi.integrations.langchain import SebbiCallbackHandler
agent.invoke({"input": "..."}, config={"callbacks": [SebbiCallbackHandler()]})
CrewAI
from sebbi.integrations.crewai import step_callback, task_callback
crew = Crew(agents=[...], tasks=[...], step_callback=step_callback, task_callback=task_callback)
OpenAI Agents SDK
from sebbi.integrations.openai_agents import SebbiRunHooks
result = await Runner.run(agent, "...", hooks=SebbiRunHooks())
MCP servers
from sebbi.integrations.mcp import sealed
@mcp.tool()
@sealed("lookup_customer")
def lookup_customer(customer_id: str) -> dict: ...
Anything else
r = sebbi.seal(input=request, output=result, label="send-invoice")
r.wait() # optional: block until sealed
print(r.url, r.sealed, r.block_index)
Async functions work with the same decorator. Exceptions are sealed with outcome error and re-raised unchanged.
OpenTelemetry
Already tracing your agents? One line seals every agent run and tool call you trace, and writes the receipt link onto the span, so it shows up in Jaeger, Tempo, Honeycomb, Datadog, Langfuse or Phoenix next to the span itself.
pip install "sebbi[otel]"
from sebbi.integrations.otel import instrument
instrument() # adds sebbi to your global TracerProvider
Each sealed span gets two attributes: sebbi.receipt.id and sebbi.receipt.url. Recognised out of the box: the OpenTelemetry GenAI conventions (gen_ai.operation.name = execute_tool, invoke_agent), OpenInference (openinference.span.kind), Vercel AI SDK spans, and any span you mark with span.set_attribute("sebbi.seal", True). Options: llm=True (also seal model calls), all_spans=True, filter=fn, prefix="...", on_receipt=fn. Already batching spans? BatchSpanProcessor(SebbiSpanExporter()) does the same without the link on the span.
Only two fingerprints per span leave your process: never span names, attributes, prompts or tool results.
Prove a trace matches its receipts. Export spans as OTLP/JSON (for example the Collector file exporter) and run:
sebbi verify-otlp traces.json
# MATCH https://sebbi.pro/r/r3f9... execute_tool refund
# 2 of 2 spans match their sealed receipts
Anyone holding the trace can run this, without trusting you or sebbi.pro. Change one attribute and that span shows MISMATCH. The fingerprint rules are in span_payload() and are identical in the JavaScript client.
Reversing an action
r = sebbi.seal(order, refund, "refund")
...
sebbi.reverse(r, "Customer cancelled; refund issued")
Refunds, cancellations and withdrawn decisions happen. A reversal never deletes anything: the original receipt stays sealed and valid, and its page shows Reversed, the reason and a link to the sealed reversal receipt. Only whoever sealed the original (this installation, or the same account key) can reverse it, and a reversal cannot itself be reversed.
Settings
| Environment | Meaning |
|---|---|
SEBBI_API_KEY |
Your key from https://sebbi.pro/connect. Optional. |
SEBBI_DISABLED=1 |
Turn every receipt into a no-op (tests, local dev). |
SEBBI_ENDPOINT |
Override the API address. |
SEBBI_OWNER_SECRET |
Fix the owner secret (serverless, several machines). |
Or in code: sebbi.configure(api_key="...").
Pricing
- Free lane: 1,000 receipts a day, no account, no key.
- With a sebbi.pro account: up to 100,000 a day, receipts tied to your account and your evidence packs. 7 days free, then 50p per device per month.
- Checking any receipt is always free.
Command line
sebbi seal "hello world" my-label # prints the receipt link
sebbi check r3f9... # VALID / INVALID
Check a receipt yourself
GET https://sebbi.pro/v1/receipts/<id> returns the leaf, the RFC 6962 inclusion path, the Merkle root and the chain block. The receipt page re-runs every check and lets anyone paste the original data to confirm it matches, fingerprinted in their own browser.
Docs: https://sebbi.pro/receipts · MCP server: https://sebbi.pro/mcp · Made by Monop Content.
Metadata
Release files for sebbi 1.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| sebbi-1.2.0.tar.gz | 19.9 kB | With provenance | Details for sebbi-1.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| sebbi-1.2.0-py3-none-any.whl | Python 3 | none | any | Details for sebbi-1.2.0-py3-none-any.whl |
Total release size: 39.7 kB
Release files / sebbi-1.2.0.tar.gz
| Download URL | sebbi-1.2.0.tar.gz |
|---|---|
| Size | 19.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f4ab0bb45f2721efcef8ce4aca5eae8b2d22858c0948ca378b1de40dfbb5ba9c
|
|
BLAKE2b-256 checksum How to use checksums |
de64704f890f258725baeca396ce83cd28ef1de818acf6f58955eba19d73cb25
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.
Transparency logRelease files / sebbi-1.2.0-py3-none-any.whl
| Download URL | sebbi-1.2.0-py3-none-any.whl |
|---|---|
| Size | 19.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4cdd12a81804176ab7346e555dd950e4543928e75a127eda23901fffaf36e9eb
|
|
BLAKE2b-256 checksum How to use checksums |
d887d28a8308b983e90ab844cba858ce52d61fff0d7881731fa78e780360137b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.
Transparency logSecurity for sebbi 1.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for sebbi-1.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.