openapi: 3.0.3 info: title: 'ORBIT API Documentation' description: '' version: 1.0.0 servers: - url: 'https://api.orbit.intranet.recentglobe.org' tags: - name: Endpoints description: '' components: securitySchemes: default: type: http scheme: bearer description: 'Obtain a bearer token via the OIDC login flow and send it as Authorization: Bearer <token>.' security: - default: [] paths: /api/v1: get: summary: '' operationId: getApiV1 description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'ORBIT API v1' properties: message: type: string example: 'ORBIT API v1' tags: - Endpoints /api/v1/enums/event-types: get: summary: 'Get all event types.' operationId: getAllEventTypes description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: 200 message: null data: - value: conference label: Conference - value: workshop label: Workshop - value: lecture label: Lecture - value: seminar label: Seminar - value: meeting label: Meeting - value: panel label: Panel - value: exhibition label: Exhibition - value: performance label: Performance - value: other label: Other properties: status: type: integer example: 200 message: type: string example: null nullable: true data: type: array example: - value: conference label: Conference - value: workshop label: Workshop - value: lecture label: Lecture - value: seminar label: Seminar - value: meeting label: Meeting - value: panel label: Panel - value: exhibition label: Exhibition - value: performance label: Performance - value: other label: Other items: type: object properties: value: type: string example: conference label: type: string example: Conference tags: - Endpoints /api/v1/enums/event-formats: get: summary: 'Get all event formats.' operationId: getAllEventFormats description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: 200 message: null data: - value: in_person label: 'In Person' - value: online label: Online - value: hybrid label: Hybrid properties: status: type: integer example: 200 message: type: string example: null nullable: true data: type: array example: - value: in_person label: 'In Person' - value: online label: Online - value: hybrid label: Hybrid items: type: object properties: value: type: string example: in_person label: type: string example: 'In Person' tags: - Endpoints /api/v1/enums/seating-types: get: summary: 'Get all seating types.' operationId: getAllSeatingTypes description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: 200 message: null data: - value: theater label: Theater - value: classroom label: Classroom - value: boardroom label: Boardroom - value: u_shape label: 'U Shape' - value: banquet label: Banquet - value: reception label: Reception - value: hollow_square label: 'Hollow Square' - value: cinema label: Cinema - value: podium label: Podium - value: horseshoe label: Horseshoe - value: other label: Other properties: status: type: integer example: 200 message: type: string example: null nullable: true data: type: array example: - value: theater label: Theater - value: classroom label: Classroom - value: boardroom label: Boardroom - value: u_shape label: 'U Shape' - value: banquet label: Banquet - value: reception label: Reception - value: hollow_square label: 'Hollow Square' - value: cinema label: Cinema - value: podium label: Podium - value: horseshoe label: Horseshoe - value: other label: Other items: type: object properties: value: type: string example: theater label: type: string example: Theater tags: - Endpoints /api/v1/institutions: get: summary: 'Display a listing of institutions.' operationId: displayAListingOfInstitutions description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: 200 message: null data: [] properties: status: type: integer example: 200 message: type: string example: null nullable: true data: type: array example: [] tags: - Endpoints post: summary: 'Store a newly created institution.' operationId: storeANewlyCreatedInstitution description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b code: type: string description: 'Must not be greater than 50 characters.' example: 'n' description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true is_active: type: boolean description: '' example: false sort_order: type: integer description: 'Must be at least 0.' example: 60 required: - name - code /api/v1/calendar.ics: get: summary: 'Export all events as iCal format.' operationId: exportAllEventsAsICalFormat description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Token required' properties: message: type: string example: 'Token required' tags: - Endpoints '/api/v1/calendar/rooms/{room}.ics': get: summary: 'Export events for a specific room as iCal format.' operationId: exportEventsForASpecificRoomAsICalFormat description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: 'Token required' properties: message: type: string example: 'Token required' tags: - Endpoints parameters: - in: path name: room description: '' example: architecto required: true schema: type: string /api/v1/me: get: summary: 'Get the current authenticated user info.' operationId: getTheCurrentAuthenticatedUserInfo description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints /api/v1/auth/logout: post: summary: 'Log the user out - invalidates the session.' operationId: logTheUserOutInvalidatesTheSession description: '' parameters: [] responses: { } tags: - Endpoints /api/v1/events/pending: get: summary: 'Get pending events (for managers).' operationId: getPendingEventsforManagers description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints /api/v1/events/batch-approve: post: summary: 'Batch approve multiple events.' operationId: batchApproveMultipleEvents description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: event_ids: type: array description: 'Must be a valid UUID.' example: - 6ff8f7f6-1eb3-3525-be4a-3932c805afed items: type: string comment: type: string description: 'Must not be greater than 1000 characters.' example: g nullable: true required: - event_ids /api/v1/events/batch-reject: post: summary: 'Batch reject multiple events.' operationId: batchRejectMultipleEvents description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: event_ids: type: array description: 'Must be a valid UUID.' example: - 6ff8f7f6-1eb3-3525-be4a-3932c805afed items: type: string comment: type: string description: 'Must not be greater than 1000 characters.' example: g nullable: true required: - event_ids /api/v1/push-subscriptions/vapid-key: get: summary: '' operationId: getApiV1PushSubscriptionsVapidKey description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints /api/v1/push-subscriptions: post: summary: '' operationId: postApiV1PushSubscriptions description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: endpoint: type: string description: 'Must be a valid URL. Must not be greater than 500 characters.' example: b keys: type: object description: '' example: [] properties: auth: type: string description: '' example: architecto p256dh: type: string description: '' example: architecto required: - auth - p256dh content_encoding: type: string description: '' example: aes128gcm enum: - aesgcm - aes128gcm required: - endpoint - keys - content_encoding delete: summary: '' operationId: deleteApiV1PushSubscriptions description: '' parameters: [] responses: { } tags: - Endpoints /api/v1/digest-subscriptions: get: summary: '' operationId: getApiV1DigestSubscriptions description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints put: summary: '' operationId: putApiV1DigestSubscriptions description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: types: type: array description: '' example: - weekly_upcoming items: type: string enum: - pending_approvals - todays_events - weekly_upcoming /api/v1/notifications: get: summary: 'List notifications for the current user.' operationId: listNotificationsForTheCurrentUser description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints /api/v1/notifications/unread-count: get: summary: 'Get unread notification count for the current user.' operationId: getUnreadNotificationCountForTheCurrentUser description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints '/api/v1/notifications/{id}/read': post: summary: 'Mark a single notification as read.' operationId: markASingleNotificationAsRead description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: id description: 'The ID of the notification.' example: architecto required: true schema: type: string /api/v1/notifications/read-all: post: summary: 'Mark all notifications as read.' operationId: markAllNotificationsAsRead description: '' parameters: [] responses: { } tags: - Endpoints /api/v1/events: get: summary: 'Display a listing of events.' operationId: displayAListingOfEvents description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints post: summary: 'Store a newly created event.' operationId: storeANewlyCreatedEvent description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true start_at: type: string description: 'Must be a valid date.' example: '2026-03-10T08:57:57' end_at: type: string description: 'Must be a valid date. Must be a date after start_at.' example: '2052-04-02' is_recurring: type: boolean description: '' example: false recurrence_rule: type: string description: 'This field is required when is_recurring is true. Must not be greater than 2000 characters.' example: 'n' nullable: true recurrence_ends_at: type: string description: 'Must be a valid date. Must be a date after start_at.' example: '2052-04-02' nullable: true recurrence_count: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 22 nullable: true recurrence_timezone: type: string description: 'Must be a valid time zone, such as Africa/Accra. Must not be greater than 64 characters.' example: Antarctica/Rothera nullable: true prep_before_minutes: type: integer description: 'Must be at least 0.' example: 12 nullable: true cleanup_after_minutes: type: integer description: 'Must be at least 0.' example: 77 nullable: true room_id: type: string description: 'Must be a valid UUID. The id of an existing record in the rooms table.' example: a1a0a47d-e8c3-3cf0-8e6e-c1ff9dca5d1f notes: type: string description: '' example: architecto nullable: true website: type: string description: 'Must be a valid URL. Must not be greater than 500 characters.' example: 'n' nullable: true contact_email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: ashly64@example.com nullable: true attachments: type: object description: '' example: null properties: { } nullable: true status: type: string description: '' example: approved enum: - draft - pending - approved - cancelled nullable: true category: type: object description: '' example: null properties: event_type: type: string description: '' example: meeting enum: - conference - workshop - lecture - seminar - meeting - panel - exhibition - performance - other nullable: true format: type: string description: '' example: hybrid enum: - in_person - online - hybrid nullable: true institution_id: type: string description: 'Must be a valid UUID. The id of an existing record in the institutions table.' example: 21c4122b-d554-3723-966c-6d723ea5293f nullable: true institution: type: string description: 'Must not be greater than 255 characters.' example: l nullable: true nullable: true roles: type: array description: '' example: null items: type: object nullable: true properties: user_name: type: string description: 'Must not be greater than 255 characters.' example: j user_email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: lafayette.considine@example.com nullable: true role: type: string description: '' example: core_responsible enum: - core_responsible - extra_responsible - room_responsible - room_user required: - user_name - role requirements: type: array description: '' example: null items: type: object nullable: true properties: kind: type: string description: '' example: setup enum: - media - pr - setup - catering is_required: type: boolean description: '' example: false details: type: string description: '' example: architecto nullable: true required: - kind required: - title - start_at - end_at - room_id '/api/v1/events/{id}': get: summary: 'Display the specified event.' operationId: displayTheSpecifiedEvent description: "If $id contains '::' it is an occurrence ID in format {series_id}::{occurrence_date}." parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints put: summary: 'Update the specified event.' operationId: updateTheSpecifiedEvent description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: title: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true start_at: type: string description: 'Must be a valid date.' example: '2026-03-10T08:57:57' end_at: type: string description: 'Must be a valid date. Must be a date after start_at.' example: '2052-04-02' is_recurring: type: boolean description: '' example: false recurrence_rule: type: string description: 'Must not be greater than 2000 characters.' example: 'n' nullable: true recurrence_ends_at: type: string description: 'Must be a valid date.' example: '2026-03-10T08:57:57' nullable: true recurrence_count: type: integer description: 'Must be at least 1. Must not be greater than 1000.' example: 7 nullable: true recurrence_timezone: type: string description: 'Must be a valid time zone, such as Africa/Accra. Must not be greater than 64 characters.' example: America/Bahia_Banderas nullable: true prep_before_minutes: type: integer description: 'Must be at least 0.' example: 77 cleanup_after_minutes: type: integer description: 'Must be at least 0.' example: 8 room_id: type: string description: 'Must be a valid UUID. The id of an existing record in the rooms table.' example: d6fa562b-acd5-35ff-babb-d11194d3737b notes: type: string description: '' example: architecto nullable: true website: type: string description: 'Must be a valid URL. Must not be greater than 500 characters.' example: 'n' nullable: true contact_email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: ashly64@example.com nullable: true attachments: type: object description: '' example: null properties: { } nullable: true category: type: object description: '' example: null properties: event_type: type: string description: '' example: exhibition enum: - conference - workshop - lecture - seminar - meeting - panel - exhibition - performance - other nullable: true format: type: string description: '' example: in_person enum: - in_person - online - hybrid nullable: true institution_id: type: string description: 'Must be a valid UUID. The id of an existing record in the institutions table.' example: 21c4122b-d554-3723-966c-6d723ea5293f nullable: true institution: type: string description: 'Must not be greater than 255 characters.' example: l nullable: true nullable: true delete: summary: 'Remove the specified event.' operationId: removeTheSpecifiedEvent description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: id description: 'The ID of the event.' example: architecto required: true schema: type: string /api/v1/event-templates: get: summary: 'Display a listing of event templates for the current user.' operationId: displayAListingOfEventTemplatesForTheCurrentUser description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints post: summary: 'Store a newly created event template.' operationId: storeANewlyCreatedEventTemplate description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 120 characters.' example: b template: type: object description: '' example: [] properties: title: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true room_id: type: string description: 'Must be a valid UUID. The id of an existing record in the rooms table.' example: 21c4122b-d554-3723-966c-6d723ea5293f notes: type: string description: '' example: architecto nullable: true website: type: string description: 'Must be a valid URL. Must not be greater than 500 characters.' example: 'n' nullable: true contact_email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: ashly64@example.com nullable: true prep_before_minutes: type: integer description: 'Must be at least 0.' example: 60 nullable: true cleanup_after_minutes: type: integer description: 'Must be at least 0.' example: 42 nullable: true category: type: object description: '' example: null properties: event_type: type: string description: '' example: seminar enum: - conference - workshop - lecture - seminar - meeting - panel - exhibition - performance - other nullable: true format: type: string description: '' example: in_person enum: - in_person - online - hybrid nullable: true institution_id: type: string description: 'Must be a valid UUID. The id of an existing record in the institutions table.' example: add3503c-ebff-3875-93af-b8c6a695762b nullable: true nullable: true roles: type: array description: '' example: null items: type: object nullable: true properties: user_name: type: string description: 'Must not be greater than 255 characters.' example: 'n' user_email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: cecil42@example.com nullable: true role: type: string description: '' example: room_user enum: - core_responsible - extra_responsible - room_responsible - room_user required: - user_name - role requirements: type: array description: '' example: null items: type: object nullable: true properties: kind: type: string description: '' example: setup enum: - media - pr - setup - catering is_required: type: boolean description: '' example: true details: type: string description: '' example: architecto nullable: true required: - kind required: - title - room_id required: - name - template '/api/v1/event-templates/{event_template}': get: summary: 'Display a single event template for the current user.' operationId: displayASingleEventTemplateForTheCurrentUser description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints put: summary: 'Update an event template.' operationId: updateAnEventTemplate description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 120 characters.' example: b template: type: object description: '' example: [] properties: title: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true room_id: type: string description: 'Must be a valid UUID. The id of an existing record in the rooms table.' example: 21c4122b-d554-3723-966c-6d723ea5293f notes: type: string description: '' example: architecto nullable: true website: type: string description: 'Must be a valid URL. Must not be greater than 500 characters.' example: 'n' nullable: true contact_email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: ashly64@example.com nullable: true prep_before_minutes: type: integer description: 'Must be at least 0.' example: 60 nullable: true cleanup_after_minutes: type: integer description: 'Must be at least 0.' example: 42 nullable: true category: type: object description: '' example: null properties: event_type: type: string description: '' example: exhibition enum: - conference - workshop - lecture - seminar - meeting - panel - exhibition - performance - other nullable: true format: type: string description: '' example: in_person enum: - in_person - online - hybrid nullable: true institution_id: type: string description: 'Must be a valid UUID. The id of an existing record in the institutions table.' example: add3503c-ebff-3875-93af-b8c6a695762b nullable: true nullable: true roles: type: array description: '' example: null items: type: object nullable: true properties: user_name: type: string description: 'Must not be greater than 255 characters.' example: 'n' user_email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: cecil42@example.com nullable: true role: type: string description: '' example: room_user enum: - core_responsible - extra_responsible - room_responsible - room_user required: - user_name - role requirements: type: array description: '' example: null items: type: object nullable: true properties: kind: type: string description: '' example: pr enum: - media - pr - setup - catering is_required: type: boolean description: '' example: true details: type: string description: '' example: architecto nullable: true required: - kind required: - title - room_id required: - name - template delete: summary: 'Delete an event template.' operationId: deleteAnEventTemplate description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: event_template description: '' example: architecto required: true schema: type: string '/api/v1/events/{event_id}/submit': post: summary: 'Submit event for approval (DRAFT -> PENDING).' operationId: submitEventForApprovalDRAFTPENDING description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: event_id description: 'The ID of the event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string '/api/v1/events/{event_id}/approve': post: summary: 'Approve event (PENDING -> APPROVED).' operationId: approveEventPENDINGAPPROVED description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: comment: type: string description: 'Must not be greater than 1000 characters.' example: b nullable: true parameters: - in: path name: event_id description: 'The ID of the event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string '/api/v1/events/{event_id}/reject': post: summary: 'Reject event (PENDING -> DRAFT).' operationId: rejectEventPENDINGDRAFT description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: comment: type: string description: 'Must not be greater than 1000 characters.' example: b nullable: true parameters: - in: path name: event_id description: 'The ID of the event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string '/api/v1/events/{event_id}/return': post: summary: 'Return event in the approval flow.' operationId: returnEventInTheApprovalFlow description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: comment: type: string description: 'Must not be greater than 1000 characters.' example: b required: - comment parameters: - in: path name: event_id description: 'The ID of the event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string '/api/v1/events/{event_id}/discard': post: summary: 'Discard event in the approval flow.' operationId: discardEventInTheApprovalFlow description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: comment: type: string description: 'Must not be greater than 1000 characters.' example: b required: - comment parameters: - in: path name: event_id description: 'The ID of the event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string '/api/v1/events/{event_id}/cancel': post: summary: 'Cancel event (any -> CANCELLED).' operationId: cancelEventanyCANCELLED description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: comment: type: string description: 'Must not be greater than 1000 characters.' example: b nullable: true parameters: - in: path name: event_id description: 'The ID of the event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string '/api/v1/events/{event_id}/approval-history': get: summary: 'Get approval history for an event.' operationId: getApprovalHistoryForAnEvent description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints parameters: - in: path name: event_id description: 'The ID of the event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string '/api/v1/events/{event_id}/approval-summary': get: summary: 'Get approval summary steps for an event.' operationId: getApprovalSummaryStepsForAnEvent description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints parameters: - in: path name: event_id description: 'The ID of the event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string '/api/v1/events/{event_id}/occurrences/{occurrence}': get: summary: 'Show the merged series + override data for a single occurrence.' operationId: showTheMergedSeries+OverrideDataForASingleOccurrence description: "Returns the series event data merged with any non-null override fields.\n{occurrence} is a URL-encoded ISO 8601 datetime of the occurrence's original start_at." parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints put: summary: 'Upsert an override for a single occurrence.' operationId: upsertAnOverrideForASingleOccurrence description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: is_cancelled: type: boolean description: '' example: false title: type: string description: 'Must not be greater than 255 characters.' example: b nullable: true description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true start_at: type: string description: 'Must be a valid date.' example: '2026-03-10T08:57:57' nullable: true end_at: type: string description: 'Must be a valid date. Must be a date after start_at.' example: '2052-04-02' nullable: true room_id: type: string description: 'Must be a valid UUID. The id of an existing record in the rooms table.' example: a4855dc5-0acb-33c3-b921-f4291f719ca0 nullable: true notes: type: string description: '' example: architecto nullable: true website: type: string description: 'Must be a valid URL. Must not be greater than 500 characters.' example: 'n' nullable: true contact_email: type: string description: 'Must be a valid email address. Must not be greater than 255 characters.' example: ashly64@example.com nullable: true prep_before_minutes: type: integer description: 'Must be at least 0.' example: 60 nullable: true cleanup_after_minutes: type: integer description: 'Must be at least 0.' example: 42 nullable: true delete: summary: 'Remove the override for a single occurrence (reverts to series defaults).' operationId: removeTheOverrideForASingleOccurrencerevertsToSeriesDefaults description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: event_id description: 'The ID of the event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string - in: path name: occurrence description: 'The occurrence.' example: '|{+' required: true schema: type: string '/api/v1/events/{event}/attachments': post: summary: 'Upload an attachment to an event.' operationId: uploadAnAttachmentToAnEvent description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: 'Must be a file. Must not be greater than 10240 kilobytes.' required: - file parameters: - in: path name: event description: 'The event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string '/api/v1/events/{event}/attachments/{media}': delete: summary: 'Delete an event attachment.' operationId: deleteAnEventAttachment description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: event description: 'The event.' example: 019bfc2a-05e0-7385-b6d6-5e929b30e2f8 required: true schema: type: string - in: path name: media description: '' example: architecto required: true schema: type: string /api/v1/rooms: get: summary: 'Display a listing of rooms.' operationId: displayAListingOfRooms description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints post: summary: 'Store a newly created room.' operationId: storeANewlyCreatedRoom description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true capacity: type: integer description: 'Must be at least 1.' example: 16 nullable: true equipment: type: string description: '' example: architecto nullable: true location: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true is_active: type: boolean description: '' example: false venue_id: type: string description: 'Must be a valid UUID. The id of an existing record in the venues table.' example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9 nullable: true seating_type: type: string description: '' example: banquet enum: - theater - classroom - boardroom - u_shape - banquet - reception - hollow_square - cinema - podium - horseshoe - other nullable: true required: - name '/api/v1/rooms/{id}': get: summary: 'Display the specified room.' operationId: displayTheSpecifiedRoom description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints put: summary: 'Update the specified room.' operationId: updateTheSpecifiedRoom description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true capacity: type: integer description: 'Must be at least 1.' example: 16 nullable: true equipment: type: string description: '' example: architecto nullable: true location: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true is_active: type: boolean description: '' example: false venue_id: type: string description: 'Must be a valid UUID. The id of an existing record in the venues table.' example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9 nullable: true seating_type: type: string description: '' example: other enum: - theater - classroom - boardroom - u_shape - banquet - reception - hollow_square - cinema - podium - horseshoe - other nullable: true delete: summary: 'Remove the specified room.' operationId: removeTheSpecifiedRoom description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: id description: 'The ID of the room.' example: 019bfc23-d2d1-7306-8600-ede2570ef8f5 required: true schema: type: string '/api/v1/rooms/{room_id}/activity': get: summary: '' operationId: getApiV1RoomsRoom_idActivity description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints parameters: - in: path name: room_id description: 'The ID of the room.' example: 019bfc23-d2d1-7306-8600-ede2570ef8f5 required: true schema: type: string '/api/v1/rooms/{room_id}/restore': post: summary: '' operationId: postApiV1RoomsRoom_idRestore description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: room_id description: 'The ID of the room.' example: 019bfc23-d2d1-7306-8600-ede2570ef8f5 required: true schema: type: string '/api/v1/rooms/{room_id}/force': delete: summary: '' operationId: deleteApiV1RoomsRoom_idForce description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: room_id description: 'The ID of the room.' example: 019bfc23-d2d1-7306-8600-ede2570ef8f5 required: true schema: type: string '/api/v1/rooms/{room_id}/availability': get: summary: 'Get availability schedules for a room.' operationId: getAvailabilitySchedulesForARoom description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints post: summary: 'Set availability for a room.' operationId: setAvailabilityForARoom description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b type: type: string description: '' example: blocked enum: - availability - blocked days: type: array description: '' example: - thursday items: type: string enum: - monday - tuesday - wednesday - thursday - friday - saturday - sunday periods: type: array description: 'This field is required when type is availability. Must have at least 1 items.' example: null items: type: object properties: start: type: string description: 'Must be a valid date in the format H:i.' example: '08:57' end: type: string description: 'Must be a valid date in the format H:i. Must be a date after periods.*.start.' example: '2052-04-02' required: - start - end start_date: type: string description: 'Must be a valid date. Must be a valid date in the format Y-m-d.' example: '2026-03-10' end_date: type: string description: 'Must be a valid date. Must be a valid date in the format Y-m-d. Must be a date after or equal to start_date.' example: '2052-04-02' required: - name - type - start_date - end_date parameters: - in: path name: room_id description: 'The ID of the room.' example: 019bfc23-d2d1-7306-8600-ede2570ef8f5 required: true schema: type: string '/api/v1/rooms/{room_id}/availability/{schedule}': delete: summary: 'Delete an availability schedule.' operationId: deleteAnAvailabilitySchedule description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: room_id description: 'The ID of the room.' example: 019bfc23-d2d1-7306-8600-ede2570ef8f5 required: true schema: type: string - in: path name: schedule description: '' example: architecto required: true schema: type: string '/api/v1/rooms/{room_id}/available-slots': get: summary: 'Get available time slots for a room.' operationId: getAvailableTimeSlotsForARoom description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: from: type: string description: 'Must be a valid date. Must be a valid date in the format Y-m-d.' example: '2026-03-10' to: type: string description: 'Must be a valid date. Must be a valid date in the format Y-m-d. Must be a date after or equal to from.' example: '2052-04-02' duration: type: integer description: 'Must be at least 15. Must not be greater than 480.' example: 22 required: - from - to parameters: - in: path name: room_id description: 'The ID of the room.' example: 019bfc23-d2d1-7306-8600-ede2570ef8f5 required: true schema: type: string '/api/v1/rooms/{room}/images': post: summary: 'Upload an image to a room.' operationId: uploadAnImageToARoom description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: 'Must be a file. Must not be greater than 5120 kilobytes.' required: - file parameters: - in: path name: room description: 'The room.' example: 019bfc23-d2d1-7306-8600-ede2570ef8f5 required: true schema: type: string '/api/v1/rooms/{room}/images/{media}': delete: summary: 'Delete a room image.' operationId: deleteARoomImage description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: room description: 'The room.' example: 019bfc23-d2d1-7306-8600-ede2570ef8f5 required: true schema: type: string - in: path name: media description: '' example: architecto required: true schema: type: string /api/v1/venues: get: summary: 'Display a listing of venues.' operationId: displayAListingOfVenues description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints post: summary: 'Store a newly created venue.' operationId: storeANewlyCreatedVenue description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b address: type: string description: '' example: architecto nullable: true is_active: type: boolean description: '' example: false required: - name '/api/v1/venues/{id}': get: summary: 'Display the specified venue.' operationId: displayTheSpecifiedVenue description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints put: summary: 'Update the specified venue.' operationId: updateTheSpecifiedVenue description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b address: type: string description: '' example: architecto nullable: true is_active: type: boolean description: '' example: true delete: summary: 'Remove the specified venue.' operationId: removeTheSpecifiedVenue description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: id description: 'The ID of the venue.' example: 019bfc20-711c-73a6-ad8c-8754d6bdc03e required: true schema: type: string '/api/v1/venues/{venue_id}/rooms': get: summary: 'Get rooms for a specific venue.' operationId: getRoomsForASpecificVenue description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints parameters: - in: path name: venue_id description: 'The ID of the venue.' example: 019bfc20-711c-73a6-ad8c-8754d6bdc03e required: true schema: type: string '/api/v1/venues/{venue_id}/activity': get: summary: '' operationId: getApiV1VenuesVenue_idActivity description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints parameters: - in: path name: venue_id description: 'The ID of the venue.' example: 019bfc20-711c-73a6-ad8c-8754d6bdc03e required: true schema: type: string '/api/v1/venues/{venue_id}/restore': post: summary: '' operationId: postApiV1VenuesVenue_idRestore description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: venue_id description: 'The ID of the venue.' example: 019bfc20-711c-73a6-ad8c-8754d6bdc03e required: true schema: type: string '/api/v1/venues/{venue_id}/force': delete: summary: '' operationId: deleteApiV1VenuesVenue_idForce description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: venue_id description: 'The ID of the venue.' example: 019bfc20-711c-73a6-ad8c-8754d6bdc03e required: true schema: type: string '/api/v1/institutions/{institution_id}': get: summary: 'Display the specified institution.' operationId: displayTheSpecifiedInstitution description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints put: summary: 'Update the specified institution.' operationId: updateTheSpecifiedInstitution description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b code: type: string description: 'Must not be greater than 50 characters.' example: 'n' description: type: string description: '' example: 'Eius et animi quos velit et.' nullable: true is_active: type: boolean description: '' example: true sort_order: type: integer description: 'Must be at least 0.' example: 60 delete: summary: 'Remove the specified institution.' operationId: removeTheSpecifiedInstitution description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: institution_id description: 'The ID of the institution.' example: architecto required: true schema: type: string '/api/v1/institutions/{institution_id}/activity': get: summary: '' operationId: getApiV1InstitutionsInstitution_idActivity description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints parameters: - in: path name: institution_id description: 'The ID of the institution.' example: architecto required: true schema: type: string '/api/v1/institutions/{institution_id}/restore': post: summary: '' operationId: postApiV1InstitutionsInstitution_idRestore description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: institution_id description: 'The ID of the institution.' example: architecto required: true schema: type: string '/api/v1/institutions/{institution_id}/force': delete: summary: '' operationId: deleteApiV1InstitutionsInstitution_idForce description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: institution_id description: 'The ID of the institution.' example: architecto required: true schema: type: string /api/v1/calendar/tokens: get: summary: "Display a listing of the user's calendar tokens." operationId: displayAListingOfTheUsersCalendarTokens description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints post: summary: 'Store a newly created calendar token.' operationId: storeANewlyCreatedCalendarToken description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Must not be greater than 255 characters.' example: b room_id: type: string description: 'Must be a valid UUID. The id of an existing record in the rooms table.' example: a4855dc5-0acb-33c3-b921-f4291f719ca0 nullable: true required: - name '/api/v1/calendar/tokens/{id}': get: summary: 'Display the specified calendar token.' operationId: displayTheSpecifiedCalendarToken description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints delete: summary: 'Remove the specified calendar token.' operationId: removeTheSpecifiedCalendarToken description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: id description: 'The ID of the token.' example: architecto required: true schema: type: string /api/v1/admin/exports: get: summary: '' operationId: getApiV1AdminExports description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints post: summary: '' operationId: postApiV1AdminExports description: '' parameters: [] responses: { } tags: - Endpoints requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: '' example: room_schedule enum: - event_list - room_schedule from_date: type: string description: 'Must be a valid date.' example: '2026-03-10T08:57:57' to_date: type: string description: 'Must be a valid date. Must be a date after or equal to from_date.' example: '2052-04-02' status: type: string description: '' example: draft enum: - draft - pending - approved - cancelled nullable: true room_id: type: string description: 'Must be a valid UUID. The id of an existing record in the rooms table.' example: a4855dc5-0acb-33c3-b921-f4291f719ca0 nullable: true venue_id: type: string description: 'Must be a valid UUID. The id of an existing record in the venues table.' example: c90237e9-ced5-3af6-88ea-84aeaa148878 nullable: true required: - type - from_date - to_date '/api/v1/admin/exports/{id}': get: summary: '' operationId: getApiV1AdminExportsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints parameters: - in: path name: id description: 'The ID of the export.' example: architecto required: true schema: type: string '/api/v1/admin/exports/{id}/run': post: summary: '' operationId: postApiV1AdminExportsIdRun description: '' parameters: [] responses: { } tags: - Endpoints parameters: - in: path name: id description: 'The ID of the export.' example: architecto required: true schema: type: string '/api/v1/admin/exports/{id}/download': get: summary: '' operationId: getApiV1AdminExportsIdDownload description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Endpoints parameters: - in: path name: id description: 'The ID of the export.' example: architecto required: true schema: type: string