Attesto

API

Public API

The production API origin for SDKs and public verification is https://verify.attesto.eu. Tenant browser workflows live on https://dashboard.attesto.eu.

Choose the right API family

Attesto has multiple public surfaces because evidence work happens in different places. Use the SDK/API from your server to create evidence, webhooks to receive lifecycle notifications, connectors to capture source-system observations, and verifier endpoints when another system needs to check evidence before trusting it.

SurfaceUse whenPrimary routesCredential
v1 SDK EventsYou need stable event logging, receipts, anchoring, and exports./v1/sdk/events, /v1/sdk/events/batch, /v1/events/{id}/proof, /v1/exports/{id}/truth-package/verifyTenant system key or tenant auth, depending on route.
v2 ProofstreamYou need ordered streams, receipts, windows, checkpoints, witnesses, anchors, and bundles./v2/streams, /v2/streams/{id}/events, /v2/checkpoints/{id}Tenant system key for server ingest; tenant session for dashboard views.
Verifier APIYou receive evidence and must check it before relying on it./v2/verify, /v1/public/verifyNo tenant cookie for public proof objects.
Audit packsYou need a portable evidence bundle for an auditor or regulator workflow./v2/audit/packs, /v2/tenant/audit/packsTenant auth/system policy.
ConnectorsAn external source system emits evidence into Attesto./v2/connectors/signed-webhooks/{id}/events, /v2/connectors/repository-webhooks/{id}/eventsConnector-specific signed envelope.
MarketplacePublic users browse connectors; tenants acquire/install; marketplace developers submit validated connector manifests./v1/marketplace/items, /v1/marketplace/developer-tiers, /v1/marketplace/publisher/assetsPublic for browse; tenant session for install; marketplace developer session for publishing.
Identity and settingsA tenant user signs in, accepts an invite, or configures enterprise SSO./v1/auth/discover, /v1/auth/external/start, /v1/settings/identity-providersTenant browser session and CSRF for settings; short-lived login state for SSO.
Public statusYou want customer-safe component health, latency, uptime bars, and incident state./api/status, /v1/statusPublic, secret-free status payload.

Origins

OriginPurpose
https://verify.attesto.euPublic API, health, signing public key, v1 proof verification, v2 Proofstream verification.
https://dashboard.attesto.euTenant dashboard, system registration, key reveal-once, exports, webhooks, connectors, billing.
https://audit.attesto.euAuditor-facing portal for invited external auditors.
https://status.attesto.euCustomer-safe service status API and status page. It deliberately excludes the private admin control panel.

Authentication

Server-side event ingest uses a tenant system key in the Authorization: Bearer header. Public verification routes validate supplied proof objects and do not require tenant cookies. Tenant dashboard routes use the existing secure browser session plus CSRF recovery for mutating requests. Do not put system keys or SSO client secrets in frontend bundles.

curl -X POST https://verify.attesto.eu/v1/sdk/events \
  -H "Authorization: Bearer $ATTESTO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $ATTESTO_IDEMPOTENCY_KEY" \
  --data-binary @event.json

Email-first authentication routes

Main tenant users sign in through email discovery on dashboard.attesto.eu. Attesto returns one recommended next step instead of showing every provider at once. Marketplace developer accounts, admin staff auth, and auditor auth remain separate surfaces.

