curl --request POST \
--url https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases/{knowledgeBaseId}/documents/{documentId}/reindex \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"chunking_strategy": {},
"parser": "<string>",
"reason": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({chunking_strategy: {}, parser: '<string>', reason: '<string>'})
};
fetch('https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases/{knowledgeBaseId}/documents/{documentId}/reindex', 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/{knowledgeBaseId}/documents/{documentId}/reindex"
payload = {
"chunking_strategy": {},
"parser": "<string>",
"reason": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "vsf_550e8400-e29b-41d4-a716-446655440000",
"object": "knowledge_base.document",
"knowledge_base_id": "vs_7c9e6679-7425-40de-944b-e07fc1f90ae7",
"source_type": "connector_document",
"source_key": "web://https://contoso.sharepoint.com/sites/x/Shared%20Documents/report.pdf",
"source_url": "https://contoso.sharepoint.com/sites/x/Shared%20Documents/report.pdf",
"native_file_id": null,
"native_file_workspace_id": null,
"origin": "user",
"web_source_id": null,
"crawler_document_id": "crawl_doc_8842",
"status": "completed",
"index_generation": 3,
"filename": "report.pdf",
"mime_type": "application/pdf",
"bytes": 234567,
"parser": "tika",
"parsed_at": 1717000000,
"page_count": 12,
"char_count": 48213,
"chunking_strategy": null,
"scope": "knowledge",
"conversation_id": null,
"expires_at": null,
"tags": {
"project": "contracts-2026"
},
"metadata": {
"connector": "sharepoint",
"site_id": "site_123",
"drive_item_id": "item_456",
"version": "42"
},
"chunks_count": 37,
"vectors_count": 37,
"last_error": null,
"indexed_at": 1717000050,
"created_at": 1714972900,
"updated_at": 1717000050
}Force a re-run of the indexing pipeline (re-fetch, re-parse, re-chunk, re-embed)
Forced FULL re-run of the pipeline - fetch, parse, chunk,
embed, vector swap - on an EXISTING document only. 404 when
the document does not exist; no create or upsert semantics.
Increments index_generation; the previous good vectors remain
searchable until the new generation commits.
This is also the rechunk operation: pass
chunking_strategy to re-run with new settings. The override
is persisted on the document (replacing any previous
per-document override) so later re-runs reuse it. Pass the
reserved value {"type": "default"} to clear the override so
the document follows its knowledge base again; this is the only
route that accepts it. Documents without an override pick up the
store-level chunking_strategy on their next run; to re-run a
whole store use POST /v1/knowledge_bases/{knowledgeBaseId}/reindex.
For a web_page document this also re-fetches its URL through
the crawler (a single-page refresh).
Fetch behaviour by source type:
uploaded_file- storage mints a fresh native fetch URL; cannot expire.web_page/remote_file- the crawler re-fetches the URL.connector_document- its content was fetched through the connector with a short-lived signed URL that is never stored, so storage cannot fetch it again itself. Theparser/chunking_strategyoverride is saved first, then storage asks the document’s connection for a targeted resynchronization of this one document (no listing of the source, no failure backoff). The response is202with the document unchanged and aresyncobject; the document switches toin_progresswithin seconds, when the connection re-sends it, and is indexed with the saved override - now and at every later synchronization. Only the connection’s owner can trigger it (409 CONNECTOR_RESYNC_OWNER_ONLYotherwise; the override stays saved and applies at the next synchronization). While the connection synchronizes, the resynchronization is queued behind it (resync.queued: true) rather than refused. A connector document materialized as a native file is re-fetched like anuploaded_filewhile that copy exists; once it has expired, the document is delegated to its connection as above.
Requires editor+.
curl --request POST \
--url https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases/{knowledgeBaseId}/documents/{documentId}/reindex \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"chunking_strategy": {},
"parser": "<string>",
"reason": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({chunking_strategy: {}, parser: '<string>', reason: '<string>'})
};
fetch('https://{host}/v2/workspaces/slug:storage/webhooks/v1/knowledge_bases/{knowledgeBaseId}/documents/{documentId}/reindex', 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/{knowledgeBaseId}/documents/{documentId}/reindex"
payload = {
"chunking_strategy": {},
"parser": "<string>",
"reason": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "vsf_550e8400-e29b-41d4-a716-446655440000",
"object": "knowledge_base.document",
"knowledge_base_id": "vs_7c9e6679-7425-40de-944b-e07fc1f90ae7",
"source_type": "connector_document",
"source_key": "web://https://contoso.sharepoint.com/sites/x/Shared%20Documents/report.pdf",
"source_url": "https://contoso.sharepoint.com/sites/x/Shared%20Documents/report.pdf",
"native_file_id": null,
"native_file_workspace_id": null,
"origin": "user",
"web_source_id": null,
"crawler_document_id": "crawl_doc_8842",
"status": "completed",
"index_generation": 3,
"filename": "report.pdf",
"mime_type": "application/pdf",
"bytes": 234567,
"parser": "tika",
"parsed_at": 1717000000,
"page_count": 12,
"char_count": 48213,
"chunking_strategy": null,
"scope": "knowledge",
"conversation_id": null,
"expires_at": null,
"tags": {
"project": "contracts-2026"
},
"metadata": {
"connector": "sharepoint",
"site_id": "site_123",
"drive_item_id": "item_456",
"version": "42"
},
"chunks_count": 37,
"vectors_count": 37,
"last_error": null,
"indexed_at": 1717000050,
"created_at": 1714972900,
"updated_at": 1717000050
}Authorizations
User session JWT or instance API key (iak_*). Send as Authorization: Bearer <token>.
Path Parameters
Knowledge base id. Legacy physical prefix vs_ (the kb_ rename is deferred).
128^vs_[A-Za-z0-9-]+$Document id. Legacy physical prefix vsf_ (the doc_ rename is deferred).
128^vsf_[A-Za-z0-9-]+$Body
Rechunk with these settings. Persisted as the
document's chunking_strategy override. The reserved
value {"type": "default"} clears that override, so
the document follows its knowledge base again. This is
the only route that accepts it; the others reject it
with VALIDATION_ERROR.
Per-document parser override, persisted on the
document and reused by later re-runs. The sentinel
value "default" clears any existing override
(reverts to the store-level parser).
Free-form audit context (e.g. parser_upgrade).
256Response
Re-indexing queued; document returned with status: in_progress.
For a connector document, the document is returned as it was,
with resync: {connection_id, sync_id, queued}: its connection
re-sends it and it switches to in_progress within seconds, or
once the running synchronization ends when queued is true.
Association between a source and a knowledge base - the only
membership model (no files registry). The server computes
source_key and dedups on (knowledge_base_id, source_key).
fetch_url is intentionally ABSENT from this schema: it is
write-only at the API boundary (may embed credentials). For
source_type: uploaded_file no fetch URL is stored at all -
storage mints a fresh short-lived one (as a privileged
workspace) whenever the crawler needs bytes, so expired-token
failures are structurally impossible for uploaded files.
128^vsf_[A-Za-z0-9-]+$knowledge_base.document ^vs_[A-Za-z0-9-]+$Discriminator. uploaded_file for platform-native files
(attached by native_file_id); remote_file for document
bytes at an arbitrary URL; web_page for HTML pages
(single URL or crawl-discovered); connector_document for
sources owned by a third-party connector.
uploaded_file, remote_file, web_page, connector_document Server-computed canonical source URI; the dedup key,
UNIQUE with knowledge_base_id.
prisme-file://{workspace_id}/{native_file_id} for
uploaded files (stable across renames - never the rebuilt
native URL); web://{normalized_url} otherwise.
Normalization is conservative (strip fragment, lowercase
scheme + host, normalize percent-encoding, strip default
ports - query params untouched) and shared with the
crawler's canonicalization.
2048User-facing provenance URL - citations, UI links, audit
logs. Stable by construction for connector documents
(e.g. SharePoint webUrl) and web pages (the page URL). For
uploaded files, a display URL (caller-overridable at
attach time); downloadable links are minted lazily via
GET /documents/{document_id}/source_url.
Provenance, set at row creation and never overwritten by
seed adoption. Seed deletion cascades only over
origin: web_source rows - a manually attached page later
discovered by a seed keeps origin: user and survives the
seed's deletion (losing only its web_source_id).
user, web_source Authoritative indexing status. Transitions are guarded by
index_generation - stale or duplicate callbacks are
ignored. fetch_expired is connector-facing: the
ephemeral fetch URL no longer works and the owning
connector must refresh it via the upsert (POST /documents with the same source_url); it is never a
user-actionable error and never occurs for
uploaded_file sources. rejected means a
before_file_ingest hook blocked the content (an
after_file_parse block is failed with
last_error.code: HookRejected) - see rejected_by, and
public_rejection_reason for the only reason that may be
shown to an end user.
queued, in_progress, completed, failed, fetch_expired, rejected Platform-native file id when source_type: uploaded_file.
Workspace owning the native file. Defaults to the caller's workspace.
Primary producing/adopting seed (origin-of-record), when
any. Multi-attribution (a page reachable from several
seeds) is carried by parent_web_source_ids.
^seed_[A-Za-z0-9-]+$All seeds whose crawl scope covers this page. Backs per-seed page counts and
seed cascade-delete: deleting a seed removes it from this
array and drops the row only when the array empties AND
origin: web_source. Empty/absent ⇒ unattributed (counted
in the /web_sources summary residual).
^seed_[A-Za-z0-9-]+$Crawler-side document id, set once the crawler has seen this source.
Monotonically increasing per document; incremented on every (re)index. Search reads only the latest committed generation; a reindex swaps the new generation in only on success, so the previous good vectors remain searchable on failure.
x >= 1255x >= 0Parser used at last successful parse.
x >= 0x >= 0Per-document override of the store default.
knowledge, conversation Unix seconds. TTL for conversation-scope documents.
Caller-supplied tags. Editable via PATCH. Filterable on list.
Connector-supplied structured context (e.g. connector,
site_id, drive_item_id, version). Editable via PATCH.
x >= 0x >= 0Most recent failure context. Cleared when a new indexing
attempt transitions to in_progress. code: SOURCE_UNAVAILABLE signals a dangling reference (e.g. the
native file was deleted out-of-band - native files emit no
lifecycle events, so this surfaces at the next fetch).
Human-readable narrative status, distinct from last_error
(e.g. a partial-success or skipped note).
Unix seconds of the most recent failure.
Why an external hook blocked the content, as the hook gave
it, kept whether or not the hook config sets
expose_reason, so it is for the knowledge base's
administrators: never relay it to an end user, and returned
only to the base's owners and storage / platform admins
(null for any other reader). Set when
status: rejected (before_file_ingest) and on a document
failed with last_error.code: HookRejected
(after_file_parse). With public_rejection_reason and
rejected_by, it is the trace of the last refusal: a
reindex keeps it and the next failure resets it, so it is
meaningful only while the document is rejected or
failed with last_error.code: HookRejected.
The part of rejection_reason the hook allowed to be shown
(expose_reason: true); empty otherwise. The only refusal
reason a client or an agent may relay to the end user.
Identifier of the hook that produced the rejection.
Unix seconds. Set when the document reaches completed.
Was this page helpful?