Skip to content

HeliosDB HTTP/REST API Reference

HeliosDB HTTP/REST API Reference

Version: 7.0 Last Updated: January 2026

Complete reference documentation for HeliosDB’s HTTP/REST API, including all endpoints, request/response formats, error handling, and best practices.


Table of Contents

  1. Base Configuration
  2. Query Endpoints
  3. Table Management
  4. Row Operations (CRUD)
  5. Transaction Endpoints
  6. Vector Operations
  7. Admin Endpoints
  8. Error Handling
  9. Rate Limiting
  10. Pagination

Base Configuration

Base URLs

EnvironmentURLPort
Production HTTPShttps://api.heliosdb.io/api/v1443
Production HTTPhttp://api.heliosdb.io/api/v18080
Local Developmenthttp://localhost:8080/api/v18080
Docker Defaulthttp://heliosdb:8080/api/v18080

Request Headers

HeaderRequiredDescription
AuthorizationYesBearer token or API key
Content-TypeYes (POST/PUT)application/json
AcceptNoResponse format: application/json, application/x-ndjson
X-Request-IDNoClient-generated request ID for tracing
X-Tenant-IDNoTenant identifier for multi-tenancy

Authentication

API Key (Recommended for services):

Terminal window
curl -H "Authorization: Bearer hdb_sk_your_api_key" \
https://api.heliosdb.io/api/v1/tables

Alternative API Key Header:

Terminal window
curl -H "X-API-Key: hdb_sk_your_api_key" \
https://api.heliosdb.io/api/v1/tables

JWT Token (For user sessions):

Terminal window
curl -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..." \
https://api.heliosdb.io/api/v1/tables

Query Endpoints

Execute SQL Query

Execute a SQL query and return results.

Endpoint: POST /query

Request Body:

{
"sql": "SELECT * FROM users WHERE status = $1 AND age > $2 LIMIT $3",
"params": ["active", 21, 100],
"timeout_ms": 30000,
"include_metadata": true
}

Parameters:

FieldTypeRequiredDescription
sqlstringYesSQL query to execute
paramsarrayNoPositional parameters ($1, $2, etc.)
timeout_msintegerNoQuery timeout in milliseconds (default: 30000)
include_metadatabooleanNoInclude column metadata (default: false)
max_rowsintegerNoMaximum rows to return (default: 10000)

Response (200 OK):

{
"success": true,
"data": [
{"id": 1, "name": "Alice", "email": "alice@example.com", "age": 25},
{"id": 2, "name": "Bob", "email": "bob@example.com", "age": 30}
],
"metadata": {
"columns": [
{"name": "id", "type": "BIGINT", "nullable": false},
{"name": "name", "type": "VARCHAR", "nullable": false},
{"name": "email", "type": "VARCHAR", "nullable": false},
{"name": "age", "type": "INTEGER", "nullable": true}
],
"row_count": 2,
"execution_time_ms": 12,
"query_id": "q_abc123"
}
}

Example:

Terminal window
curl -X POST https://api.heliosdb.io/api/v1/query \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sql": "SELECT id, name, email FROM users WHERE status = $1 ORDER BY created_at DESC LIMIT 10",
"params": ["active"]
}'

Execute Async Query

Execute a long-running query asynchronously.

Endpoint: POST /query/async

Request Body:

{
"sql": "SELECT customer_id, SUM(amount) as total FROM orders GROUP BY customer_id",
"params": [],
"timeout_ms": 300000,
"callback_url": "https://your-app.com/webhook/query-complete"
}

Response (202 Accepted):

{
"query_id": "async_q_xyz789",
"status": "pending",
"status_url": "/api/v1/query/async_q_xyz789",
"estimated_time_ms": 45000
}

Get Async Query Status

Check the status of an async query.

Endpoint: GET /query/{query_id}

Response (Running):

{
"query_id": "async_q_xyz789",
"status": "running",
"progress": 45,
"started_at": "2026-01-04T12:00:00Z"
}

Response (Completed):

