{"openapi":"3.0.3","info":{"title":"Calendar App API","description":"A production-grade calendar application for scheduling, events, and team collaboration.","version":"1.0.0","contact":{"name":"Michael Barbine","email":"Michael@Barbineworldwide.com","url":"https://PlatPhormNews.com"},"license":{"name":"MIT"}},"servers":[{"url":"https://calendar.platphormnews.com/api","description":"Production"}],"paths":{"/health":{"get":{"summary":"Health check","operationId":"getHealth","tags":["System"],"responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"healthy"},"version":{"type":"string","example":"1.0.0"},"timestamp":{"type":"string","format":"date-time"},"uptime":{"type":"number"}}}}}}}}},"/v1/events":{"get":{"summary":"List events","operationId":"listEvents","tags":["Events"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100}},{"name":"calendar","in":"query","schema":{"type":"string"}},{"name":"from","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"search","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of events","headers":{"X-Request-Id":{"schema":{"type":"string"}},"X-Total-Count":{"schema":{"type":"integer"}},"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}}}}}},"post":{"summary":"Create an event","operationId":"createEvent","tags":["Events"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","startTime","endTime"],"properties":{"title":{"type":"string"},"description":{"type":"string"},"location":{"type":"string"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"allDay":{"type":"boolean","default":false},"color":{"type":"string"},"calendarId":{"type":"string"}}}}}},"responses":{"201":{"description":"Event created"},"400":{"description":"Validation error"}}}},"/v1/events/{id}":{"get":{"summary":"Get event by ID","operationId":"getEvent","tags":["Events"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Event details"},"404":{"description":"Event not found"}}},"put":{"summary":"Update event","operationId":"updateEvent","tags":["Events"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Event updated"},"404":{"description":"Event not found"}}},"delete":{"summary":"Delete event (soft delete)","operationId":"deleteEvent","tags":["Events"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Event deleted"},"404":{"description":"Event not found"}}}},"/v1/calendars":{"get":{"summary":"List calendars","operationId":"listCalendars","tags":["Calendars"],"responses":{"200":{"description":"List of calendars"}}}},"/v1/webhooks":{"get":{"summary":"List webhook endpoints","operationId":"listWebhooks","tags":["Webhooks"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":25}}],"responses":{"200":{"description":"Paginated list of webhook endpoints"}}},"post":{"summary":"Process incoming webhook or register endpoint","operationId":"receiveWebhook","tags":["Webhooks"],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["event.created","event.updated","event.deleted"]},"data":{"type":"object","description":"Event data payload"},"url":{"type":"string","description":"Webhook endpoint URL (for registration)"},"events":{"type":"array","items":{"type":"string"},"description":"Event types to subscribe to"}}}}}},"responses":{"200":{"description":"Webhook processed"},"201":{"description":"Event created via webhook or endpoint registered"},"400":{"description":"Validation error"}}}},"/v1/docs":{"get":{"summary":"List documentation or get a specific doc page","operationId":"getDocs","tags":["Documentation"],"parameters":[{"name":"slug","in":"query","schema":{"type":"string"},"description":"Documentation page slug (e.g., architecture, api, mcp)"}],"responses":{"200":{"description":"Documentation index or single page content"},"404":{"description":"Documentation page not found"}}}},"/v1/integrations/kanban":{"get":{"summary":"Kanban integration status","operationId":"getKanbanIntegration","tags":["Integrations"],"parameters":[{"name":"board","in":"query","schema":{"type":"string"}},{"name":"task","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Kanban integration info or upstream board/task data"},"503":{"description":"Upstream unavailable"}}},"post":{"summary":"Sync event to Kanban board","operationId":"syncToKanban","tags":["Integrations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["eventId","boardId"],"properties":{"eventId":{"type":"string"},"boardId":{"type":"string"},"listId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"}}}}}},"responses":{"201":{"description":"Event synced to Kanban"},"202":{"description":"Queued (upstream unreachable)"},"400":{"description":"Validation error"},"404":{"description":"Event not found"}}},"put":{"summary":"Import Kanban task as calendar event","operationId":"importFromKanban","tags":["Integrations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["taskId","title","dueDate"],"properties":{"taskId":{"type":"string"},"boardId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"dueDate":{"type":"string","format":"date-time"},"calendarId":{"type":"string"}}}}}},"responses":{"200":{"description":"Already imported"},"201":{"description":"Kanban task imported as event"},"400":{"description":"Validation error"}}}},"/v1/integrations/jobs":{"get":{"summary":"Jobs integration status","operationId":"getJobsIntegration","tags":["Integrations"],"parameters":[{"name":"job","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Jobs integration info or upstream job data"},"503":{"description":"Upstream unavailable"}}},"post":{"summary":"Sync event to Jobs listing","operationId":"syncToJobs","tags":["Integrations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["eventId","jobId"],"properties":{"eventId":{"type":"string"},"jobId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"}}}}}},"responses":{"201":{"description":"Event synced to Jobs"},"202":{"description":"Queued (upstream unreachable)"},"400":{"description":"Validation error"},"404":{"description":"Event not found"}}},"put":{"summary":"Import job deadline as calendar event","operationId":"importFromJobs","tags":["Integrations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jobId","title","deadline"],"properties":{"jobId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"deadline":{"type":"string","format":"date-time"},"calendarId":{"type":"string"}}}}}},"responses":{"200":{"description":"Already imported"},"201":{"description":"Job deadline imported as event"},"400":{"description":"Validation error"}}}},"/v1/public/events":{"get":{"summary":"List public calendar events","operationId":"listPublicEvents","tags":["Public"],"responses":{"200":{"description":"Paginated list of public events"}}},"post":{"summary":"Create server-side public calendar event","operationId":"createPublicEvent","tags":["Public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","startTime","endTime"],"properties":{"title":{"type":"string"},"description":{"type":"string"},"location":{"type":"string"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"allDay":{"type":"boolean"},"calendarId":{"type":"string"}}}}}},"responses":{"201":{"description":"Public event created"},"400":{"description":"Validation error"},"401":{"description":"PLATPHORM_API_KEY required"}}}},"/v1/events/ics":{"get":{"summary":"Export calendar events as ICS","operationId":"exportEventsIcs","tags":["Feeds"],"responses":{"200":{"description":"ICS feed"}}}},"/v1/events/{id}/ics":{"get":{"summary":"Export one event as an iCalendar file","operationId":"exportEventIcs","tags":["Feeds"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"ICS event"},"404":{"description":"Event not found or not public"}}}},"/v1/events/{id}/google-link":{"get":{"summary":"Generate a Google Calendar add link for an event","operationId":"generateGoogleCalendarLink","tags":["Events"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Google Calendar add link"},"404":{"description":"Event not found or not public"}}}},"/v1/events/{id}/outlook-link":{"get":{"summary":"Generate an Outlook/iCalendar export link for an event","operationId":"generateOutlookCalendarLink","tags":["Events"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Outlook/iCalendar .ics link"},"404":{"description":"Event not found or not public"}}}},"/v1/integrations/onboard":{"get":{"summary":"Onboard integration status","operationId":"getOnboardIntegration","tags":["Integrations"],"responses":{"200":{"description":"Onboard integration info"},"202":{"description":"Onboard unreachable/degraded"}}},"post":{"summary":"Import onboarding item as calendar event","operationId":"importFromOnboard","tags":["Integrations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","dueDate"],"properties":{"title":{"type":"string"},"dueDate":{"type":"string","format":"date-time"},"description":{"type":"string"},"owner":{"type":"string"},"sourceId":{"type":"string"},"calendarId":{"type":"string"}}}}}},"responses":{"201":{"description":"Onboard item imported"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"}}}},"/v1/integrations/claws":{"get":{"summary":"Claws integration status","operationId":"getClawsIntegration","tags":["Integrations"],"responses":{"200":{"description":"Claws integration info"}}},"post":{"summary":"Analyze calendar event via Claws","operationId":"analyzeWithClaws","tags":["Integrations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["eventId"],"properties":{"eventId":{"type":"string"},"prompt":{"type":"string"}}}}}},"responses":{"200":{"description":"Analysis completed"},"202":{"description":"Analysis queued"},"401":{"description":"Unauthorized"},"404":{"description":"Event not found"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-PlatPhorm-API-Key"},"bearerAuth":{"type":"http","scheme":"bearer"}}}}