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.
| Surface | Use when | Primary routes | Credential |
|---|---|---|---|
| v1 SDK Events | You need stable event logging, receipts, anchoring, and exports. | /v1/sdk/events, /v1/sdk/events/batch, /v1/events/{id}/proof, /v1/exports/{id}/truth-package/verify | Tenant system key or tenant auth, depending on route. |
| v2 Proofstream | You 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 API | You receive evidence and must check it before relying on it. | /v2/verify, /v1/public/verify | No tenant cookie for public proof objects. |
| Audit packs | You need a portable evidence bundle for an auditor or regulator workflow. | /v2/audit/packs, /v2/tenant/audit/packs | Tenant auth/system policy. |
| Connectors | An external source system emits evidence into Attesto. | /v2/connectors/signed-webhooks/{id}/events, /v2/connectors/repository-webhooks/{id}/events | Connector-specific signed envelope. |
| Marketplace | Public users browse connectors; tenants acquire/install; marketplace developers submit validated connector manifests. | /v1/marketplace/items, /v1/marketplace/developer-tiers, /v1/marketplace/publisher/assets | Public for browse; tenant session for install; marketplace developer session for publishing. |
| Identity and settings | A tenant user signs in, accepts an invite, or configures enterprise SSO. | /v1/auth/discover, /v1/auth/external/start, /v1/settings/identity-providers | Tenant browser session and CSRF for settings; short-lived login state for SSO. |
| Public status | You want customer-safe component health, latency, uptime bars, and incident state. | /api/status, /v1/status | Public, secret-free status payload. |
Origins
| Origin | Purpose |
|---|---|
https://verify.attesto.eu | Public API, health, signing public key, v1 proof verification, v2 Proofstream verification. |
https://dashboard.attesto.eu | Tenant dashboard, system registration, key reveal-once, exports, webhooks, connectors, billing. |
https://audit.attesto.eu | Auditor-facing portal for invited external auditors. |
https://status.attesto.eu | Customer-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.
| Route | Purpose | Security notes |
|---|---|---|
POST /v1/auth/discover | Accepts 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/providers | Returns safe provider labels for enabled login paths. | No client secrets or private metadata. |
POST /v1/auth/external/start | Creates 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/signup | Password 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-invite | Accepts 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/me | Session 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.
| Field | Meaning | Requirement |
|---|---|---|
occurred_at | Source-system event time. | Required for Proofstream events and must include timezone or UTC offset. |
source_timezone | IANA timezone for the registered source system. | Defaults from tenant timezone; use values such as Europe/Amsterdam or Europe/Berlin. |
| Connector received time | When Attesto or Local Vault received the source event. | Set by the receiving service, not by untrusted frontend code. |
| Normalized UTC time | Canonical 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.
| Case | Result |
|---|---|
| Same key, same request | Original response is replayed. |
| Same key, changed payload | 409 Conflict. |
| No key on write path | Request 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.
POST /v1/sdk/eventslogs one event.POST /v1/sdk/events/batchlogs up to 1000 events.GET /v1/events/{eventId}/proofreturns anchored proof material for an event.POST /v1/public/verifyverifies a v1 proof object.POST /v1/exports/{exportId}/truth-package/verifyrecords a backend-validatedtruth_package.verifiedevent after a verifier report proves the exported package was cryptographically checked.
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 family | Purpose | Credential |
|---|---|---|
GET /v1/dashboard | Returns 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-key | Register 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}/proof | Inspect tenant events and proof material. | Tenant session. |
POST /v1/events/{event_id}/retrieve, GET /v1/events/{event_id}/retrieve/status | Start 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/verify | Create, 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}/deliveries | Manage 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-invite | Invite tenant users, resend invites, update roles/status, and revoke access. | Tenant session; owner/admin role for mutations. |
GET/POST/PATCH/DELETE /v1/parties | Maintain 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/portal | Read 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}/revoke | Grant, 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.
POST /v2/streamscreates a stream.POST /v2/streams/{streamId}/eventsappends one event and returns a signed receipt.POST /v2/streams/{streamId}/events/batchappends multiple events with receipt results.GET /v2/streams/{streamId}/headreturns the current append-only stream head.GET /v2/receipts/{eventId}returns the stored receipt.POST /v2/verify/receiptverifies one receipt object directly.GET /v2/windows/{windowId}returns window evidence and inclusion material.GET /v2/checkpoints/{checkpointId}returns checkpoint evidence.GET /v2/checkpoints/{checkpointId}/consistency?from=...returns consistency evidence.GET /v2/witness/policies/{policyId}returns the witness policy used for quorum checks.GET /v2/anchors/{anchorEpochId}returns anchor epoch evidence.GET /v2/ivc/epochs/{ivcEpochId}returns Proof of Evolution epoch evidence.POST /v2/audit/packscreates an offline verifier bundle when the range has the required witness and anchor evidence.POST /v2/verifyverifies receipt, stream, checkpoint, consistency, anchor, IVC, or bundle objects.
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 family | Purpose | Credential |
|---|---|---|
GET /v2/tenant/streams, GET /v2/tenant/streams/{stream_id}/events | List 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/epochs | Read proof health, fork evidence, and Proof of Evolution epochs. | Tenant session. |
GET /v2/tenant/streams/{stream_id}/windows, /checkpoints | Inspect closed windows and checkpoints for a stream. | Tenant session. |
POST /v2/tenant/audit/packs | Create 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.
| Route | Purpose |
|---|---|
GET /v1/settings | Returns the tenant settings snapshot, including safe identity-provider metadata. |
PATCH /v1/settings/tenant | Updates tenant display settings, locale, and timezone policy. |
GET /v1/settings/identity-providers | Lists tenant SSO providers and public setup values. |
POST /v1/settings/identity-providers | Adds 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 family | Purpose | Credential |
|---|---|---|
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}/commit | Create, 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}/events | Ingests a signed webhook event from an external source system. | Connector signed envelope. |
POST /v2/connectors/repository-webhooks/{connector_id}/events | Ingests 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-tokens | Create a short-lived, single-use enrollment token; only the token hash is stored after creation. | Tenant session. |
POST /v2/local-vault/enroll | Exchange a valid enrollment token for an installation credential and public installation metadata. | Single-use enrollment token. |
POST /v2/local-vault/installations/{installation_id}/events | Relay encrypted-spool events from the customer edge into Proofstream. | Local Vault installation credential. |
POST /v2/local-vault/installations/{installation_id}/witness/checkpoints | Submit 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 family | Purpose | Credential |
|---|---|---|
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/me | Create 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/installs | List the tenant's connector entitlements and installs. | Tenant session. |
POST /v1/marketplace/items/{slug}/acquire, /install, /install/update, /revoke | Acquire, install, update, or revoke tenant access to a connector asset. | Tenant session and CSRF. |
GET /v1/marketplace/items/{slug}/artifact | Download 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/profile | Create, read, and update publisher profile metadata. | Marketplace developer session and CSRF for writes. |
GET /v1/marketplace/publisher/billing-state, POST /publisher/upgrade, /publisher/billing-portal | Inspect 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/status | Start Stripe Connect payout onboarding and refresh payout readiness for paid connector publishing. | Marketplace developer session and CSRF. |
POST /v1/marketplace/publisher/assets | Submit 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.
GET https://status.attesto.eu/healthreturns status-service health.GET https://status.attesto.eu/api/statusreturns the public status payload used by the page.GET https://status.attesto.eu/v1/statusis the versioned status payload alias.
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
| Status | Meaning | Integrator action |
|---|---|---|
400 | Malformed request or unsupported verifier object. | Fix request shape and retry with a new idempotency key if body changes. |
401 | Missing or invalid system key. | Rotate or reconfigure server-side credential. |
403 | Authenticated key lacks access to the tenant, system, or stream. | Check tenant/system assignment. |
404 | Object is not visible to the caller or does not exist. | Confirm IDs and tenant scope. |
409 | Idempotency conflict, sequence conflict, or append conflict. | Do not blindly retry changed bodies; inspect conflict details. |
422 | Request is syntactically valid but violates the route contract. | Fix field values, policy references, or object kind. |
429 | Rate limit. | Back off with jitter and keep idempotency keys stable. |
5xx | Service-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.