{
"query_id": "async_q_xyz789",
"status": "completed",
"data": [...],
"metadata": {
"row_count": 15234,
"execution_time_ms": 42150
},
"started_at": "2026-01-04T12:00:00Z",
"completed_at": "2026-01-04T12:00:42Z"
}

Response (Failed):

{
"query_id": "async_q_xyz789",
"status": "failed",
"error": {
"code": "QUERY_TIMEOUT",
"message": "Query exceeded maximum execution time"
}
}

Stream Query Results

Stream query results as newline-delimited JSON (NDJSON).

Endpoint: POST /query/stream

Headers:

Accept: application/x-ndjson

Request Body:

{
"sql": "SELECT * FROM large_table",
"batch_size": 1000
}

Response (Streaming):

{"id":1,"name":"Alice","email":"alice@example.com"}
{"id":2,"name":"Bob","email":"bob@example.com"}
{"id":3,"name":"Charlie","email":"charlie@example.com"}
...

Python Example:

import requests
response = requests.post(
"https://api.heliosdb.io/api/v1/query/stream",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/x-ndjson"
},
json={"sql": "SELECT * FROM events WHERE date > '2025-01-01'"},
stream=True
)
for line in response.iter_lines():
if line:
row = json.loads(line)
process_row(row)

Cancel Query

Cancel a running query.

Endpoint: DELETE /query/{query_id}

Response (200 OK):

{
"query_id": "async_q_xyz789",
"status": "cancelled",
"cancelled_at": "2026-01-04T12:01:00Z"
}

Explain Query

Get the query execution plan without running the query.

Endpoint: POST /query/explain

Request Body:

{
"sql": "SELECT * FROM users WHERE email = $1",
"params": ["test@example.com"],
"analyze": false,
"format": "json"
}

Parameters:

FieldTypeDescription
analyzebooleanExecute query to get actual timings (default: false)
formatstringOutput format: text, json, yaml (default: json)

Response (200 OK):

{
"plan": {
"node_type": "Index Scan",
"index_name": "idx_users_email",
"relation": "users",
"index_cond": "(email = 'test@example.com')",
"estimated_rows": 1,
"estimated_cost": 0.29,
"actual_rows": null,
"actual_time_ms": null
},
"planning_time_ms": 0.5
}

Table Management

List Tables

Get a list of all tables in the database.

Endpoint: GET /tables

Query Parameters:

ParameterTypeDescription
schemastringFilter by schema name
patternstringFilter by name pattern (SQL LIKE)
include_viewsbooleanInclude views (default: true)
include_systembooleanInclude system tables (default: false)

Response (200 OK):

{
"tables": [
{
"name": "users",
"schema": "public",
"type": "table",
"row_count": 150000,
"size_bytes": 45000000,
"created_at": "2025-06-01T10:00:00Z",
"updated_at": "2026-01-04T08:00:00Z"
},
{
"name": "orders",
"schema": "public",
"type": "table",
"row_count": 2500000,
"size_bytes": 890000000,
"created_at": "2025-06-01T10:00:00Z",
"updated_at": "2026-01-04T11:30:00Z"
},
{
"name": "user_stats",
"schema": "public",
"type": "materialized_view",
"row_count": 150000,
"size_bytes": 12000000,
"created_at": "2025-08-15T14:00:00Z",
"updated_at": "2026-01-04T06:00:00Z"
}
],
"total_count": 3
}

Get Table Schema

Get detailed schema information for a specific table.

Endpoint: GET /tables/{table_name}

Response (200 OK):

