{"openapi":"3.1.0","info":{"title":"Ferrule Google Calendar API","version":"1.0.0","description":"REST API for Google Calendar via the Ferrule gateway.","contact":{"name":"Ferrule","url":"https://ferrule.io"}},"servers":[{"url":"https://0.0.0.0:3000","description":"Ferrule gateway"}],"paths":{"/api/v1/google-calendar/calendars":{"get":{"operationId":"google-calendar.list_calendars","description":"List all calendars the authenticated user has access to, including subscribed calendars.","tags":["google-calendar"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]},"primary":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"accessRole":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]}},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-calendar/events":{"get":{"operationId":"google-calendar.list_events","description":"List events from a calendar. Returns events within the specified time range, ordered by start time. Defaults to the primary calendar with singleEvents=true and maxResults=250.","tags":["google-calendar"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"query","name":"calendarId","schema":{"description":"Calendar ID to list events from. Defaults to 'primary' (the user's primary calendar).","type":"string"}},{"in":"query","name":"timeMin","schema":{"description":"Lower bound (inclusive) for an event's end time, in RFC 3339 format (e.g. 2024-01-01T00:00:00Z).","type":"string"}},{"in":"query","name":"timeMax","schema":{"description":"Upper bound (exclusive) for an event's start time, in RFC 3339 format.","type":"string"}},{"in":"query","name":"maxResults","schema":{"description":"Maximum number of events to return (default 250).","type":"number"}},{"in":"query","name":"pageToken","schema":{"description":"Token for paginating through results.","type":"string"}},{"in":"query","name":"orderBy","schema":{"description":"Sort order: 'startTime' (requires singleEvents=true) or 'updated'.","type":"string"}},{"in":"query","name":"singleEvents","schema":{"description":"Whether to expand recurring events into instances. Defaults to true.","type":"boolean"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"location":{"anyOf":[{"type":"string"},{"type":"null"}]},"start":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"end":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"attendees":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"responseStatus":{"anyOf":[{"type":"string"},{"type":"null"}]},"organizer":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]},"organizer":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"creator":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"htmlLink":{"anyOf":[{"type":"string"},{"type":"null"}]},"recurrence":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"reminders":{"anyOf":[{"type":"object","properties":{"useDefault":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"overrides":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"minutes":{"anyOf":[{"type":"number"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"colorId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}]},"transparency":{"anyOf":[{"type":"string"},{"type":"null"}]},"conferenceData":{"anyOf":[{"type":"object","properties":{},"additionalProperties":{}},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]},"nextPageToken":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}},"post":{"operationId":"google-calendar.insert_event","description":"Create a new event on a calendar. Provide summary, start/end times, and optionally description, location, attendees, recurrence rules, reminders, color, visibility, transparency, or a Google Meet link.","tags":["google-calendar"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"query","name":"calendarId","schema":{"description":"Calendar ID to create the event on. Defaults to 'primary' (the user's primary calendar).","type":"string"}},{"in":"query","name":"summary","schema":{"type":"string","description":"Title of the event."}},{"in":"query","name":"description","schema":{"description":"Description or notes for the event.","type":"string"}},{"in":"query","name":"location","schema":{"description":"Location of the event.","type":"string"}},{"in":"query","name":"startDateTime","schema":{"type":"string","description":"Start date-time in RFC 3339 format (e.g. 2024-01-15T09:00:00-05:00)."}},{"in":"query","name":"endDateTime","schema":{"type":"string","description":"End date-time in RFC 3339 format (e.g. 2024-01-15T10:00:00-05:00)."}},{"in":"query","name":"attendees","schema":{"description":"Comma-separated list of attendee email addresses (e.g. 'alice@example.com,bob@example.com').","type":"string"}},{"in":"query","name":"sendUpdates","schema":{"description":"Whether to send notifications: 'all', 'externalOnly', or 'none' (default 'none').","type":"string","enum":["all","externalOnly","none"]}},{"in":"query","name":"recurrence","schema":{"description":"Array of RFC 5545 recurrence lines (RRULE, RDATE, EXDATE). Example: ['RRULE:FREQ=MONTHLY;BYDAY=3FR'].","type":"array","items":{"type":"string"}}},{"in":"query","name":"reminders","schema":{"description":"Reminder settings. Set useDefault=true to use the calendar's defaults, or supply overrides.","type":"object","properties":{"useDefault":{"type":"boolean"},"overrides":{"type":"array","items":{"type":"object","properties":{"method":{"type":"string","enum":["email","popup"]},"minutes":{"type":"number"}},"required":["method","minutes"]}}}}},{"in":"query","name":"colorId","schema":{"description":"Event color ID (1–11). See Google Calendar 'colors' endpoint.","type":"string"}},{"in":"query","name":"visibility","schema":{"description":"Event visibility.","type":"string","enum":["default","public","private","confidential"]}},{"in":"query","name":"transparency","schema":{"description":"Whether the event blocks time ('opaque') or not ('transparent').","type":"string","enum":["opaque","transparent"]}},{"in":"query","name":"addGoogleMeet","schema":{"description":"When true, attach a Google Meet conference to the event. Sends conferenceDataVersion=1.","type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"location":{"anyOf":[{"type":"string"},{"type":"null"}]},"start":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"end":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"attendees":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"responseStatus":{"anyOf":[{"type":"string"},{"type":"null"}]},"organizer":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]},"organizer":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"creator":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"htmlLink":{"anyOf":[{"type":"string"},{"type":"null"}]},"recurrence":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"reminders":{"anyOf":[{"type":"object","properties":{"useDefault":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"overrides":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"minutes":{"anyOf":[{"type":"number"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"colorId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}]},"transparency":{"anyOf":[{"type":"string"},{"type":"null"}]},"conferenceData":{"anyOf":[{"type":"object","properties":{},"additionalProperties":{}},{"type":"null"}]}},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-calendar/events/{eventId}":{"get":{"operationId":"google-calendar.get_event","description":"Get a single event by its ID from a calendar.","tags":["google-calendar"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"eventId","schema":{"type":"string","description":"The ID of the event to retrieve."},"required":true,"description":"The ID of the event to retrieve."},{"in":"query","name":"calendarId","schema":{"description":"Calendar ID containing the event. Defaults to 'primary' (the user's primary calendar).","type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"location":{"anyOf":[{"type":"string"},{"type":"null"}]},"start":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"end":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"attendees":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"responseStatus":{"anyOf":[{"type":"string"},{"type":"null"}]},"organizer":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]},"organizer":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"creator":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"htmlLink":{"anyOf":[{"type":"string"},{"type":"null"}]},"recurrence":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"reminders":{"anyOf":[{"type":"object","properties":{"useDefault":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"overrides":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"minutes":{"anyOf":[{"type":"number"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"colorId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}]},"transparency":{"anyOf":[{"type":"string"},{"type":"null"}]},"conferenceData":{"anyOf":[{"type":"object","properties":{},"additionalProperties":{}},{"type":"null"}]}},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}},"patch":{"operationId":"google-calendar.update_event","description":"Partially update an existing event. Only the fields you provide are changed — omitted fields are left unchanged. To clear a recurrence, pass an empty array.","tags":["google-calendar"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"eventId","schema":{"type":"string","description":"The ID of the event to update."},"required":true,"description":"The ID of the event to update."},{"in":"query","name":"calendarId","schema":{"description":"Calendar ID containing the event. Defaults to 'primary'.","type":"string"}},{"in":"query","name":"summary","schema":{"description":"Title of the event.","type":"string"}},{"in":"query","name":"description","schema":{"description":"Description or notes.","type":"string"}},{"in":"query","name":"location","schema":{"description":"Location of the event.","type":"string"}},{"in":"query","name":"startDateTime","schema":{"description":"Start date-time in RFC 3339 format.","type":"string"}},{"in":"query","name":"endDateTime","schema":{"description":"End date-time in RFC 3339 format.","type":"string"}},{"in":"query","name":"attendees","schema":{"description":"Comma-separated list of attendee emails.","type":"string"}},{"in":"query","name":"sendUpdates","schema":{"description":"Whether to send notifications (default 'none').","type":"string","enum":["all","externalOnly","none"]}},{"in":"query","name":"recurrence","schema":{"description":"Array of RFC 5545 recurrence lines. Pass [] to clear; omit to leave unchanged.","type":"array","items":{"type":"string"}}},{"in":"query","name":"reminders","schema":{"description":"Reminder settings.","type":"object","properties":{"useDefault":{"type":"boolean"},"overrides":{"type":"array","items":{"type":"object","properties":{"method":{"type":"string","enum":["email","popup"]},"minutes":{"type":"number"}},"required":["method","minutes"]}}}}},{"in":"query","name":"colorId","schema":{"description":"Event color ID (1–11).","type":"string"}},{"in":"query","name":"visibility","schema":{"description":"Event visibility.","type":"string","enum":["default","public","private","confidential"]}},{"in":"query","name":"transparency","schema":{"description":"Busy/free setting.","type":"string","enum":["opaque","transparent"]}},{"in":"query","name":"addGoogleMeet","schema":{"description":"When true, attach a new Google Meet conference. Omit to leave the existing conferenceData unchanged.","type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"location":{"anyOf":[{"type":"string"},{"type":"null"}]},"start":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"end":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"attendees":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"responseStatus":{"anyOf":[{"type":"string"},{"type":"null"}]},"organizer":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]},"organizer":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"creator":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"htmlLink":{"anyOf":[{"type":"string"},{"type":"null"}]},"recurrence":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"reminders":{"anyOf":[{"type":"object","properties":{"useDefault":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"overrides":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"minutes":{"anyOf":[{"type":"number"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"colorId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}]},"transparency":{"anyOf":[{"type":"string"},{"type":"null"}]},"conferenceData":{"anyOf":[{"type":"object","properties":{},"additionalProperties":{}},{"type":"null"}]}},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}},"put":{"operationId":"google-calendar.replace_event","description":"Fully replace an existing event. All fields you supply overwrite the stored event; fields you omit will be cleared unless the Google API treats them as implicit. Requires summary, startDateTime, and endDateTime.","tags":["google-calendar"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"eventId","schema":{"type":"string","description":"The ID of the event to replace."},"required":true,"description":"The ID of the event to replace."},{"in":"query","name":"calendarId","schema":{"description":"Calendar ID containing the event. Defaults to 'primary'.","type":"string"}},{"in":"query","name":"summary","schema":{"type":"string","description":"Title of the event."}},{"in":"query","name":"description","schema":{"description":"Description or notes.","type":"string"}},{"in":"query","name":"location","schema":{"description":"Location of the event.","type":"string"}},{"in":"query","name":"startDateTime","schema":{"type":"string","description":"Start date-time in RFC 3339 format."}},{"in":"query","name":"endDateTime","schema":{"type":"string","description":"End date-time in RFC 3339 format."}},{"in":"query","name":"attendees","schema":{"description":"Comma-separated list of attendee emails.","type":"string"}},{"in":"query","name":"sendUpdates","schema":{"description":"Whether to send notifications (default 'none').","type":"string","enum":["all","externalOnly","none"]}},{"in":"query","name":"recurrence","schema":{"description":"Array of RFC 5545 recurrence lines.","type":"array","items":{"type":"string"}}},{"in":"query","name":"reminders","schema":{"description":"Reminder settings.","type":"object","properties":{"useDefault":{"type":"boolean"},"overrides":{"type":"array","items":{"type":"object","properties":{"method":{"type":"string","enum":["email","popup"]},"minutes":{"type":"number"}},"required":["method","minutes"]}}}}},{"in":"query","name":"colorId","schema":{"description":"Event color ID (1–11).","type":"string"}},{"in":"query","name":"visibility","schema":{"description":"Event visibility.","type":"string","enum":["default","public","private","confidential"]}},{"in":"query","name":"transparency","schema":{"description":"Busy/free setting.","type":"string","enum":["opaque","transparent"]}},{"in":"query","name":"addGoogleMeet","schema":{"description":"When true, attach a new Google Meet conference.","type":"boolean"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"location":{"anyOf":[{"type":"string"},{"type":"null"}]},"start":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"end":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"attendees":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"responseStatus":{"anyOf":[{"type":"string"},{"type":"null"}]},"organizer":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]},"organizer":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"creator":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"htmlLink":{"anyOf":[{"type":"string"},{"type":"null"}]},"recurrence":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"reminders":{"anyOf":[{"type":"object","properties":{"useDefault":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"overrides":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"minutes":{"anyOf":[{"type":"number"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"colorId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}]},"transparency":{"anyOf":[{"type":"string"},{"type":"null"}]},"conferenceData":{"anyOf":[{"type":"object","properties":{},"additionalProperties":{}},{"type":"null"}]}},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}},"delete":{"operationId":"google-calendar.delete_event","description":"Delete an event by its ID.","tags":["google-calendar"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"path","name":"eventId","schema":{"type":"string","description":"The ID of the event to delete."},"required":true,"description":"The ID of the event to delete."},{"in":"query","name":"calendarId","schema":{"description":"Calendar ID containing the event. Defaults to 'primary'.","type":"string"}},{"in":"query","name":"sendUpdates","schema":{"description":"Whether to send notifications (default 'none').","type":"string","enum":["all","externalOnly","none"]}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"],"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}},"/api/v1/google-calendar/events/search":{"post":{"operationId":"google-calendar.search_events","description":"Search for events in a calendar using a text query. Matches against event summary, description, location, attendee names, and other fields.","tags":["google-calendar"],"security":[{"oauth2":[]},{"bearerApiKey":[]}],"parameters":[{"in":"query","name":"q","schema":{"type":"string","description":"Free text search query to find matching events."}},{"in":"query","name":"calendarId","schema":{"description":"Calendar ID to search. Defaults to 'primary' (the user's primary calendar).","type":"string"}},{"in":"query","name":"timeMin","schema":{"description":"Lower bound (inclusive) for an event's end time, in RFC 3339 format.","type":"string"}},{"in":"query","name":"timeMax","schema":{"description":"Upper bound (exclusive) for an event's start time, in RFC 3339 format.","type":"string"}},{"in":"query","name":"maxResults","schema":{"description":"Maximum number of events to return (default 250).","type":"number"}},{"in":"query","name":"pageToken","schema":{"description":"Token for paginating through results.","type":"string"}},{"in":"query","name":"orderBy","schema":{"description":"Sort order: 'startTime' (requires singleEvents=true) or 'updated'.","type":"string"}},{"in":"query","name":"singleEvents","schema":{"description":"Whether to expand recurring events into instances. Defaults to true.","type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Request body parameters"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"location":{"anyOf":[{"type":"string"},{"type":"null"}]},"start":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"end":{"anyOf":[{"type":"object","properties":{"dateTime":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"attendees":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"responseStatus":{"anyOf":[{"type":"string"},{"type":"null"}]},"organizer":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]},"organizer":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"creator":{"anyOf":[{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"self":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"status":{"anyOf":[{"type":"string"},{"type":"null"}]},"htmlLink":{"anyOf":[{"type":"string"},{"type":"null"}]},"recurrence":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"reminders":{"anyOf":[{"type":"object","properties":{"useDefault":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"overrides":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"method":{"anyOf":[{"type":"string"},{"type":"null"}]},"minutes":{"anyOf":[{"type":"number"},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]}},"additionalProperties":{}},{"type":"null"}]},"colorId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}]},"transparency":{"anyOf":[{"type":"string"},{"type":"null"}]},"conferenceData":{"anyOf":[{"type":"object","properties":{},"additionalProperties":{}},{"type":"null"}]}},"additionalProperties":{}}},{"type":"null"}]},"nextPageToken":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":{}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}},"502":{"description":"Upstream error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"code":{"type":"string"},"message":{"type":"string"}},"required":["error","code","message"],"additionalProperties":false}}}}}}}},"webhooks":{},"components":{"securitySchemes":{"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"/oauth/authorize","tokenUrl":"/oauth/token","scopes":{}}}},"bearerApiKey":{"type":"http","scheme":"bearer","description":"API key authentication. Pass a Ferrule API key as a Bearer token."}}}}