diff --git a/bindings/SVS_C_API_Design.md b/bindings/SVS_C_API_Design.md
new file mode 100644
index 00000000..a7598049
--- /dev/null
+++ b/bindings/SVS_C_API_Design.md
@@ -0,0 +1,657 @@
+# SVS C API Design Proposal
+
+## Overview
+
+This document describes the design proposal for the Scalable Vector Search (SVS) C API. The API provides a C interface to SVS's vector similarity search capabilities, enabling integration with C applications and other languages that support C FFI (Foreign Function Interface).
+
+### Design Goals
+
+The SVS C API is designed with the following principles:
+
+1. **Simplicity** - Provide a minimal, intuitive set of operations to create and use vector search indices
+2. **Flexibility** - Allow fine-grained control over:
+ - Index building parameters (graph degree, window sizes, etc.)
+ - Memory allocation strategies (simple, hugepage, custom)
+ - Thread pool configuration (native, OpenMP, custom)
+ - Vector storage formats (simple, compressed, quantized)
+ - Search parameters and filters
+ - Logging system
+3. **Safety** - Comprehensive error handling with detailed error messages
+4. **Portability** - Standard C interface that works across platforms and languages
+
+## Architecture Overview
+
+The API is built around a builder pattern with the following core abstractions:
+
+```
+┌─────────────────┐
+│ Index Builder │ Configure index parameters
+│ - Algorithm │
+│ - Storage │
+│ - Threadpool │
+└────────┬────────┘
+ │ build()
+ ↓
+┌─────────────────┐
+│ Index │ Perform searches
+│ - search() │ with optional search params
+└─────────────────┘
+ │
+ ├─ Search Params (optional)
+ └─ Search Results
+```
+
+## Core Components
+
+### 1. Index
+
+The main search structure providing vector similarity search operations.
+
+**Current Capabilities:**
+- **TopK Search** - Find the k nearest neighbors for query vectors
+- Configurable search parameters (window size, etc.)
+- Multiple distance metrics (Euclidean, Cosine, Inner Product)
+
+**Requirements:**
+- Built from a non-empty dataset using Index Builder
+- Immutable after creation
+
+**Future Extensions:**
+- Range search (all neighbors within distance threshold)
+- Filtered search (predicate-based filtering)
+- Dynamic updates (add/remove vectors)
+
+### 2. Index Builder
+
+Configures and creates index instances using the builder pattern.
+
+**Required Parameters:**
+- Algorithm configuration handle
+- Vector dimensions
+- Distance metric (Euclidean, Cosine, Inner Product)
+
+**Optional Configuration:**
+- Storage format (default: Simple FP32)
+- Thread pool kind and size (default: native with hardware concurrency)
+- Custom thread pool interface (for advanced use cases)
+
+### 3. Algorithm Configuration
+
+Defines the search algorithm and its parameters.
+
+**Current Support:**
+- **Vamana** - Graph-based approximate nearest neighbor search
+ - Graph degree (connectivity)
+ - Build window size (construction search budget)
+ - Default search window size
+ - Alpha parameter (pruning threshold)
+ - Search history mode
+
+**Future Support:**
+- **Flat** - Exhaustive brute-force search
+- **IVF** - Inverted file with clustering
+
+### 4. Storage Configuration
+
+Defines how vectors are stored in memory, supporting various compression schemes.
+
+| Storage Type | Configuration Options | Description |
+|--------------|----------------------|-------------|
+| **Simple** | FP32, FP16, INT8, UINT8, INT4, UINT4 | Uncompressed storage |
+| **SQ** | INT8, UINT8 | Scalar quantization |
+| **LVQ** | Primary: INT4/UINT4/INT8/UINT8
Residual: VOID/INT4/UINT4/INT8/UINT8 | Locally-adaptive vector quantization |
+| **LeanVec** | Dimensions
Primary: data type
Secondary: data type | LeanVec dimensionality reduced storage |
+
+**Example:**
+```c
+// Simple FP32 storage (default)
+svs_storage_h storage = svs_storage_create_simple(SVS_DATA_TYPE_FLOAT32, err);
+
+// LVQ with 8-bit primary and 4-bit residual
+svs_storage_h storage = svs_storage_create_lvq(
+ SVS_DATA_TYPE_UINT8, SVS_DATA_TYPE_UINT4, err
+);
+
+// LeanVec with 128 dimensions
+svs_storage_h storage = svs_storage_create_leanvec(
+ 128, SVS_DATA_TYPE_FLOAT16, SVS_DATA_TYPE_INT8, err
+);
+
+// Scalar quantization
+svs_storage_h storage = svs_storage_create_sq(SVS_DATA_TYPE_INT8, err);
+```
+
+### 5. Thread Pool Configuration
+
+Controls parallelization strategy for index operations.
+
+| Type | Configuration | Use Case |
+|------|---------------|----------|
+| **Native** | Thread count | Default SVS thread pool (recommended) |
+| **OpenMP** | Uses OMP_NUM_THREADS | Integration with OpenMP applications |
+| **Single Thread** | No parallelization | Debugging or minimal overhead |
+| **Custom** | User-defined interface | Custom scheduling/work-stealing |
+
+**Custom Interface:**
+```c
+struct svs_threadpool_interface_ops {
+ size_t (*size)(void* self);
+ void (*parallel_for)(
+ void* self,
+ void (*func)(void* svs_param, size_t i),
+ void* svs_param, // SVS state
+ size_t n // Number of tasks
+ );
+};
+
+struct svs_threadpool_interface {
+ struct svs_threadpool_interface_ops ops;
+ void* self; // User-defined state
+};
+```
+
+### 6. Search Parameters
+
+Configures runtime search behavior (algorithm-specific).
+
+**Vamana Search Parameters:**
+- **Search window size** - Controls search accuracy vs. speed tradeoff
+ - Larger values: more accurate but slower
+ - Smaller values: faster but less accurate
+ - Typically 50-200 for good recall
+
+**Usage:**
+```c
+// Use custom search parameters
+svs_search_params_h params = svs_search_params_create_vamana(100, err);
+svs_search_results_t results = svs_index_search(
+ index, queries, num_queries, k, params, err
+);
+svs_search_params_free(params);
+
+// Or use defaults from algorithm configuration
+svs_search_results_t results = svs_index_search(
+ index, queries, num_queries, k, NULL, err
+);
+```
+
+## Error Handling Strategy
+
+The API uses a dual approach for error reporting: return codes and optional detailed error information.
+
+### Return Values
+
+- Functions returning handles return `NULL` on failure
+- Functions returning booleans return `false` on failure
+- All functions accept an optional `svs_error_h` parameter for detailed diagnostics
+
+### Detailed Error Information
+
+For comprehensive error diagnostics, create an error handle and pass it to API calls:
+
+```c
+// Create error handle
+svs_error_h err = svs_error_create();
+
+// Use in API calls (last parameter, can be NULL)
+svs_algorithm_h algo = svs_algorithm_create_vamana(
+ 64, // graph_degree
+ 128, // build_window_size
+ 128, // search_window_size
+ err // optional error handle (can be NULL)
+);
+
+if (algo == NULL) {
+ // Check error status
+ if (!svs_error_ok(err)) {
+ // Query error details
+ svs_error_code_t code = svs_error_get_code(err);
+ const char* msg = svs_error_get_message(err);
+ fprintf(stderr, "Error [%d]: %s\n", code, msg);
+ }
+}
+
+// Error handle can be reused across multiple calls
+svs_storage_h storage = svs_storage_create_simple(SVS_DATA_TYPE_FLOAT32, err);
+
+// Free error handle when done
+svs_error_free(err);
+```
+
+### Error Codes
+
+```c
+enum svs_error_code {
+ SVS_OK = 0, // Success
+ SVS_ERROR_GENERIC = 1, // Generic/unspecified error
+ SVS_ERROR_INVALID_ARGUMENT = 2, // Invalid function parameter
+ SVS_ERROR_OUT_OF_MEMORY = 3, // Memory allocation failed
+ SVS_ERROR_NOT_IMPLEMENTED = 5, // Feature not yet available
+ SVS_ERROR_UNSUPPORTED_HW = 6, // Hardware doesn't support required features
+ SVS_ERROR_RUNTIME = 7, // Runtime error during operation
+ SVS_ERROR_UNKNOWN = 1000 // Unknown/unexpected error
+};
+```
+
+### Best Practices
+
+1. **Always check return values** - Test for `NULL` or `false` before using results
+2. **Use error handles during development** - Provides detailed diagnostics and error messages
+3. **Reuse error handles** - Single handle can be reused across multiple API calls
+4. **Free all resources** - Always call appropriate `_free()` functions to prevent leaks
+5. **Pass NULL for optional parameters** - Error handle and search params can be `NULL` if not needed
+6. **Check `svs_error_ok()`** - Use this helper to check if operation succeeded
+
+## Naming Conventions
+
+Consistent naming improves API discoverability and reduces cognitive load.
+
+### Prefixes
+
+- `svs_` - All functions and types
+- `SVS_` - Macros and constants
+
+### Type Suffixes
+
+| Suffix | Meaning | Example |
+|--------|---------|----------|
+| `_t` | Value type (enum, struct) | `svs_metric_t`, `svs_error_code_t` |
+| `_h` | Handle (opaque pointer) | `svs_index_h`, `svs_algorithm_h` |
+| `_i` | Interface structure | `svs_allocator_i`, `svs_threadpool_i` |
+
+### Function Naming Pattern
+
+```
+svs_