RoutePurposeSecurity notes
POST /v1/auth/discoverAccepts an email and optional invite token, then returns password, OAuth/OIDC, SAML, organization SSO, or signup/trial as the next step.Does not expose a provider wall or secret provider config.
GET /v1/auth/providersReturns safe provider labels for enabled login paths.No client secrets or private metadata.
POST /v1/auth/external/startCreates OAuth/OIDC state, nonce, and PKCE data, then returns the redirect URL for the discovered provider.State is short-lived and single-use.
GET /v1/auth/external/callback/{provider_id}Verifies the provider callback and issues the existing tenant session cookies.Issuer, audience, nonce, JWKS, and verified email are checked.
GET /v1/auth/saml/metadata/{provider_id}Returns tenant-specific SAML SP metadata for enterprise setup.Safe to share with the tenant identity provider.
POST /v1/auth/saml/acs/{provider_id}Consumes signed SAML assertions.Rejects unsigned, replayed, expired, wrong-audience, and wrong-recipient assertions.
POST /v1/auth/login, POST /v1/auth/signupPassword fallback and clean signup/trial creation after discovery recommends that path.Password fallback remains scoped to tenant dashboard users; marketplace developer accounts are separate.
GET /v1/auth/invite/{token}Returns invite context for the email-first acceptance flow.Invite token is validated before any identity is linked.
POST /v1/auth/accept-inviteAccepts an invite with password setup or provider-based activation.External linking requires verified email and tenant match.
POST /v1/auth/refresh, POST /v1/auth/logout, GET /v1/auth/csrf, GET /v1/auth/meSession refresh, logout, CSRF recovery, and current user identity.Use browser credentials; never log session cookies.

See Tenant SSO for the Entra ID, generic OIDC, and SAML setup guide.

Source time and timezone policy

Attesto records when the source system says an event happened and when Attesto received it. Event APIs require timezone-aware timestamps such as 2026-06-07T12:00:00+02:00 or 2026-06-07T10:00:00Z. Tenant timezone is configurable; systems inherit the tenant timezone by default and can set their own source_timezone when the connected source runs in another jurisdiction.

FieldMeaningRequirement
occurred_atSource-system event time.Required for Proofstream events and must include timezone or UTC offset.
source_timezoneIANA timezone for the registered source system.Defaults from tenant timezone; use values such as Europe/Amsterdam or Europe/Berlin.
Connector received timeWhen Attesto or Local Vault received the source event.Set by the receiving service, not by untrusted frontend code.
Normalized UTC timeCanonical comparison time for verification and ordering.Derived server-side while preserving source context.

Idempotency and replay behavior

Write routes accept Idempotency-Key. Repeating the same key with the same canonical request returns the original result. Repeating the same key with a different request fails as a conflict. This protects connector retries and server-side job retries from creating duplicate evidence.

CaseResult
Same key, same requestOriginal response is replayed.
Same key, changed payload409 Conflict.
No key on write pathRequest is rejected when the route requires dedupe.

v1 event ingest

Use v1 when you need the stable event audit trail and anchoring path. SDKs set defaults for event type, status, retries, and idempotency.

Tenant dashboard v1 APIs

These browser APIs power dashboard.attesto.eu. Mutating calls use tenant session cookies and CSRF recovery. Use system keys and SDK routes for server-side ingest; use these routes for tenant operators managing their workspace.

