# write_public_calendar_events Behavior, inputs, outputs and permissions for write_public_calendar_events. Source: https://docs.getridian.com/developers/tools/write_public_calendar_events/ Language: en Reviewed: 2026-10-06 This reference is generated from the published tool contract. ## Behavior and boundaries Creates, replaces or deletes up to 100 events in one subscription calendar. upserts replace an event with the same external_id completely; deletes remove events by external_id. Results are per item; one invalid item does not stop the others. Content is public. Subscribers see changes on their next fetch (Google can take up to 24 hours). ## Permissions Granted scopes, accounts, calendars and visibility rules limit access. Workspace administrators do not automatically gain access to other users’ accounts. `public_calendars:write` [Consent and boundaries](https://docs.getridian.com/developers/authentication/) ## Input ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "calendar_id": { "type": "string", "minLength": 1, "maxLength": 64, "description": "Calendar id from list_public_calendars." }, "upserts": { "maxItems": 100, "type": "array", "items": { "type": "object", "properties": { "external_id": { "type": "string", "pattern": "^[A-Za-z0-9._:-]{1,128}$", "description": "Your stable id for the event: 1–128 letters, digits and . _ : -. Writing the same id again replaces the event." }, "event": { "type": "object", "properties": { "title": { "type": "string", "minLength": 1, "maxLength": 255 }, "start": { "type": "string", "description": "Local \"2027-01-16T10:00\" in the event zone, an ISO timestamp with offset, or a date \"2027-01-16\" for all-day events." }, "end": { "description": "Exclusive date for all-day events; otherwise like start. Default: calendar default length.", "type": "string" }, "timezone": { "type": "string", "maxLength": 64 }, "all_day": { "type": "boolean" }, "location": { "type": "string", "maxLength": 500 }, "url": { "description": "https link shown in the event.", "type": "string", "maxLength": 2000 }, "description": { "type": "string", "maxLength": 65536 }, "status": { "type": "string", "enum": [ "confirmed", "tentative", "cancelled" ] }, "show_as": { "type": "string", "enum": [ "free", "busy" ] }, "categories": { "maxItems": 10, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 50 } }, "alarms": { "description": "Reminders in minutes before start.", "maxItems": 3, "type": "array", "items": { "type": "integer", "minimum": 0, "maximum": 40320 } }, "recurrence": { "type": "object", "properties": { "rules": { "minItems": 1, "maxItems": 5, "type": "array", "items": { "type": "string", "maxLength": 500 }, "description": "RRULEs such as \"FREQ=WEEKLY;BYDAY=TH;COUNT=6\". DAILY to YEARLY only." }, "except_dates": { "maxItems": 1000, "type": "array", "items": { "type": "string" } } }, "required": [ "rules" ], "additionalProperties": false } }, "required": [ "title", "start" ], "additionalProperties": {} } }, "required": [ "external_id", "event" ], "additionalProperties": false } }, "deletes": { "maxItems": 100, "type": "array", "items": { "type": "string", "pattern": "^[A-Za-z0-9._:-]{1,128}$", "description": "Your stable id for the event: 1–128 letters, digits and . _ : -. Writing the same id again replaces the event." } } }, "required": [ "calendar_id" ], "additionalProperties": false } ``` ## Output ```json { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "results": { "type": "array", "items": { "type": "object", "properties": { "external_id": { "type": "string" }, "status": { "type": "number" }, "changed": { "type": "boolean" }, "deleted": { "type": "boolean" }, "error": { "type": "object", "properties": { "code": { "type": "string" }, "detail": { "type": "string" } }, "required": [ "code" ], "additionalProperties": {} } }, "required": [ "external_id", "status" ], "additionalProperties": false } } }, "required": [ "results" ], "additionalProperties": false } ``` ## Errors and retries Check the tool result for errors. Do not blindly retry writes after a timeout. Check the current resource or send status first. [Error handling](https://docs.getridian.com/developers/errors/)