SDKs
Python-, TypeScript-, CLI- en Go-SDKs
Attesto biedt vier first-class developer surfaces: Python, TypeScript, Go en de Attesto CLI. Ze delen hetzelfde Proofstream protocol, dezelfde golden vectors, verifier matrix, production origin en regels voor secret-handling.
Package registries
De officiële package identifiers zijn attesto voor
Python en @attesto/sdk voor TypeScript. De huidige
publieke releases zijn attesto==0.4.0 en
@attesto/sdk==0.4.0. Go SDK en CLI rapporteren dezelfde
0.4.0 releaseversion. Installeer alleen uit de officiële
PyPI- en npm-registries; installeer geen SDKs uit mirrors,
willekeurige tarballs of source snapshots.
De release gate scheidt packages van surfaces: registry readiness
verwacht drie package/module distributions (attesto,
@attesto/sdk en de Go module) en vier production
developer surfaces omdat de attesto CLI een first-class
Go-backed verifier surface is. De gate moet
surfacesExpected=4, surfacesReady=4,
cliReady=true en cliVersionMatches=true
rapporteren.
Package artifacts zijn bewust minimaal. npm artifacts bevatten
alleen runtime JavaScript, declaration files, README.md
en package metadata. PyPI production releases zijn wheel-only.
Sourcemaps, raw TypeScript source, tests, caches, source archives,
frontend bundles, API keys, private keys en secret-like materiaal
zijn verboden.
Authentication model
System-key clients worden gebruikt voor event ingest, stream heads, receipts, publieke proof objects, bundles en remote verification. Tenant/operator clients gebruiken een dashboard bearer token voor tenant stream lists, connector installation, Local Vault installation, fork evidence inspection, proof-state views en tenant audit-pack creation. Plaats geen van beide credentials in frontend code.
Article 13 support en Article 12 evidence met één integratieregel
Voor high-risk AI-systemen gaat Article 12 over technische logging-capability en traceerbaarheid, terwijl Article 13 transparantie en bruikbare informatie richting deployers en gebruikers raakt. In Attesto-termen is de exacte integratieregel export OPENAI_BASE_URL=http://localhost:8765/v1: daarmee wijs je OpenAI-compatible calls naar de Attesto Gateway en kan automatische evidence capture starten. Het deterministische Article 12 report legt uit wat is vastgelegd en onafhankelijk verifieerbaar is, en dezelfde receipt-backed trail kan Article 13-documentatie ondersteunen. Dit is bewijs-ondersteuning, geen juridische conformiteitsverklaring.
De concrete one-line gateway-integratie die dit waar maakt is:
export OPENAI_BASE_URL=http://localhost:8765/v1
Vervang localhost in productie door de gedeployde gateway
host en bewaar zowel de provider key als de Attesto system key in
server-side secret storage.
Gebruik dit patroon wanneer je een Python function boundary beheert. De decorator legt commitments over argumenten, return value, timing, source reference en failures vast; het report vat coverage samen zonder LLM.
from attesto import AttestoV2Client, attest, article12
import os
with AttestoV2Client(api_key=os.environ["ATTESTO_API_KEY"]) as capture:
@attest(capture, stream_id="str_...")
def score_case(case: dict) -> dict:
return {"decision": "manual_review", "policy_id": "policy-2026-01"}
score_case({"case_id": "case-2026-0001"})
with AttestoV2Client.with_bearer_token(os.environ["ATTESTO_TENANT_TOKEN"]) as operator:
print(article12(operator, "str_..."))
De capture path gebruikt een system API key; de report path leest tenant stream events en vereist daarom een tenant/operator bearer token.
attesto --token-env ATTESTO_TENANT_TOKEN \
report article12 --stream str_... --output report.md
Wat de SDK afhandelt
De SDKs zijn bewust dunne server-side clients. Ze verbergen het evidence model niet, maar verwijderen repetitief transportwerk zodat je applicatie zich kan richten op de juiste event shape en het verifiëren van teruggegeven evidence.
| Zorgpunt | SDK-gedrag | Developer verantwoordelijkheid |
|---|---|---|
| Base URL | Standaard https://verify.attesto.eu. | Alleen overriden voor private/staging deployments. |
| Authentication | Ondersteunt system API-key mode en tenant bearer-token mode. | Gebruik de smalste credential die nodig is voor de taak. |
| Idempotency | Maakt idempotency keys voor writes wanneer niet aangeleverd. | Herbruik dezelfde key wanneer je dezelfde body retryt vanuit je eigen job system. |
| Retries | Retryt tijdelijke 429, 5xx en transport errors met backoff. | Wijzig payloads niet tussen retries. |
| Proofstream helpers | Biedt stream-, receipt-, checkpoint-, anchor-, IVC-, bundle- en verify helpers. | Kies stream granularity en policy IDs bewust. |
| Errors | Gooit typed auth-, validation-, rate-limit- en server errors. | Log veilige error categories, geen API keys of raw secret-bearing payloads. |
Capability matrix
| Capability | Python | TypeScript | Go | CLI |
|---|---|---|---|---|
| Streams/events/receipts | Ja | Ja | Ja | Ja |
| Windows/checkpoints/consistency | Ja | Ja | Ja | Ja |
| Remote verifier API | Ja | Ja | Ja | Ja |
| Offline receipt verification | Verifier helper/API | Verifier helper/API | Ja | Ja |
| Witness policy en fork evidence | Ja | Ja | Ja | Ja |
| Anchors en IVC epochs | Ja | Ja | Ja | Ja |
| Connectors | Ja | Ja | Ja | Ja |
| Local Vault relay/witness | Ja | Ja | Ja | Ja |
| Release readiness evidence | Via scripts | Via scripts | Via CLI/module tests | Ja |
Python
pip install attesto
import os
from datetime import UTC, datetime
from attesto import AttestoClient
attesto = AttestoClient(api_key=os.environ["ATTESTO_API_KEY"])
ack = attesto.log_event(
type="inference",
status="verified",
ts=datetime.now(UTC),
payload={
"model": "risk-service-v4",
"score": 0.91,
"policy_id": "policy-2026-01",
},
)
print(ack.id)
Python async
import os
from datetime import UTC, datetime
from attesto import AsyncAttestoClient
async with AsyncAttestoClient(api_key=os.environ["ATTESTO_API_KEY"]) as attesto:
ack = await attesto.log_event(
type="ai.decision",
status="verified",
ts=datetime.now(UTC),
payload={"decision": "manual_review", "score": 91},
)
print(ack.id)
TypeScript
npm install @attesto/sdk
import { AttestoClient } from "@attesto/sdk";
const attesto = new AttestoClient({
apiKey: process.env.ATTESTO_API_KEY!,
});
const ack = await attesto.logEvent({
type: "inference",
status: "verified",
ts: new Date(),
payload: {
model: "risk-service-v4",
score: 0.91,
policy_id: "policy-2026-01",
},
});
console.log(ack.id);
TypeScript attestedFetch
Gebruik attestedFetch wanneer een OpenAI-compatible SDK of framework een custom fetch implementation accepteert. Het registreert alleen commitments, nooit raw prompts of completions. strict: true faalt gesloten wanneer evidence niet kan worden ingestuurd; fail-open mode moet gemonitord worden.
import { AttestoV2Client, attestedFetch } from "@attesto/sdk";
const client = new AttestoV2Client({ apiKey: process.env.ATTESTO_API_KEY! });
const fetchWithEvidence = attestedFetch(client, {
streamId: "str_...",
capture: "commitments",
strict: true,
});
Proofstream v2 client
Gebruik AttestoV2Client wanneer je stream-level receipts,
checkpoint consistency, witness policy visibility, verifier bundles
en offline verification helpers nodig hebt.
from attesto import AttestoV2Client
from datetime import UTC, datetime
import os
with AttestoV2Client(api_key=os.environ["ATTESTO_API_KEY"]) as attesto:
stream = attesto.create_stream(
use_case="ai-decision-history",
policy_id="policy-2026-01",
)
receipt = attesto.log_event(
stream_id=stream.stream_id,
source_ref="source-event-001",
event_type="decision",
occurred_at=datetime.now(UTC),
payload={"decision": "review", "score": 91},
)
stored = attesto.get_receipt(receipt.stream_event_id)
report = attesto.verify_receipt(
receipt=stored.receipt,
public_key_hex=os.environ["ATTESTO_RECEIPT_SIGNER_PUBLIC_KEY_HEX"],
stream_event_id=receipt.stream_event_id,
)
assert report.ok
TypeScript Proofstream:
import { AttestoV2Client } from "@attesto/sdk";
const attesto = new AttestoV2Client({
apiKey: process.env.ATTESTO_API_KEY!,
});
const stream = await attesto.createStream({
useCase: "ai-decision-history",
policyId: "policy-2026-01",
});
const receipt = await attesto.logEvent(stream.streamId, {
sourceRef: "case-2026-0001:decision-1",
eventType: "ai.decision",
occurredAt: new Date(),
payload: { decision: "manual_review", score: 91 },
});
const report = await attesto.verifyReceipt({
receipt: receipt.receipt,
streamEventId: receipt.streamEventId,
publicKeyHex: process.env.ATTESTO_RECEIPT_SIGNER_PUBLIC_KEY_HEX!,
});
if (!report.ok) throw new Error(report.problems.join("; "));
Go
Gebruik Go voor infrastructure automation, security tooling, cloud workers en verifier services. De Go SDK gebruikt momenteel alleen de Go standard library en wordt resolved vanaf het publieke go.attesto.eu/sdk module path.
go get go.attesto.eu/sdk
package main
import (
"context"
"fmt"
"log"
"os"
attesto "go.attesto.eu/sdk"
)
func main() {
client, err := attesto.NewClient(os.Getenv("ATTESTO_API_KEY"))
if err != nil {
log.Fatal(err)
}
stream, err := client.CreateStream(context.Background(), attesto.StreamCreateInput{
UseCase: "ai-decision-history",
PolicyID: "policy-2026-01",
})
if err != nil {
log.Fatal(err)
}
receipt, err := client.LogEvent(context.Background(), stream.StreamID, attesto.EventInput{
SourceRef: "case-2026-0001:decision-1",
EventType: "ai.decision",
Payload: attesto.M{"decision": "manual_review", "score": 91},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(receipt.StreamEventID, receipt.EventHash)
}
CLI
De Attesto CLI is de operator- en verifier surface voor scripted workflows. De CLI ondersteunt JSON output, local config, stream/event actions, receipt verification, bundle verification, fork evidence, quorum evidence, connectors, Local Vault en release-readiness evidence checks. De CLI print nooit opgeslagen API keys, tenant tokens of connector secrets.
CLI command reference
| Command group | Subcommands | Gebruik |
|---|---|---|
version, config, login, logout | config get, config set | Versie bekijken en lokale redacted configuratie beheren. |
streams | create, get, head | Streams maken, tenant-visible stream metadata inspecteren en de append-only head ophalen. |
events | log, batch | Één event of een JSON event batch versturen met source timestamps en payload files. |
receipts | get, verify | Een opgeslagen receipt ophalen en lokaal of via /v2/verify/receipt verifiëren. |
windows, checkpoints, anchors, ivc | get, verify, checkpoints consistency, ivc epochs get/verify | Proofstream windows, checkpoint roots, consistency proofs, anchor epochs en IVC epochs ophalen en verifiëren. |
witnesses, quorum, fork-evidence | policies, status, receipts, inspect, verify | Witness policy, proof state, quorum material en fork evidence inspecteren. |
bundles, verify | build, get, verify, offline-verify, verify file, verify truth-package | Verifier bundles bouwen en bundles, portable receipt files of Truth Package ZIPs verifiëren. |
connector, connectors | connector init, connectors create, ingest, revoke, verify | Connector manifests scaffolden, tenant connectors beheren, events ingesten en signed connector payloads verifiëren. |
local-vault | install, relay, spool, status, witness, fork-evidence, revoke | Local Vault installations, encrypted spool workflows, witness receipts, fork evidence en revocation bedienen. |
marketplace | init, validate, submit | Publisher manifests voorbereiden, lokaal valideren en assets indienen voor private Attesto review. |
doctor, report, readiness | report article12, readiness lifecycle/fork-defense/quorum/assurance/connectors/local-vault/nova/production | Install diagnostics, deterministic Article 12 reporting en release-readiness evidence checks draaien. |
cd sdk/go
go run ./cmd/attesto --json version
go run ./cmd/attesto --json \
--api-key-env ATTESTO_API_KEY \
streams create \
--use-case ai-decision-history \
--policy-id policy-2026-01
Offline receipt verification:
go run ./cmd/attesto --json receipts verify \
--file receipt.json \
--public-key-hex "$ATTESTO_RECEIPT_SIGNER_PUBLIC_KEY_HEX"
Production readiness evidence check:
go run ./cmd/attesto --json readiness lifecycle
go run ./cmd/attesto --json readiness fork-defense
go run ./cmd/attesto --json readiness production
Marketplace publisher automation:
go run ./cmd/attesto --json marketplace init \
--output attesto.connector.json \
--slug signed-webhook-evidence \
--name "Generic Signed Webhook Evidence" \
--version 1.0.0 \
--category compliance \
--summary "Produces Attesto evidence for signed webhook events." \
--description "Produces verifiable Proofstream events for signed webhook payloads." \
--publisher-slug attesto \
--publisher-name Attesto \
--repository-url https://git.rotz.ai/rotzmediagroup/attesto-v1/src/branch/attesto-2.0/connectors/webhook \
--docs-url https://docs.attesto.eu/manuals/connectors.html#signed \
--provider-url https://docs.attesto.eu/manuals/connectors.html#signed \
--auth-mode signed-webhook \
--auth-scopes webhook:read \
--sync-modes webhook \
--event-types webhook.event.received \
--canary-ref release/attesto-2.0-connector-assurance-readiness/result.json \
--capabilities proofstream,offline-verification
go run ./cmd/attesto --json marketplace validate \
--manifest-file attesto.connector.json
go run ./cmd/attesto --json \
--token-env ATTESTO_TENANT_TOKEN \
marketplace submit \
--manifest-file attesto.connector.json \
--source-ref https://git.rotz.ai/rotzmediagroup/attesto-v1/src/branch/attesto-2.0/connectors/webhook \
--visibility public \
--pricing-model free
Operator endpoints
Tenant/operator endpoints vereisen bearer-token mode. Gebruik dit alleen in trusted operator automation en nooit in publieke clients.
from attesto import AttestoV2Client
operator = AttestoV2Client.with_bearer_token(
os.environ["ATTESTO_TENANT_TOKEN"],
)
streams = operator.list_tenant_streams()
forks = operator.list_fork_evidence(streams[0]["streamId"])
const operator = new AttestoV2Client({
apiKey: process.env.ATTESTO_TENANT_TOKEN!,
authMode: "bearer",
});
const streams = await operator.listTenantStreams();
const forks = await operator.listForkEvidence(String(streams[0].streamId));
operator, err := attesto.NewBearerClient(os.Getenv("ATTESTO_TENANT_TOKEN"))
if err != nil { log.Fatal(err) }
streams, err := operator.ListTenantStreams(context.Background(), "", 100, 0)
if err != nil { log.Fatal(err) }
Offline en online verify helpers
SDK verification methods zijn nuttig in services die Attesto receipts of bundles ontvangen en fail-closed moeten werken voordat ze deze accepteren.
from attesto import AttestoV2Client
from datetime import UTC, datetime
import os
with AttestoV2Client(api_key=os.environ["ATTESTO_API_KEY"]) as attesto:
report = attesto.verify_object(
kind="bundle",
proof_object=bundle_object,
)
if not report.ok:
raise RuntimeError(report.problems)
const report = await attesto.verifyObject({
kind: "bundle",
object: bundleObject,
});
if (!report.ok) {
throw new Error(report.problems.join("; "));
}
MockAttesto voor lokale tests
attesto.testing.MockAttesto is een Python test harness
voor lokale CI en integratietests. Het gebruikt dezelfde canonical
hashing en receipt shapes als de SDK, maar tekent met een
per-instance throwaway mock key en markeert objecten als mock
evidence. Gebruik het om je applicatieflow zonder netwerktoegang of
Attesto-account te testen; gebruik mock receipts nooit in production
evidence of customer bundles.
MockAttesto is bewust fail-closed tegen echte trust roots: verificatie met een production witness key moet mock evidence verwerpen. Zo blijven tests snel zonder dat synthetic evidence als production proof kan doorgaan.
Companion packages en edge-surfaces
De core SDKs blijven klein. Aparte packages dekken edge relay, MCP tooling, workflow nodes en de toekomstige independent witness node. Deze packages mogen nooit verborgen transitieve dependencies van de core SDKs worden.
| Surface | Package | Gebruik | Statusregel |
|---|---|---|---|
| MCP-server | attesto-mcp | Stelt deterministische Attesto-tools beschikbaar aan MCP-hosts. | Alleen installeren vanuit PyPI release evidence. |
| Local Vault | attesto-local-vault | Versleutelde customer-edge spool, relay en optionele witness mode. | Sleutels blijven lokaal; geen frontend-gebruik. |
| n8n-node | n8n-nodes-attesto | Workflow receipts en signed webhook verification. | Credentials blijven in n8n credentials. |
| Independent witness node | attesto-witness, @attesto/witness, go.attesto.eu/witness | Privacy-preserving observatie van publieke of expliciet gedeelde heads. | Phase-gated; geen core SDK dependency. |
pip install attesto-mcp
pipx install attesto-local-vault
npm install n8n-nodes-attesto
Gespecificeerd als privacy-preserving observation node package. Huidig customer-operated witness gedrag is beschikbaar via Local Vault witness mode; standalone attesto-witness, @attesto/witness en go.attesto.eu/witness mogen alleen worden geïnstalleerd nadat release evidence dat package groen markeert.
Security rules
- Gebruik SDKs alleen vanuit server-side code.
- Bewaar system keys in je secret manager en injecteer ze at runtime.
- Plaats system keys niet in frontend bundles, mobile apps, query strings of logs.
- Gebruik de standaard production origin tenzij je tenant een private deployment origin heeft.
- Houd idempotency ingeschakeld voor ieder write path.