Route familyPurposeCredential
GET /v1/dashboardReturns the tenant dashboard summary used by the operator UI.Tenant session.
GET/POST /v1/systems, PATCH/DELETE /v1/systems/{system_id}, POST /v1/systems/{system_id}/rotate-keyRegister source systems, preserve source timezone policy, and reveal or rotate system keys once.Tenant session; writer role for mutations.
GET /v1/events, GET /v1/events/{event_id}, GET /v1/events/{event_id}/proofInspect tenant events and proof material.Tenant session.
POST /v1/events/{event_id}/retrieve, GET /v1/events/{event_id}/retrieve/statusStart and monitor archive retrieval for archived event evidence.Tenant session; writer role to initiate retrieval.
GET/POST/DELETE /v1/exports, POST /v1/exports/{export_id}/download/prepare, GET /v1/exports/{export_id}/download?ticket=..., POST /v1/exports/{export_id}/truth-package/verifyCreate, download, delete, and verification-record Truth Package exports.Tenant session; writer role for creation, deletion, and verification record submission.
GET/POST/PATCH/DELETE /v1/webhooks, POST /v1/webhooks/{webhook_id}/rotate-secret, GET /v1/webhooks/{webhook_id}/deliveriesManage signed tenant webhooks, rotate the one-shot delivery secret, and inspect delivery attempts.Tenant session; admin role for webhook mutations.
GET/POST/PATCH/DELETE /v1/users, POST /v1/users/{user_id}/resend-inviteInvite tenant users, resend invites, update roles/status, and revoke access.Tenant session; owner/admin role for mutations.
GET/POST/PATCH/DELETE /v1/partiesMaintain external party records used in tenant evidence workflows.Tenant session; admin role for mutations.
GET /v1/packs, POST /v1/packs/{vertical_id}/install, DELETE /v1/packs/{vertical_id}List, install, and remove tenant evidence packs without seeding synthetic data.Tenant session; admin role for install/remove.
GET /v1/billing/account, POST /v1/billing/top-up, PATCH /v1/billing/auto-reload, GET /v1/billing/ledger, GET /v1/billing/usage, POST /v1/billing/portalRead the PAYG credit wallet, start Stripe Checkout for an Evidence Credits top-up, configure auto-reload, inspect ledger/usage, or open the Stripe billing portal.Tenant session; admin role for checkout and portal sessions.
GET/POST /v1/auditor-invites, POST /v1/auditor-invites/{access_id}/revokeGrant, list, and revoke external auditor access to the read-only audit portal.Tenant session; admin role for grant/revoke.

Minimal event body:

{
  "type": "ai.decision",
  "status": "verified",
  "occurred_at": "2026-06-07T12:00:00Z",
  "source_ref": "case-2026-0001",
  "payload": {
    "model": "risk-classifier-v4",
    "decision": "manual_review",
    "policy_id": "policy-2026-01"
  }
}

v2 Proofstream

Proofstream adds append-only streams, signed receipts, windows, checkpoints, witness evidence, anchors, bundles, and offline verification.

Create a stream:

curl -X POST https://verify.attesto.eu/v2/streams \
  -H "Authorization: Bearer $ATTESTO_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @- <<JSON
{
  "system_id": "sys_...",
  "use_case": "ai-decision-history",
  "policy_id": "policy-2026-01",
  "metadata": {
    "owner": "risk-platform",
    "environment": "production"
  }
}
JSON

Append an event:

curl -X POST https://verify.attesto.eu/v2/streams/$STREAM_ID/events \
  -H "Authorization: Bearer $ATTESTO_API_KEY" \
  -H "Idempotency-Key: $ATTESTO_IDEMPOTENCY_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @- <<JSON
{
  "source_ref": "case-2026-0001:decision-1",
  "event_type": "ai.decision",
  "occurred_at": "2026-06-07T12:00:00+02:00",
  "payload": {
    "decision": "manual_review",
    "score": 91,
    "policy_id": "policy-2026-01"
  }
}
JSON

Receipt response shape:

{
  "stream_event_id": "sev_...",
  "stream_id": "str_...",
  "seq_no": 1,
  "event_hash": "sha256-hex",
  "stream_head_hash": "sha256-hex",
  "receipt": {
    "protocol": "ATTESTO-PROOFSTREAM-001",
    "alg": "Ed25519",
    "kid": "proofstream-receipt-key",
    "signature": "hex-encoded-signature"
  }
}

Tenant Proofstream and dashboard APIs

Tenant browser APIs expose the same evidence model inside the dashboard without requiring frontend access to server-side system keys. Mutating dashboard calls use browser cookies and CSRF recovery.

Route familyPurposeCredential
GET /v2/tenant/streams, GET /v2/tenant/streams/{stream_id}/eventsList streams and inspect stream events visible to the tenant.Tenant session.
GET /v2/tenant/receipts/{stream_event_id}Inspect the stored receipt for a tenant-visible stream event.Tenant session.
GET /v2/tenant/streams/{stream_id}/proof-state, /forks, /ivc/epochsRead proof health, fork evidence, and Proof of Evolution epochs.Tenant session.
GET /v2/tenant/streams/{stream_id}/windows, /checkpointsInspect closed windows and checkpoints for a stream.Tenant session.
POST /v2/tenant/audit/packsCreate a tenant-authorized offline bundle for auditor review.Tenant session plus tenant policy.
PUT /v2/tenant/witness/policies/{policy_id}Update a tenant witness policy with the configured quorum rules.Tenant session plus tenant policy permission.

