Technical reference · May 2026

ZizkaDB

The operational database for AI agents. This document describes architecture, APIs, data semantics, and how ZizkaDB fits alongside vector databases, application databases, and tracing tools.

Overview

ZizkaDB stores agent events — decisions, tool calls, messages, and outcomes — with causal links, semantic search over history, reconstruction of logged state at a timestamp, and statistical behavioral baselines per agent.

LayerRoleExamples
Vector retrievalDocument / knowledge search by embeddingPinecone, Qdrant, Weaviate
Application stateTransactional app dataPostgres, Redis
Agent operationsDecision history, lineage, driftZizkaDB
Traces & evalsSpans, experiments, framework hooksLangSmith, OpenTelemetry
Agent runtime
 ├── Vector DB          →  RAG / knowledge retrieval
 ├── Postgres / Redis   →  app state, caches, users
 ├── ZizkaDB            →  events, why(), at(), baseline, forget()
 └── OTel / LangSmith   →  distributed traces (optional)

Problem domain

Production agent systems typically need:

  • Causal debugging — walk from a bad output to the event that triggered it
  • State at time T — what was logged for an agent before a given timestamp
  • Cross-session memory — under your API keys, retention policy, and erasure controls
  • Behavior change detection — compare recent sessions to that agent's historical pattern

ZizkaDB targets these operational concerns. It does not replace embedding indexes for document RAG or distributed tracing for infrastructure spans.

Architecture

Managed (db.zizka.ai)

ComponentTechnologyNotes
DashboardNext.js 14PM2 :3001, nginx TLS
APIFastAPI (Python)Docker :8000
Primary storePostgres + pgvectorEvents, tenants, metadata
Vector searchQdrantSemantic search index
CacheRedisSessions / cache
Edgenginx/ → dashboard, /v1/ → API, /swagger → OpenAPI

Self-hosted

Docker Compose stack: Postgres (pgvector), Qdrant, Redis, API. Dashboard is optional (run from dashboard/). Requires OPENAI_API_KEY for embedding-backed features; logging and causal APIs work without it.

git clone https://github.com/Zizka-ai/ZizkaDB
cp .env.example infra/.env
docker compose -f infra/docker-compose.yml up -d

Data model

Every record is an event:

FieldTypeDescription
agentstringAgent identifier (fleet key)
eventstringEvent type label (e.g. tool_call, user_message)
dataJSON objectArbitrary payload you control
parent_idUUID (optional)Causal parent event
session_idstring (optional)Groups a run / conversation
metadataJSON (optional)Tenant tags (user_id, env, etc.)
timestampISO 8601Server-assigned or client-provided
checksumSHA-256Hash over canonical payload bytes

Multi-tenancy: API keys (zizkadb_live_*) scope all reads and writes to a tenant. Dashboard auth uses email OTP → JWT.

Capabilities

Event logging
POST /v1/events · db.log(...)

Append events. Use parent_id to build causal trees.

Causal lineage
GET /v1/events/{id}/why · db.why(event_id)

Returns ancestor chain from event to root.

Semantic search
POST /v1/search · db.search(query, agent=..., limit=...)

Embeddings via OpenAI text-embedding-3-small on ingest.

Time travel
GET /v1/events/at · db.at(agent, timestamp)

Aggregate logged events ≤ timestamp into a state snapshot.

Context injection
POST /v1/memory/context · db.context_for(agent, task, max_tokens=...)

Recent + semantically relevant events formatted for system prompts.

Behavioral baseline
GET /v1/agents/{id}/baseline · db.baseline(agent, recent_window=...)

Drift score vs historical event distribution; needs session volume.

Session diff
GET /v1/memory/diff/{session_id} · db.memory_diff(session_id)

Summary of event counts, errors, and changes within a session.

GDPR erasure
DELETE /v1/memory/forget · db.forget(filter_key, filter_value)

Deletes events (and vectors) matching metadata filter.

Time travel semantics

at(agent, timestamp) reconstructs logged state by aggregating all events for that agent with timestamp ≤ T. The returned structure reflects what was recorded in ZizkaDB, not a re-execution of the LLM or tools.

PropertyBehavior
DeterminismSame event log → same reconstructed snapshot
LLM outputsNot re-generated; only stored payloads are returned
ChecksumsPer-event SHA-256 enables integrity verification of stored payloads
CompletenessDepends on what your integration logged (gaps = missing parent events)

Integrity & retention

  • Events are stored in Postgres with an append-by-default write pattern; each payload includes a SHA-256 checksum for integrity verification.
  • forget() removes events matching metadata filters (GDPR right to erasure) — storage is not WORM/immutable.
  • Managed plans enforce retention windows (90 days Pro, 1 year Team); self-hosted retention is operator-defined.
  • Bulk signed audit export is on the product roadmap; today, export via API/query and verify checksums per event.

Performance expectations

ZizkaDB is built for normal agent loops — tool calls, messages, and decisions — not for blockchain-scale write throughput. Stack: Postgres (events), Qdrant (vectors), Redis (cache).

ModeWrite pathTypical use
Logging onlyPostgres INSERT + SHA-256 checksumFast enough for typical agent step loops
With semantic searchAbove + OpenAI embedding + Qdrant upsert (per log)Fine for normal volume; embedding adds network latency
why() / queryPostgres reads on explicit event_id or filtersNo hidden session state on the server

High-frequency fleets (thousands of parallel writes per second) are not a v1 target. Async embedding queues and published benchmarks are on the roadmap as usage grows.

Security (early stage)