{
"name": "users",
"schema": "public",
"type": "table",
"columns": [
{
"name": "id",
"type": "BIGINT",
"nullable": false,
"default": "nextval('users_id_seq'::regclass)",
"is_primary_key": true
},
{
"name": "email",
"type": "VARCHAR(255)",
"nullable": false,
"default": null,
"is_primary_key": false
},
{
"name": "name",
"type": "VARCHAR(255)",
"nullable": false,
"default": null,
"is_primary_key": false
},
{
"name": "age",
"type": "INTEGER",
"nullable": true,
"default": null,
"is_primary_key": false
},
{
"name": "status",
"type": "VARCHAR(50)",
"nullable": false,
"default": "'active'",
"is_primary_key": false
},
{
"name": "created_at",
"type": "TIMESTAMP WITH TIME ZONE",
"nullable": false,
"default": "now()",
"is_primary_key": false
},
{
"name": "embedding",
"type": "VECTOR(1536)",
"nullable": true,
"default": null,
"is_primary_key": false
}
],
"indexes": [
{
"name": "users_pkey",
"type": "btree",
"columns": ["id"],
"unique": true,
"primary": true
},
{
"name": "idx_users_email",
"type": "btree",
"columns": ["email"],
"unique": true,
"primary": false
},
{
"name": "idx_users_status",
"type": "btree",
"columns": ["status"],
"unique": false,
"primary": false
},
{
"name": "idx_users_embedding",
"type": "hnsw",
"columns": ["embedding"],
"unique": false,
"primary": false,
"options": {"m": 16, "ef_construction": 64}
}
],
"constraints": [
{
"name": "users_status_check",
"type": "check",
"definition": "status IN ('active', 'inactive', 'suspended')"
}
],
"statistics": {
"row_count": 150000,
"size_bytes": 45000000,
"index_size_bytes": 12000000,
"last_analyzed": "2026-01-04T06:00:00Z"
}
}

Create Table

Create a new table.

Endpoint: POST /tables

Request Body:

{
"name": "products",
"schema": "public",
"columns": [
{
"name": "id",
"type": "BIGSERIAL",
"nullable": false,
"primary_key": true
},
{
"name": "sku",
"type": "VARCHAR(50)",
"nullable": false
},
{
"name": "name",
"type": "VARCHAR(255)",
"nullable": false
},
{
"name": "description",
"type": "TEXT",
"nullable": true
},
{
"name": "price",
"type": "DECIMAL(10,2)",
"nullable": false,
"check": "price >= 0"
},
{
"name": "inventory",
"type": "INTEGER",
"nullable": false,
"default": "0"
},
{
"name": "category",
"type": "VARCHAR(100)",
"nullable": true
},
{
"name": "embedding",
"type": "VECTOR(768)",
"nullable": true
},
{
"name": "metadata",
"type": "JSONB",
"nullable": true
},
{
"name": "created_at",
"type": "TIMESTAMP WITH TIME ZONE",
"nullable": false,
"default": "NOW()"
}
],
"indexes": [
{
"name": "idx_products_sku",
"columns": ["sku"],
"unique": true
},
{
"name": "idx_products_category",
"columns": ["category"]
},
{
"name": "idx_products_embedding",
"columns": ["embedding"],
"type": "hnsw",
"options": {"m": 16, "ef_construction": 64}
}
],
"if_not_exists": true
}

Response (201 Created):

{
"success": true,
"table": {
"name": "products",
"schema": "public",
"created_at": "2026-01-04T12:00:00Z"
}
}

Alter Table

Modify an existing table structure.

Endpoint: PATCH /tables/{table_name}

Request Body:

{
"operations": [
{
"operation": "add_column",
"column": {
"name": "discount_percent",
"type": "DECIMAL(5,2)",
"nullable": true,
"default": "0"
}
},
{
"operation": "drop_column",
"column_name": "old_field"
},
{
"operation": "rename_column",
"old_name": "desc",
"new_name": "description"
},
{
"operation": "add_index",
"index": {
"name": "idx_products_price",
"columns": ["price"]
}
}
]
}

Response (200 OK):

{
"success": true,
"operations_completed": 4,
"table": {
"name": "products",
"updated_at": "2026-01-04T12:05:00Z"
}
}

Drop Table

Delete a table.

Endpoint: DELETE /tables/{table_name}

Query Parameters:

ParameterTypeDescription
cascadebooleanDrop dependent objects (default: false)
if_existsbooleanDon’t error if table doesn’t exist (default: false)

Response (200 OK):

{
"success": true,
"table": "products",
"dropped_at": "2026-01-04T12:10:00Z"
}

Row Operations (CRUD)

Read Rows

Query rows from a table with filtering, sorting, and pagination.

