## Attendee availability

`GET /v1/calendar/accessibility`

Returns employees' busy intervals for a period: events from their calendars and absence chart entries. Call the method before you schedule a meeting to pick a time without overlaps.

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 |
|----------|-----|:-----:|---------|
| `userIds` (query) | string | yes | Comma-separated employee IDs. List: [`GET /v1/users`](/docs/entities/users/list) |
| `from` (query) | string | yes | Period start: a date such as `2026-10-01`, or a date and time in ISO 8601 |
| `to` (query) | string | yes | Period end in the same format |

## Examples

### curl — personal key

```bash
curl -G https://vibecode.bitrix24.com/v1/calendar/accessibility \
  --data-urlencode "userIds=1295" \
  --data-urlencode "from=2026-10-01" \
  --data-urlencode "to=2026-10-31" \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth application

```bash
curl -G https://vibecode.bitrix24.com/v1/calendar/accessibility \
  --data-urlencode "userIds=1295" \
  --data-urlencode "from=2026-10-01" \
  --data-urlencode "to=2026-10-31" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — personal key

```javascript
const params = new URLSearchParams({ userIds: '1295', from: '2026-10-01', to: '2026-10-31' })
const res = await fetch(`https://vibecode.bitrix24.com/v1/calendar/accessibility?${params}`, {
  headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const { data } = await res.json()

for (const [userId, intervals] of Object.entries(data)) {
  console.log(userId, intervals.map((i) => `${i.from} — ${i.to}`))
}
```

### JavaScript — OAuth application

```javascript
const params = new URLSearchParams({ userIds: '1295', from: '2026-10-01', to: '2026-10-31' })
const res = await fetch(`https://vibecode.bitrix24.com/v1/calendar/accessibility?${params}`, {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})
const { data } = await res.json()
```

## Response fields

| Field | Type | Description |
|------|-----|---------|
| `success` | boolean | Always `true` on success |
| `data` | object | Availability by employee: the key is an employee ID from `userIds`, the value is an array of busy intervals. An empty array means the period has no busy intervals visible to the key owner |
| `data.<userId>[].id` | number | ID of the calendar event or absence chart entry |
| `data.<userId>[].name` | string | Event name. For another employee's private event, and for an event whose name the key owner cannot see, the busy status in square brackets is returned instead of the name. Absence chart entries do not have this field |
| `data.<userId>[].from` | string | Interval start: a date and time in ISO 8601 with an offset. For an all-day event, a date without time |
| `data.<userId>[].to` | string | Interval end in the same format. For an all-day event, the last day of the event, inclusive |
| `data.<userId>[].timezoneFrom` | string | Time zone of the start, for example `UTC`. All-day events do not have this field |
| `data.<userId>[].timezoneTo` | string | Time zone of the end. All-day events do not have this field |
| `data.<userId>[].skipTime` | boolean | `true` means an all-day event |
| `data.<userId>[].accessibility` | string | Busy status in the interval, for example `busy`. For an absence chart entry, `absent` |
| `data.<userId>[].importance` | string | Event importance, for example `normal` |
| `data.<userId>[].eventType` | string \| null | Event type. `null` for an event without a special type |
| `data.<userId>[].fromHr` | boolean | `true` for an absence chart entry. The time of such an entry is returned in UTC. Calendar events do not have this field |

## Response example

```json
{
  "success": true,
  "data": {
    "1295": [
      {
        "from": "2026-10-15T10:00:00+00:00",
        "to": "2026-10-15T11:00:00+00:00",
        "id": 8339,
        "name": "Team meeting",
        "accessibility": "busy",
        "importance": "normal",
        "eventType": null,
        "timezoneFrom": "UTC",
        "timezoneTo": "UTC",
        "skipTime": false
      },
      {
        "from": "2026-10-19",
        "to": "2026-10-20",
        "id": 8341,
        "name": "Business trip",
        "accessibility": "absent",
        "importance": "normal",
        "eventType": null,
        "skipTime": true
      }
    ]
  }
}
```

## Error response example

400 — the date in `from` is not in ISO 8601 format:

```json
{
  "success": false,
  "error": {
    "code": "INVALID_PARAMS",
    "message": "from must be an ISO date"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|-----|---------|
| 200 | `Warning: 299` | The filter is ignored by default; previous data is preserved and the warning is sent in the `Warning` header. |
| 400 (strict mode only) | `UNSUPPORTED_FILTER` | The server mode is disabled by default; until it is enabled, the endpoint preserves HTTP 200 and the previous data. |
| 400 | `MISSING_REQUIRED_FIELDS` | `userIds`, `from` or `to` is missing, or `userIds` contains a value that is not a positive integer |
| 400 | `INVALID_PARAMS` | `from` or `to` is not in ISO 8601 format |
| 401 | `TOKEN_MISSING` | The API key has no configured tokens |
| 403 | `SCOPE_DENIED` | The API key does not have the `calendar` scope |
| 403 | `BITRIX_ACCESS_DENIED` | Bitrix24 denied access |
| 422 | `BITRIX_ERROR` | Bitrix24 rejected the request |
| 429 | `RATE_LIMITED` | Request limit exceeded |
| 502 | `BITRIX_UNAVAILABLE` | Bitrix24 is unavailable or returned a response of an unexpected shape |
| 503 | `BITRIX_TIMEOUT` | Bitrix24 did not respond in time |

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

## See also

- [Calendar settings](/docs/calendar/settings)
- [Calendar events](/docs/entities/calendar-events)
- [Calendar resources](/docs/entities/calendar-resources)
- [Calendar](/docs/calendar)
