{"openapi":"3.1.0","info":{"title":"unWarp API","version":"36.2.0"},"paths":{"/api/capture/transcribe":{"post":{"summary":"Capture Transcribe","operationId":"capture_transcribe_api_capture_transcribe_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_capture_transcribe_api_capture_transcribe_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptureAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aai/token":{"post":{"summary":"Aai Streaming Token","description":"Mint a short-lived AssemblyAI streaming token for live captions.","operationId":"aai_streaming_token_api_aai_token_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/StreamTokenRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamToken"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notes/{note_id}/retry-cleanup":{"post":{"summary":"Retry Cleanup","description":"Re-run the pipeline over a note's current source — the failure-state\nretry button on the note page (a malformed polish, a network blip, or a\nresult the user simply wants regenerated).","operationId":"retry_cleanup_api_notes__note_id__retry_cleanup_post","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notes/{note_id}/embed":{"post":{"summary":"Request Embedding","description":"The editor's autosave writes the body straight to Storage through the\nanon client, so the api never sees it — this is how it says \"my text\nchanged\" so semantic search catches up. Anyone who may edit the note may\nask (the author, or a member of its workspace — the notes_update rule).\n\nOnly ENQUEUES (the api does no compute): at most one deferred\n`embed_note` per note, which re-reads the body when it runs and does\nnothing when the body's chunks haven't changed — so a ping costs a redis\nSET NX, and the paid embedding call is bounded by real edits, which is\nwhy there's no rate limit to trip. `queued: false` is the honest\nanswer when embeddings are dark.","operationId":"request_embedding_api_notes__note_id__embed_post","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedQueued"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notes/{note_id}/append-source":{"post":{"summary":"Append Source","description":"Accept a new recording for an existing note and hand it to the\nappend pipeline. The response returns as soon as the upload + the\npending flip land — the user can navigate away; the worker takes it\nfrom there (STT → merge into body_raw → re-polish).","operationId":"append_source_api_notes__note_id__append_source_post","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_append_source_api_notes__note_id__append_source_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notes/search":{"post":{"summary":"Search Notes","description":"Semantic note search for the SPA library union. Best-effort: returns\n`available: false` + no matches when embeddings aren't configured, so the\ncaller falls back to its own full-text search.","operationId":"search_notes_api_notes_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotesSearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotesSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings":{"post":{"summary":"Create Meeting","operationId":"create_meeting_api_meetings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/segment":{"post":{"summary":"Upload Segment","description":"One recorder chunk: blob → Storage, metadata (+ the live transcript,\nwhen streaming produced one) → the Redis ledger the finalize job reads.","operationId":"upload_segment_api_meetings__meeting_id__segment_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_segment_api_meetings__meeting_id__segment_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/finalize":{"post":{"summary":"Finalize Meeting","operationId":"finalize_meeting_api_meetings__meeting_id__finalize_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinalizeAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/audio/{segment_id}":{"get":{"summary":"Segment Audio","description":"Playback: 307 to a short-lived signed URL so the browser streams the\nbytes (range requests included) straight from Supabase Storage.","operationId":"segment_audio_api_meetings__meeting_id__audio__segment_id__get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}},{"name":"segment_id","in":"path","required":true,"schema":{"type":"string","title":"Segment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/plans":{"post":{"summary":"Create Plan","operationId":"create_plan_api_meetings_plans_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/plans/{plan_id}":{"patch":{"summary":"Update Plan","operationId":"update_plan_api_meetings_plans__plan_id__patch","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Plan","operationId":"delete_plan_api_meetings_plans__plan_id__delete","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/plans/{plan_id}/sources":{"post":{"summary":"Add Source","operationId":"add_source_api_meetings_plans__plan_id__sources_post","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/plans/{plan_id}/sources/{source_id}":{"delete":{"summary":"Delete Source","operationId":"delete_source_api_meetings_plans__plan_id__sources__source_id__delete","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/plans/{plan_id}/prepare":{"post":{"summary":"Prepare Plan","operationId":"prepare_plan_api_meetings_plans__plan_id__prepare_post","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrepAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/plans/{plan_id}/start":{"post":{"summary":"Start Plan","description":"Turn a plan into the meeting row the recorder writes into.\n\nIdempotent: pressing Record twice on the same plan returns the meeting it\nalready made rather than orphaning the first one.","operationId":"start_plan_api_meetings_plans__plan_id__start_post","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanStarted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/reviews/{review_id}/apply":{"post":{"summary":"Apply Review","description":"Apply what the user accepted from a post-meeting review.\n\nThe review may have sat in the queue for days, so nothing is trusted from\nthe stored payload alone: every id is re-matched against the caller's\nstill-open points (shared.meeting_prep.decide_review), which is what stops\na point they already ticked being completed twice, or a deleted one coming\nback from the dead.","operationId":"apply_review_api_meetings_reviews__review_id__apply_post","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","title":"Review Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewApply"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewApplied"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/reviews/{review_id}/dismiss":{"post":{"summary":"Dismiss Review","operationId":"dismiss_review_api_meetings_reviews__review_id__dismiss_post","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","title":"Review Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notes":{"get":{"summary":"List Notes","operationId":"list_notes_api_v1_notes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Note","operationId":"create_note_api_v1_notes_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/notes/{note_id}":{"get":{"summary":"Get Note","operationId":"get_note_api_v1_notes__note_id__get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Note","operationId":"update_note_api_v1_notes__note_id__patch","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Note","operationId":"delete_note_api_v1_notes__note_id__delete","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notes/{note_id}/restore":{"post":{"summary":"Restore Note","operationId":"restore_note_api_v1_notes__note_id__restore_post","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notes/{note_id}/canvas/preview":{"get":{"summary":"Canvas Preview","operationId":"canvas_preview_api_v1_notes__note_id__canvas_preview_get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notes/{note_id}/tags":{"get":{"summary":"List Tags","operationId":"list_tags_api_v1_notes__note_id__tags_get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Add Tag","operationId":"add_tag_api_v1_notes__note_id__tags_post","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notes/{note_id}/tags/{tag}":{"delete":{"summary":"Remove Tag","operationId":"remove_tag_api_v1_notes__note_id__tags__tag__delete","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}},{"name":"tag","in":"path","required":true,"schema":{"type":"string","title":"Tag"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/action-items":{"get":{"summary":"List Action Items","operationId":"list_action_items_api_v1_action_items_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Action Item","operationId":"create_action_item_api_v1_action_items_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/action-items/{item_id}":{"get":{"summary":"Get Action Item","operationId":"get_action_item_api_v1_action_items__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Action Item","operationId":"update_action_item_api_v1_action_items__item_id__patch","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Action Item","description":"Soft-delete: stamp deleted_at so the item can be restored until the\npurge cron tears it down. A second DELETE on a binned item 404s.","operationId":"delete_action_item_api_v1_action_items__item_id__delete","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/action-items/{item_id}/restore":{"post":{"summary":"Restore Action Item","operationId":"restore_action_item_api_v1_action_items__item_id__restore_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/events":{"get":{"summary":"List Events","operationId":"list_events_api_v1_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Event","operationId":"create_event_api_v1_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/events/{event_id}":{"get":{"summary":"Get Event","operationId":"get_event_api_v1_events__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Event","operationId":"update_event_api_v1_events__event_id__patch","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Event","operationId":"delete_event_api_v1_events__event_id__delete","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/folders":{"get":{"summary":"List Folders","operationId":"list_folders_api_v1_folders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Folder","operationId":"create_folder_api_v1_folders_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/folders/{folder_id}":{"get":{"summary":"Get Folder","operationId":"get_folder_api_v1_folders__folder_id__get","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Folder","operationId":"update_folder_api_v1_folders__folder_id__patch","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Folder","operationId":"delete_folder_api_v1_folders__folder_id__delete","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/brainstorms":{"get":{"summary":"List Brainstorms","operationId":"list_brainstorms_api_v1_brainstorms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Brainstorm","operationId":"create_brainstorm_api_v1_brainstorms_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/brainstorms/{brainstorm_id}":{"get":{"summary":"Get Brainstorm","operationId":"get_brainstorm_api_v1_brainstorms__brainstorm_id__get","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Brainstorm","operationId":"update_brainstorm_api_v1_brainstorms__brainstorm_id__patch","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Brainstorm","operationId":"delete_brainstorm_api_v1_brainstorms__brainstorm_id__delete","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/brainstorms/{brainstorm_id}/nodes":{"post":{"summary":"Create Node","operationId":"create_node_api_v1_brainstorms__brainstorm_id__nodes_post","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/brainstorms/{brainstorm_id}/nodes/{node_id}":{"patch":{"summary":"Update Node","operationId":"update_node_api_v1_brainstorms__brainstorm_id__nodes__node_id__patch","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}},{"name":"node_id","in":"path","required":true,"schema":{"type":"string","title":"Node Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Node","operationId":"delete_node_api_v1_brainstorms__brainstorm_id__nodes__node_id__delete","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}},{"name":"node_id","in":"path","required":true,"schema":{"type":"string","title":"Node Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/brainstorms/{brainstorm_id}/links":{"post":{"summary":"Create Link","operationId":"create_link_api_v1_brainstorms__brainstorm_id__links_post","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/brainstorms/{brainstorm_id}/links/{link_id}":{"patch":{"summary":"Update Link","operationId":"update_link_api_v1_brainstorms__brainstorm_id__links__link_id__patch","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}},{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Link","operationId":"delete_link_api_v1_brainstorms__brainstorm_id__links__link_id__delete","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}},{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/brainstorms/{brainstorm_id}/export":{"get":{"summary":"Export Brainstorm","description":"Render the map as an image. `format=svg` (default) is generated\nserver-side from the live graph — always available, even for a map the AI\njust created. `format=png` returns the flattened raster the SPA editor\nsaved (open the map once to produce it).","operationId":"export_brainstorm_api_v1_brainstorms__brainstorm_id__export_get","parameters":[{"name":"brainstorm_id","in":"path","required":true,"schema":{"type":"string","title":"Brainstorm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me":{"get":{"summary":"Me","description":"Quick \"is my key working?\" endpoint — 401 unauthenticated is probed\nby the Landing console, so this route must never grow auth exceptions.","operationId":"me_api_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mcp":{"get":{"summary":"Mcp Descriptor","description":"Advertise the server — no auth (the Landing connector probes this).\n\nThe MCP spec allows GET for opening an SSE session in stateful mode;\nwe're stateless, so an operator hitting the URL in a browser gets a\nuseful JSON descriptor instead of a 405. The WWW-Authenticate header\nrides along so a probing client that GETs first still learns where the\nOAuth metadata lives.","operationId":"mcp_descriptor_api_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Mcp Rpc","operationId":"mcp_rpc_api_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Mcp Preflight","operationId":"mcp_preflight_api_mcp_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"summary":"Authorization Server Metadata","description":"RFC 8414 — the endpoints are real: token/register/revoke live here on\nthe API origin; the consent page is the SPA. Capability surface is\nintentionally narrow: S256-only PKCE, code + refresh_token grants only\n(no implicit, no password), `none` auth for MCP-flavour public clients\nwith client_secret_post for confidential ones.","operationId":"authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Authorization Server Metadata Preflight","operationId":"authorization_server_metadata_preflight__well_known_oauth_authorization_server_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"summary":"Protected Resource Metadata","description":"RFC 9728 — what a 401's WWW-Authenticate header points MCP clients\nat, so they can discover the authorization server and start the flow.","operationId":"protected_resource_metadata__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Protected Resource Metadata Preflight","operationId":"protected_resource_metadata_preflight__well_known_oauth_protected_resource_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/register":{"post":{"summary":"Register Client","operationId":"register_client_oauth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Register Preflight","operationId":"register_preflight_oauth_register_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/token":{"post":{"summary":"Token Endpoint","operationId":"token_endpoint_oauth_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Token Preflight","operationId":"token_preflight_oauth_token_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/revoke":{"post":{"summary":"Revoke Endpoint","description":"Always 200, even for unknown tokens — per RFC 7009 §2.2 a probing\nclient must not be able to tell \"expired\" from \"never minted\". Only a\ntotally missing token (a client bug, not an attack signal) gets a 400.","operationId":"revoke_endpoint_oauth_revoke_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Revoke Preflight","operationId":"revoke_preflight_oauth_revoke_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/consent-details":{"get":{"summary":"Consent Details","description":"Everything the consent screen renders: the client's display\nmetadata (http(s)-sanitised — a stored row predating the register-time\ncheck could still carry javascript:), the requested scope, and who is\nsigned in.","operationId":"consent_details_oauth_consent_details_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/approve":{"post":{"summary":"Approve Consent","description":"Mint an authorization code for the signed-in user. The Bearer-JWT\nauth is the CSRF boundary the old stack's consent nonce provided: an\nattacker page can't read the victim's token, so it can't submit a\ndecision — and we re-validate client + redirect against the live table\nso a freshly revoked client fails closed.","operationId":"approve_consent_oauth_approve_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/deny":{"post":{"summary":"Deny Consent","description":"Deny → bounce with error=access_denied per OAuth 2.1 §4.1.2.1 (only\nto a registered redirect_uri).","operationId":"deny_consent_oauth_deny_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/share/{slug}":{"get":{"summary":"Read Shared Note","operationId":"read_shared_note_api_share__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/brainstorm/{slug}":{"get":{"summary":"Read Shared Brainstorm","description":"The JSON source for the SPA's /share/brainstorm/{slug} route — the same\ncapability model as a shared note: the unguessable slug minted by\nshare_brainstorm() is the only key, the read runs service-role, and a\nrevoked share or a deleted map reads as 404, never stale.","operationId":"read_shared_brainstorm_api_share_brainstorm__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/{slug}/report":{"post":{"summary":"Report Shared Note","operationId":"report_shared_note_api_share__slug__report_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareReport"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/brainstorm/{slug}/report":{"post":{"summary":"Report Shared Brainstorm","operationId":"report_shared_brainstorm_api_share_brainstorm__slug__report_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareReport"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export":{"post":{"summary":"Export Archive","operationId":"export_archive_api_export_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/api-keys":{"get":{"summary":"List Api Keys","operationId":"list_api_keys_api_account_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Mint Api Key","description":"Mint a key and return the plaintext exactly once — after this, only\nsha256(plaintext) lives in the DB, so a leak exposes the prefix + name\n+ timestamps and nothing usable.","operationId":"mint_api_key_api_account_api_keys_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/api-keys/{key_id}":{"get":{"summary":"Get Api Key","operationId":"get_api_key_api_account_api_keys__key_id__get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Revoke Api Key","description":"Revoke (never delete) — the row stays for the audit trail, and the\nresolver refuses revoked rows on the next request.","operationId":"revoke_api_key_api_account_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/connections":{"get":{"summary":"List Connections","description":"The /you/connections list: every grant the user owns, collapsed to\nthe freshest row per client_id (refresh rotation leaves a trail of\nrevoked-by-rotation rows nobody needs to see).","operationId":"list_connections_api_account_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/connections/{connection_id}":{"delete":{"summary":"Revoke Connection","description":"Disconnect. Accepts either a grant row id (revoke that grant) or a\n`mcp_cl_…` client_id (revoke every active grant for that client — the\n\"Disconnect from claude.ai\" gesture). Revocation flips revoked_at; the\nresolver stops honouring the tokens immediately.","operationId":"revoke_connection_api_account_connections__connection_id__delete","parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Connection","description":"The /you/connections Read-only switch. Same id forms as revoke (a grant\nrow id, or a `mcp_cl_…` client_id for every active grant of that client).\n\nSession JWTs only (`require_user`): a connector's own OAuth token can\nnever reach this route, so an AI client cannot lift its own read-only.\n`resolve_oauth_access_token_full` reads the column on every request, so\nthe new level applies from the connector's very next call, and refresh\nrotation carries it forward (oauth.rotate_refresh_token).","operationId":"update_connection_api_account_connections__connection_id__patch","parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/knowledge/consolidate":{"post":{"summary":"Consolidate Knowledge","description":"The /you \"Tidy up\" button: one inline LLM pass that merges\nnear-duplicates and tightens phrasing in the caller's own\n`profiles.knowledge` blob (port of the pre-rewrite consolidateMyKnowledge\nserver action).\n\nSingle round-trip through the same Claude client the cleanup pipeline and\nthe /api/ai routes use (shared.llm.consolidate_user_knowledge) — no\nenqueue: it's a small, bounded prompt and the user is waiting on the\nresult. 503 when Claude is unconfigured (dark like every AI surface).\nThrottled to once per hour per user via `knowledge_consolidated_at` — a\nsecond click inside the window returns 429 with the existing timestamp,\nnot another paid call. The windowed `knowledge.consolidate` bucket\nrate-limits fail-closed so a broken audit read 503s rather than handing\nout unmetered model calls.\n\nReturns `{knowledge, consolidated_at}` — the post-pass blob and the fresh\nstamp — so the editor can drop its state in without a reload.","operationId":"consolidate_knowledge_api_account_knowledge_consolidate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/delete":{"post":{"summary":"Request Account Deletion","operationId":"request_account_deletion_api_account_delete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/delete/cancel":{"post":{"summary":"Cancel Account Deletion","description":"Reverse a pending deletion during the grace window.","operationId":"cancel_account_deletion_api_account_delete_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stripe/webhook":{"post":{"summary":"Stripe Webhook","operationId":"stripe_webhook_api_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stripe Webhook Api Stripe Webhook Post"}}}}}}},"/api/billing/checkout":{"post":{"summary":"Create Checkout","description":"Start (or resume) a paid subscription: resolve the billing account,\nensure a Stripe customer, and open a Checkout Session. Returns the hosted\nCheckout URL for the SPA to redirect to.","operationId":"create_checkout_api_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Create Checkout Api Billing Checkout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/portal":{"post":{"summary":"Create Portal","description":"Open the Stripe Customer Portal for the caller's billing account (manage\ncard, switch plan, cancel). 400 when they have no Stripe customer yet —\nthey've never checked out, so there's nothing to manage.","operationId":"create_portal_api_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Create Portal Api Billing Portal Post"}}}}}}},"/api/billing/seats":{"post":{"summary":"Update Seat Count","description":"Change how many Team seats are paid for. Clamped to the 2-seat minimum\nand never below the seats currently occupied (remove members first).","operationId":"update_seat_count_api_billing_seats_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update Seat Count Api Billing Seats Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/cancel":{"post":{"summary":"Cancel Plan","description":"Cancel at period end — on Stripe when the subscription is Stripe-backed\n(the local RPC alone would keep the card charging), locally for trials. A\npending downgrade schedule is released first (a scheduled subscription\nrefuses direct cancel updates).","operationId":"cancel_plan_api_billing_cancel_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Cancel Plan Api Billing Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/resume":{"post":{"summary":"Resume Plan","description":"Undo a pending cancellation while still inside the paid period.","operationId":"resume_plan_api_billing_resume_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Resume Plan Api Billing Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/downgrade":{"post":{"summary":"Schedule Downgrade","description":"Switch Team → Personal at the end of the paid period. No cancellation,\nno gap: the live Stripe subscription is wrapped in a schedule whose next\nphase is the Personal price x 1 starting at current_period_end — they keep\nthe Team they paid for, and pay for one seat from that day. The webhook\ncompletes the local conversion when the phase flips.","operationId":"schedule_downgrade_api_billing_downgrade_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Schedule Downgrade Api Billing Downgrade Post"}}}}}}},"/api/billing/downgrade/cancel":{"post":{"summary":"Cancel Downgrade","description":"Keep the Team plan: release the downgrade schedule and clear the\npending markers.","operationId":"cancel_downgrade_api_billing_downgrade_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Cancel Downgrade Api Billing Downgrade Cancel Post"}}}}}}},"/api/billing/revenuecat/webhook":{"post":{"summary":"Revenuecat Webhook","operationId":"revenuecat_webhook_api_billing_revenuecat_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Revenuecat Webhook Api Billing Revenuecat Webhook Post"}}}}}}},"/api/calendar/google/start":{"post":{"summary":"Google Start","operationId":"google_start_api_calendar_google_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleStart"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizeUrl"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calendar/google/callback":{"get":{"summary":"Google Callback","operationId":"google_callback_api_calendar_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calendar/apple/connect":{"post":{"summary":"Apple Connect","description":"Verify the credentials by using them, then store them encrypted.\n\nThe verification is the discovery walk — if it works, the password is\ngood and we already know where the calendars live, so the round trip\nisn't wasted. Storing first and finding out later would leave the user\nwith a connection that looks fine and never syncs.","operationId":"apple_connect_api_calendar_apple_connect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppleConnect"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calendar/connections":{"get":{"summary":"List Connections","operationId":"list_connections_api_calendar_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionList"}}}}}}},"/api/calendar/connections/{connection_id}/calendars":{"get":{"summary":"Available Calendars","description":"The calendars on this account, so the user can switch which one is\nlinked without disconnecting and starting over.","operationId":"available_calendars_api_calendar_connections__connection_id__calendars_get","parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableCalendars"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calendar/connections/{connection_id}":{"patch":{"summary":"Update Connection","operationId":"update_connection_api_calendar_connections__connection_id__patch","parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionUpdated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Disconnect","operationId":"disconnect_api_calendar_connections__connection_id__delete","parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calendar/connections/{connection_id}/sync":{"post":{"summary":"Sync Now","description":"Queue a sync for this connection.\n\nFail-closed on the rate limit: a sync is a burst of calls against\nsomeone else's API on our client credentials, and a broken limit read\nmust not turn into an unmetered loop that gets the app's Google project\nthrottled for everyone.","operationId":"sync_now_api_calendar_connections__connection_id__sync_post","parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncQueued"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/push/web":{"post":{"summary":"Register Web Push","operationId":"register_web_push_api_push_web_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebSubscription"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Remove Web Push","operationId":"remove_web_push_api_push_web_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebUnsubscribe"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/push/native":{"post":{"summary":"Register Native Push","operationId":"register_native_push_api_push_native_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NativeToken"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Remove Native Push","operationId":"remove_native_push_api_push_native_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NativeUnregister"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/push/vapid":{"get":{"summary":"Vapid Public Key","description":"The applicationServerKey for the browser; null = web push\nunavailable on this deployment (the client treats it as absent).","operationId":"vapid_public_key_api_push_vapid_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VapidKey"}}}}}}},"/api/tts":{"post":{"summary":"Tts","operationId":"tts_api_tts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TtsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/generate":{"post":{"summary":"Ai Generate","description":"Stream generated markdown for a prompt, optionally grounded in one of\nthe caller's notes (the old intent prompts collapsed into free-form\n`prompt`; the source-note framing and ground rules carry over).","operationId":"ai_generate_api_ai_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/extract-actions":{"post":{"summary":"Ai Extract Actions","description":"Re-run action-item extraction over the full note — useful when the\ncapture-time call missed something or after a manual edit. Dedupes\nagainst existing OPEN items by normalized text (the model is also told\nnot to repeat them, so this is mostly a safety net).","operationId":"ai_extract_actions_api_ai_extract_actions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteRef"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ai Extract Actions Api Ai Extract Actions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/retag":{"post":{"summary":"Ai Retag","description":"Replace this note's tags, steering the model toward the caller's\nexisting vocabulary so tag drift stays down without a controlled list.","operationId":"ai_retag_api_ai_retag_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteRef"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ai Retag Api Ai Retag Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/brainstorm":{"post":{"summary":"Ai Brainstorm","description":"Apply a chat turn (optionally reading an attached image) and report what\nchanged, plus an `undo` bundle that reverses exactly this turn.","operationId":"ai_brainstorm_api_ai_brainstorm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainstormChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ai Brainstorm Api Ai Brainstorm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/brainstorm/undo":{"post":{"summary":"Ai Brainstorm Undo","description":"Reverse a prior assistant turn using the `undo` bundle it returned.","operationId":"ai_brainstorm_undo_api_ai_brainstorm_undo_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainstormUndoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ai Brainstorm Undo Api Ai Brainstorm Undo Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/note":{"post":{"summary":"Ai Note","description":"Apply one chat turn to a note (reading its canvas as reference when it has\none) and report what changed.","operationId":"ai_note_api_ai_note_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ai Note Api Ai Note Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/ask":{"post":{"summary":"Ai Ask","description":"Answer across the caller's notes, meetings, tasks and calendar — and,\nwhen the message asks for it, create the reminder or calendar entry.","operationId":"ai_ask_api_ai_ask_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai/briefing":{"post":{"summary":"Ai Briefing","description":"Proactive suggestions for the dashboard — one generation per day, per\nscope, plus `refresh: true` on demand.","operationId":"ai_briefing_api_ai_briefing_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BriefingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BriefingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cast/stream-token":{"post":{"summary":"Cast Stream Token","operationId":"cast_stream_token_api_cast_stream_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Cast Stream Token Api Cast Stream Token Post"}}}}}}},"/api/cast/polish":{"post":{"summary":"Cast Polish","operationId":"cast_polish_api_cast_polish_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolishRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Cast Polish Api Cast Polish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cast/aai-webhook":{"post":{"summary":"Cast Aai Webhook","description":"Server-to-server: AssemblyAI (or its relay) reports the billed\nstreaming-session duration. The service role bypasses RLS by design —\nuser_id comes from the secret-authenticated payload, and the upsert on\nsession_id makes redelivery idempotent (no double-counting).","operationId":"cast_aai_webhook_api_cast_aai_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Cast Aai Webhook Api Cast Aai Webhook Post"}}}}}}},"/api/unsubscribe":{"get":{"summary":"Unsubscribe Get","operationId":"unsubscribe_get_api_unsubscribe_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Unsubscribe Post","operationId":"unsubscribe_post_api_unsubscribe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/support/tickets":{"get":{"summary":"My Tickets","operationId":"my_tickets_api_support_tickets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Tickets Api Support Tickets Get"}}}}}},"post":{"summary":"Open Ticket","operationId":"open_ticket_api_support_tickets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewTicket"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Open Ticket Api Support Tickets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/support/tickets/{ticket_id}":{"get":{"summary":"My Ticket","operationId":"my_ticket_api_support_tickets__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Ticket Api Support Tickets  Ticket Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/support/tickets/{ticket_id}/reply":{"post":{"summary":"Reply","operationId":"reply_api_support_tickets__ticket_id__reply_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Reply"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reply Api Support Tickets  Ticket Id  Reply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/support/tickets/{ticket_id}/close":{"post":{"summary":"Close","description":"\"Never mind, sorted it.\" The requester can end their own thread; only\nthe operator can mark one 'resolved' (that's a claim about the answer).","operationId":"close_api_support_tickets__ticket_id__close_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Close Api Support Tickets  Ticket Id  Close Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/summary":{"get":{"summary":"Summary","description":"The whole Overview tab: headline numbers, the daily series, and the\naction breakdown behind the traffic figure.","operationId":"summary_api_admin_summary_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Summary Api Admin Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users":{"get":{"summary":"Users","operationId":"users_api_admin_users_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Sort"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Users Api Admin Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}":{"get":{"summary":"User Detail","operationId":"user_detail_api_admin_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response User Detail Api Admin Users  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/role":{"post":{"summary":"Set Role","operationId":"set_role_api_admin_users__user_id__role_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Role Api Admin Users  User Id  Role Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/ban":{"post":{"summary":"Set Ban","operationId":"set_ban_api_admin_users__user_id__ban_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BanPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Ban Api Admin Users  User Id  Ban Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/state":{"post":{"summary":"Set State","description":"Move a user's billing posture — comp them, drop them to free, put them\non a trial. Local rows only; Stripe is not called (same as the trial\nRPCs), and the webhook reconciles a real subscription if one exists.","operationId":"set_state_api_admin_users__user_id__state_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set State Api Admin Users  User Id  State Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/deletion":{"post":{"summary":"Set Deletion","description":"Schedule or cancel the 7-day soft delete. The purge-accounts cron does\nthe destroying; this only moves the date, so a mis-click is recoverable\nright up until the window closes.","operationId":"set_deletion_api_admin_users__user_id__deletion_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletionPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Deletion Api Admin Users  User Id  Deletion Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/support":{"get":{"summary":"Support Queue","description":"The inbox. `status=active` is open+pending, `waiting` narrows that to\nthe ones whose last word came from the user — the real work queue.","operationId":"support_queue_api_admin_support_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"active","title":"Status"}},{"name":"assigned","in":"query","required":false,"schema":{"type":"string","default":"","title":"Assigned"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Support Queue Api Admin Support Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/support/{ticket_id}":{"get":{"summary":"Support Thread","operationId":"support_thread_api_admin_support__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Support Thread Api Admin Support  Ticket Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Support Update","operationId":"support_update_api_admin_support__ticket_id__patch","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Support Update Api Admin Support  Ticket Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/support/{ticket_id}/reply":{"post":{"summary":"Support Reply","operationId":"support_reply_api_admin_support__ticket_id__reply_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketReply"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Support Reply Api Admin Support  Ticket Id  Reply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/abuse":{"get":{"summary":"Abuse Queue","description":"Reports filed from the public share pages. `status=open` is the\nuntriaged pair (new + reviewing); anything else filters exactly.","operationId":"abuse_queue_api_admin_abuse_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Abuse Queue Api Admin Abuse Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/abuse/{report_id}":{"post":{"summary":"Review Abuse","operationId":"review_abuse_api_admin_abuse__report_id__post","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AbusePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Review Abuse Api Admin Abuse  Report Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/me":{"get":{"summary":"Admin Me","description":"The SPA's gate: 200 means this session may render the console, 403\nmeans it may not. Cheap enough to call on every /admin navigation, which\nis the point — the flag lives in the database, not in the JWT.","operationId":"admin_me_api_admin_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Me Api Admin Me Get"}}}}}}},"/api/admin/discounts":{"get":{"summary":"List Discounts","operationId":"list_discounts_api_admin_discounts_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(active|archived|all)$","default":"active","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Discounts Api Admin Discounts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Discount","description":"Create the coupon, then the promotion code on it. If the code half is\nrefused (most often: that code already exists) the coupon is deleted\nagain, so a failed create never leaves an orphan behind in Stripe.","operationId":"create_discount_api_admin_discounts_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscountInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Discount Api Admin Discounts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/discounts/{promotion_code_id}":{"patch":{"summary":"Toggle Discount","description":"Archive / reactivate a code, and/or rename it (the name customers see\non invoices). Archiving stops NEW redemptions only: a subscription\nalready carrying the discount keeps it for the rest of its duration —\nthat is Stripe's rule and the honest one, since the customer was\npromised it.","operationId":"toggle_discount_api_admin_discounts__promotion_code_id__patch","parameters":[{"name":"promotion_code_id","in":"path","required":true,"schema":{"type":"string","title":"Promotion Code Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscountPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Toggle Discount Api Admin Discounts  Promotion Code Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Discount","description":"Delete a code for good. Stripe has no \"delete\" for a promotion code,\nso this is three steps: archive the code (no new redemptions), stamp it\ndeleted (so it leaves the console's lists), and delete its coupon (so it\ncan never be reactivated). Customers already carrying the discount keep\nit until it runs out — deleting a coupon never touches existing\nsubscriptions. The usage count in the audit row is the final tally.","operationId":"delete_discount_api_admin_discounts__promotion_code_id__delete","parameters":[{"name":"promotion_code_id","in":"path","required":true,"schema":{"type":"string","title":"Promotion Code Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Discount Api Admin Discounts  Promotion Code Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/discount":{"post":{"summary":"Apply Discount","description":"Put a code on someone's existing subscription — the \"we owe you one\"\nlever for a customer who forgot to enter it at checkout. It goes through\nthe promotion code, so it counts against that code's usage limit exactly\nlike a self-serve redemption would. Replaces any discount already there.","operationId":"apply_discount_api_admin_users__user_id__discount_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyDiscount"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Apply Discount Api Admin Users  User Id  Discount Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Clear Discount","description":"Remove every discount from the user's live Stripe subscriptions. The\nnext invoice is charged at full price; nothing already invoiced moves.","operationId":"clear_discount_api_admin_users__user_id__discount_delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Clear Discount Api Admin Users  User Id  Discount Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/workspaces/{workspace_id}/collections/{folder_id}/rebuild":{"post":{"summary":"Rebuild Collection","description":"Rewrite a collection's living note from its history.\n\nOwners and managers only — it replaces a note every member reads, and it\nis the one AI call here a person triggers by hand. Coalesced: a second\nclick while one is queued is the same rebuild.","operationId":"rebuild_collection_api_workspaces__workspace_id__collections__folder_id__rebuild_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RebuildQueued"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/workspaces/{workspace_id}/collections/{folder_id}/sources":{"post":{"summary":"Fold Filed Source","description":"Fold a session (a ready meeting) or a note someone just filed into this\ncollection into its living note — what the pipelines do for one that\nFINISHES inside the collection, for one moved there by hand afterwards.\n\nAny member: filing is a member's move, and it only ever adds to the note\n(an update is targeted edits; a first write is from the collection's own\nhistory). Body: {\"kind\": \"meeting\" | \"note\", \"id\": \"<uuid>\"}. Answers\n202 {\"queued\": false} for a source that is in place but that this note\ndoesn't take (a note in a campaign, an archived or AI-written one, a\nsession already folded in) — nothing is generated, nothing metered.\n\nThe service role bypasses RLS, so this route IS the boundary: every\ncheck is re-made here (shared/living_notes.filed_verdict), and the job\nmakes them again when it runs.","operationId":"fold_filed_source_api_workspaces__workspace_id__collections__folder_id__sources_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceQueued"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Healthz Healthz Get"}}}}}}},"/api/health":{"get":{"summary":"Api Health","description":"Liveness for anyone; detail for the bearer of CRON_SECRET.\n\nThe public branch is a bare {\"status\": \"ok\"} on purpose — versions, queue\nstate and config presence are operator data, not public data. Redis\ntrouble degrades the detailed payload but never turns a liveness probe\nred. The authorized payload keeps the keys the Landing console reads:\n`version`, and `stt` + `stt_ms` for the transcription path.","operationId":"api_health_api_health_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Health Api Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cron/{job_name}":{"post":{"summary":"Run Cron Job","description":"Run a registered maintenance job now (the admin's \"Run now\" button).\n\n503 until CRON_SECRET is configured, 401 on a wrong one — and every run,\nsuccess or failure, upserts the job's cron_heartbeats row when Supabase\nis wired, so the admin can tell \"ran and failed\" from \"never ran\".\n\nLight sweeps run inline (this is the api container — I/O only); the\nheavy jobs (LLM passes, push fan-out, CRDT materialization) enqueue to\nthe worker and report `enqueued` instead of a summary.","operationId":"run_cron_job_api_cron__job_name__post","parameters":[{"name":"job_name","in":"path","required":true,"schema":{"type":"string","title":"Job Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Cron Job Api Cron  Job Name  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Root  Get"}}}}}}}},"components":{"schemas":{"AbusePatch":{"properties":{"status":{"type":"string","title":"Status"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"}},"type":"object","required":["status"],"title":"AbusePatch"},"AccountRequest":{"properties":{"billing_account_id":{"type":"string","title":"Billing Account Id"}},"type":"object","required":["billing_account_id"],"title":"AccountRequest"},"AppleConnect":{"properties":{"apple_id":{"type":"string","maxLength":200,"minLength":3,"title":"Apple Id"},"app_password":{"type":"string","maxLength":200,"minLength":8,"title":"App Password"},"scope_kind":{"type":"string","enum":["all","personal","workspace"],"title":"Scope Kind","default":"all"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"server_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Server Url"}},"type":"object","required":["apple_id","app_password"],"title":"AppleConnect"},"ApplyDiscount":{"properties":{"code":{"type":"string","maxLength":40,"minLength":3,"title":"Code"}},"type":"object","required":["code"],"title":"ApplyDiscount"},"AskAction":{"properties":{"kind":{"type":"string","enum":["action_item","event"],"title":"Kind"},"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"when":{"type":"string","title":"When"},"href":{"type":"string","title":"Href"}},"type":"object","required":["kind","id","label","when","href"],"title":"AskAction","description":"Something the turn CREATED, echoed back so the SPA can show it (and\noffer an undo) instead of making the user go looking for it."},"AskMessage":{"properties":{"role":{"type":"string","enum":["user","assistant"],"title":"Role"},"content":{"type":"string","maxLength":4000,"title":"Content"}},"type":"object","required":["role","content"],"title":"AskMessage"},"AskRequest":{"properties":{"question":{"type":"string","maxLength":2000,"minLength":1,"title":"Question"},"scope":{"type":"string","title":"Scope","default":"all"},"history":{"items":{"$ref":"#/components/schemas/AskMessage"},"type":"array","title":"History"}},"type":"object","required":["question"],"title":"AskRequest"},"AskResponse":{"properties":{"answer":{"type":"string","title":"Answer"},"sources":{"items":{"$ref":"#/components/schemas/AskSource"},"type":"array","title":"Sources"},"grounded":{"type":"boolean","title":"Grounded"},"actions":{"items":{"$ref":"#/components/schemas/AskAction"},"type":"array","title":"Actions"},"notice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notice"}},"type":"object","required":["answer","sources","grounded"],"title":"AskResponse"},"AskSource":{"properties":{"kind":{"type":"string","enum":["note","meeting"],"title":"Kind"},"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"href":{"type":"string","title":"Href"}},"type":"object","required":["kind","id","title","href"],"title":"AskSource"},"AuthorizeUrl":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"AuthorizeUrl"},"AvailableCalendars":{"properties":{"calendars":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Calendars"}},"type":"object","required":["calendars"],"title":"AvailableCalendars"},"BanPatch":{"properties":{"banned":{"type":"boolean","title":"Banned"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"}},"type":"object","required":["banned"],"title":"BanPatch"},"Body_append_source_api_notes__note_id__append_source_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"client_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Transcript"},"client_segments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Segments"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"}},"type":"object","title":"Body_append_source_api_notes__note_id__append_source_post"},"Body_capture_transcribe_api_capture_transcribe_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"client_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Transcript"},"client_segments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Segments"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},"type":"object","title":"Body_capture_transcribe_api_capture_transcribe_post"},"Body_upload_segment_api_meetings__meeting_id__segment_post":{"properties":{"audio":{"type":"string","contentMediaType":"application/octet-stream","title":"Audio"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"segments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segments"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"start_offset_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Start Offset Ms"}},"type":"object","required":["audio"],"title":"Body_upload_segment_api_meetings__meeting_id__segment_post"},"BrainstormChatRequest":{"properties":{"brainstorm_id":{"type":"string","title":"Brainstorm Id"},"message":{"type":"string","maxLength":4000,"title":"Message","default":""},"selection":{"anyOf":[{"$ref":"#/components/schemas/Selection"},{"type":"null"}]},"history":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array"},{"type":"null"}],"title":"History"},"image":{"anyOf":[{"$ref":"#/components/schemas/ImageInput"},{"type":"null"}]}},"type":"object","required":["brainstorm_id"],"title":"BrainstormChatRequest"},"BrainstormUndoRequest":{"properties":{"brainstorm_id":{"type":"string","title":"Brainstorm Id"},"undo":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Undo"}},"type":"object","required":["brainstorm_id"],"title":"BrainstormUndoRequest"},"BriefingRequest":{"properties":{"scope":{"type":"string","title":"Scope","default":"all"},"refresh":{"type":"boolean","title":"Refresh","default":false}},"type":"object","title":"BriefingRequest"},"BriefingResponse":{"properties":{"brief":{"type":"string","title":"Brief"},"suggestions":{"items":{"$ref":"#/components/schemas/Suggestion"},"type":"array","title":"Suggestions"},"generated_at":{"type":"string","title":"Generated At"},"cached":{"type":"boolean","title":"Cached"}},"type":"object","required":["brief","suggestions","generated_at","cached"],"title":"BriefingResponse"},"CaptureAccepted":{"properties":{"note_id":{"type":"string","title":"Note Id"},"cleanup_status":{"type":"string","title":"Cleanup Status"}},"type":"object","required":["note_id","cleanup_status"],"title":"CaptureAccepted"},"ChatMessage":{"properties":{"role":{"type":"string","enum":["user","assistant"],"title":"Role"},"content":{"type":"string","maxLength":4000,"title":"Content"}},"type":"object","required":["role","content"],"title":"ChatMessage"},"CheckoutRequest":{"properties":{"plan":{"type":"string","enum":["personal","team"],"title":"Plan"},"cycle":{"type":"string","enum":["monthly","annual"],"title":"Cycle","default":"monthly"},"seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seats"},"promo":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Promo"}},"type":"object","required":["plan"],"title":"CheckoutRequest"},"ConnectionCreated":{"properties":{"connection":{"additionalProperties":true,"type":"object","title":"Connection"}},"type":"object","required":["connection"],"title":"ConnectionCreated"},"ConnectionList":{"properties":{"connections":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Connections"},"google_available":{"type":"boolean","title":"Google Available"},"apple_available":{"type":"boolean","title":"Apple Available"}},"type":"object","required":["connections","google_available","apple_available"],"title":"ConnectionList"},"ConnectionPatch":{"properties":{"import_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Import Enabled"},"export_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Export Enabled"},"scope_kind":{"anyOf":[{"type":"string","enum":["all","personal","workspace"]},{"type":"null"}],"title":"Scope Kind"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"calendar_id":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Calendar Id"},"calendar_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Calendar Name"}},"type":"object","title":"ConnectionPatch"},"ConnectionUpdated":{"properties":{"connection":{"additionalProperties":true,"type":"object","title":"Connection"}},"type":"object","required":["connection"],"title":"ConnectionUpdated"},"DeletionPatch":{"properties":{"pending":{"type":"boolean","title":"Pending"}},"type":"object","required":["pending"],"title":"DeletionPatch"},"DiscountInput":{"properties":{"code":{"type":"string","maxLength":40,"minLength":3,"title":"Code"},"name":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Name"},"kind":{"type":"string","enum":["percent","amount"],"title":"Kind"},"percent_off":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent Off"},"amount_off":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Off"},"currency":{"type":"string","title":"Currency","default":"eur"},"duration":{"type":"string","enum":["once","repeating","forever"],"title":"Duration"},"duration_in_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration In Months"},"plan":{"type":"string","enum":["any","personal","team"],"title":"Plan","default":"any"},"max_redemptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Redemptions"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"first_time_only":{"type":"boolean","title":"First Time Only","default":false}},"type":"object","required":["code","kind","duration"],"title":"DiscountInput","description":"What an operator fills in. Every limit is optional; the discount\nitself (kind + amount + duration) is not."},"DiscountPatch":{"properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"name":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Name"}},"type":"object","title":"DiscountPatch"},"EmbedQueued":{"properties":{"note_id":{"type":"string","title":"Note Id"},"queued":{"type":"boolean","title":"Queued"}},"type":"object","required":["note_id","queued"],"title":"EmbedQueued"},"FinalizeAccepted":{"properties":{"meeting_id":{"type":"string","title":"Meeting Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["meeting_id","status"],"title":"FinalizeAccepted"},"GenerateRequest":{"properties":{"prompt":{"type":"string","maxLength":2000,"minLength":1,"title":"Prompt"},"note_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Id"}},"type":"object","required":["prompt"],"title":"GenerateRequest"},"GoogleStart":{"properties":{"scope_kind":{"type":"string","enum":["all","personal","workspace"],"title":"Scope Kind","default":"all"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},"type":"object","title":"GoogleStart"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImageInput":{"properties":{"media_type":{"type":"string","enum":["image/png","image/jpeg","image/webp","image/gif"],"title":"Media Type"},"data":{"type":"string","maxLength":7500000,"minLength":1,"title":"Data"}},"type":"object","required":["media_type","data"],"title":"ImageInput","description":"An uploaded sketch / whiteboard photo / screenshot, base64 (no data: prefix)."},"MeetingCreate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Title"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"folder_id":{"title":"Folder Id"}},"type":"object","title":"MeetingCreate"},"MeetingCreated":{"properties":{"meeting_id":{"type":"string","title":"Meeting Id"}},"type":"object","required":["meeting_id"],"title":"MeetingCreated"},"NativeToken":{"properties":{"platform":{"type":"string","enum":["ios","android"],"title":"Platform"},"token":{"type":"string","maxLength":4096,"minLength":8,"title":"Token"},"deviceName":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Devicename"}},"type":"object","required":["platform","token"],"title":"NativeToken"},"NativeUnregister":{"properties":{"token":{"type":"string","minLength":8,"title":"Token"}},"type":"object","required":["token"],"title":"NativeUnregister"},"NewTicket":{"properties":{"subject":{"type":"string","maxLength":200,"minLength":1,"title":"Subject"},"body":{"type":"string","maxLength":10000,"minLength":1,"title":"Body"},"category":{"type":"string","title":"Category","default":"other"},"context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context"}},"type":"object","required":["subject","body"],"title":"NewTicket"},"NoteChatRequest":{"properties":{"note_id":{"type":"string","title":"Note Id"},"message":{"type":"string","maxLength":4000,"title":"Message","default":""},"history":{"anyOf":[{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array"},{"type":"null"}],"title":"History"}},"type":"object","required":["note_id"],"title":"NoteChatRequest"},"NoteRef":{"properties":{"note_id":{"type":"string","title":"Note Id"}},"type":"object","required":["note_id"],"title":"NoteRef"},"NotesSearchMatch":{"properties":{"id":{"type":"string","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"similarity":{"type":"number","title":"Similarity"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"}},"type":"object","required":["id","similarity"],"title":"NotesSearchMatch"},"NotesSearchRequest":{"properties":{"q":{"type":"string","maxLength":500,"minLength":1,"title":"Q"},"limit":{"type":"integer","maximum":40.0,"minimum":1.0,"title":"Limit","default":10}},"type":"object","required":["q"],"title":"NotesSearchRequest"},"NotesSearchResponse":{"properties":{"available":{"type":"boolean","title":"Available"},"matches":{"items":{"$ref":"#/components/schemas/NotesSearchMatch"},"type":"array","title":"Matches"}},"type":"object","required":["available","matches"],"title":"NotesSearchResponse"},"Ok":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true}},"type":"object","title":"Ok"},"PipelineAccepted":{"properties":{"note_id":{"type":"string","title":"Note Id"},"cleanup_status":{"type":"string","title":"Cleanup Status"}},"type":"object","required":["note_id","cleanup_status"],"title":"PipelineAccepted"},"PlanCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"starts_at":{"type":"string","title":"Starts At"},"duration_min":{"type":"integer","maximum":600.0,"minimum":5.0,"title":"Duration Min","default":30},"brief":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Brief"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"include_last_meeting":{"type":"boolean","title":"Include Last Meeting","default":true},"add_to_calendar":{"type":"boolean","title":"Add To Calendar","default":true}},"type":"object","required":["title","starts_at"],"title":"PlanCreate"},"PlanOut":{"properties":{"plan":{"additionalProperties":true,"type":"object","title":"Plan"}},"type":"object","required":["plan"],"title":"PlanOut"},"PlanPatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At"},"duration_min":{"anyOf":[{"type":"integer","maximum":600.0,"minimum":5.0},{"type":"null"}],"title":"Duration Min"},"brief":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Brief"},"include_last_meeting":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Last Meeting"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"PlanPatch"},"PlanStarted":{"properties":{"plan_id":{"type":"string","title":"Plan Id"},"meeting_id":{"type":"string","title":"Meeting Id"}},"type":"object","required":["plan_id","meeting_id"],"title":"PlanStarted"},"PolishRequest":{"properties":{"transcript":{"type":"string","maxLength":200000,"title":"Transcript"},"lock_mode":{"type":"boolean","title":"Lock Mode","default":false}},"type":"object","required":["transcript"],"title":"PolishRequest"},"PrepAccepted":{"properties":{"plan_id":{"type":"string","title":"Plan Id"},"prep_status":{"type":"string","title":"Prep Status"}},"type":"object","required":["plan_id","prep_status"],"title":"PrepAccepted"},"RebuildQueued":{"properties":{"queued":{"type":"boolean","title":"Queued"}},"type":"object","required":["queued"],"title":"RebuildQueued"},"Reply":{"properties":{"body":{"type":"string","maxLength":10000,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"Reply"},"ReviewApplied":{"properties":{"completed":{"type":"integer","title":"Completed"},"created":{"type":"integer","title":"Created"}},"type":"object","required":["completed","created"],"title":"ReviewApplied"},"ReviewApply":{"properties":{"accept_covered":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Accept Covered"},"accept_new":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Accept New"}},"type":"object","title":"ReviewApply"},"RolePatch":{"properties":{"is_admin":{"type":"boolean","title":"Is Admin"}},"type":"object","required":["is_admin"],"title":"RolePatch"},"SeatsRequest":{"properties":{"seats":{"type":"integer","title":"Seats"}},"type":"object","required":["seats"],"title":"SeatsRequest"},"SegmentAccepted":{"properties":{"segment_id":{"type":"string","title":"Segment Id"},"bytes":{"type":"integer","title":"Bytes"}},"type":"object","required":["segment_id","bytes"],"title":"SegmentAccepted"},"Selection":{"properties":{"kind":{"type":"string","enum":["node","link"],"title":"Kind"},"id":{"type":"string","maxLength":64,"title":"Id"}},"type":"object","required":["kind","id"],"title":"Selection"},"ShareReport":{"properties":{"reason":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Reason"}},"type":"object","title":"ShareReport"},"SourceCreate":{"properties":{"kind":{"type":"string","title":"Kind"},"note_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Id"},"storage_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Path"},"filename":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Filename"},"mime":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Mime"},"byte_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Byte Size"},"text":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Text"}},"type":"object","required":["kind"],"title":"SourceCreate"},"SourceOut":{"properties":{"source":{"additionalProperties":true,"type":"object","title":"Source"}},"type":"object","required":["source"],"title":"SourceOut"},"SourceQueued":{"properties":{"queued":{"type":"boolean","title":"Queued"}},"type":"object","required":["queued"],"title":"SourceQueued"},"StatePatch":{"properties":{"state":{"type":"string","title":"State"}},"type":"object","required":["state"],"title":"StatePatch"},"StreamToken":{"properties":{"token":{"type":"string","title":"Token"},"expires_in_seconds":{"type":"integer","title":"Expires In Seconds"},"host":{"type":"string","title":"Host"},"model":{"type":"string","title":"Model"}},"type":"object","required":["token","expires_in_seconds","host","model"],"title":"StreamToken"},"StreamTokenRequest":{"properties":{"purpose":{"type":"string","enum":["capture","dictation"],"title":"Purpose","default":"capture"}},"type":"object","title":"StreamTokenRequest"},"Suggestion":{"properties":{"label":{"type":"string","title":"Label"},"body":{"type":"string","title":"Body"},"href":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Href"},"cta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta"}},"type":"object","required":["label","body"],"title":"Suggestion"},"SyncQueued":{"properties":{"queued":{"type":"boolean","title":"Queued"}},"type":"object","required":["queued"],"title":"SyncQueued"},"TicketPatch":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"},"assigned_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assigned To"},"assign":{"type":"boolean","title":"Assign","default":false}},"type":"object","title":"TicketPatch"},"TicketReply":{"properties":{"body":{"type":"string","maxLength":10000,"minLength":1,"title":"Body"},"internal":{"type":"boolean","title":"Internal","default":false}},"type":"object","required":["body"],"title":"TicketReply"},"TtsRequest":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"note_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Id"},"hash":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Hash"}},"type":"object","title":"TtsRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VapidKey":{"properties":{"publicKey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publickey"}},"type":"object","required":["publicKey"],"title":"VapidKey"},"WebPushKeys":{"properties":{"p256dh":{"type":"string","minLength":1,"title":"P256Dh"},"auth":{"type":"string","minLength":1,"title":"Auth"}},"type":"object","required":["p256dh","auth"],"title":"WebPushKeys"},"WebSubscription":{"properties":{"endpoint":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Endpoint"},"keys":{"$ref":"#/components/schemas/WebPushKeys"}},"type":"object","required":["endpoint","keys"],"title":"WebSubscription"},"WebUnsubscribe":{"properties":{"endpoint":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Endpoint"}},"type":"object","required":["endpoint"],"title":"WebUnsubscribe"}}}}