For AI agents: markdown of this page — /docs-content-en/entities/calendar-sections/list.md documentation index — /llms.txt
List sections
GET /v1/calendar-sections
Returns all calendar sections for a type + ownerId pair. A single employee may have several sections — for example, "Work", "Personal", "Team meetings".
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Parametertype (query) |
Typestring | Requiredyes | Default— | DescriptionCalendar type: user — personal, group — workgroup, company_calendar — company calendar, location — meeting room |
ParameterownerId (query) |
Typenumber | Requiredyes | Default— | DescriptionCalendar owner identifier. For an employee — the ID from GET /v1/users, for a workgroup — its ID, for type=location — 0 |
Parameterlimit (query) |
Typenumber | Requiredno | Default50 |
DescriptionNumber of records, up to 5000. When limit > 50, auto-pagination is enabled |
Parameteroffset (query) |
Typenumber | Requiredno | Default0 |
DescriptionAccepted, but does not affect the result set — the list returns all sections of the type + ownerId pair |
Parameterselect (query) |
Typestring | Requiredno | Default— | DescriptionComma-separated fields to include in the response: ?select=id,name,color |
Parameterfilter (query) |
Typeobject | Requiredno | Default— | DescriptionAnother way to pass type and ownerId. The list accepts no other keys: for example, filter[name]=... returns 400 UNSUPPORTED_FILTER before reaching Bitrix24.Filtering syntax. Example: ?filter[type]=user&filter[ownerId]=1 |
Parametersort (query) |
Typestring | Requiredno | Default— | DescriptionAccepted, but does not affect the order of sections in the response |
Parameterorder (query) |
Typeobject | string | Requiredno | Default— | DescriptionBoth forms — ?order[id]=desc and ?order=desc — are accepted but, like sort, do not affect the order of sections in the response. In the order[field] form, a direction other than asc, desc, ASC, or DESC returns 400 INVALID_SORT_DIRECTION |
ParameterwithTotal (query) |
Typestring | Requiredno | Default— | DescriptionThe values true and false are recognized. For sections, the parameter does not affect the response: meta.total is returned even with withTotal=false |
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/calendar-sections?type=user&ownerId=1" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/calendar-sections?type=user&ownerId=1" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const params = new URLSearchParams({ type: 'user', ownerId: '1' })
const res = await fetch(`https://vibecode.bitrix24.com/v1/calendar-sections?${params}`, {
headers: {
'X-Api-Key': 'YOUR_API_KEY',
},
})
const { success, data, meta } = await res.json()
console.log(`Found ${meta.total} sections`)
JavaScript — OAuth application
const params = new URLSearchParams({ type: 'user', ownerId: '1' })
const res = await fetch(`https://vibecode.bitrix24.com/v1/calendar-sections?${params}`, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { success, data, meta } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata |
Typearray | DescriptionArray of sections |
Fieldmeta.total |
Typenumber | DescriptionTotal number of sections in the result set |
Fieldmeta.hasMore |
Typeboolean | DescriptionWhether there are more records beyond limit |
Fields of a single section in the data array:
| Field | Type | RO | Description |
|---|---|---|---|
Fieldid |
Typenumber | ROyes | DescriptionSection identifier |
Fieldname |
Typestring | ROno | DescriptionName |
Fielddescription |
Typestring | ROno | DescriptionDescription |
Fieldtype |
Typestring | ROno | DescriptionCalendar type: user, group, company_calendar, location |
FieldownerId |
Typenumber | ROno | DescriptionCalendar owner identifier. For an employee — the ID from GET /v1/users |
Fieldcolor |
Typestring | ROno | DescriptionSection color in #RRGGBB format |
FieldtextColor |
Typestring | ROno | DescriptionText color in #RRGGBB format |
Fieldexport |
Typeobject | ROno | DescriptionExport parameters in iCal format. The key set depends on the direction: on read, the response carries ALLOW, PATH, and LINK; on write, the endpoint accepts ALLOW and SET — see Create a section. The keys are uppercase and are not converted to camelCase |
Fieldaccess |
Typeobject | ROyes | DescriptionAccess rights map: key — access-right identifier, value — numeric permission identifier |
Fieldperm |
Typeobject | ROyes | DescriptionCurrent employee's permissions map: view_time, view_title, view_full, add, edit, edit_section, access |
FieldisCollab |
Typeboolean | ROyes | DescriptionWhether the section belongs to a collab |
FieldcreatedBy |
Typenumber | ROyes | DescriptionID of the employee who created the section. Employee list: GET /v1/users |
FielddateCreate |
Typedatetime | ROyes | DescriptionCreation date |
FieldupdatedAt |
Typedatetime | ROyes | DescriptionLast modification date |
"RO" — the field is read-only: passing it in POST / PATCH makes Vibecode return 400 READONLY_FIELD.
Response example
{
"success": true,
"data": [
{
"id": 42,
"name": "Work",
"description": "Main work calendar",
"type": "user",
"ownerId": 1,
"color": "#9cbeee",
"textColor": "#283000",
"export": {
"ALLOW": true,
"PATH": "https://example.bitrix24.com/company/personal/user/1/calendar/",
"LINK": "&type=user&owner=1&ncc=1&user=1&sec_id=42&sign=704a559a691722ae080fa420dcb9d7f8"
},
"access": {
"U1": 39,
"G2": 13
},
"perm": {
"view_time": true,
"view_title": true,
"view_full": true,
"add": true,
"edit": true,
"edit_section": true,
"access": true
},
"isCollab": false,
"createdBy": 1,
"dateCreate": "2026-05-15 09:34:33",
"updatedAt": "2026-05-15 09:34:33"
}
],
"meta": {
"total": 1,
"hasMore": false
}
}
Error response example
400 — required type or ownerId not passed:
{
"success": false,
"error": {
"code": "MISSING_REQUIRED_PARAMS",
"message": "GET /v1/calendar-sections requires query parameters: type, ownerId. Example: GET /v1/calendar-sections?type=...&ownerId=..."
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| HTTP400 | CodeMISSING_REQUIRED_PARAMS |
Descriptiontype or ownerId not passed |
| HTTP400 | CodeUNSUPPORTED_FILTER |
DescriptionA filter[...] key other than filter[type] and filter[ownerId] was passed |
| HTTP400 | CodeINVALID_SORT_DIRECTION |
DescriptionThe direction in order[field] is not asc, desc, ASC, or DESC |
| HTTP403 | CodeSCOPE_DENIED |
DescriptionThe API key does not have the calendar scope |
| HTTP401 | CodeTOKEN_MISSING |
DescriptionThe API key has no configured tokens |
| HTTP502 | CodeBITRIX_UNAVAILABLE |
DescriptionBitrix24 is temporarily unavailable — retry the request later |
| HTTP429 | CodeRATE_LIMITED |
DescriptionRate limit exceeded: 300 requests per minute per portal. All API keys of the portal share one limit. The current limit is returned in the x-ratelimit-limit header. Retry after the delay in the Retry-After header |
For the full list of common API errors, see Errors.
Known specifics
limit trims the output on the Vibecode API side; offset has no effect. The list always returns all sections of the specified type + ownerId pair. limit trims the received array to N records, while offset is accepted but ignored — you cannot skip records with it.
The export key set differs between read and write. The response carries ALLOW, PATH, and LINK: PATH is the calendar URL in the Bitrix24 account; LINK is the signed query string appended to the iCal export URL. The export period is set with the SET key when sending via POST /v1/calendar-sections, but it never comes back in the response — store the value on your side if you need it for display. Bitrix24 key casing is preserved in both directions: the keys stay uppercase and are not converted to camelCase.
Dates arrive in the Bitrix24 account time zone without an offset. The format of dateCreate and updatedAt is YYYY-MM-DD HH:MM:SS. To parse them as a point in time, append the account's time zone offset yourself: new Date(s.replace(' ', 'T') + '+00:00').
A single section cannot be fetched by id via the API. The GET /v1/calendar-sections/:id endpoint is not supported. To find one section by id, get the list and filter it on the client side: data.find(s => s.id === 42).