ZizkaDB v1 is aimed at developers and small teams — not enterprise compliance certification yet. Here is what we do today:

  • In transit: TLS on managed cloud (db.zizka.ai via nginx).
  • Tenant isolation: every API call scoped by API key or JWT to a tenant_id; no cross-tenant reads.
  • At rest: standard Postgres / disk encryption on the operator's infrastructure (AWS EBS on managed; your disk when self-hosted).
  • BYOK embedding keys: encrypted in Postgres (Fernet) when you bring your own OpenAI key.
  • GDPR erasure: forget() deletes matching events and vectors.
  • Telemetry: one anonymous SDK/MCP startup ping — opt out with ZIZKADB_TELEMETRY=false.

Not claimed today: SOC 2, HIPAA, or formal DPAs. For enterprise security review, contact founder@zizka.ai.

Integration

Concurrency: Python and TypeScript SDKs are stateless HTTP clients — no thread-local storage or contextvars. Pass agent, session_id, parent_id, and event_id explicitly on each call. Safe in FastAPI, Celery, and parallel async workers.

SurfaceInstallUse case
Python SDKpip install zizkadb-sdkFastAPI, notebooks, batch
TypeScript SDKnpm install zizkadb-sdkNode, Bun, Deno, edge
MCP serveruvx zizkadb-mcpClaude Desktop, Cursor — no app refactor
RESTcurl / any HTTPGo, Rust, Java, mobile

Cloud default host: https://db.zizka.ai. Self-host: pass host= to the SDK or set ZIZKADB_HOST for MCP.

pythonfrom zizkadb import ZizkaDB

db = ZizkaDB("zizkadb_live_xxxx")  # managed
# db = ZizkaDB(host="http://localhost:8000")  # self-host

msg = await db.log(agent="bot", event="user_message", data={"text": "..."})
tool = await db.log(agent="bot", event="tool_call", data={...}, parent_id=msg.event_id)
chain = await db.why(tool.event_id)

Cursor MCP (30 seconds)

Add to ~/.cursor/mcp.json or project .cursor/mcp.json, then reload MCP:

json{
  "mcpServers": {
    "zizkadb": {
      "command": "uvx",
      "args": ["zizkadb-mcp"],
      "env": { "ZIZKADB_API_KEY": "zizkadb_live_xxxx" }
    }
  }
}

Self-host: set ZIZKADB_HOST to http://localhost:8000 instead (dev key auto-injected).

MCP tools

log_event, search_memory, get_context, why, query_events, time_travel, memory_diff, forget — see setup guide for config.

Telemetry: one anonymous SDK startup ping (name, version, OS, cloud vs self-host). Opt out: ZIZKADB_TELEMETRY=false.

REST API

Base URL https://db.zizka.ai. Auth: Authorization: Bearer <token>. Interactive schema: /swagger.

MethodPathPurpose
POST/v1/eventsLog event
GET/v1/eventsQuery events
GET/v1/events/{id}/whyCausal chain
GET/v1/events/atState at timestamp
POST/v1/searchSemantic search
POST/v1/memory/contextPrompt context block
GET/v1/memory/diff/{session_id}Session summary
DELETE/v1/memory/forgetMetadata erasure
GET/v1/agentsList agents
GET/v1/agents/{id}/baselineDrift / baseline
GET/healthHealth check

Deployment

ModeCostData residency
Self-hostedFree (AGPL core)Your VPC / machine
Managed Pro€39/moZizka cloud
Managed Team€99/moZizka cloud + higher limits

Onboarding: signup → email OTP → Settings → API key → SDK or MCP env.

Comparison

Capability matrix (May 2026). Verify competitor docs before external debates; ~ = partial support.

CapabilityLangSmithMem0PineconeZizkaDB
Agent event logging
Causal lineage~
Time travel (logged state at T)
Semantic search on agent history
Any framework / model~
Behavioral baseline / drift
Cross-agent fleet queries
Per-event checksum
Self-host (free tier)

Licensing

ComponentLicense
Core API + self-host stackAGPL-3.0
Python SDKAGPL-3.0
TypeScript SDKAGPL-3.0
MCP serverMIT

AGPL applies when you modify and distribute the server. MCP is MIT for IDE integration. Commercial embedding requires legal review.

Plan limits

PlanEvents / monthRetention
Self-hostedUnlimited (your hardware)Operator-defined
Pro (€39/mo)100M90 days
Team (€99/mo)Up to 1B (plan cap)1 year

Baseline/drift requires sufficient session_id coverage; early agents report warming_up or insufficient_data.

FAQ

How is this different from LangSmith?

LangSmith focuses on LangChain-centric tracing and evals. ZizkaDB is a standalone operational store with causal trees, time travel over logged state, fleet baselines, and framework-agnostic ingestion.

How is this different from Mem0?

Mem0 optimizes long-term memory retrieval for prompts. ZizkaDB adds causal lineage, session replay, drift baselines, and checksum-backed event storage.

Do we replace Pinecone?

No. Pinecone indexes documents for RAG. ZizkaDB indexes agent decision history. Most teams use both.

Does ZizkaDB wrap LLM calls?

No. You call log() at existing decision points. Optional parent_id links causality.

Latency impact?

Logging is async HTTP. Embedding runs on ingest; hot path is typically fire-and-forget await db.log(...).

PII and GDPR?

You control data and metadata. forget() deletes by metadata filter. Self-host keeps data in your infrastructure.

PyPI package name?

Install zizkadb-sdk (not the unrelated agentdb package). Import: from zizkadb import ZizkaDB.

Contact

Producthttps://db.zizka.ai
Docshttps://db.zizka.ai/docs
APIhttps://db.zizka.ai/swagger
GitHubhttps://github.com/Zizka-ai/ZizkaDB
Emailfounder@zizka.ai