---
title: "Edit a calendar event (owner-scoped partial update)"
method: PATCH
path: "/api/calendar-events/{event_id}"
tags: ["Calendar"]
---

# Edit a calendar event (owner-scoped partial update)

`PATCH /api/calendar-events/{event_id}`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/calendar-events/{event_id}`
- Auth: none declared

Owner-scoped partial update. Only the supplied fields change; each
is validated at the boundary with the same rules as create. The
helper restricts writes to a fixed column allowlist (no user_id /
status / created_at escalation).

## Path parameters

- `event_id` integer, required: The event id to edit.

## Response `200`

Successful Response

- CalendarEventCreateResponse: `POST /api/calendar-events` + `PATCH /api/calendar-events/{id}` response. Frontend reads `data.event` to add/replace the row in the calendar without a re-fetch.
  - `event` UserCalendarEvent, required: A single user_calendar_events (v86) row. Required fields are populated by every helper code path (id, user_id, title, event_date, recurrence, status, created_at, updated_at). Nullable schema columns (note, ticker, event_time, recurrence_until, remind_offset_minutes, last_reminded_for) are Optional. Dates/times are ISO strings (DATE -> 'YYYY-MM-DD', TIME -> 'HH:MM:SS', TIMESTAMPTZ -> ISO-8601) — the helper's _row_to_dict coerces them so the wire shape stays JSON-friendly.
    - `id` integer, required: Primary key.
    - `user_id` integer, required: Owning user's id.
    - `title` string, required: Event title (<=120 chars).
    - `note` string, nullable: Optional free-text note.
    - `ticker` string, nullable: Optional associated ticker (uppercased).
    - `event_date` string, required: Anchor occurrence date, ISO 'YYYY-MM-DD'.
    - `event_time` string, nullable: Optional time-of-day 'HH:MM:SS'; null = all-day.
    - `recurrence` string, required: One of none|daily|weekly|monthly|yearly.
    - `recurrence_until` string, nullable: Recurrence end date 'YYYY-MM-DD'; null = open-ended.
    - `remind_offset_minutes` integer, nullable: Minutes-before-occurrence to remind (0 = day-of, 1440 = 1 day before); null = no reminder.
    - `status` string, required: One of active|cancelled.
    - `last_reminded_for` string, nullable: Occurrence-date a reminder last fired (dedupe).
    - `created_at` string, required: ISO-8601 timestamp.
    - `updated_at` string, required: ISO-8601 timestamp.

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `404`: Not Found
- `422`: Validation Error
- `500`: Internal Server Error

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
