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.4.0.tar.gz (13.6 kB view details)

Uploaded Source

Built Distribution

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

sapixdb-0.4.0-py3-none-any.whl (17.2 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for sapixdb-0.4.0.tar.gz
Algorithm Hash digest
SHA256 37e09b40c37bfdb1d5a13ade58a93b6b8931f3370539a222e60fff878b9dafe6
MD5 d1401080a39195b8e777302cb299328c
BLAKE2b-256 c3b2a9b49300fc31a3a7f88eab16bb8a7f14880c6be8aefe6cde65df4ee7f1dd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sapixdb-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 17.2 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.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 be5acdd37c70ae388212f6155448259e99da32c3b02e098d7e5a2c3024fd27ec
MD5 af2cc8381c1423717c8a882ff1b75487
BLAKE2b-256 14d00b84974a87e2f9b11d34361014a6892eae80f8850d76e94dc15d16e62da5

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