API Overview

July 25, 2026 · View on GitHub

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.

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:

export OPENVIKING_CONFIG_FILE=/path/to/ov.conf

Minimal configuration example:

{
  "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

import openviking as ov

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

Go SDK Client

The Go SDK is an HTTP-only client for Client-Server mode. It is published from the main repository as the sdk/go module.

go get github.com/volcengine/OpenViking/sdk/go
client, err := openviking.NewClient(openviking.Config{
    BaseURL: "http://localhost:1933",
    APIKey:  "your-key",
})
if err != nil {
    return err
}
defer client.CloseIdleConnections()

The Go SDK sends the same identity headers as the Python HTTP client:

Config fieldHTTP header
APIKeyX-API-Key
AccountX-OpenViking-Account
UserX-OpenViking-User
ActorPeerIDX-OpenViking-Actor-Peer

For normal api_key deployments, APIKey is enough because the server derives tenant identity from the key. Set Account and User only for trusted deployments or gateways that explicitly forward tenant identity.

It does not implement Python embedded mode or legacy agent_id compatibility. See sdk/go/README.md for package-level examples.

JavaScript/TypeScript SDK Client

The JavaScript/TypeScript SDK is an HTTP-only client for Node.js 18+. It ships ESM, CommonJS and TypeScript declarations.

npm install @openviking/sdk
import { OpenVikingClient } from "@openviking/sdk";

const client = new OpenVikingClient({
  baseUrl: "http://localhost:1933",
  apiKey: "your-key",
});

const results = await client.search("deployment guide", {
  targetUri: "viking://resources",
});

It uses the same identity headers and response envelope as the Python and Go HTTP clients. See sdk/typescript/README.md for package-level examples.

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:

export OPENVIKING_CLI_CONFIG_FILE=/path/to/ovcli.conf

Configuration file example:

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

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
timeoutHTTP request timeout in seconds600.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:

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 600.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 600.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.
  • Python HTTP client and CLI can also opt into shared temporary uploads via client config (ovcli.conf -> upload.mode = "shared").
  • 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.
  • temp_upload defaults to upload_mode=local. Use upload_mode=shared only when you explicitly want distributed shared temporary uploads.
  • 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:

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:

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:

openviking -o json ls viking://resources/

Lifecycle

Embedded Mode

import openviking as ov

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

# ... use client ...

client.close()

Client-Server Mode

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

{
  "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

{
  "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:

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:

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

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

{
  "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:

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

JSON output - error:

{"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

This catalog follows the routes actually mounted by the server. Each group heading links to its detailed reference. Detail pages show an HTTP, Python SDK, TypeScript SDK, Go SDK, or CLI tab only when that surface is genuinely available; a raw HTTP workaround is not presented as an SDK.

System Status

MethodPathDescription
GET/healthBasic health check (no authentication)
GET/readyAGFS, VectorDB, and API key manager readiness (no authentication)
GET/api/v1/system/statusSystem status
POST/api/v1/system/waitWait for background processing
POST/api/v1/system/consistencyCheck filesystem and vector-index consistency
POST/api/v1/system/backend/sync-statusQuery backend synchronization status
POST/api/v1/system/backend/sync-retryRetry backend synchronization
GET/api/v1/system/sync/{sync_path}Path-form compatibility endpoint for synchronization status
POST/api/v1/system/sync/{sync_path}/retryPath-form compatibility endpoint for synchronization retry

Resources and Filesystem

MethodPathDescription
POST/api/v1/resources/temp_uploadUpload a temporary file for a later import
POST/api/v1/resourcesAdd a resource from a URL or temporary upload
GET/api/v1/fs/lsList a directory
GET/api/v1/fs/treeGet a directory tree
GET/api/v1/fs/statGet resource status
GET/api/v1/fs/attrsGet logical extended attributes
POST/api/v1/fs/attrs/set_tagsSet retrieval tags (compatibility alias)
POST/api/v1/fs/mkdirCreate a directory
DELETE/api/v1/fsDelete a resource
POST/api/v1/fs/mvMove or rename a resource

Content

MethodPathDescription
GET/api/v1/content/readRead full content (L2)
GET/api/v1/content/abstractRead an abstract (L0)
GET/api/v1/content/overviewRead an overview (L1)
GET/api/v1/content/downloadDownload original file bytes
POST/api/v1/content/writeWrite content and refresh semantic indexes
POST/api/v1/content/set_tagsSet retrieval tags
POST/api/v1/content/reindexRebuild semantic or vector indexes

Skills

MethodPathDescription
GET/api/v1/skillsList skills
POST/api/v1/skillsAdd a skill
POST/api/v1/skills/findSearch skills
POST/api/v1/skills/validateValidate skill data
GET/api/v1/skills/{skill_name}Get a skill
PUT/api/v1/skills/{skill_name}Update a skill
DELETE/api/v1/skills/{skill_name}Delete a skill

Sessions and Memory

MethodPathDescription
POST/api/v1/sessionsCreate a session
GET/api/v1/sessionsList sessions
GET/api/v1/sessions/{session_id}Get a session
GET/api/v1/sessions/{session_id}/tool-resultsList tool results
GET/api/v1/sessions/{session_id}/tool-results/{tool_result_id}Read a tool result
GET/api/v1/sessions/{session_id}/tool-results/{tool_result_id}/searchSearch within a tool result
GET/api/v1/sessions/{session_id}/contextGet assembled context
GET/api/v1/sessions/{session_id}/archives/{archive_id}Get a session archive
DELETE/api/v1/sessions/{session_id}Delete a session
POST/api/v1/sessions/{session_id}/commitArchive a session and extract memory
POST/api/v1/sessions/{session_id}/extractExtract memory
POST/api/v1/sessions/{session_id}/messagesAdd one message
POST/api/v1/sessions/{session_id}/messages/batchAdd messages in a batch
POST/api/v1/sessions/{session_id}/usedRecord context or skills actually used
POST/api/v1/search/recallRecall memory as injection-ready context

Retrieval, Code Retrieval, and Relations

MethodPathDescription
POST/api/v1/search/findSemantic search
POST/api/v1/search/searchContext-aware search
POST/api/v1/search/grepContent pattern search
POST/api/v1/search/globFile pattern matching
POST/api/v1/code/outlineExtract code structure
POST/api/v1/code/searchSearch code
POST/api/v1/code/expandExpand code context
GET/api/v1/relationsGet resource relations
POST/api/v1/relations/linkCreate a resource link
DELETE/api/v1/relations/linkDelete a resource link
POST/api/v1/relations/build_graphBuild a relation graph

Watches, Snapshots, and OVPack

MethodPathDescription
GET/api/v1/watchesList watches or query by to_uri
GET/api/v1/watches/{task_id}Get a watch by task ID
PATCH/api/v1/watchesUpdate a watch by to_uri
PATCH/api/v1/watches/{task_id}Update a watch by task ID
DELETE/api/v1/watchesDelete a watch by to_uri
DELETE/api/v1/watches/{task_id}Delete a watch by task ID
POST/api/v1/watches/triggerTrigger a watch by to_uri
POST/api/v1/watches/{task_id}/triggerTrigger a watch by task ID
POST/api/v1/snapshot/commitCreate a snapshot
GET/api/v1/snapshot/logRead snapshot history
POST/api/v1/snapshot/restoreRestore a historical snapshot
GET/api/v1/snapshot/showInspect a snapshot or one of its files
GET/api/v1/snapshot/diffCompare snapshots
GET/api/v1/snapshot/ignoreRead snapshot ignore rules
PUT/api/v1/snapshot/ignoreReplace snapshot ignore rules
DELETE/api/v1/snapshot/ignoreClear snapshot ignore rules
POST/api/v1/pack/exportExport an .ovpack
POST/api/v1/pack/importImport an .ovpack
POST/api/v1/pack/backupBack up public scopes
POST/api/v1/pack/restoreRestore a backup package

Background Tasks, Runtime Observer, and Metrics

MethodPathDescription
GET/api/v1/tasks/{task_id}Get a background task
GET/api/v1/tasksList background tasks
GET/api/v1/observer/queueQueue status
GET/api/v1/observer/vikingdbVikingDB status
GET/api/v1/observer/modelsModel status
GET/api/v1/observer/lockLock status
GET/api/v1/observer/retrievalRetrieval status
GET/api/v1/observer/filesystemFilesystem status
GET/api/v1/observer/systemAggregate runtime status
GET/metricsPrometheus metrics

Administration and Privacy Configuration

MethodPathDescription
POST/api/v1/admin/accountsCreate an account and its first administrator
GET/api/v1/admin/accountsList accounts
POST/api/v1/admin/migrateMigrate legacy identity data
DELETE/api/v1/admin/accounts/{account_id}Delete an account
POST/api/v1/admin/accounts/{account_id}/usersRegister a user
GET/api/v1/admin/accounts/{account_id}/usersList users
DELETE/api/v1/admin/accounts/{account_id}/users/{user_id}Remove a user
PUT/api/v1/admin/accounts/{account_id}/users/{user_id}/roleChange a user role
POST/api/v1/admin/accounts/{account_id}/users/{user_id}/keyRegenerate a user key
GET/api/v1/privacy-configsList privacy configuration categories
GET/api/v1/privacy-configs/{category}List category targets
GET/api/v1/privacy-configs/{category}/{target_key}Get the active configuration
GET/api/v1/privacy-configs/{category}/{target_key}/versionsList configuration versions
GET/api/v1/privacy-configs/{category}/{target_key}/versions/{version}Get one version
POST/api/v1/privacy-configs/{category}/{target_key}Write and activate a new version
POST/api/v1/privacy-configs/{category}/{target_key}/activateActivate a version

WebDAV and VikingBot API

MethodPathDescription
OPTIONS/webdav/resources, /webdav/resources/{resource_path}Query WebDAV capabilities
PROPFIND/webdav/resources, /webdav/resources/{resource_path}Query resource properties
GET / HEAD/webdav/resources, /webdav/resources/{resource_path}Read a file or directory
PUT/webdav/resources, /webdav/resources/{resource_path}Write a UTF-8 text file
DELETE/webdav/resources, /webdav/resources/{resource_path}Delete a file or directory
MKCOL/webdav/resources, /webdav/resources/{resource_path}Create a directory
MOVE/webdav/resources, /webdav/resources/{resource_path}Move or rename a resource
GET/bot/v1/healthVikingBot health check
POST/bot/v1/chatNon-streaming VikingBot chat
POST/bot/v1/chat/streamStreaming VikingBot chat
POST/bot/v1/feedbackSubmit feedback for a VikingBot answer

Documentation Reading Plan

The sidebar is organized by responsibility rather than historical file size:

GroupWhat to look for
Core DataResources, content, filesystem, skills, sessions, and memory
Retrieval & RelationsSemantic retrieval, code retrieval, and resource relations
Data LifecycleWatches, snapshots, and OVPack
Operations & ObservabilitySystem, tasks, Observer, and Metrics
Identity & GovernanceAdministration and privacy configuration
Protocols & ExtensionsWebDAV and VikingBot API