Back to Openviking

API Overview

docs/en/api/01-overview.md

0.3.1418.7 KB
Original Source

API Overview

This page covers how to connect to OpenViking and the conventions shared across all API endpoints.

Connection Modes

OpenViking supports two usage modes: Embedded Mode (direct Python API calls) and Client-Server Mode (via HTTP API).

This API documentation primarily focuses on the HTTP API usage in Client-Server Mode. Embedded mode is available but will not be covered separately in subsequent documentation.

ModeUse CaseDescription
EmbeddedLocal development, single processRuns locally with local data storage
HTTPConnect to OpenViking ServerConnects to a remote server via HTTP API
CLIShell scripting, agent tool-useConnects to server via CLI commands

Embedded Mode (Brief Overview)

Embedded mode allows direct OpenViking API calls within a Python process without starting a separate server process.

python
import openviking as ov

client = ov.OpenViking(path="./data")
client.initialize()

Embedded mode uses ov.conf to configure embedding, vlm, storage, and other modules. Default configuration path: ~/.openviking/ov.conf. You can also specify the path via environment variable:

bash
export OPENVIKING_CONFIG_FILE=/path/to/ov.conf

Minimal configuration example:

json
{
  "embedding": {
    "dense": {
      "api_base": "<api-endpoint>",
      "api_key": "<your-api-key>",
      "provider": "<volcengine|openai|jina|...>",
      "dimension": 1024,
      "model": "<model-name>"
    }
  },
  "vlm": {
    "api_base": "<api-endpoint>",
    "api_key": "<your-api-key>",
    "provider": "<volcengine|openai|openai-codex|kimi|glm>",
    "model": "<model-name>"
  }
}

For provider: "openai-codex", vlm.api_key is optional once Codex OAuth is available through openviking-server init.

For full configuration options and provider-specific examples, see the Configuration Guide.

Client-Server Mode (Main Focus)

Client-Server mode connects to an OpenViking server via HTTP API, supporting multi-tenancy, remote access, and other features. See the deployment documentation for how to start the OpenViking server.

Python SDK Client

python
import openviking as ov

client = ov.SyncHTTPClient(
    url="http://localhost:1933",
    api_key="your-key",
    agent_id="my-agent",
    timeout=120.0,
)
client.initialize()

When url is not explicitly provided, the HTTP client automatically reads connection information from ovcli.conf. ovcli.conf is a configuration file shared between the HTTP client and CLI. Default path: ~/.openviking/ovcli.conf. You can also specify the path via environment variable:

bash
export OPENVIKING_CLI_CONFIG_FILE=/path/to/ovcli.conf

Configuration file example:

json
{
  "url": "http://localhost:1933",
  "api_key": "your-key",
  "account": "acme",
  "user": "alice",
  "agent_id": "my-agent"
}

Configuration field description:

FieldDescriptionDefault
urlServer address(required)
api_keyAPI Keynull (no auth)
accountDefault account header for tenant-scoped requestsnull
userDefault user header for tenant-scoped requestsnull
agent_idAgent identifier headernull
timeoutHTTP request timeout in seconds60.0
outputDefault output format: "table" or "json""table"

See the Configuration Guide for details.

Using Python SDK Client Without Configuration File

SyncHTTPClient and AsyncHTTPClient support operating completely without relying on the ovcli.conf configuration file, by explicitly passing all parameters during initialization:

python
import openviking as ov

client = ov.SyncHTTPClient(
    url="http://localhost:1933",          # Explicitly provided
    api_key="your-key",                    # Explicitly provided (api_key usually identifies user identity)
    timeout=30.0,                          # Don't use default 60.0
    extra_headers={}                       # Pass empty dict instead of None, useful for gateway auth in some scenarios
)
client.initialize()

⚠️ Note: The client will attempt to load the configuration file if any of the following conditions are met:

  • url is None
  • api_key is None
  • timeout equals 60.0 (default value)
  • extra_headers is None

