[{"data":1,"prerenderedAt":7},["ShallowReactive",2],{"docs-entities\u002Fcalendar-events\u002Fcreate":3,"docs-tabs-entities\u002Fcalendar-events\u002Fcreate":6},{"content":4,"lastmod":5},"\n## Create event\n\n`POST \u002Fv1\u002Fcalendar-events`\n\nCreates a new event in the specified calendar.\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|---------|\n| `type` | string | yes | Calendar type: `user`, `group`, `company_calendar` |\n| `ownerId` | number | yes | Calendar owner ID: employee (`GET \u002Fv1\u002Fusers`) or workgroup |\n| `name` | string | yes | Event title |\n| `from` | datetime | yes | Event start in ISO 8601. Accepts a string with an explicit offset (`2026-06-10T10:00:00+00:00`), in UTC (`2026-06-10T07:00:00Z`), or without a zone (`2026-06-10T10:00:00`) |\n| `to` | datetime | yes | Event end in ISO 8601. Accepts a string with an explicit offset (`2026-06-10T11:00:00+00:00`), in UTC (`2026-06-10T08:00:00Z`), or without a zone (`2026-06-10T11:00:00`) |\n| `timezoneFrom` | string | no | Event start timezone (IANA name: `UTC`, `Asia\u002FAlmaty`). Without it, the timezone of the employee who owns the API key is used |\n| `timezoneTo` | string | no | Event end timezone (IANA name) |\n| `description` | string | no | Description |\n| `sectionId` | number | no | Calendar section ID. If the field is not passed, a new section is created on every call. To have events written to a single section, pass the `sectionId` of an existing section. The ID of an existing section is returned by [`GET \u002Fv1\u002Fcalendar-events`](.\u002Flist.md) in the `sectionId` field of any previously created event |\n| `skipTime` | boolean | no | All-day event. When `true`, the event covers the calendar days from `from` through `to`, inclusive: December 10–12 spans three days; GET returns `durationSeconds: 259200`. For how to pass the dates so the day does not shift, see [Known specifics](#known-specifics) |\n| `importance` | string | no | `high`, `normal`, `low` |\n| `accessibility` | string | no | Availability: `busy`, `quest` (tentative), `free`, `absent` |\n| `location` | string | no | Venue |\n| `color` | string | no | Event color (HEX, `#RRGGBB`) |\n| `attendees` | number[] | no | Array of invited employee IDs. List: `GET \u002Fv1\u002Fusers`. Stored only if the same request passes `isMeeting: true`. Without the flag the array is ignored with no error and no warning. IDs are not checked for existence: any number becomes an attendee `U\u003Cid>`, and a string such as `C_\u003Cid>` produces the code `U0` in `attendeesCodes`. CRM items are linked with the `crmFields` field. **Write-only** — in the response, attendees are returned in the `attendeeList` and `attendeesCodes` fields. See [Event fields](.\u002Ffields.md) |\n| `remind` | array | no | Reminder settings. Each item: `{type: 'min' \\| 'hour' \\| 'day', count: \u003Cnumber>}` |\n| `rrule` | object | no | Recurrence schedule of a recurring event. For the field structure and an example, see the [Recurring event](#recurring-event) section below |\n| `isPrivate` | boolean | no | Private event — details are hidden from other users |\n| `isMeeting` | boolean | no | Meeting event with invitations. Pass `true` for the `attendees` array to be stored |\n| `crmFields` | string[] | no | CRM items to link the event to: `D_\u003Cid>` deal, `C_\u003Cid>` contact, `L_\u003Cid>` lead, `CO_\u003Cid>` company. Item lists: `GET \u002Fv1\u002Fdeals`, `GET \u002Fv1\u002Fcontacts`, `GET \u002Fv1\u002Fleads`, `GET \u002Fv1\u002Fcompanies`. The value must be an array. An unknown prefix, or a reference to a record that does not exist, is rejected |\n\nFull field list: [`GET \u002Fv1\u002Fcalendar-events\u002Ffields`](.\u002Ffields.md).\n\n## Examples\n\n### Multi-day all-day event\n\nPOST request body for an event from December 10 through December 12, inclusive. The employee who owns the API key is in the UTC timezone here, so 12:00 is passed with the `+00:00` offset:\n\n```json\n{\n  \"type\": \"user\",\n  \"ownerId\": 1,\n  \"name\": \"Vacation\",\n  \"from\": \"2026-12-10T12:00:00+00:00\",\n  \"to\": \"2026-12-12T12:00:00+00:00\",\n  \"skipTime\": true\n}\n```\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcalendar-events\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"type\": \"user\",\n    \"ownerId\": 1,\n    \"name\": \"Team call\",\n    \"from\": \"2026-06-10T10:00:00\",\n    \"to\": \"2026-06-10T11:00:00\",\n    \"timezoneFrom\": \"UTC\",\n    \"timezoneTo\": \"UTC\",\n    \"description\": \"Weekly sync\",\n    \"accessibility\": \"busy\",\n    \"sectionId\": 3\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcalendar-events\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"type\": \"user\",\n    \"ownerId\": 1,\n    \"name\": \"Team call\",\n    \"from\": \"2026-06-10T10:00:00\",\n    \"to\": \"2026-06-10T11:00:00\",\n    \"timezoneFrom\": \"UTC\",\n    \"timezoneTo\": \"UTC\",\n    \"description\": \"Weekly sync\",\n    \"accessibility\": \"busy\",\n    \"sectionId\": 3\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcalendar-events', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    type: 'user',\n    ownerId: 1,\n    name: 'Team call',\n    from: '2026-06-10T10:00:00',\n    to: '2026-06-10T11:00:00',\n    timezoneFrom: 'UTC',\n    timezoneTo: 'UTC',\n    description: 'Weekly sync',\n    accessibility: 'busy',\n    sectionId: 3,\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Event ID:', data.id)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcalendar-events', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    type: 'user',\n    ownerId: 1,\n    name: 'Team call',\n    from: '2026-06-10T10:00:00',\n    to: '2026-06-10T11:00:00',\n    timezoneFrom: 'UTC',\n    timezoneTo: 'UTC',\n    description: 'Weekly sync',\n    accessibility: 'busy',\n    sectionId: 3,\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Recurring event\n\nTo create a recurring event, pass the `rrule` field as an object. Request:\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcalendar-events\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"type\": \"user\",\n    \"ownerId\": 1,\n    \"name\": \"Team call\",\n    \"from\": \"2026-07-13T10:00:00\",\n    \"to\": \"2026-07-13T11:00:00\",\n    \"timezoneFrom\": \"UTC\",\n    \"timezoneTo\": \"UTC\",\n    \"rrule\": {\n      \"FREQ\": \"WEEKLY\",\n      \"INTERVAL\": 1,\n      \"BYDAY\": [\"MO\", \"WE\"],\n      \"UNTIL\": \"2026-09-30\"\n    }\n  }'\n```\n\nA single event with one `id` is created — the list (`GET \u002Fv1\u002Fcalendar-events`) will return one item per occurrence in the series, all sharing a common `parentId`. Deleting the event (`DELETE \u002Fv1\u002Fcalendar-events\u002F:id`) removes the entire series.\n\n`rrule` fields:\n\n| Field | Type | Description |\n|------|-----|---------|\n| `FREQ` | string | Frequency: `DAILY`, `WEEKLY`, `MONTHLY`, `YEARLY` |\n| `INTERVAL` | number | Interval. `1` — every cycle, `2` — every other, and so on |\n| `BYDAY` | string[] | Days of the week for `WEEKLY`: `SU`, `MO`, `TU`, `WE`, `TH`, `FR`, `SA` |\n| `UNTIL` | date | Series end date in `YYYY-MM-DD` format. Alternative — `COUNT` |\n| `COUNT` | number | Number of repetitions. Alternative — `UNTIL` |\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data` | object | The created event (all fields — see [Event fields](.\u002Ffields.md)) |\n\nThe URL of the event card in Bitrix24 depends on the calendar type:\n\n| `type` | URL |\n|---|---|\n| `user` | `https:\u002F\u002F\u003Cportal>.bitrix24.com\u002Fcompany\u002Fpersonal\u002Fuser\u002F\u003CownerId>\u002Fcalendar\u002F?EVENT_ID=\u003Cid>&EVENT_DATE=\u003Cdd.mm.yyyy>` |\n| `group` | `https:\u002F\u002F\u003Cportal>.bitrix24.com\u002Fworkgroups\u002Fgroup\u002F\u003CownerId>\u002Fcalendar\u002F?EVENT_ID=\u003Cid>&EVENT_DATE=\u003Cdd.mm.yyyy>` |\n| `company_calendar` | `https:\u002F\u002F\u003Cportal>.bitrix24.com\u002Fcalendar\u002F?EVENT_ID=\u003Cid>&EVENT_DATE=\u003Cdd.mm.yyyy>` |\n\n`\u003Cdd.mm.yyyy>` — the event start date (the `from` field) in dot-separated \"day.month.year\" format. `\u003Cportal>` — your Bitrix24 portal domain. Access is limited by the employee's permissions in Bitrix24.\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 7773,\n    \"parentId\": 7773,\n    \"deleted\": false,\n    \"type\": \"user\",\n    \"ownerId\": 1,\n    \"name\": \"Team call\",\n    \"from\": \"2026-06-10T10:00:00+00:00\",\n    \"to\": \"2026-06-10T11:00:00+00:00\",\n    \"skipTime\": false,\n    \"durationSeconds\": 3600,\n    \"createdBy\": 1,\n    \"dateCreate\": \"06\u002F05\u002F2026 09:12:00 am\",\n    \"updatedAt\": \"06\u002F05\u002F2026 09:12:00 am\",\n    \"description\": \"Weekly sync\",\n    \"accessibility\": \"busy\",\n    \"importance\": \"normal\",\n    \"isMeeting\": false,\n    \"meetingStatus\": \"H\",\n    \"meetingHost\": 1,\n    \"sectionId\": 3,\n    \"attendeeList\": [\n      { \"id\": 1, \"entryId\": \"7773\", \"status\": \"H\" }\n    ]\n  }\n}\n```\n\n## Error response example\n\n422 — a required field was not passed:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Required parameter \\\"name\\\" is not set for the \\\"calendar.event.add\\\" method\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 422 | `BITRIX_ERROR` | A required field was not passed (`type`, `ownerId`, `name`, `from`, `to`) |\n| 400 | `READONLY_FIELD` | A read-only field was passed in the request body (`id`, `createdBy`, `dateCreate`, `updatedAt`) |\n| 403 | `SCOPE_DENIED` | The API key does not have the `calendar` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**Section buildup when creating without `sectionId`.** If the `sectionId` field is not passed, a new calendar section is created on every call. Over a series of calls without `sectionId`, empty sections accumulate in the employee's calendar and are visible in the Bitrix24 web interface. To have all events written to a single section, pass the `sectionId` of an existing section — its ID can be taken from the [`GET \u002Fv1\u002Fcalendar-events`](.\u002Flist.md) response.\n\n**The day of an all-day event depends on the timezone of the employee who owns the API key.** With `skipTime: true`, the calendar day is determined by the moment in `from` and `to`, converted to the key owner's timezone. A date without a time, or a time without an offset, can move the event to an adjacent day: for an employee in UTC+2, a request with `\"from\": \"2026-12-10\"` creates an event on December 9. To keep the day from shifting, pass the time with the offset of the key owner's timezone, for example `2026-12-10T12:00:00+02:00`. The employee's timezone is returned in the `timeZone` field of [`GET \u002Fv1\u002Fusers\u002F:id`](\u002Fdocs\u002Fentities\u002Fusers\u002Fget). The `timezoneFrom` and `timezoneTo` fields do not affect the day of such an event.\n\n## See also\n\n- [Event fields](.\u002Ffields.md)\n- [Update event](.\u002Fupdate.md)\n- [Delete event](.\u002Fdelete.md)\n- [List events](.\u002Flist.md)\n","2026-11-12",{},1794739320776]