
## Event fields

`GET /v1/calendar-events/fields`

Returns the event field schema: type, readonly flag, available batch operations.

## Examples

### curl — personal key

```bash
curl "https://vibecode.bitrix24.com/v1/calendar-events/fields" \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth application

```bash
curl "https://vibecode.bitrix24.com/v1/calendar-events/fields" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/calendar-events/fields', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})

const { success, data } = await res.json()
console.log('Fields:', Object.keys(data.fields).length)
```

### JavaScript — OAuth application

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/calendar-events/fields', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

const { success, data } = await res.json()
```

## Response fields

| Field | Type | RO | Description |
|------|-----|:--:|---------|
| `id` | number | yes | Event ID |
| `parentId` | number | yes | Parent event ID (for recurring events, matches the `id` of the source event) |
| `active` | boolean | yes | Whether the event is active. Returned in the `GET /v1/calendar-events` list, absent from the `GET /v1/calendar-events/:id` card |
| `deleted` | boolean | yes | Deletion flag |
| `name` | string | | Title |
| `description` | string | | Description |
| `type` | string | | Calendar type: `user`, `group`, `company_calendar` |
| `ownerId` | number | | Calendar owner ID. Employee: `GET /v1/users` |
| `from` | datetime | | Start (ISO 8601) |
| `to` | datetime | | End (ISO 8601) |
| `skipTime` | boolean | | All-day event. When `true`, the duration is fixed at 24 hours |
| `durationSeconds` | number | yes | Event duration in seconds |
| `importance` | string | | Importance: `high`, `normal`, `low` |
| `accessibility` | string | | Availability: `busy`, `quest`, `free`, `absent` |
| `location` | string | | Venue |
| `color` | string | | Event color (HEX) |
| `textColor` | string | | Event text color (HEX). Returned in the `GET /v1/calendar-events` list, absent from the `GET /v1/calendar-events/:id` card |
| `sectionId` | number | | Calendar section ID |
| `isPrivate` | boolean | | Private event |
| `isMeeting` | boolean | | Meeting event with invitations |
| `attendees` | number[] | | Array of invited employee IDs for writing. **Write-only** — this field is not returned in event responses; attendees are available in `attendeeList`, `attendeesCodes` |
| `attendeesCodes` | string[] | yes | Internal Bitrix24 attendee codes (format `U<id>`) |
| `attendeeList` | array | yes | Extended attendee list: `{ id, entryId, status }`, where `status` is `Y` (accepted), `H` (host), `Q` (tentative), `N` (declined) |
| `remind` | array | | Reminder settings |
| `rrule` | object | | Recurrence schedule of a recurring event: periodicity (`FREQ`), interval (`INTERVAL`), days of the week (`BYDAY`), series boundary (`UNTIL` or `COUNT`). On read, `BYDAY` comes back as a dictionary object such as `{"MO":"MO"}`, and `UNTIL` is a date string in the Bitrix24 account's regional format that Bitrix24 fills in even when `COUNT` is set |
| `createdBy` | number | yes | Event creator ID. Lookup: `GET /v1/users` |
| `dateCreate` | string | yes | Creation date. A Bitrix24-formatted string that depends on the Bitrix24 account's regional settings (for example `08.06.2026 17:29:51` or `06/08/2026 05:29:51 pm`). This is not ISO 8601 — do not parse it with a fixed parser |
| `updatedAt` | string | yes | Last modification date. A string in the same Bitrix24 account regional format as `dateCreate`. This is not ISO 8601 |
| `meetingStatus` | string | yes | Participation status of the calendar owner: `Y` (accepted), `H` (host), `Q` (tentative), `N` (declined) |
| `meetingHost` | number | yes | Meeting organizer ID. Lookup: `GET /v1/users` |
| `eventType` | string | yes | Technical event type (for system events) |
| `syncStatus` | string | yes | Synchronization status with external calendars |
| `recurrenceId` | number | yes | Recurring event series ID |
| `collabId` | number | yes | Collaboration ID (when external users participate) |

Unset scalar fields are returned as `null`, empty arrays as `[]`. In a minimal event `null` arrives, for example, in `eventType`, `description`, `location`, `color`, `textColor`, `rrule`, `recurrenceId`, `syncStatus`, `collabId`, while `remind` arrives as an empty array `[]`.

## Response example

```json
{
  "success": true,
  "data": {
    "fields": {
      "id": { "type": "number", "readonly": true, "label": "Event ID", "description": "Unique calendar event identifier." },
      "name": { "type": "string", "readonly": false, "label": "Name", "description": "Calendar event name." },
      "type": { "type": "string", "readonly": false, "label": "Calendar type", "description": "Event calendar type: user, group, or the company shared calendar." },
      "ownerId": { "type": "number", "readonly": false, "label": "Calendar owner ID", "description": "Identifier of the calendar owner — an employee or a workgroup." },
      "from": { "type": "datetime", "readonly": false, "label": "Event start", "description": "Event start date and time in ISO 8601 format with the time-zone offset." },
      "to": { "type": "datetime", "readonly": false, "label": "Event end", "description": "Event end date and time in ISO 8601 format with the time-zone offset." },
      "skipTime": { "type": "boolean", "readonly": false, "label": "All-day event", "description": "Whether the event lasts all day without a specific time." },
      "durationSeconds": { "type": "number", "readonly": true, "label": "Duration in seconds", "description": "Event duration in seconds." },
      "importance": { "type": "string", "readonly": false, "label": "Importance", "description": "Event importance level: high, normal, or low." },
      "accessibility": { "type": "string", "readonly": false, "label": "Availability", "description": "Owner availability status during the event: busy, tentative, free, or absent." },
      "sectionId": { "type": "number", "readonly": false, "label": "Calendar section ID", "description": "Identifier of the calendar section the event is recorded in." },
      "attendees": { "type": "array", "readonly": false, "label": "Invited attendees", "description": "Array of IDs of employees invited to the event — a write-only field; in the response attendees are returned in attendeeList and attendeesCodes." },
      "rrule": { "type": "object", "readonly": false, "label": "Recurrence rule", "description": "Recurrence schedule of a recurring event: frequency, interval, weekdays, and the series-end condition." },
      "dateCreate": { "type": "string", "readonly": true, "label": "Creation date", "description": "Event creation date and time as a string, depending on the account regional settings." },
      "updatedAt": { "type": "string", "readonly": true, "label": "Change date", "description": "Event last-change date and time as a string, depending on the account regional settings." }
    },
    "batch": ["create", "update", "delete"]
  }
}
```

## Error response example

403 — no scope:

```json
{
  "success": false,
  "error": {
    "code": "SCOPE_DENIED",
    "message": "This endpoint requires 'calendar' scope"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|-----|---------|
| 403 | `SCOPE_DENIED` | The API key does not have the `calendar` scope |
| 401 | `TOKEN_MISSING` | The API key has no configured tokens |

Full list of common API errors — [Errors](/docs/errors).

## See also

- [Create event](./create.md)
- [Update event](./update.md)
- [List events](./list.md)