Endpoint: GET /tables/{table_name}/rows

Query Parameters:

ParameterTypeDescription
filterstringWHERE clause filter (e.g., status='active')
selectstringColumns to select (comma-separated)
order_bystringSort column (prefix with - for DESC)
limitintegerMaximum rows (default: 100, max: 10000)
offsetintegerOffset for pagination
cursorstringCursor for cursor-based pagination

Example Request:

Terminal window
curl "https://api.heliosdb.io/api/v1/tables/users/rows?filter=status='active'&select=id,name,email&order_by=-created_at&limit=25" \
-H "Authorization: Bearer YOUR_API_KEY"

Response (200 OK):

{
"data": [
{"id": 150, "name": "Zoe", "email": "zoe@example.com"},
{"id": 149, "name": "Yolanda", "email": "yolanda@example.com"},
{"id": 148, "name": "Xavier", "email": "xavier@example.com"}
],
"pagination": {
"total_count": 1250,
"limit": 25,
"offset": 0,
"has_more": true,
"next_cursor": "eyJpZCI6MTQ3fQ=="
}
}

Insert Rows

Insert one or more rows into a table.

Endpoint: POST /tables/{table_name}/rows

Request Body (Single Row):

{
"row": {
"name": "Alice Johnson",
"email": "alice.johnson@example.com",
"age": 28,
"status": "active"
},
"returning": ["id", "created_at"]
}

Request Body (Bulk Insert):

{
"rows": [
{"name": "Bob Smith", "email": "bob@example.com", "age": 35},
{"name": "Carol White", "email": "carol@example.com", "age": 29},
{"name": "David Brown", "email": "david@example.com", "age": 42}
],
"on_conflict": {
"columns": ["email"],
"action": "update",
"update_columns": ["name", "age"]
},
"returning": ["id"]
}

Parameters:

FieldTypeDescription
rowobjectSingle row to insert
rowsarrayMultiple rows to insert
returningarrayColumns to return after insert
on_conflictobjectUpsert behavior on conflict

Response (201 Created):

{
"success": true,
"inserted_count": 3,
"data": [
{"id": 151},
{"id": 152},
{"id": 153}
]
}

Update Rows

Update rows matching a filter.

Endpoint: PUT /tables/{table_name}/rows

Request Body:

{
"filter": "status = 'pending' AND created_at < '2025-12-01'",
"updates": {
"status": "expired",
"updated_at": "2026-01-04T12:00:00Z"
},
"returning": ["id", "status"]
}

Response (200 OK):

{
"success": true,
"affected_rows": 47,
"data": [
{"id": 23, "status": "expired"},
{"id": 45, "status": "expired"},
{"id": 67, "status": "expired"}
]
}

Delete Rows

Delete rows matching a filter.

Endpoint: DELETE /tables/{table_name}/rows

Request Body:

{
"filter": "status = 'deleted' AND deleted_at < '2025-01-01'",
"returning": ["id"]
}

Response (200 OK):

{
"success": true,
"deleted_count": 156,
"data": [
{"id": 10},
{"id": 15},
{"id": 22}
]
}

Get Row by ID

Get a single row by primary key.

Endpoint: GET /tables/{table_name}/rows/{id}

Response (200 OK):

{
"data": {
"id": 123,
"name": "Alice",
"email": "alice@example.com",
"age": 28,
"status": "active",
"created_at": "2025-06-15T10:30:00Z"
}
}

Update Row by ID

Update a single row by primary key.

Endpoint: PATCH /tables/{table_name}/rows/{id}

Request Body:

{
"updates": {
"name": "Alice Smith",
"age": 29
},
"returning": ["id", "name", "age", "updated_at"]
}

Response (200 OK):

{
"success": true,
"data": {
"id": 123,
"name": "Alice Smith",
"age": 29,
"updated_at": "2026-01-04T12:15:00Z"
}
}

Delete Row by ID

Delete a single row by primary key.

Endpoint: DELETE /tables/{table_name}/rows/{id}

Response (200 OK):

{
"success": true,
"deleted": true
}