Tenant settings and SSO APIs

Tenant settings are only available to authenticated tenant users with the required role. Provider secrets are encrypted server-side and are never returned to the browser after save.

RoutePurpose
GET /v1/settingsReturns the tenant settings snapshot, including safe identity-provider metadata.
PATCH /v1/settings/tenantUpdates tenant display settings, locale, and timezone policy.
GET /v1/settings/identity-providersLists tenant SSO providers and public setup values.
POST /v1/settings/identity-providersAdds Entra ID, generic OIDC, or SAML provider configuration.
PATCH /v1/settings/identity-providers/{provider_id}Updates enabled state, domains, issuer metadata, or rotated secrets.
DELETE /v1/settings/identity-providers/{provider_id}Disables and removes a tenant identity provider.

Connector and Local Vault APIs

Connectors are production evidence sources. Tenant users configure connector records in the dashboard, while source systems post events through provider-specific signed envelopes or Local Vault relay. Every connector event must include source system, source object, source event type, source timestamp with timezone, idempotency reference, and a normalized payload commitment.

Route familyPurposeCredential
GET/POST /v2/tenant/connectors/signed-webhooks, DELETE /v2/tenant/connectors/signed-webhooks/{connector_id}Create, list, and revoke generic signed webhook connectors. Connector secrets are returned once at creation time when applicable and are never returned again.Tenant session.
GET/POST /v2/tenant/connectors/s3-objects, DELETE /v2/tenant/connectors/s3-objects/{connector_id}, POST /v2/tenant/connectors/s3-objects/{connector_id}/commitCreate, list, revoke, and commit S3/R2 object evidence connectors. The commit route records object metadata and integrity without proxying object content.Tenant session.
GET/POST /v2/tenant/connectors/repository-webhooks, DELETE /v2/tenant/connectors/repository-webhooks/{connector_id}Create, list, and revoke GitHub/GitLab repository webhook connectors.Tenant session.
POST /v2/connectors/signed-webhooks/{connector_id}/eventsIngests a signed webhook event from an external source system.Connector signed envelope.
POST /v2/connectors/repository-webhooks/{connector_id}/eventsIngests repository change evidence.Provider webhook/signature contract.
GET/POST /v2/tenant/local-vault/installations, DELETE /v2/tenant/local-vault/installations/{installation_id}Manage Local Vault edge installations and revoke edge credentials fail-closed.Tenant session.
POST /v2/tenant/local-vault/enrollment-tokensCreate a short-lived, single-use enrollment token; only the token hash is stored after creation.Tenant session.
POST /v2/local-vault/enrollExchange a valid enrollment token for an installation credential and public installation metadata.Single-use enrollment token.
POST /v2/local-vault/installations/{installation_id}/eventsRelay encrypted-spool events from the customer edge into Proofstream.Local Vault installation credential.
POST /v2/local-vault/installations/{installation_id}/witness/checkpointsSubmit customer-side witness checkpoint statements when witness mode is enabled by policy.Local Vault witness credential.

Provenance APIs (Attesto 3)

The provenance lane is live on https://verify.attesto.eu. A provenance-class stream receives commitment-only envelopes from a Local Vault in provenance mode: randomized commitments, proof material and allowlisted public metadata. Raw content, prompts, file names and provider output never reach the platform, and there is no API to retrieve a capsule because Attesto does not hold one. Routes answer 404 on a deployment whose provenance lane is disabled; errors carry a {"code", "message"} detail.

