Create, update (edit), move/reschedule, or shift events — bulk/batch, one or many in a single call. Pass `ops`, an array where each item has an `op` (create | update | move | shift) plus that op's fields; a single edit is just a 1-item array. Times are 24-hour HH:MM; for an event crossing midnight set endNextDay=true. For a recurring event choose a `scope`: 'all' (default), 'future', or 'this' (the last two need `occurrenceDate`). move changes start/date keeping duration; shift nudges by `byMinutes`. By default the whole batch is atomic: if ANY op fails validation (e.g. a conflict), nothing is written and the failing ops are returned as errors — fix and resend. Pass `partial: true` for best-effort (apply what's valid). Ops apply in order as one transaction and are checked against each other: two creates can't double-book a slot, and an earlier move frees a slot a later op can reuse. Target each event id at most once per batch. Reference an area/activity type by id or by `areaName`/`activityTypeName`; create new ones first with manage_categories. If the user has a Google Calendar connected, creating or editing a calendar-linked event (or one created under their default sync calendar) also pushes the change to Google — the same as editing on the dial; don't edit an event get_schedule/find_event marked `readOnly` (it's from a calendar the user doesn't own and the change would silently revert). To remove events or clear a day use delete_events. The response reports `applied`, `failed`, `skipped` (validated but not written because the atomic batch was rejected), and per-op `results` (each with its 0-based `index`).