Transaction Endpoints

Begin Transaction

Start a new transaction.

Endpoint: POST /transactions

Request Body:

{
"isolation_level": "serializable",
"timeout_ms": 30000,
"read_only": false
}

Parameters:

FieldTypeDescription
isolation_levelstringread_committed, repeatable_read, serializable
timeout_msintegerTransaction timeout
read_onlybooleanRead-only transaction

Response (201 Created):

{
"transaction_id": "txn_abc123xyz",
"isolation_level": "serializable",
"started_at": "2026-01-04T12:00:00Z",
"expires_at": "2026-01-04T12:00:30Z"
}

Execute in Transaction

Execute a query within a transaction.

Endpoint: POST /transactions/{transaction_id}/query

Request Body:

{
"sql": "UPDATE accounts SET balance = balance - $1 WHERE id = $2",
"params": [100.00, 1]
}

Response (200 OK):

{
"success": true,
"affected_rows": 1,
"transaction_id": "txn_abc123xyz"
}

Commit Transaction

Commit a transaction.

Endpoint: POST /transactions/{transaction_id}/commit

Response (200 OK):

{
"success": true,
"transaction_id": "txn_abc123xyz",
"committed_at": "2026-01-04T12:00:15Z"
}

Rollback Transaction

Rollback a transaction.

Endpoint: POST /transactions/{transaction_id}/rollback

Response (200 OK):

{
"success": true,
"transaction_id": "txn_abc123xyz",
"rolled_back_at": "2026-01-04T12:00:10Z"
}

Vector Operations

Perform similarity search on vector embeddings.

Endpoint: POST /vectors/search

Request Body:

{
"index": "documents_embedding_idx",
"vector": [0.1, 0.2, 0.3, 0.4, ...],
"top_k": 10,
"filter": "category = 'technology'",
"include_vectors": false,
"include_metadata": true,
"metric": "cosine",
"ef_search": 100
}

Parameters:

FieldTypeDescription
indexstringVector index name
vectorarrayQuery vector
top_kintegerNumber of results (default: 10)
filterstringSQL filter condition
include_vectorsbooleanReturn vectors in results
include_metadatabooleanReturn metadata columns
metricstringDistance metric: cosine, l2, inner_product
ef_searchintegerHNSW search parameter (higher = better quality)

Response (200 OK):

{
"results": [
{
"id": 456,
"score": 0.92,
"distance": 0.08,
"metadata": {
"title": "Introduction to Machine Learning",
"category": "technology",
"author": "Jane Doe"
}
},
{
"id": 789,
"score": 0.88,
"distance": 0.12,
"metadata": {
"title": "Deep Learning Fundamentals",
"category": "technology",
"author": "John Smith"
}
}
],
"query_time_ms": 15
}

Upsert Vectors

Insert or update vectors with metadata.

Endpoint: POST /vectors/upsert

Request Body:

{
"table": "documents",
"vectors": [
{
"id": "doc_001",
"vector": [0.1, 0.2, 0.3, ...],
"metadata": {
"title": "Document One",
"category": "science",
"created_at": "2026-01-04T12:00:00Z"
}
},
{
"id": "doc_002",
"vector": [0.4, 0.5, 0.6, ...],
"metadata": {
"title": "Document Two",
"category": "technology",
"created_at": "2026-01-04T12:01:00Z"
}
}
]
}

Response (200 OK):

{
"success": true,
"upserted_count": 2,
"ids": ["doc_001", "doc_002"]
}

Delete Vectors

Delete vectors by ID or filter.

Endpoint: DELETE /vectors

Request Body:

{
"table": "documents",
"ids": ["doc_001", "doc_002"],
"filter": null
}

Alternative - Delete by Filter:

{
"table": "documents",
"ids": null,
"filter": "category = 'deprecated'"
}

Response (200 OK):

{
"success": true,
"deleted_count": 2
}

Admin Endpoints

Health Check

Check server health status.

Endpoint: GET /health

Response (200 OK):

