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/plan, POST /v1/billing/checkout, POST /v1/billing/portalRead the active plan, start Stripe Checkout for Starter/Growth/Realtime 30-day trial subscriptions, 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.

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.