{"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"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}