curl --request GET \
--url https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"object": "list",
"data": [
{
"id": "<string>",
"object": "knowledge_base",
"name": "<string>",
"index_name": "<string>",
"embedding": {
"model": "<string>",
"dimensions": 2
},
"owner": {
"id": "<string>"
},
"owner_org_slug": "<string>",
"created_at": 123,
"description": "<string>",
"chunking_strategy": {},
"file_parsing": {
"image": "<string>",
"audio": "<string>",
"document": "<string>"
},
"document_counts": {
"queued": 1,
"in_progress": 1,
"completed": 1,
"failed": 1,
"fetch_expired": 1,
"total": 1
},
"owner_user_id": "<string>",
"agent_id": "<string>",
"processing": {
"crawler_reachable": true,
"health": {
"message": "<string>",
"last_event_at": 123
},
"metrics": {
"total_items": 1,
"indexed": 1,
"failed": 1,
"skipped": 1
},
"last_run_at": 123
},
"crawl_settings": {
"webpages_limit": 2,
"periodicity": 123,
"paused": true,
"max_webpages_limit": 123
},
"web_source_count": 1,
"last_active_at": 123,
"updated_at": 123
}
],
"total": 1,
"page": 2,
"limit": 50,
"has_more": true
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "Authentication required."
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "<string>",
"details": {}
}
}List knowledge bases visible to the caller
Scoped by the caller’s active orgSlug and access bindings.
curl --request GET \
--url https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"object": "list",
"data": [
{
"id": "<string>",
"object": "knowledge_base",
"name": "<string>",
"index_name": "<string>",
"embedding": {
"model": "<string>",
"dimensions": 2
},
"owner": {
"id": "<string>"
},
"owner_org_slug": "<string>",
"created_at": 123,
"description": "<string>",
"chunking_strategy": {},
"file_parsing": {
"image": "<string>",
"audio": "<string>",
"document": "<string>"
},
"document_counts": {
"queued": 1,
"in_progress": 1,
"completed": 1,
"failed": 1,
"fetch_expired": 1,
"total": 1
},
"owner_user_id": "<string>",
"agent_id": "<string>",
"processing": {
"crawler_reachable": true,
"health": {
"message": "<string>",
"last_event_at": 123
},
"metrics": {
"total_items": 1,
"indexed": 1,
"failed": 1,
"skipped": 1
},
"last_run_at": 123
},
"crawl_settings": {
"webpages_limit": 2,
"periodicity": 123,
"paused": true,
"max_webpages_limit": 123
},
"web_source_count": 1,
"last_active_at": 123,
"updated_at": 123
}
],
"total": 1,
"page": 2,
"limit": 50,
"has_more": true
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "Authentication required."
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "<string>",
"details": {}
}
}Authorizations
User session JWT or instance API key (iak_*). Send as Authorization: Bearer <token>.
Query Parameters
Page size. Server clamps to [1, 100] silently.
1 <= x <= 1001-based page number.
x >= 1Case-insensitive substring match on name.
Case-insensitive substring match on name OR description
(legacy /vector_stores?search= parity; takes precedence
over name when both are sent - added 2026-07-15, SPA
migration F1).
Comma-separated list of store populations to include -
owned, shared, all, agents. Defaults to
owned,shared. all/agents require the corresponding
admin/agent access.
Documented valid values; not strictly server-validated - an unrecognized value yields an empty result rather than a 400.
creating, active, failed, deleting Response
Paginated knowledge bases.
Shared list-response envelope. Array is always data. Every
element carries its own object discriminator.
list Hide child attributes
Hide child attributes
128^vs_[A-Za-z0-9-]+$knowledge_base 256mock, elasticsearch, opensearch, redis, pgvector, qdrant, pinecone Physical index name on the provider.
creating before external resources are provisioned;
active after metadata + physical setup + owner binding
succeed; failed is a visible failed state with a
cleanup-job hook; deleting is the transactional deletion
window.
creating, active, failed, deleting First-class owner principal (§F-6). For agent-owned
(conversation-scope) stores type: agent and id is the
agent id - represented as a principalType: agent binding
in the platform-managed product_bindings store, NOT a
blanked owner_user_id. owner_user_id / agent_id below
mirror this for convenience and filtering.
Tenant scope. All knowledge-base lookups are scoped by this field.
4096Default chunking for documents; overridable per document.
tika, tika-ocr, unstructured, unstructured-ocr, llm, null Per-status aggregate over this store's documents.
Maintained with transitions guarded by each document's
index_generation - duplicate or stale crawler callbacks
cannot corrupt counters.
Hide child attributes
Hide child attributes
x >= 0x >= 0x >= 0x >= 0x >= 0x >= 0owner.id when owner.type == user; null for agent-owned stores.
owner.id when owner.type == agent; null otherwise. Filterable on list.
Caller's effective role, computed at read time from access
bindings. Null on cross-workspace (workspace_jwt) reads.
owner, admin, editor, reader, null owner, admin_binding, editor_binding, reader_binding, agent_binding, trusted_workspace, null Knowledge-base processing / parser-backend health (§F-5). The
crawler is the universal parse/fetch backend for EVERY document
(uploads, single pages, web crawl), so this is present whenever
the knowledge base has documents - even with zero web sources.
Live fields come from the crawler; when it is unreachable
crawler_reachable is false and the live status/metrics
degrade to null rather than erroring (replacing the legacy
overloaded status:"unknown" + crawler_error). DB-derived
per-seed counts live on /web_sources and remain available
regardless.
Hide child attributes
Hide child attributes
idle, processing, paused, unknown, null null by default - the live crawler round-trip only runs when
the KB detail request passes ?include=processing; true/
false otherwise.
The persisted crawler health - previously exposed by no endpoint, now surfaced here (powers OUT_OF_SPACE / PAUSED inline banners).
Live KB-wide item counts from the crawler; null when unreachable.
Engine-global crawl settings - one Crawler instance per KB, so these are the single values the crawler honors (they are NOT per-seed). Read from the store-level columns; edited via the KB PATCH (added 2026-07-17, web-sources crawl-settings re-home).
Hide child attributes
Hide child attributes
Per-crawl page cap, governance-capped (Platform → Org hierarchy).
x >= 1Seconds between crawls; null = manual-only (seconds integer rather than an enum for lossless crawler parity - deviation 06-A-1).
Whether the whole crawler is paused.
Resolved governance cap (Platform → Org hierarchy) for
webpages_limit - the "max allowed" hint surfaced on the
KB detail response. Read-only; not accepted on PATCH
(added 2026-07-20).
Number of registered web sources (crawl seeds). Summary
metadata for list cards - the seed objects themselves stay
on /web_sources (added 2026-07-15, SPA migration F1).
x >= 0Unix seconds.
x >= 0x >= 11 <= x <= 100Was this page helpful?