{
"status": "healthy",
"version": "7.0.0",
"uptime_seconds": 864000,
"components": {
"storage": "healthy",
"query_engine": "healthy",
"replication": "healthy",
"cache": "healthy"
}
}

Readiness Check

Check if server is ready to accept requests.

Endpoint: GET /ready

Response (200 OK):

{
"ready": true,
"checks": {
"database": true,
"connections_available": true,
"replication_synced": true
}
}

Liveness Check

Check if server is alive (for Kubernetes probes).

Endpoint: GET /live

Response (200 OK):

{
"alive": true
}

Server Info

Get server information and capabilities.

Endpoint: GET /info

Response (200 OK):

{
"version": "7.0.0",
"build": "2026.01.04-abc123",
"api_version": "v1",
"features": {
"vector_search": true,
"graph_queries": true,
"time_series": true,
"multi_tenancy": true,
"streaming": true
},
"protocols": ["postgresql", "mongodb", "redis", "cassandra", "http", "grpc"],
"limits": {
"max_query_size_bytes": 1048576,
"max_result_rows": 100000,
"max_connections": 10000
}
}

Prometheus Metrics

Get Prometheus-format metrics.

Endpoint: GET /metrics

Response (200 OK):

# HELP heliosdb_queries_total Total number of queries executed
# TYPE heliosdb_queries_total counter
heliosdb_queries_total{status="success"} 1234567
heliosdb_queries_total{status="error"} 123
# HELP heliosdb_query_duration_seconds Query execution duration
# TYPE heliosdb_query_duration_seconds histogram
heliosdb_query_duration_seconds_bucket{le="0.01"} 500000
heliosdb_query_duration_seconds_bucket{le="0.1"} 1100000
heliosdb_query_duration_seconds_bucket{le="1.0"} 1200000
heliosdb_query_duration_seconds_bucket{le="+Inf"} 1234567
# HELP heliosdb_connections_active Active database connections
# TYPE heliosdb_connections_active gauge
heliosdb_connections_active 250
# HELP heliosdb_cache_hit_ratio Cache hit ratio
# TYPE heliosdb_cache_hit_ratio gauge
heliosdb_cache_hit_ratio 0.95

Error Handling

Error Response Format

All errors follow a consistent format:

{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable error message",
"details": {
"field": "additional context"
},
"request_id": "req_abc123"
}
}

HTTP Status Codes

CodeMeaningWhen Used
200OKSuccessful request
201CreatedResource created
202AcceptedAsync operation started
204No ContentSuccessful with no response body
400Bad RequestInvalid request syntax or parameters
401UnauthorizedMissing or invalid authentication
403ForbiddenAuthenticated but not authorized
404Not FoundResource does not exist
409ConflictResource conflict (e.g., duplicate key)
422Unprocessable EntityValidation error
429Too Many RequestsRate limit exceeded
500Internal Server ErrorServer-side error
503Service UnavailableServer temporarily unavailable

Common Error Codes

CodeDescription
AUTHENTICATION_REQUIREDNo authentication provided
AUTHENTICATION_FAILEDInvalid credentials
AUTHORIZATION_DENIEDInsufficient permissions
INVALID_QUERYSQL syntax error
TABLE_NOT_FOUNDReferenced table does not exist
COLUMN_NOT_FOUNDReferenced column does not exist
CONSTRAINT_VIOLATIONUnique/foreign key violation
TYPE_MISMATCHData type mismatch
QUERY_TIMEOUTQuery exceeded time limit
RATE_LIMIT_EXCEEDEDToo many requests
TRANSACTION_CONFLICTSerialization failure
INTERNAL_ERRORUnexpected server error

Rate Limiting

Rate Limit Headers

Every response includes rate limit information:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 987
X-RateLimit-Reset: 1704364800
X-RateLimit-Reset-After: 3600

Rate Limit Response (429)

{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please retry after 60 seconds.",
"details": {
"limit": 1000,
"remaining": 0,
"reset_at": "2026-01-04T13:00:00Z"
}
}
}

Pagination

Offset-Based Pagination

