For AI agents: markdown of this page — /docs-content-en/note/documents/list.md documentation index — /llms.txt
List documents
GET /v1/note/documents
Returns a flat list of accessible documents, paginated with a continuation cursor. To traverse a large knowledge base in full, use this method: the document tree of a single knowledge base is not paginated.
The generic filter parameter is not applied by this endpoint. By default, the API preserves the previous HTTP 200 response and data, adds Warning: 299 - "filter is not supported on this endpoint and was ignored", and records unsupported-filter use in the server log.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
Parameterlimit (query) |
Typeinteger | Requiredno | DescriptionPage size, from 1 to 200 |
ParameterafterCursor (query) |
Typestring | Requiredno | DescriptionThe previous response's meta.nextCursor object as URL-encoded JSON. Fields: stream, collectionId, id |
Pass the cursor fields unchanged. collectionId may be null. Stop the traversal only when meta.nextCursor is null: an empty data array with a non-null cursor means you must request the next page.
Examples
curl — personal key
curl -G https://vibecode.bitrix24.com/v1/note/documents \
--data-urlencode "limit=20" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl -G https://vibecode.bitrix24.com/v1/note/documents \
--data-urlencode "limit=20" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
let cursor = null
do {
const params = new URLSearchParams({ limit: '20' })
if (cursor) params.set('afterCursor', JSON.stringify(cursor))
const res = await fetch(`https://vibecode.bitrix24.com/v1/note/documents?${params}`, {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
if (!res.ok) throw new Error(`HTTP ${res.status}`)
const { data, meta } = await res.json()
for (const document of data) console.log(document.id)
cursor = meta.nextCursor
} while (cursor !== null)
JavaScript — OAuth application
let cursor = null
do {
const params = new URLSearchParams({ limit: '20' })
if (cursor) params.set('afterCursor', JSON.stringify(cursor))
const res = await fetch(`https://vibecode.bitrix24.com/v1/note/documents?${params}`, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
if (!res.ok) throw new Error(`HTTP ${res.status}`)
const { data, meta } = await res.json()
for (const document of data) console.log(document.id)
cursor = meta.nextCursor
} while (cursor !== null)
Response fields
| Field | Type | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata |
Typearray | DescriptionDocuments on this page. The array may be empty while meta.nextCursor is not null |
Fielddata[].id |
Typenumber | DescriptionDocument identifier |
Fielddata[].collectionId |
Typenumber | DescriptionThe knowledge base the document belongs to. List: GET /v1/note/collections |
Fielddata[].parentId |
Typenumber or null | DescriptionParent document in the knowledge base tree. null for a top-level document |
Fielddata[].title |
Typestring | DescriptionDocument title |
Fielddata[].position |
Typenumber | DescriptionSort order among sibling documents |
Fielddata[].createdBy |
Typenumber | DescriptionCreator identifier. List: GET /v1/users |
Fielddata[].updatedBy |
Typenumber | DescriptionIdentifier of the last editor. List: GET /v1/users |
Fielddata[].createdAt |
Typestring | DescriptionCreation date in ISO 8601 format |
Fielddata[].updatedAt |
Typestring | DescriptionLast modification date in ISO 8601 format |
Fielddata[].contentUpdatedAt |
Typestring or null | DescriptionDate of the last content change in ISO 8601 format, or null. A title-only edit does not change it |
Fielddata[].state |
Typestring | DescriptionDocument state. live for an active document |
Fielddata[].isArchived |
Typeboolean | Descriptiontrue for an archived document |
Fielddata[].isTrashed |
Typeboolean | Descriptiontrue for a document in the trash |
Fielddata[].isOrphan |
Typeboolean | Descriptiontrue for a document that belongs to no knowledge base |
Fieldmeta.nextCursor |
Typeobject or null | DescriptionNext-page cursor { stream, collectionId, id }, or null at the end |
Response example
A page of two documents with a continuation cursor:
{
"success": true,
"data": [
{
"id": 11,
"collectionId": 9,
"parentId": null,
"title": "Chapter 1",
"position": 1000,
"createdBy": 1269,
"updatedBy": 1269,
"createdAt": "2026-06-23T22:07:29+00:00",
"updatedAt": "2026-06-23T22:07:29+00:00",
"contentUpdatedAt": null,
"state": "live",
"isArchived": false,
"isTrashed": false,
"isOrphan": false
},
{
"id": 5,
"collectionId": 7,
"parentId": null,
"title": "Chapter 1 (updated)",
"position": 1000,
"createdBy": 1269,
"updatedBy": 1269,
"createdAt": "2026-06-22T12:17:40+00:00",
"updatedAt": "2026-07-06T12:03:47+00:00",
"contentUpdatedAt": null,
"state": "live",
"isArchived": false,
"isTrashed": false,
"isOrphan": false
}
],
"meta": {
"nextCursor": { "stream": "collections", "collectionId": 7, "id": 5 }
}
}
Error response example
400 — limit is outside the range from 1 to 200:
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "`limit` must be an integer between 1 and 200"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| HTTP200 | CodeWarning: 299 |
DescriptionThe filter is ignored by default; previous data is preserved and the warning is sent in the Warning header. |
| HTTP400 (strict mode only) | CodeUNSUPPORTED_FILTER |
DescriptionThe server mode is disabled by default; until it is enabled, the endpoint preserves HTTP 200 and the previous data. |
| HTTP400 | CodeINVALID_PARAMS |
Descriptionlimit outside 1…200 or malformed afterCursor |
| HTTP403 | CodeSCOPE_DENIED |
DescriptionThe key lacks the note scope |
| HTTP401 | CodeTOKEN_MISSING |
DescriptionThe API key has no tokens configured |
Full list of common API errors — Errors.