Skip to content

Rest Api

HeliosDB Nano API Reference

Complete API reference for all HeliosDB Nano 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
}

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

CodeMeaningExample
200SuccessQuery executed
201CreatedResource created
400Bad RequestInvalid SQL syntax
401UnauthorizedInvalid API key
404Not FoundTable not found
429Rate LimitedToo many requests
500Server ErrorInternal error

PostgreSQL Error Codes (SQLSTATE)

CodeClassMeaning
00000SUCCESSSuccess
42P01SYNTAX_ERRORRelation does not exist
42P02SYNTAX_ERRORColumn does not exist
23505INTEGRITYUnique violation
23503INTEGRITYForeign key violation
25001TRANSACTIONTransaction 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

Terminal window
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


Last Updated: December 2025 API Version: v3.4 (stable) SDK Versions: Python 3.4, TypeScript 3.4, Go 3.4, Rust 3.4