cursor / next_cursor).
Create workspace
name(required, 1–200 chars) — Human-readable workspace name.domain_slug(optional, default"generic") — Domain vocabulary slug. Resolved to the latest published version unlessdomain_versionis also set.domain_version(optional) — Pin a specific published domain version. Omit to take the latest.access(optional) — Access-control configuration:labels— List of{name, description}labels. Empty list (the default) disables filtering entirely.default_label— Required whenlabelsis non-empty. Applied when the classifier cannot decide. Must name one of the declared labels.
retention_policy(optional):derived_ttl_days— Days before derived representations expire (anchored oningested_at). Null = keep forever.source_ttl_days— Days before source bytes are deleted (anchored oncreated_at). Null = keep forever.job_ttl_days(default 30) — Days to retain job input and result payloads. Null = keep forever.
knowledge_graph(optional) — Graph build policy. Editable later via Update workspace.auto_build(defaultfalse) — Build the graph automatically after each ingestion completes. Off by default because a build is billable and long-running; settruefor a workspace that should always hold a graph over what it ingests.exclude_path_prefixes/exclude_categories— Files matching either are kept out of the graph corpus, unless the file’s owngraph_inclusionisinclude.
workspace_id— UUID for the workspace.domain_slug/domain_version— The resolved vocabulary this workspace uses.knowledge_graph.auto_build— Whether ingestion automatically triggers a KG build (defaultfalse).status—activeordeleting.
domain_not_found(404) — Slug does not match any visible domain.domain_not_published(409) — The resolved domain version is a draft, not published.default_label_required(422) —access.labelsis non-empty butdefault_labelis missing.
List workspaces
name_contains(optional) — Case-insensitive substring filter on workspace name.cursor(optional) — Opaque cursor fromnext_cursor.limit(optional, default 50, max 200)
Get workspace
workspace_not_found(404) — No such workspace for this key. Cross-tenant reads are indistinguishable from missing rows.
Update workspace
auto_build to true hands that trigger to ingestion instead, for a workspace that
wants a graph over everything it ingests and accepts one build per ingestion. Either
way a build already in flight keeps running — cancel its job if that is what you
meant.
Errors:
workspace_not_found(404) — No such workspace for this key.workspace_deleting(409) — A teardown is in flight; the workspace accepts no further writes.invalid_request(422) — An unknown field, such as an attempt to rename the workspace.
Get workspace stats
stale > 0 means observed and ingested hashes diverged — run an ingestion with
selection.stale_only=true to catch up. expired > 0 means derived representations
were dropped by retention; re-ingest to make those files searchable again.
Delete workspace
confirm_name must equal the workspace’s name exactly; this is deliberate friction.
The teardown (storage prefix, search index, graph nodes) runs asynchronously — poll
the returned job.
Request:
Job with kind: "workspace_delete".
Errors:
workspace_deleting(409) — A teardown is already in flight.invalid_request(422) —confirm_namedoes not match the workspace name.