Terminal window
# Page 1
GET /tables/users/rows?limit=25&offset=0
# Page 2
GET /tables/users/rows?limit=25&offset=25
# Page 3
GET /tables/users/rows?limit=25&offset=50
Terminal window
# First page
GET /tables/users/rows?limit=25
# Subsequent pages using cursor from response
GET /tables/users/rows?limit=25&cursor=eyJpZCI6MjV9

Response with Pagination:

{
"data": [...],
"pagination": {
"limit": 25,
"total_count": 1250,
"has_more": true,
"next_cursor": "eyJpZCI6NTB9",
"prev_cursor": "eyJpZCI6MjV9"
}
}

Best Practices

  1. Use cursor pagination for large datasets (more efficient)
  2. Set reasonable limits (25-100 rows per page)
  3. Cache total_count if needed frequently
  4. Use streaming for very large exports

SDK Examples

Python

import requests
from typing import Optional, Dict, Any, List
class HeliosDBClient:
def __init__(self, base_url: str, api_key: str):
self.base_url = base_url.rstrip('/')
self.headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
def query(self, sql: str, params: Optional[List] = None) -> Dict[str, Any]:
response = requests.post(
f'{self.base_url}/query',
headers=self.headers,
json={'sql': sql, 'params': params or []}
)
response.raise_for_status()
return response.json()
def insert(self, table: str, rows: List[Dict]) -> Dict[str, Any]:
response = requests.post(
f'{self.base_url}/tables/{table}/rows',
headers=self.headers,
json={'rows': rows}
)
response.raise_for_status()
return response.json()
def vector_search(self, index: str, vector: List[float], top_k: int = 10) -> Dict[str, Any]:
response = requests.post(
f'{self.base_url}/vectors/search',
headers=self.headers,
json={'index': index, 'vector': vector, 'top_k': top_k}
)
response.raise_for_status()
return response.json()
# Usage
client = HeliosDBClient('https://api.heliosdb.io/api/v1', 'YOUR_API_KEY')
# Query
result = client.query('SELECT * FROM users WHERE status = $1', ['active'])
print(result['data'])
# Insert
client.insert('users', [
{'name': 'Alice', 'email': 'alice@example.com'},
{'name': 'Bob', 'email': 'bob@example.com'}
])
# Vector search
matches = client.vector_search('documents_idx', [0.1, 0.2, 0.3, ...])
print(matches['results'])

JavaScript/TypeScript

interface QueryResult {
data: Record<string, any>[];
metadata?: {
row_count: number;
execution_time_ms: number;
};
}
class HeliosDBClient {
private baseUrl: string;
private headers: HeadersInit;
constructor(baseUrl: string, apiKey: string) {
this.baseUrl = baseUrl.replace(/\/$/, '');
this.headers = {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
};
}
async query(sql: string, params: any[] = []): Promise<QueryResult> {
const response = await fetch(`${this.baseUrl}/query`, {
method: 'POST',
headers: this.headers,
body: JSON.stringify({ sql, params })
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
return response.json();
}
async insert(table: string, rows: Record<string, any>[]): Promise<any> {
const response = await fetch(`${this.baseUrl}/tables/${table}/rows`, {
method: 'POST',
headers: this.headers,
body: JSON.stringify({ rows })
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
return response.json();
}
async vectorSearch(index: string, vector: number[], topK = 10): Promise<any> {
const response = await fetch(`${this.baseUrl}/vectors/search`, {
method: 'POST',
headers: this.headers,
body: JSON.stringify({ index, vector, top_k: topK })
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
return response.json();
}
}
// Usage
const client = new HeliosDBClient('https://api.heliosdb.io/api/v1', 'YOUR_API_KEY');
// Query
const result = await client.query('SELECT * FROM users WHERE status = $1', ['active']);
console.log(result.data);
// Insert
await client.insert('users', [
{ name: 'Alice', email: 'alice@example.com' },
{ name: 'Bob', email: 'bob@example.com' }
]);
// Vector search
const matches = await client.vectorSearch('documents_idx', [0.1, 0.2, 0.3]);
console.log(matches.results);

Last Updated: January 2026 API Version: v1 HeliosDB Version: 7.0.0