HTTP Call Examples

  • CLI, SyncHTTPClient, and AsyncHTTPClient automatically upload local files or directories before calling the server API.
  • Raw HTTP calls don't get this convenience layer. When using curl or other HTTP clients, you need to first call POST /api/v1/resources/temp_upload, then pass the returned temp_file_id to the target API.
  • For raw HTTP imports of local directories, you need to first zip them into a .zip file and upload using the above method; the server does not accept direct host directory paths.
  • POST /api/v1/resources can directly accept remote URLs, but does not accept host local paths like ./doc.md or /tmp/doc.md.

Direct HTTP (curl) call example:

bash
curl http://localhost:1933/api/v1/fs/ls?uri=viking:// \
  -H "X-API-Key: your-key"

CLI Mode

The OpenViking CLI (can be abbreviated as ov command) connects to an OpenViking server and exposes all operations as shell commands. The CLI also reads connection information from ovcli.conf (shared with the HTTP client).

Basic usage:

bash
openviking [global options] <command> [arguments] [command options]

Global options (must be placed before the command name):

OptionDescription
--output, -oOutput format: table (default), json
--versionShow CLI version

Example:

bash
openviking -o json ls viking://resources/

Lifecycle

Embedded Mode

python
import openviking as ov

client = ov.OpenViking(path="./data")
client.initialize()

# ... use client ...

client.close()

Client-Server Mode

python
import openviking as ov

client = ov.SyncHTTPClient(url="http://localhost:1933")
client.initialize()

# ... use client ...

client.close()

The CLI is called directly via the command line, requiring the ovcli.conf file to be configured first, with no additional client initialization needed:

openviking -o json ls viking://resources/

Authentication

See the Authentication Guide for full details.

  • Authorization Bearer header: Authorization: Bearer your-key (recommended)
  • X-API-Key header: X-API-Key: your-key
  • If the server doesn't have an API Key configured, authentication is skipped.
  • The /health and /ready endpoints never require authentication.

Response Format

All HTTP API responses follow a unified format:

Success Response

json
{
  "status": "ok",
  "result": { ... },
  "time": 0.123
}

The top-level status describes whether the HTTP API request succeeded. Some successful operations return domain-level status fields inside result, such as "status": "success", "status": "accepted", or task states. Those fields are not API transport errors.

Error Response

json
{
  "status": "error",
  "error": {
    "code": "NOT_FOUND",
    "message": "Resource not found: viking://resources/nonexistent/"
  },
  "time": 0.01
}

HTTP errors always use the top-level error envelope. Synchronous processing failures, such as resource parsing or synchronous reindex failures, are returned as non-2xx responses with status="error" and an error object. Clients should not look for result.status="error" to detect request failure.

Request validation failures, including malformed JSON, missing required fields, and invalid parameter values, return HTTP 400 with error.code="INVALID_ARGUMENT". The response never uses FastAPI's raw {"detail": ...} error format; when field-level validation information is available, it is exposed under error.details.validation_errors.

Python HTTP SDKs (SyncHTTPClient and AsyncHTTPClient) raise the corresponding OpenVikingError subclass for this envelope. For example, PROCESSING_ERROR is raised as ProcessingError.

CLI Output Format

Table Mode (Default)

List data is rendered as tables; non-list data falls back to formatted JSON:

bash
openviking ls viking://resources/
# name          size  mode  isDir  uri
# .abstract.md  100   420   False  viking://resources/.abstract.md

JSON Mode (--output json)

All commands output formatted JSON, matching the result structure of API responses:

bash
openviking -o json ls viking://resources/
# [{ "name": "...", "size": 100, ... }, ...]

The default output format can be set in ovcli.conf:

json
{
  "url": "http://localhost:1933",
  "output": "json"
}

Compact Mode (--compact, -c)

  • When --output=json: Compact JSON format + {ok, result} wrapper, suitable for scripts
  • When --output=table: Simplified representation for table output (e.g., removing empty columns)

JSON output - success:

json
{"ok": true, "result": ...}

JSON output - error:

