Skip to main content

Official Python SDK for SapixDB — the agent-native living database

Project description

SapixDB Python SDK

Official Python SDK for SapixDB — the agent-native living database.

Supports both sync and async (asyncio / FastAPI / Django Async). Python 3.9+.

Installation

pip install sapixdb
# or
uv add sapixdb
# or
poetry add sapixdb

Quick Start

from sapixdb import SapixClient

db = SapixClient(url="http://localhost:7475", agent="my-app")

# Write a record
record = db.collection("products").write({
    "name": "Classic T-Shirt",
    "price": 29.99,
    "stock": 100,
})
print(record.id)    # "nuc_abc123"
print(record.hash)  # "sha3:e7f2a1..."

# Read latest records
products = db.collection("products").latest()

# Filter
shirts = db.collection("products").find({"category": "apparel"})

# Time travel — what did the DB look like yesterday?
from datetime import datetime, timedelta, timezone
yesterday = (datetime.now(timezone.utc) - timedelta(days=1)).isoformat()
snapshot = db.collection("orders").as_of(yesterday).latest()

Async Usage

import asyncio
from sapixdb import AsyncSapixClient

async def main():
    db = AsyncSapixClient(url="http://localhost:7475", agent="my-app")
    record = await db.collection("products").write({"name": "T-Shirt", "price": 29.99})
    products = await db.collection("products").latest()

# Or as a context manager
async def main():
    async with AsyncSapixClient(url="http://localhost:7475", agent="my-app") as db:
        record = await db.collection("products").write({"name": "T-Shirt"})

asyncio.run(main())

FastAPI Integration

from fastapi import FastAPI
from sapixdb import AsyncSapixClient

app = FastAPI()
db = AsyncSapixClient(url="http://localhost:7475", agent="store")

@app.post("/products")
async def create_product(name: str, price: float):
    record = await db.collection("products").write({"name": name, "price": price})
    return {"id": record.id, "hash": record.hash}

@app.get("/products")
async def list_products():
    items = await db.collection("products").latest()
    return [{"id": r.id, **r.data} for r in items]

API Reference

SapixClient / AsyncSapixClient

Parameter Type Default Description
url str SapixDB agent URL
agent str Agent ID (matches SAPIX_AGENT_ID)
headers dict {} Extra HTTP headers
timeout float 10.0 Request timeout in seconds

db.collection(name)

Returns a CollectionClient (or AsyncCollectionClient).

.write(data)WriteResult

Append a new record. Nothing is ever overwritten.

.write_batch(records)list[WriteResult]

Write multiple records. Async version runs them concurrently.

.get(record_id)NucleotideRecord

Fetch a record by ID. Raises SapixNotFoundError if missing.

.latest(*, filter?, limit?)list[NucleotideRecord]

Current version of every record.

.history(*, filter?, limit?)list[NucleotideRecord]

Full append-only history — every version ever written.

.find(filter, *, limit?)list[NucleotideRecord]

Filter records (latest version only).

.find_one(filter)NucleotideRecord | None

First match, or None.

.as_of(timestamp)CollectionQuery

Scope reads to a point in time. Returns a query object with .latest(), .find(), .find_one(), .all().


db.graph

.relate(src, dst, edge_type, weight=1.0)

Create a typed directed edge between two records.

.add_edge(src, dst, edge_type, weight=1.0)

Full edge creation.

.remove_edge(src, dst, edge_type)

Delete an edge.

.traverse(from_id, *, depth=1, direction="outbound")TraverseResult

Walk the graph. direction: "outbound" | "inbound" | "both".

.neighbors(node_id, direction="outbound")list[NucleotideRecord]

Direct neighbours (depth=1 shortcut).

.edges(node_id)list[GraphEdge]

All outbound edges from a node.


db.ingest(collection, data)WriteResult

Write via the ingest endpoint — for AI agents, webhooks, and pipelines.

db.ingest("ai_decisions", {
    "model": "gpt-4o",
    "action": "approve_loan",
    "confidence": 0.94,
    "reasoning": "Credit score 780, DTI 28%",
})

Error Handling

from sapixdb import SapixError, SapixNetworkError, SapixNotFoundError

try:
    record = db.collection("orders").get("nuc_missing")
except SapixNotFoundError as e:
    print(f"Not found: {e.record_id}")
except SapixNetworkError:
    print("SapixDB is unreachable — is it running?")
except SapixError as e:
    print(f"Error {e.status}: {e}")

Full Example: Online Store

from sapixdb import SapixClient

db = SapixClient(url="http://localhost:7475", agent="store")

# 1. Add a product
shirt = db.collection("products").write({
    "sku": "SHIRT-001", "name": "Classic T-Shirt",
    "price": 29.99, "stock": 200, "category": "apparel",
})

# 2. Register customer
customer = db.collection("customers").write({
    "name": "Alice Johnson", "email": "alice@example.com",
})

# 3. Place order
order = db.collection("orders").write({
    "customer_id": customer.id,
    "items": [{"product_id": shirt.id, "qty": 2, "unit_price": 29.99}],
    "total": 59.98,
    "status": "placed",
})

# 4. Link in graph
db.graph.relate(order.id, customer.id, "placed_by")
db.graph.relate(order.id, shirt.id, "contains")

# 5. Ship (appends — "placed" version is preserved forever)
db.collection("orders").write({
    "customer_id": customer.id,
    "status": "shipped",
    "tracking": "UPS-1Z999AA10123456784",
})

# 6. Audit: what was the order status when it was placed?
original = db.collection("orders").as_of(order.timestamp).find_one(
    {"customer_id": customer.id}
)
print(original.data["status"])  # "placed", not "shipped"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sapixdb-0.3.0.tar.gz (1.6 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sapixdb-0.3.0-py3-none-any.whl (16.5 kB view details)

Uploaded Python 3

File details

Details for the file sapixdb-0.3.0.tar.gz.

File metadata

  • Download URL: sapixdb-0.3.0.tar.gz
  • Upload date:
  • Size: 1.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for sapixdb-0.3.0.tar.gz
Algorithm Hash digest
SHA256 94c909522273706a9a932dc0032191a0535b1585a80c700af66e684bccb9530c
MD5 4a753e08657798acf20513532f6df88f
BLAKE2b-256 b529c655398fc18342f4d84a33a57d7eb0b9e8e838e00238508fd0a54aebb086

See more details on using hashes here.

File details

Details for the file sapixdb-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: sapixdb-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 16.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for sapixdb-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 226cd8098925333c11bb941882dd4e94e1a8f9ef61e2c1032cd58c0fdeb08d2b
MD5 7d7704cc8f325d56f18807244201a1e2
BLAKE2b-256 642ca6a7075c2a5d4fee3a55404a56c2506a58bbff863b5eab0159cecbab7f1e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page