RoutePurposeCredential
PUT /v2/tenant/witness/policies/{policy_id}Declare the witness quorum policy before creating a stream under that policyId. Production runs with an explicit policy required, so stream creation refuses to invent one (409 explicit witness quorum policy required); mode: "managed-shadow" with empty witnessKeys selects the managed witness.Tenant owner/admin session.
POST /v2/provenance/streamsCreate a provenance stream from useCase and policyId; the body has no metadata. Idempotent: the same inputs return the same stream with created: false. POST /v2/streams keeps creating legacy streams; when the platform's provenance lane is on, each newly created legacy stream carries a visible compatibilityWarning, and once legacy creation is switched off it refuses with 403 legacy_stream_creation_disabled.System API key.
POST /v2/local-vault/installations/{installation_id}/provenance-eventsRelay one ATTESTO-PROVENANCE-001 envelope from the vault; the stream is read from the envelope and the installation object advertises the path as provenanceEndpointPath. Returns the Proofstream receipt plus provenanceAck (accepted, replayed, installationId, sourceRef, envelopeHash).The installation's Ed25519 signature over the envelope; no bearer token.
POST /v2/streams/{stream_id}/provenance-eventsSame ingest addressed by stream. A legacy stream answers 409 provenance_stream_class_required; an L1/L2 envelope the platform cannot substantiate answers 422 provenance_assurance_not_substantiated.System API key plus the envelope signature.
POST /v2/local-vault/installations/{installation_id}/attestations, GET .../attestations/{attestation_ref}Register and read an ATTESTO-VAULT-ATTESTATION-001 record: pkcs11-key-custody substantiates L1, tpm2-quote substantiates L2. The platform verifies the record and returns attestationRef, assuranceCapability, verified and expiresAt.Record signed by the installation key; the read is public.
GET /v2/local-vault/installations/{installation_id}/key-statusThe installation's key lifecycle for offline revocation checks: keyId, publicKeyHex, status, revokedAt, revocationReason, replacedByInstallationId, revocationInstantReconstructed. Answers for revoked installations too, carries no activity summary and no verdict; the verifier compares against its own receipt time.None (public on purpose).
GET /v2/streams/{stream_id}/provenance-events/{source_ref}/bundle-inclusion?from_checkpoint_id=&to_checkpoint_id=The inclusion object proving one capsule root under a verifier bundle's provenance_root, addressed by the checkpoint range the bundle was built from. Hand it with the bundle to an SDK's verify_bundle_provenance.System API key.
GET/PUT /v2/tenant/provenance/provider-policy, GET /v2/local-vault/installations/{installation_id}/provider-policyWhich providers an installation may run, with a reviewable reason per allowed provider; the vault reads its tenant's policy from the installation route.Tenant session; installation-scoped read.
POST /v2/local-vault/installations/{installation_id}/migration-status, GET /v2/tenant/local-vault/migration-statusThe vault's signed migration phase report (observe, parity, cutover-ready, cutover, legacy-retained) and the tenant's view of it, with reportedAt.Signed by the installation key; tenant session for the list.

Create a provenance stream:

curl -X POST https://verify.attesto.eu/v2/provenance/streams \
  -H "Authorization: Bearer $ATTESTO_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @- <<JSON
{
  "useCase": "ai-image-provenance",
  "policyId": "policy-2026-01"
}
JSON

Rollout state: Phase A of the controlled rollout ran on production on 2026-08-23 with a first-party tenant, and the lane-based rollback was rehearsed against production; Phases B to D have not started. The offline verifiers for disclosures, bundle provenance, key revocation and effective assurance are documented in the SDK guide; the vault side is in the Local Vault guide.

Marketplace APIs

Marketplace APIs power marketplace.attesto.eu. The public catalog is read-only. Tenant acquisition, installation, artifact download, and revocation require an authenticated tenant session plus CSRF. Publisher signup, profile management, developer checkout, payout onboarding, and asset submission use a separate marketplace-only developer account. Public docs intentionally omit private Attesto review and publication endpoints.

