HeliosDB-Lite API Reference¶
Complete API reference for all HeliosDB-Lite integration points across languages and deployment modes.
REST API (Server Mode)¶
Base URL: http://localhost:8080 (default)
Endpoints¶
Queries¶
Execute SQL Query
POST /v1/branches/{branch}/query
Content-Type: application/json
Request Body:
{
"sql": "SELECT * FROM users WHERE id = $1",
"params": [1]
}
Response (200 OK):
{
"rows": [
{"id": 1, "name": "Alice", "email": "alice@example.com"}
],
"columns": ["id", "name", "email"],
"rows_affected": 0
}
Error Response (400):
{
"error": {
"code": "42P01",
"message": "relation \"users\" does not exist"
}
}
Execute Natural Language Query
POST /v1/nl/query
Content-Type: application/json
Request Body:
{
"question": "How many users are from California?",
"branch": "main"
}
Response (200 OK):
{
"sql": "SELECT COUNT(*) FROM users WHERE state = 'California'",
"rows": [{"count": 42}],
"columns": ["count"]
}
Query at Timestamp (Time-Travel)
POST /v1/branches/{branch}/query
Content-Type: application/json
Request Body:
{
"sql": "SELECT * FROM users",
"params": [],
"as_of_timestamp": "2025-01-01T00:00:00Z"
}
Response (200 OK):
{
"rows": [...],
"columns": [...],
"rows_affected": 0
}
Vector Search¶
Text Vector Search
POST /v1/vectors/stores/{store}/search/text
Content-Type: application/json
Request Body:
{
"text": "machine learning",
"top_k": 10,
"min_score": 0.5,
"filter": {"category": "tech"}
}
Response (200 OK):
{
"results": [
{
"id": "doc_123",
"score": 0.95,
"content": "Machine learning is...",
"metadata": {"category": "tech", "year": 2024}
}
]
}
Vector Search by Vector
POST /v1/vectors/stores/{store}/search
Content-Type: application/json
Request Body:
{
"vector": [0.1, 0.2, 0.3, ...],
"top_k": 10,
"min_score": 0.5
}
Response (200 OK):
{
"results": [
{
"id": "doc_123",
"score": 0.95,
"content": "...",
"metadata": {}
}
]
}
Store Text with Embedding
POST /v1/vectors/stores/{store}/texts
Content-Type: application/json
Request Body:
{
"texts": ["Document 1", "Document 2"],
"metadatas": [
{"source": "blog"},
{"source": "wiki"}
]
}
Response (200 OK):
{
"ids": ["doc_1", "doc_2"]
}
Vector Store Management¶
List Vector Stores
GET /v1/vectors/stores
Response (200 OK):
{
"stores": [
{
"name": "documents",
"dimensions": 1536,
"metric": "cosine",
"count": 1000
}
]
}
Create Vector Store
POST /v1/vectors/stores
Content-Type: application/json
Request Body:
{
"name": "documents",
"dimensions": 1536,
"metric": "cosine"
}
Response (201 Created):
{
"name": "documents",
"dimensions": 1536,
"metric": "cosine",
"count": 0
}
Branching¶
List Branches
GET /v1/branches
Response (200 OK):
{
"branches": [
{
"name": "main",
"parent": null,
"created_at": "2025-01-01T00:00:00Z"
},
{
"name": "dev",
"parent": "main",
"created_at": "2025-01-10T12:30:00Z"
}
]
}
Create Branch
POST /v1/branches
Content-Type: application/json
Request Body:
{
"name": "feature-branch",
"from_branch": "main"
}
Response (201 Created):
{
"name": "feature-branch",
"parent": "main",
"created_at": "2025-01-15T10:00:00Z"
}
Merge Branches
POST /v1/branches/{source}/merge
Content-Type: application/json
Request Body:
{
"target": "main"
}
Response (200 OK):
{
"status": "merged",
"changes": 5
}
Agent Memory¶
Add Memory
POST /v1/agents/memory/{session_id}/add
Content-Type: application/json
Request Body:
{
"role": "user",
"content": "Hello, how can you help?"
}
Response (200 OK):
{
"status": "stored"
}
Get Memory
GET /v1/agents/memory/{session_id}/messages?limit=50
Response (200 OK):
{
"messages": [
{
"id": "msg_1",
"role": "user",
"content": "Hello",
"timestamp": "2025-01-15T10:00:00Z"
}
]
}
Search Memory
POST /v1/agents/memory/{session_id}/search
Content-Type: application/json
Request Body:
{
"query": "What did we discuss about performance?",
"top_k": 5
}
Response (200 OK):
{
"results": [
{
"id": "msg_123",
"content": "Performance is critical for production...",
"score": 0.92
}
]
}
Document Management¶
List Collections
GET /v1/documents/collections
Response (200 OK):
{
"collections": [
{
"name": "knowledge_base",
"document_count": 150,
"chunk_count": 1200,
"created_at": "2025-01-01T00:00:00Z"
}
]
}
Create Collection
POST /v1/documents/collections
Content-Type: application/json
Request Body:
{
"name": "knowledge_base",
"chunk_size": 512,
"chunk_overlap": 50
}
Response (201 Created):
{
"name": "knowledge_base",
"chunk_size": 512,
"chunk_overlap": 50,
"created_at": "2025-01-15T10:00:00Z"
}
Upload Document
POST /v1/documents/collections/{collection}/documents
Content-Type: multipart/form-data
Form Data:
- file: (binary file content)
- metadata: {"source": "manual", "author": "admin"}
Response (201 Created):
{
"id": "doc_abc123",
"filename": "guide.pdf",
"chunks": 25,
"status": "processed"
}
Search Documents (RAG)
POST /v1/documents/collections/{collection}/search
Content-Type: application/json
Request Body:
{
"query": "How do I configure authentication?",
"top_k": 5,
"include_content": true
}
Response (200 OK):
{
"results": [
{
"chunk_id": "chunk_123",
"document_id": "doc_abc",
"content": "Authentication can be configured...",
"score": 0.95,
"metadata": {"source": "guide.pdf", "page": 5}
}
]
}
Schema Inference¶
Infer Schema from JSON
POST /v1/schema/infer
Content-Type: application/json
Request Body:
{
"format": "json",
"data": [
{"id": 1, "name": "Alice", "score": 95.5},
{"id": 2, "name": "Bob", "score": 87.3}
],
"table_name": "students"
}
Response (200 OK):
{
"sql": "CREATE TABLE students (\n id INTEGER,\n name TEXT,\n score REAL\n);",
"columns": [
{"name": "id", "type": "INTEGER", "nullable": false},
{"name": "name", "type": "TEXT", "nullable": false},
{"name": "score", "type": "REAL", "nullable": false}
]
}
Infer Schema from CSV
POST /v1/schema/infer
Content-Type: application/json
Request Body:
{
"format": "csv",
"data": "id,name,score\n1,Alice,95.5\n2,Bob,87.3",
"table_name": "students"
}
Response (200 OK):
{
"sql": "CREATE TABLE students (...);",
"columns": [...]
}
Chat Completion (AI)¶
Chat Completion
POST /v1/chat/completions
Content-Type: application/json
Request Body:
{
"session_id": "session_123",
"message": "What tables have a customer_id column?",
"include_sql": true
}
Response (200 OK):
{
"response": "I found 3 tables with a customer_id column: orders, invoices, and support_tickets.",
"sql_executed": "SELECT table_name FROM pg_columns WHERE column_name = 'customer_id'",
"results": [
{"table_name": "orders"},
{"table_name": "invoices"},
{"table_name": "support_tickets"}
]
}
Query Management¶
Cancel Query
POST /v1/queries/{query_id}/cancel
Response (200 OK):
{
"status": "cancelled",
"query_id": "q_abc123"
}
List Active Queries
GET /v1/queries/active
Response (200 OK):
{
"queries": [
{
"id": "q_abc123",
"sql": "SELECT * FROM large_table",
"started_at": "2025-01-15T10:00:00Z",
"duration_ms": 5000,
"state": "running"
}
]
}
Tenant Management¶
List Tenants
GET /v1/tenants
Response (200 OK):
{
"tenants": [
{
"id": 1,
"name": "acme_corp",
"plan": "enterprise",
"created_at": "2025-01-01T00:00:00Z"
}
]
}
Create Tenant
POST /v1/tenants
Content-Type: application/json
Request Body:
{
"name": "acme_corp",
"plan": "enterprise",
"isolation": "schema"
}
Response (201 Created):
{
"id": 1,
"name": "acme_corp",
"plan": "enterprise",
"isolation": "schema",
"created_at": "2025-01-15T10:00:00Z"
}
Get Tenant Usage
GET /v1/tenants/{tenant_id}/usage
Response (200 OK):
{
"tenant_id": 1,
"storage_bytes": 1073741824,
"connections_active": 5,
"queries_per_second": 100,
"quota": {
"storage_bytes": 10737418240,
"max_connections": 50,
"max_qps": 1000
}
}
Set Tenant Context
POST /v1/tenants/context
Content-Type: application/json
Request Body:
{
"tenant_id": 1
}
Response (200 OK):
{
"status": "context_set",
"tenant_id": 1,
"tenant_name": "acme_corp"
}
Health & Status¶
Health Check
GET /health
Response (200 OK):
{
"status": "healthy",
"version": "2.4.0-beta",
"uptime_seconds": 3600
}
PostgreSQL Wire Protocol (Server Mode)¶
Standard PostgreSQL protocol on port 5432.
Connection String Format¶
postgresql://[user[:password]@][host][:port]/[database]
Examples:
postgresql://localhost:5432/mydb
postgresql://user:password@db.example.com:5432/mydb
postgres://localhost/mydb
Supported Features¶
- Standard SQL (DML/DDL)
- Parameterized queries ($1, $2, ...)
- Transactions (BEGIN/COMMIT/ROLLBACK)
- Multiple data types
- Indexes
- Transactions with isolation levels
Supported Client Libraries¶
- Python: psycopg2, asyncpg, sqlalchemy
- JavaScript/Node: pg, node-postgres, sequelize
- Rust: sqlx, tokio-postgres, diesel
- Go: database/sql, pgx, sqlc
- Java: JDBC, Hibernate
- .NET: Npgsql, Entity Framework
- PHP: PDO, php-pgsql
Rust API (Native/Embedded Mode)¶
Core Types¶
pub struct EmbeddedDatabase {
// ...
}
pub struct QueryResult {
pub rows: Vec<HashMap<String, Value>>,
pub columns: Vec<String>,
pub rows_affected: i64,
}
pub struct VectorSearchResult {
pub id: String,
pub score: f64,
pub content: Option<String>,
pub metadata: Option<HashMap<String, Value>>,
}
pub enum Value {
Null,
Bool(bool),
Int4(i32),
Int8(i64),
Float4(f32),
Float8(f64),
String(String),
Bytes(Vec<u8>),
Json(serde_json::Value),
Vector(Vec<f32>),
}
Core Methods¶
impl EmbeddedDatabase {
// Lifecycle
pub fn new(path: &str) -> Result<Self>;
pub fn new_in_memory() -> Result<Self>;
pub fn with_config(path: &str, config: Config) -> Result<Self>;
// Query execution
pub fn execute(&self, sql: &str, params: &[Value]) -> Result<()>;
pub fn query(&self, sql: &str, params: &[Value]) -> Result<QueryResult>;
pub fn query_row(&self, sql: &str, params: &[Value]) -> Result<Option<Row>>;
// Transactions
pub fn begin_transaction(&self) -> Result<Transaction>;
// Vector operations
pub fn vector_search(&self, store: &str, query: &str, top_k: usize)
-> Result<Vec<VectorSearchResult>>;
pub fn store_text(&self, store: &str, text: &str,
metadata: Option<HashMap<String, Value>>) -> Result<String>;
// Branching
pub fn create_branch(&self, name: &str, from: Option<&str>,
options: Option<BranchOptions>) -> Result<()>;
pub fn merge_branch(&self, source: &str, target: &str) -> Result<()>;
pub fn drop_branch(&self, name: &str) -> Result<()>;
pub fn switch_branch(&self, name: &str) -> Result<()>;
// Time-travel
pub fn query_as_of_timestamp(&self, sql: &str,
timestamp: &str, params: &[Value]) -> Result<QueryResult>;
pub fn query_as_of_transaction(&self, sql: &str,
txn_id: u64, params: &[Value]) -> Result<QueryResult>;
}
Trait Methods¶
pub trait ToSqlValue {
fn to_sql_value(&self) -> Value;
}
impl ToSqlValue for i32 { ... }
impl ToSqlValue for i64 { ... }
impl ToSqlValue for f64 { ... }
impl ToSqlValue for String { ... }
impl ToSqlValue for &str { ... }
impl ToSqlValue for bool { ... }
impl ToSqlValue for Vec<f32> { ... }
Python SDK API¶
Client¶
class Client:
def __init__(
self,
base_url: str = "http://localhost:8080",
api_key: Optional[str] = None,
branch: str = "main",
timeout: float = 30.0
) -> None: ...
async def query(
self,
sql: str,
params: Optional[List[Any]] = None,
branch: Optional[str] = None
) -> QueryResult: ...
async def execute(
self,
sql: str,
params: Optional[List[Any]] = None
) -> int: ...
async def nl_query(
self,
question: str
) -> Tuple[QueryResult, str]: ...
async def vector_search(
self,
store: str,
query: str,
top_k: int = 10,
min_score: Optional[float] = None,
filter: Optional[Dict[str, Any]] = None
) -> List[VectorSearchResult]: ...
async def store_text(
self,
store: str,
text: str,
metadata: Optional[Dict[str, Any]] = None
) -> str: ...
async def create_vector_store(
self,
name: str,
dimensions: int,
metric: str = "cosine"
) -> Dict[str, Any]: ...
async def list_vector_stores(self) -> List[Dict[str, Any]]: ...
async def create_branch(
self,
name: str,
from_branch: Optional[str] = None
) -> Dict[str, Any]: ...
async def merge_branch(self, source: str, target: str) -> None: ...
async def memory_add(
self,
session_id: str,
role: str,
content: str
) -> None: ...
async def memory_get(
self,
session_id: str,
limit: int = 50
) -> List[Dict[str, Any]]: ...
async def memory_search(
self,
session_id: str,
query: str,
top_k: int = 5
) -> List[VectorSearchResult]: ...
async def close(self) -> None: ...
Data Classes¶
@dataclass
class QueryResult:
rows: List[Dict[str, Any]]
columns: List[str]
rows_affected: int = 0
@dataclass
class VectorSearchResult:
id: str
score: float
content: Optional[str] = None
metadata: Optional[Dict[str, Any]] = None
@dataclass
class VectorStore:
name: str
dimensions: int
metric: str
count: int
@dataclass
class Branch:
name: str
parent: Optional[str] = None
created_at: str = ""
@dataclass
class Message:
role: str
content: str
timestamp: Optional[str] = None
TypeScript SDK API¶
Client¶
class HeliosDBClient {
constructor(config: ClientConfig);
async query(sql: string, params?: any[]): Promise<QueryResult>;
async execute(sql: string, params?: any[]): Promise<number>;
async nlQuery(question: string): Promise<[QueryResult, string]>;
async vectorSearch(
store: string,
query: string,
options?: VectorSearchOptions
): Promise<VectorSearchResult[]>;
async storeText(
store: string,
text: string,
metadata?: Record<string, any>
): Promise<string>;
async createVectorStore(
name: string,
dimensions: number,
metric?: string
): Promise<Record<string, any>>;
async listVectorStores(): Promise<Record<string, any>[]>;
async createBranch(
name: string,
fromBranch?: string
): Promise<Record<string, any>>;
async mergeBranch(source: string, target: string): Promise<void>;
async memoryAdd(
sessionId: string,
role: string,
content: string
): Promise<void>;
async memoryGet(
sessionId: string,
limit?: number
): Promise<Record<string, any>[]>;
async memorySearch(
sessionId: string,
query: string,
topK?: number
): Promise<VectorSearchResult[]>;
async close(): Promise<void>;
}
Types¶
interface QueryResult {
rows: Record<string, any>[];
columns: string[];
rows_affected?: number;
}
interface VectorSearchResult {
id: string;
score: number;
content?: string;
metadata?: Record<string, any>;
}
interface ClientConfig {
baseUrl?: string;
apiKey?: string;
branch?: string;
timeout?: number;
}
interface VectorSearchOptions {
topK?: number;
minScore?: number;
filter?: Record<string, any>;
}
Go SDK API¶
Client¶
type Client struct {
// ...
}
func NewClient(baseURL, apiKey string) *Client
func (c *Client) Query(ctx context.Context, sql string,
params ...interface{}) (*QueryResult, error)
func (c *Client) Execute(ctx context.Context, sql string,
params ...interface{}) (int64, error)
func (c *Client) NLQuery(ctx context.Context, question string)
(*QueryResult, string, error)
func (c *Client) VectorSearch(ctx context.Context, store, query string,
opts ...*SearchOptions) ([]VectorSearchResult, error)
func (c *Client) StoreText(ctx context.Context, store, text string,
metadata map[string]interface{}) (string, error)
func (c *Client) CreateBranch(ctx context.Context, name string,
fromBranch ...string) error
func (c *Client) MergeBranch(ctx context.Context, source, target string) error
func (c *Client) MemoryAdd(ctx context.Context, sessionID, role, content string)
error
func (c *Client) MemoryGet(ctx context.Context, sessionID string,
limit int) ([]map[string]interface{}, error)
func (c *Client) MemorySearch(ctx context.Context, sessionID, query string,
topK int) ([]VectorSearchResult, error)
func (c *Client) Close() error
Types¶
type QueryResult struct {
Rows []map[string]interface{}
Columns []string
RowsAffected int64
}
type VectorSearchResult struct {
ID string
Score float64
Content *string
Metadata map[string]interface{}
}
type SearchOptions struct {
TopK int
MinScore *float64
Filter map[string]interface{}
}
Error Codes & Responses¶
HTTP Status Codes¶
| Code | Meaning | Example |
|---|---|---|
| 200 | Success | Query executed |
| 201 | Created | Resource created |
| 400 | Bad Request | Invalid SQL syntax |
| 401 | Unauthorized | Invalid API key |
| 404 | Not Found | Table not found |
| 429 | Rate Limited | Too many requests |
| 500 | Server Error | Internal error |
PostgreSQL Error Codes (SQLSTATE)¶
| Code | Class | Meaning |
|---|---|---|
| 00000 | SUCCESS | Success |
| 42P01 | SYNTAX_ERROR | Relation does not exist |
| 42P02 | SYNTAX_ERROR | Column does not exist |
| 23505 | INTEGRITY | Unique violation |
| 23503 | INTEGRITY | Foreign key violation |
| 25001 | TRANSACTION | Transaction failed |
Configuration Reference¶
Server Configuration (heliosdb.toml)¶
[storage]
path = "./heliosdb-data"
cache_size = 536870912
compression = "zstd"
in_memory = false
[server]
listen_addr = "0.0.0.0"
port = 5432
max_connections = 100
[performance]
enable_simd = true
worker_threads = 4
[encryption]
enabled = false
algorithm = "aes256-gcm"
key_source = { environment = "HELIOSDB_KEY" }
[vector]
pq_enabled = true
pq_auto_compress = true
Environment Variables¶
HELIOSDB_PORT=5432
HELIOSDB_LISTEN_ADDR=0.0.0.0
HELIOSDB_DATA_DIR=./data
HELIOSDB_ENCRYPTION_KEY=...
HELIOSDB_LOG_LEVEL=info
Rate Limits & Quotas¶
Rate Limiting (Server Mode)¶
- Default: 1000 requests/second per IP
- Configurable via
max_connections - WebSocket connections: 100/second
Resource Limits¶
- Max query size: No hard limit
- Max result rows: Limited by memory
- Max vector dimensions: 4096
- Max text length: 2 GB per cell
Changelog & Versioning¶
Versioning Scheme¶
MAJOR.MINOR.PATCH[-PRERELEASE]
- MAJOR: Breaking API changes
- MINOR: New features (backward compatible)
- PATCH: Bug fixes
- PRERELEASE: alpha, beta, rc
Compatibility¶
- SDK versions must match server major version
- Patch versions are forward compatible
- Minor versions are forward compatible
Support & Contact¶
- GitHub Issues: https://github.com/heliosdb/heliosdb-lite/issues
- Documentation: https://docs.heliosdb.com
- Email: support@heliosdb.com
Last Updated: December 2025 API Version: v3.4 (stable) SDK Versions: Python 3.4, TypeScript 3.4, Go 3.4, Rust 3.4