json
{"ok": false, "error": {"code": "NOT_FOUND", "message": "Resource not found", "details": {}}}

Special Cases

  • String results (read, abstract, overview): printed directly as plain text
  • None results (mkdir, rm, mv): no output

Exit Codes

Note: Exit codes are return codes from the CLI (command line tool), not HTTP API status codes.

CodeMeaning
0Success
1General error
2Configuration error
3Connection error

Error Codes

CodeHTTP StatusDescription
OK200Success
INVALID_ARGUMENT400Invalid parameter
INVALID_URI400Invalid Viking URI format
NOT_FOUND404Resource not found
ALREADY_EXISTS409Resource already exists
UNAUTHENTICATED401Missing or invalid API key
PERMISSION_DENIED403Insufficient permissions
RESOURCE_EXHAUSTED429Rate limit exceeded
FAILED_PRECONDITION412Precondition failed
CONFLICT409Operation conflicts with an in-progress task or existing state
DEADLINE_EXCEEDED504Operation timed out
UNAVAILABLE503Service unavailable
PROCESSING_ERROR500Resource or semantic processing failed
INTERNAL500Internal server error
UNIMPLEMENTED501Feature not implemented
EMBEDDING_FAILED500Embedding generation failed
VLM_FAILED500VLM call failed
SESSION_EXPIRED410Session no longer exists
NOT_INITIALIZED-Service or component not initialized (need to call initialize() first)

API Endpoints

Below are all HTTP API endpoints provided by OpenViking, grouped by functional module:

System

MethodPathDescriptionAuthentication
GET/healthHealth check (no auth)No auth required
GET/readyReadiness probe (no auth)No auth required
GET/metricsPrometheus metrics exportOptional
GET/api/v1/system/statusSystem statusRequired
POST/api/v1/system/waitWait for processingRequired

Resources

MethodPathDescription
POST/api/v1/resources/temp_uploadUpload local file for raw HTTP resource / pack import
POST/api/v1/resourcesAdd resource (supports URL or temp_file_id)
POST/api/v1/skillsAdd skill

Pack

MethodPathDescriptionPermission
POST/api/v1/pack/exportExport .ovpackROOT/ADMIN
POST/api/v1/pack/importImport .ovpackROOT/ADMIN

File System

MethodPathDescription
GET/api/v1/fs/lsList directory
GET/api/v1/fs/treeDirectory tree
GET/api/v1/fs/statResource status
POST/api/v1/fs/mkdirCreate directory
DELETE/api/v1/fsDelete resource
POST/api/v1/fs/mvMove/rename resource

Content

MethodPathDescription
GET/api/v1/content/readRead full content (L2)
GET/api/v1/content/abstractRead abstract (L0)
GET/api/v1/content/overviewRead overview (L1)
GET/api/v1/content/downloadDownload raw file bytes
POST/api/v1/content/writeUpdate an existing file and refresh semantics/vectors
POST/api/v1/content/reindexRebuild semantic/vector index for existing content (deprecated, use maintenance)
MethodPathDescription
POST/api/v1/search/findSemantic search (no session context)
POST/api/v1/search/searchContext-aware search (supports sessions)
POST/api/v1/search/grepContent pattern search
POST/api/v1/search/globFile pattern matching

Relations (Experimental, may change in future versions)

MethodPathDescription
GET/api/v1/relationsGet relations
POST/api/v1/relations/linkCreate link
DELETE/api/v1/relations/linkRemove link

Sessions

MethodPathDescription
POST/api/v1/sessionsCreate session
GET/api/v1/sessionsList sessions
GET/api/v1/sessions/{session_id}Get session
GET/api/v1/sessions/{session_id}/contextGet assembled session context
GET/api/v1/sessions/{session_id}/archives/{archive_id}Get a specific session archive
DELETE/api/v1/sessions/{session_id}Delete session
POST/api/v1/sessions/{session_id}/commitCommit session (archive and extract memories)
POST/api/v1/sessions/{session_id}/extractExtract memories from a session
POST/api/v1/sessions/{session_id}/messagesAdd message
POST/api/v1/sessions/{session_id}/usedRecord contexts / skills actually used