Route familyPurposeCredential
GET /v1/marketplace/categories, /developer-tiers, /items, /items/{slug}Browse public connector categories, developer tiers, and validated public assets.Public, read-only.
POST /v1/marketplace/auth/signup, /auth/login, /auth/logout, GET /auth/csrf, /auth/meCreate and use marketplace-only developer accounts. These accounts cannot sign in to the tenant dashboard.Marketplace developer credentials/session.
GET /v1/marketplace/me/entitlements, /me/installsList the tenant's connector entitlements and installs.Tenant session.
POST /v1/marketplace/items/{slug}/acquire, /install, /install/update, /revokeAcquire, install, update, or revoke tenant access to a connector asset.Tenant session and CSRF.
GET /v1/marketplace/items/{slug}/artifactDownload the connector manifest artifact after entitlement is active.Tenant session with active entitlement.
GET /v1/marketplace/evidence/{receipt_id}Fetch marketplace evidence receipt metadata for tenant-visible marketplace actions.Tenant or marketplace session scoped to the evidence tenant.
GET/POST/PATCH /v1/marketplace/publisher/profileCreate, read, and update publisher profile metadata.Marketplace developer session and CSRF for writes.
GET /v1/marketplace/publisher/billing-state, POST /publisher/upgrade, /publisher/billing-portalInspect developer tier state, start Stripe Checkout for paid developer tiers, or open the billing portal.Marketplace developer session and CSRF for writes.
POST /v1/marketplace/publisher/payout/onboarding, /publisher/payout/statusStart Stripe Connect payout onboarding and refresh payout readiness for paid connector publishing.Marketplace developer session and CSRF.
POST /v1/marketplace/publisher/assetsSubmit a connector manifest into private Attesto review. Public listing is never automatic.Marketplace developer session, CSRF, and eligible developer tier for paid assets.

Public status API

status.attesto.eu exposes customer-safe health for public services. It includes component status, latency, uptime bars, incident summaries, generated time, and timezone metadata. It does not expose private admin status, tenant identifiers, logs, secrets, provider payloads, or raw database details.

See Public status page for the public visibility model and component list.

Verification behavior

Verification fails closed on malformed objects, changed payloads, changed sequence numbers, removed or inserted events, stale checkpoints, wrong witness signatures, wrong anchors, and ambiguous fork evidence.

Truth Package downloads and verification are separate lifecycle events. A download records truth_package.accessed, proving that the package was served. A successful verifier report submitted to /v1/exports/{exportId}/truth-package/verify records truth_package.verified, proving that a verifier checked the package hash, manifest hash, and included artifacts. The final ZIP hash is recorded after the ZIP bytes are finalized and is not embedded back into the same ZIP; that avoids circular self-reference while keeping the downloadable bytes independently hashable.

curl -X POST https://dashboard.attesto.eu/v1/exports/$EXPORT_ID/truth-package/verify \
  -H "Authorization: Bearer $ATTESTO_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @truth-package-verification-report.json
curl -X POST https://verify.attesto.eu/v2/verify \
  -H "Content-Type: application/json" \
  --data-binary @attesto-bundle.json

Error semantics

StatusMeaningIntegrator action
400Malformed request or unsupported verifier object.Fix request shape and retry with a new idempotency key if body changes.
401Missing or invalid system key.Rotate or reconfigure server-side credential.
403Authenticated key lacks access to the tenant, system, or stream.Check tenant/system assignment.
404Object is not visible to the caller or does not exist.Confirm IDs and tenant scope.
409Idempotency conflict, sequence conflict, or append conflict.Do not blindly retry changed bodies; inspect conflict details.
422Request is syntactically valid but violates the route contract.Fix field values, policy references, or object kind.
429Rate limit.Back off with jitter and keep idempotency keys stable.
5xxService-side failure.Retry with the same idempotency key and preserve the original body.

API keys stay server-side

Attesto system keys are bearer credentials. Use them only from trusted server-side processes, connector edges, or secret-managed job runners.