Privacy Configs

MethodPathDescription
GET/api/v1/privacy-configsList privacy config categories
GET/api/v1/privacy-configs/{category}List targets under a category
GET/api/v1/privacy-configs/{category}/{target_key}Get active config (meta + current)
POST/api/v1/privacy-configs/{category}/{target_key}Upsert and activate
GET/api/v1/privacy-configs/{category}/{target_key}/versionsList version numbers
GET/api/v1/privacy-configs/{category}/{target_key}/versions/{version}Get version snapshot
POST/api/v1/privacy-configs/{category}/{target_key}/activateActivate a version

Tasks

MethodPathDescription
GET/api/v1/tasks/{task_id}Get background task status
GET/api/v1/tasksList background tasks (supports filtering by type, status, resource)

Observer

MethodPathDescription
GET/api/v1/observer/queueQueue status
GET/api/v1/observer/vikingdbVikingDB status
GET/api/v1/observer/modelsModels status (VLM / embedding / rerank)
GET/api/v1/observer/lockLock subsystem status
GET/api/v1/observer/retrievalRetrieval subsystem status
GET/api/v1/observer/systemSystem status

Debug

MethodPathDescription
GET/api/v1/debug/healthQuick health check
GET/api/v1/debug/vector/scrollPaginated vector record inspection
GET/api/v1/debug/vector/countCount vector records

Maintenance

MethodPathDescriptionPermission
POST/api/v1/maintenance/reindexReindex content (optional abstract regeneration)ROOT/ADMIN

Statistics

MethodPathDescription
GET/api/v1/stats/memoriesGet memory health statistics (supports category filtering)
GET/api/v1/stats/sessions/{session_id}Get session extraction statistics

Admin (Multi-tenant)

MethodPathDescriptionPermission
POST/api/v1/admin/accountsCreate workspace + first adminROOT
GET/api/v1/admin/accountsList workspacesROOT
DELETE/api/v1/admin/accounts/{account_id}Delete workspace (cascade data cleanup)ROOT
POST/api/v1/admin/accounts/{account_id}/usersRegister userROOT/ADMIN
GET/api/v1/admin/accounts/{account_id}/usersList usersROOT/ADMIN
DELETE/api/v1/admin/accounts/{account_id}/users/{user_id}Remove userROOT/ADMIN
PUT/api/v1/admin/accounts/{account_id}/users/{user_id}/roleChange user roleROOT
POST/api/v1/admin/accounts/{account_id}/users/{user_id}/keyRegenerate user keyROOT/ADMIN

VikingBot Interaction Endpoints (Optional)

VikingBot API requires the server to be started with the --with-bot option:

MethodPathDescription
GET/healthBot health check (reused with system /health)
POST/chatSend message to Bot
POST/chat/streamBot streaming response

WebDAV Endpoints

MethodPathDescription
OPTIONS/webdav/resources, /webdav/resources/{path}WebDAV options query
PROPFIND/webdav/resources, /webdav/resources/{path}WebDAV property query
GET/HEAD/webdav/resources/{path}Read file
PUT/webdav/resources/{path}Upload/create file (UTF-8 text only)
DELETE/webdav/resources/{path}Delete file/directory
MKCOL/webdav/resources/{path}Create directory
MOVE/webdav/resources/{path}Move/rename resource

Documentation Reading Plan

Subsequent API documentation is organized by functional module as follows:

DocumentContent
Resources - Resource management APIAdding, importing, exporting resources and skills
Retrieval - Search APISearch, relations, context acquisition
File System - File system operationsDirectory operations, content reading and writing
Sessions - Session managementSession creation, message management, memory extraction
Skills - Skill management APISkill management
System - System and monitoring APISystem status, monitoring, debug API
Privacy Configs - Privacy config version management and activationPrivacy configuration
Metrics - Prometheus metrics export and scraping guideMetrics documentation
Admin - Multi-tenant management APIMulti-tenant account and user management