{"openapi":"3.1.0","info":{"title":"Toto","version":"1.0.0"},"paths":{"/debug-sentry":{"get":{"tags":["debug"],"summary":"Debug Sentry Error","description":"Trigger a test error to verify Sentry integration.\nSEC-026: admin-gated so an attacker can't drive Sentry-event spend\nor fill the inbox with synthetic errors.","operationId":"debug_sentry_error_debug_sentry_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/debug-sentry/message":{"get":{"tags":["debug"],"summary":"Debug Sentry Message","description":"Send a test message to Sentry without crashing.\nSEC-026: admin-gated.","operationId":"debug_sentry_message_debug_sentry_message_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/waitlist":{"get":{"tags":["auth"],"summary":"Waitlist Page","operationId":"waitlist_page_waitlist_get","parameters":[{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"success","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Success"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["auth"],"summary":"Waitlist Submit","description":"Collect email for the waitlist.","operationId":"waitlist_submit_waitlist_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/beta-verify":{"post":{"tags":["auth"],"summary":"Beta Verify","description":"Verify a beta code and set the access cookie.","operationId":"beta_verify_beta_verify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/login":{"get":{"tags":["auth"],"summary":"Login Page","operationId":"login_page_login_get","parameters":[{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"message","in":"query","required":false,"schema":{"type":"string","default":"","title":"Message"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["auth"],"summary":"Login Email","operationId":"login_email_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/signup":{"get":{"tags":["auth"],"summary":"Signup Page","operationId":"signup_page_signup_get","parameters":[{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["auth"],"summary":"Signup Email","operationId":"signup_email_signup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google":{"get":{"tags":["auth"],"summary":"Auth Google","operationId":"auth_google_auth_google_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google/callback":{"get":{"tags":["auth"],"summary":"Auth Google Callback","operationId":"auth_google_callback_auth_google_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/apple":{"get":{"tags":["auth"],"summary":"Auth Apple","operationId":"auth_apple_auth_apple_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/apple/callback":{"post":{"tags":["auth"],"summary":"Auth Apple Callback","description":"Apple sends a POST with form data (response_mode=form_post).","operationId":"auth_apple_callback_auth_apple_callback_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/signup-modal":{"post":{"tags":["auth"],"summary":"Signup Modal","description":"Handle signup from the auth modal. Returns JSON.","operationId":"signup_modal_auth_signup_modal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/login-modal":{"post":{"tags":["auth"],"summary":"Login Modal","description":"Handle login from the auth modal. Returns JSON.","operationId":"login_modal_auth_login_modal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/logout":{"get":{"tags":["auth"],"summary":"Logout","operationId":"logout_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/events":{"get":{"tags":["sse"],"summary":"Subscribe to real-time events","description":"Server-Sent Events stream for real-time updates. Authenticated via session cookie, anonymous cookie, or Bearer token. Use ?detail=full for enriched payloads with full entity data. Sends keepalive comments every 15 seconds.","operationId":"sse_events_api_events_get","parameters":[{"name":"detail","in":"query","required":false,"schema":{"type":"string","description":"Payload detail level: 'minimal' or 'full'","default":"minimal","title":"Detail"},"description":"Payload detail level: 'minimal' or 'full'"}],"responses":{"200":{"description":"SSE event stream (text/event-stream)","content":{"application/json":{"schema":{}}}},"303":{"description":"Redirect to /login if not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/docs":{"get":{"tags":["docs"],"summary":"Docs Index","description":"Docs homepage — overview with key links.","operationId":"docs_index_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/docs/{slug}":{"get":{"tags":["docs"],"summary":"Docs Page","description":"Individual documentation page.","operationId":"docs_page_docs__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["pages"],"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/playground":{"get":{"tags":["pages"],"summary":"Playground","operationId":"playground_playground_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/demos":{"get":{"tags":["pages"],"summary":"Demos Page","operationId":"demos_page_demos_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/demo":{"get":{"tags":["pages"],"summary":"Demo Page","operationId":"demo_page_demo_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/pricing":{"get":{"tags":["pages"],"summary":"Pricing","operationId":"pricing_pricing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy":{"get":{"tags":["pages"],"summary":"Privacy","operationId":"privacy_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/terms":{"get":{"tags":["pages"],"summary":"Terms","operationId":"terms_terms_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/developers":{"get":{"tags":["pages"],"summary":"Developers Redirect","description":"Redirect /developers to /api-docs.","operationId":"developers_redirect_developers_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api-docs":{"get":{"tags":["pages"],"summary":"Api Docs","description":"Serve API reference as a simple HTML page.","operationId":"api_docs_api_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/lists":{"get":{"tags":["lists"],"summary":"Get all lists","description":"Returns all lists owned by the authenticated user, including hidden ones.","operationId":"api_get_lists_api_lists_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"}}},"post":{"tags":["lists"],"summary":"Create a new list","description":"Create a new list. Name is required and truncated to 100 chars.","operationId":"api_create_list_api_lists_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateListRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"422":{"description":"Validation error (empty name)"}}}},"/api/lists/{list_id}":{"patch":{"tags":["lists"],"summary":"Update a list","description":"Partially update list properties. Only provided (non-null) fields are changed.","operationId":"api_update_list_api_lists__list_id__patch","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateListRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"404":{"description":"List not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["lists"],"summary":"Delete a list","description":"Permanently delete a list and all its items. Creates sync tombstones for offline clients.","operationId":"api_delete_list_api_lists__list_id__delete","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"404":{"description":"List not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lists/{list_id}/metadata":{"patch":{"tags":["lists"],"summary":"Merge list metadata","description":"Merge keys into a list's metadata. Existing keys are preserved unless overridden. Set a key to null to delete it.","operationId":"api_merge_list_metadata_api_lists__list_id__metadata_patch","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"404":{"description":"List not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lists/{list_id}/layout":{"patch":{"tags":["lists"],"summary":"Update per-list layout","description":"Update layout settings (listSpan, cardColumns, cardGap, height) for a specific list. Merges with existing layout_metadata.","operationId":"api_update_list_layout_api_lists__list_id__layout_patch","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"404":{"description":"List not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/{list_id}/layout":{"post":{"tags":["lists"],"summary":"Web Update List Layout","description":"Web-facing route to update per-list layout. Reads JSON body, merges with existing layout_metadata.","operationId":"web_update_list_layout_lists__list_id__layout_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lists/{list_id}/hide":{"post":{"tags":["lists"],"summary":"Hide a list","description":"Hide a list from default views by setting visible=false.","operationId":"api_hide_list_api_lists__list_id__hide_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"404":{"description":"List not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lists/{list_id}/show":{"post":{"tags":["lists"],"summary":"Show a list","description":"Make a hidden list visible again in default views by setting visible=true.","operationId":"api_show_list_api_lists__list_id__show_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"404":{"description":"List not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lists/{list_id}/items":{"get":{"tags":["lists"],"summary":"Get items in a list","description":"Get items in a list with filtering, sorting, pagination, and text search. Returns a paginated wrapper with items array, total count, limit, and offset.","operationId":"api_get_items_api_lists__list_id__items_get","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status: pending, in_progress, done, blocked, deferred","title":"Status"},"description":"Filter by status: pending, in_progress, done, blocked, deferred"},{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3,"minimum":0},{"type":"null"}],"description":"Filter by priority: 0=none, 1=low, 2=medium, 3=high","title":"Priority"},"description":"Filter by priority: 0=none, 1=low, 2=medium, 3=high"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category tag","title":"Category"},"description":"Filter by category tag"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort order: priority, due_date, created_at, sort_order","title":"Sort"},"description":"Sort order: priority, due_date, created_at, sort_order"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max items to return (1-200)","default":50,"title":"Limit"},"description":"Max items to return (1-200)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of items to skip","default":0,"title":"Offset"},"description":"Number of items to skip"},{"name":"due_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to items due on or before this date (YYYY-MM-DD)","title":"Due Before"},"description":"Filter to items due on or before this date (YYYY-MM-DD)"},{"name":"due_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to items due on or after this date (YYYY-MM-DD)","title":"Due After"},"description":"Filter to items due on or after this date (YYYY-MM-DD)"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Text search on task and notes fields","title":"Search"},"description":"Text search on task and notes fields"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["lists"],"summary":"Add item to a list","description":"Create a new item in the specified list. Task text is required and auto-truncated to 500 chars.","operationId":"api_add_item_api_lists__list_id__items_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddItemRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"422":{"description":"Task text required or validation error"}}}},"/api/items/{item_id}/edit":{"post":{"tags":["lists"],"summary":"Edit an item","description":"Partially update an item. Only provided (non-null) fields are changed.","operationId":"api_edit_item_api_items__item_id__edit_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditItemRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"404":{"description":"Item not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/items/{item_id}/status":{"post":{"tags":["lists"],"summary":"Set item status","description":"Set an item's status. When set to 'done', records completed_at and completed_by.","operationId":"api_set_status_api_items__item_id__status_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"404":{"description":"Item not found"},"422":{"description":"Invalid status value"}}}},"/api/items/{item_id}/done":{"post":{"tags":["lists"],"summary":"Mark item done","description":"Convenience endpoint to mark an item as done. Returns the full updated item list.","operationId":"api_done_api_items__item_id__done_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/items/{item_id}/undone":{"post":{"tags":["lists"],"summary":"Revert item to pending","description":"Revert an item from done back to pending. Clears completed_at and completed_by.","operationId":"api_undone_api_items__item_id__undone_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/items/{item_id}/delete":{"post":{"tags":["lists"],"summary":"Delete an item","description":"Permanently delete an item. Creates a sync tombstone for offline clients. Returns the updated item list.","operationId":"api_delete_api_items__item_id__delete_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search":{"get":{"tags":["lists"],"summary":"Cross-list search","description":"Search for items across all lists. Supports text, regex, and glob modes. Prefix query with 'regex:' for regex or 'glob:' for glob matching. Results are grouped by list and include match_fields and highlight info.","operationId":"api_search_api_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500,"description":"Search query. Prefix with 'regex:' or 'glob:' for advanced modes.","title":"Q"},"description":"Search query. Prefix with 'regex:' or 'glob:' for advanced modes."},{"name":"field","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict search to specific field: task, description, notes, category","title":"Field"},"description":"Restrict search to specific field: task, description, notes, category"},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Encoded list ID to scope search to a single list","title":"List Id"},"description":"Encoded list ID to scope search to a single list"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status: pending, in_progress, done, blocked, deferred","title":"Status"},"description":"Filter by status: pending, in_progress, done, blocked, deferred"},{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3,"minimum":0},{"type":"null"}],"description":"Filter by priority: 0=none, 1=low, 2=medium, 3=high","title":"Priority"},"description":"Filter by priority: 0=none, 1=low, 2=medium, 3=high"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category tag","title":"Category"},"description":"Filter by category tag"},{"name":"due_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to items due on or before this date (YYYY-MM-DD)","title":"Due Before"},"description":"Filter to items due on or before this date (YYYY-MM-DD)"},{"name":"due_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to items due on or after this date (YYYY-MM-DD)","title":"Due After"},"description":"Filter to items due on or after this date (YYYY-MM-DD)"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"Sort order: relevance or created_at","default":"created_at","title":"Sort"},"description":"Sort order: relevance or created_at"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max items to return (1-200)","default":50,"title":"Limit"},"description":"Max items to return (1-200)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of items to skip","default":0,"title":"Offset"},"description":"Number of items to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid regex pattern or query"},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"422":{"description":"Invalid parameters"}}}},"/api/items/{item_id}/sublist":{"post":{"tags":["lists"],"summary":"Create a sub-list for an item","description":"Create a new sub-list linked to the specified item. Depth capped at 2 levels.","operationId":"api_create_sublist_api_items__item_id__sublist_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSublistRequest","default":{"name":""}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"404":{"description":"Item not found"},"422":{"description":"Depth limit exceeded"}}},"get":{"tags":["lists"],"summary":"Get an item's sub-list","description":"Returns the sub-list and its items for a given parent item.","operationId":"api_get_sublist_api_items__item_id__sublist_get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"404":{"description":"No sub-list found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lists/{list_id}/items/batch":{"post":{"tags":["lists"],"summary":"Batch create items","description":"Create up to 50 items in a single request. Returns succeeded and failed arrays with per-item results.","operationId":"api_batch_add_items_api_lists__list_id__items_batch_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchAddItemRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/batch/items/status":{"patch":{"tags":["lists"],"summary":"Batch update item status","description":"Update the status of up to 50 items in a single request. Returns succeeded and failed arrays.","operationId":"api_batch_set_status_api_batch_items_status_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchStatusRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/batch/items/delete":{"post":{"tags":["lists"],"summary":"Batch delete items","description":"Delete up to 50 items in a single request. Creates sync tombstones. Returns succeeded and failed arrays.","operationId":"api_batch_delete_items_api_batch_items_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDeleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lists/{list_id}/items/{item_id}/expand":{"post":{"tags":["lists"],"summary":"Expand item category to sub-list","description":"Create a child sub-list from an item's category tag. The new list inherits the category name and color.","operationId":"api_expand_item_to_list_api_lists__list_id__items__item_id__expand_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"404":{"description":"Item not found"},"422":{"description":"Item has no category"}}}},"/api/lists/{list_id}/children":{"get":{"tags":["lists"],"summary":"Get child lists","description":"Get all child lists of a parent list.","operationId":"api_get_child_lists_api_lists__list_id__children_get","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Insufficient scope"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists":{"get":{"tags":["lists"],"summary":"Lists Panel","description":"Render the lists panel as an htmx partial.","operationId":"lists_panel_lists_get","parameters":[{"name":"include_hidden","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Include Hidden"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/create":{"post":{"tags":["lists"],"summary":"Lists Create","description":"Create a new list via form submission and re-render the lists panel.","operationId":"lists_create_lists_create_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_lists_create_lists_create_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/{list_id}/rename":{"post":{"tags":["lists"],"summary":"Lists Rename","description":"Rename a list and re-render the lists panel.","operationId":"lists_rename_lists__list_id__rename_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_lists_rename_lists__list_id__rename_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/{list_id}/toggle-visibility":{"post":{"tags":["lists"],"summary":"Lists Toggle Visibility","description":"Toggle a list's visibility and re-render the lists panel.","operationId":"lists_toggle_visibility_lists__list_id__toggle_visibility_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/{list_id}/toggle-pin":{"post":{"tags":["lists"],"summary":"Lists Toggle Pin","description":"Toggle a list's pinned state and re-render the lists panel.","operationId":"lists_toggle_pin_lists__list_id__toggle_pin_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/backfill-timestamps":{"post":{"tags":["lists"],"summary":"Admin Backfill Timestamps","description":"Run backfill_list_timestamps. Requires admin API key.","operationId":"admin_backfill_timestamps_api_admin_backfill_timestamps_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/lists/reorder":{"post":{"tags":["lists"],"summary":"Lists Reorder","description":"Batch update sort_order for multiple lists. Body: {\"order\": [encoded_list_id, ...]}","operationId":"lists_reorder_lists_reorder_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/{list_id}/delete":{"post":{"tags":["lists"],"summary":"Lists Delete","description":"Delete a list and all its items, then re-render the lists panel.","operationId":"lists_delete_lists__list_id__delete_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/{list_id}/items/{item_id}/expand":{"post":{"tags":["lists"],"summary":"Items Expand To Sublist","description":"Expand an item's category into a child sub-list, move matching items, then re-render.","operationId":"items_expand_to_sublist_lists__list_id__items__item_id__expand_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/{list_id}/items":{"get":{"tags":["lists"],"summary":"Items List","description":"Render the item list partial for a given list.","operationId":"items_list_lists__list_id__items_get","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/{list_id}/add":{"post":{"tags":["lists"],"summary":"Items Add","description":"Add an item via form submission and re-render the item list.","operationId":"items_add_lists__list_id__add_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_items_add_lists__list_id__add_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/items/{item_id}/edit":{"post":{"tags":["lists"],"summary":"Items Edit","description":"Edit an item's task text and/or category via form submission and re-render the item list.","operationId":"items_edit_items__item_id__edit_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_items_edit_items__item_id__edit_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/items/{item_id}/done":{"post":{"tags":["lists"],"summary":"Items Done","description":"Mark an item as done and re-render the item list.\n\nQuery params:\n    swap=item: return only the single updated item HTML (server-side\n               single-item swap, Gary's quick win for desktop pipeline)","operationId":"items_done_items__item_id__done_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"swap","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Swap"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/items/{item_id}/undone":{"post":{"tags":["lists"],"summary":"Items Undone","description":"Revert an item to pending and re-render the item list.\n\nQuery params:\n    swap=item: return only the single updated item HTML","operationId":"items_undone_items__item_id__undone_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"swap","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Swap"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/items/{item_id}/doing":{"post":{"tags":["lists"],"summary":"Items Doing","description":"Set an item to in_progress and re-render the item list.","operationId":"items_doing_items__item_id__doing_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/items/{item_id}/delete":{"post":{"tags":["lists"],"summary":"Items Delete","description":"Delete an item and re-render the item list.","operationId":"items_delete_items__item_id__delete_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/items/{item_id}/toggle-printed":{"post":{"tags":["lists"],"summary":"Items Toggle Printed","description":"Toggle an item's printed flag and re-render the item list.","operationId":"items_toggle_printed_items__item_id__toggle_printed_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/items/{item_id}/sublist":{"get":{"tags":["lists"],"summary":"Items Sublist","description":"Render inline sub-list preview for an expanded card.","operationId":"items_sublist_items__item_id__sublist_get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/render-markdown":{"post":{"tags":["lists"],"summary":"Api Render Markdown","description":"Render Markdown to safe HTML for preview.","operationId":"api_render_markdown_api_render_markdown_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderMarkdownRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/items/{item_id}/description":{"post":{"tags":["lists"],"summary":"Items Update Description","description":"Update an item's description via the modal editor.","operationId":"items_update_description_items__item_id__description_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_items_update_description_items__item_id__description_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lists/{list_id}/print":{"post":{"tags":["lists"],"summary":"Queue items for printing","description":"Queue selected items for printing.","operationId":"items_print_lists__list_id__print_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/label-preview":{"get":{"tags":["lists"],"summary":"Preview DYMO label","description":"Generate a JPEG preview of a DYMO label with the given tasks.\n\nSEC-017: requires either a device bearer token, an authenticated web\nsession, or an active anon session. Previously this endpoint was fully\npublic and could be used to spam pillow with attacker-controlled\nrendering work.","operationId":"label_preview_label_preview_get","parameters":[{"name":"task","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":20,"default":["Add items and select them to preview"],"title":"Task"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/labels/address-preview":{"get":{"tags":["labels"],"summary":"Preview address label","description":"Generate a JPEG preview of a DYMO address label with the given fields.","operationId":"address_preview_labels_address_preview_get","parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string","description":"Recipient name","default":"","title":"Name"},"description":"Recipient name"},{"name":"address1","in":"query","required":false,"schema":{"type":"string","description":"Street address","default":"","title":"Address1"},"description":"Street address"},{"name":"city","in":"query","required":false,"schema":{"type":"string","description":"City","default":"","title":"City"},"description":"City"},{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"State/province","default":"","title":"State"},"description":"State/province"},{"name":"zip_code","in":"query","required":false,"schema":{"type":"string","description":"ZIP/postal code","default":"","title":"Zip Code"},"description":"ZIP/postal code"}],"responses":{"200":{"description":"JPEG image of the label preview","content":{"application/json":{"schema":{}},"image/jpeg":{}}},"401":{"description":"Missing or invalid auth token"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/devices/register":{"post":{"tags":["devices"],"summary":"Register a new device","description":"Register a new device. The caller must be authenticated via web session cookie or API key bearer (write scope). The new device is bound to that user. Returns a bearer token shown once.","operationId":"register_device_devices_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceRegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceRegisterResponse"}}}},"401":{"description":"No authenticated session or API key"},"403":{"description":"API key missing 'write' scope, or setup_code mismatch"},"500":{"description":"Server DEVICE_SETUP_CODE not configured"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/devices/rotate-token":{"post":{"tags":["devices"],"summary":"Rotate device token","description":"Generate a new bearer token and invalidate the old one immediately.","operationId":"rotate_token_devices_rotate_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"}}}},"/devices/print-jobs":{"get":{"tags":["devices"],"summary":"Poll pending print jobs","description":"Get pending print jobs assigned to this device. Only available to printer-capable devices.","operationId":"get_print_jobs_devices_print_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Device does not have a printer"}}}},"/devices/print-jobs/{job_id}/claim":{"post":{"tags":["devices"],"summary":"Claim a print job","description":"Claim a pending print job for this device. Only one device can claim a job.","operationId":"claim_print_job_devices_print_jobs__job_id__claim_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"403":{"description":"Device does not have a printer"},"404":{"description":"Job not found or already claimed"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/devices/print-jobs/{job_id}/complete":{"post":{"tags":["devices"],"summary":"Report print job completion","description":"Report a print job as completed (success) or errored. Pass error message in body if the job failed.","operationId":"complete_print_job_devices_print_jobs__job_id__complete_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"404":{"description":"Job not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sync/changes":{"get":{"tags":["sync"],"summary":"Get changes since sequence","description":"Returns all lists, items, and tombstones modified since the given sync sequence number. Clients store the returned current_seq and pass it on the next call to get only new changes.","operationId":"sync_changes_api_sync_changes_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Sync sequence number to fetch changes after","default":0,"title":"Since"},"description":"Sync sequence number to fetch changes after"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncChangesResponse"}}}},"401":{"description":"Missing or invalid auth token"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sync/push":{"post":{"tags":["sync"],"summary":"Push client changes","description":"Push a batch of client-side changes with Last-Write-Wins conflict resolution. Each change specifies an entity type, ID, fields to update, and a client timestamp. Returns resolved (applied) and conflicted (rejected) changes.","operationId":"sync_push_api_sync_push_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncPushRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncPushResponse"}}}},"401":{"description":"Missing or invalid auth token"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/settings":{"get":{"tags":["settings"],"summary":"Settings Page","description":"Render the settings page.","operationId":"settings_page_settings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/test-fx/toto-fx.test.js":{"get":{"tags":["settings"],"summary":"Test Fx Js","description":"Serve TotoFX test JS only to admins.","operationId":"test_fx_js_test_fx_toto_fx_test_js_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/demo-items":{"get":{"tags":["settings"],"summary":"Get demo items","description":"Return parsed demo items for pre-auth screen preview.","operationId":"get_demo_items_api_demo_items_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["settings"],"summary":"Save demo items","description":"Save demo items back to demo-items.txt. Requires admin scope.","operationId":"save_demo_items_api_demo_items_post","requestBody":{"content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Lists"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin":{"get":{"tags":["settings"],"summary":"Admin Page","description":"Admin panel. Requires admin login.","operationId":"admin_page_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/admin/waitlist":{"get":{"tags":["settings"],"summary":"Admin Waitlist Json","description":"Return waitlist entries as JSON. Requires admin.","operationId":"admin_waitlist_json_api_admin_waitlist_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/waitlist/csv":{"get":{"tags":["settings"],"summary":"Admin Waitlist Csv","description":"Export waitlist as CSV. Requires admin.","operationId":"admin_waitlist_csv_api_admin_waitlist_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/venue-config":{"get":{"tags":["settings"],"summary":"Get Venue Config","description":"Return current venue configuration.","operationId":"get_venue_config_api_venue_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["settings"],"summary":"Save Venue Config","description":"Write venue configuration to venue-config.js. Requires admin scope.","operationId":"save_venue_config_api_venue_config_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Config"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/animation-defaults":{"get":{"tags":["settings"],"summary":"Get production animation defaults","description":"Return current production animation defaults.","operationId":"get_animation_defaults_api_animation_defaults_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["settings"],"summary":"Export animation defaults","description":"Write production animation defaults from sandbox export. Requires admin scope.","operationId":"save_animation_defaults_api_animation_defaults_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Defaults"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings":{"get":{"tags":["settings"],"summary":"Get settings info","description":"Return settings storage info. Settings are stored client-side in localStorage.","operationId":"get_settings_api_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["settings"],"summary":"Save settings stub","description":"Stub endpoint — settings are stored client-side in localStorage.","operationId":"save_settings_api_settings_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/animations":{"get":{"tags":["animations"],"summary":"Full animation manifest","description":"Returns the complete animation manifest including all categories,\nstyles, variants with tunable parameters, dotgrid effects,\nsettings schema, and theme metadata.","operationId":"get_animation_manifest_api_animations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnimationManifestResponse"}}}}}}},"/api/animations/settings/schema":{"get":{"tags":["animations"],"summary":"Animation settings schema","description":"Returns just the settings schema portion of the manifest —\nuseful for building settings UIs or validating client-side config.","operationId":"get_settings_schema_api_animations_settings_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsSchemaResponse"}}}}}}},"/api/animations/themes":{"get":{"tags":["animations"],"summary":"Theme catalog","description":"Returns all built-in themes with their full definitions\n(palette, typography, elevation, animation overrides).\n\nCustom themes are stored client-side in localStorage and are not\nincluded here.","operationId":"get_theme_catalog_api_animations_themes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThemeCatalogResponse"}}}}}}},"/api/animations/plugins":{"get":{"tags":["animations"],"summary":"List animation plugin files","description":"Returns a list of JS files in the plugins directory for dynamic loading.\nDrop a .js file into app/ui/static/animations/plugins/ and it gets discovered.","operationId":"list_animation_plugins_api_animations_plugins_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PluginListResponse"}}}}}}},"/api/keys":{"get":{"tags":["api_keys"],"summary":"List your API keys","description":"List all active (non-revoked) API keys for the authenticated user. Never returns raw tokens.","operationId":"list_api_keys_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"}}},"post":{"tags":["api_keys"],"summary":"Create a new API key","description":"Create a new API key for programmatic access. The raw token is returned once and cannot be retrieved later.","operationId":"create_api_key_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"},"422":{"description":"Invalid scopes"}}}},"/api/keys/{key_id}":{"delete":{"tags":["api_keys"],"summary":"Revoke an API key","description":"Soft-revoke an API key. The key remains in the database but can no longer authenticate.","operationId":"revoke_api_key_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":{}}}},"401":{"description":"Authentication required"},"400":{"description":"Key already revoked"},"404":{"description":"API key not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats":{"get":{"tags":["stats"],"summary":"Get aggregate stats","description":"Returns counts of items by status and priority, completion metrics for today and this week, and total list count. Scoped to the authenticated user.","operationId":"api_get_stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"}}}},"/api/activity":{"get":{"tags":["activity"],"summary":"Get recent activity","description":"Returns a feed of recently changed items, derived from updated_at timestamps. Use `since` to filter to changes after a given date, and `limit` to cap the result count.","operationId":"api_get_activity_api_activity_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 date or datetime — only return activity after this timestamp (e.g. 2026-03-24)","title":"Since"},"description":"ISO 8601 date or datetime — only return activity after this timestamp (e.g. 2026-03-24)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum number of activity entries to return (1-200)","default":50,"title":"Limit"},"description":"Maximum number of activity entries to return (1-200)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing or invalid auth token"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user-animations":{"get":{"tags":["user_animations"],"summary":"List saved animation configs","description":"List all saved animation configurations for the current user.","operationId":"list_user_animations_api_user_animations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"}}},"post":{"tags":["user_animations"],"summary":"Save a new animation config","description":"Save a new animation configuration preset. Max 20 per user.","operationId":"create_user_animation_api_user_animations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnimationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation error"}}}},"/api/user-animations/{animation_id}":{"put":{"tags":["user_animations"],"summary":"Update a saved animation config","description":"Update the name or config of a saved animation preset.","operationId":"update_user_animation_api_user_animations__animation_id__put","parameters":[{"name":"animation_id","in":"path","required":true,"schema":{"type":"string","title":"Animation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAnimationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"},"404":{"description":"Animation not found"},"422":{"description":"Validation error"}}},"delete":{"tags":["user_animations"],"summary":"Delete a saved animation config","description":"Delete a saved animation configuration preset.","operationId":"delete_user_animation_api_user_animations__animation_id__delete","parameters":[{"name":"animation_id","in":"path","required":true,"schema":{"type":"string","title":"Animation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"},"404":{"description":"Animation not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user-themes":{"get":{"tags":["user_themes"],"summary":"List saved custom themes","description":"List all saved custom themes for the current user.","operationId":"list_user_themes_api_user_themes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"}}},"post":{"tags":["user_themes"],"summary":"Save a new custom theme","description":"Save a new custom theme. Max 20 per user.","operationId":"create_user_theme_api_user_themes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateThemeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"},"422":{"description":"Validation error"}}}},"/api/user-themes/{theme_id}":{"put":{"tags":["user_themes"],"summary":"Update a saved custom theme","description":"Update the name or config of a saved custom theme.","operationId":"update_user_theme_api_user_themes__theme_id__put","parameters":[{"name":"theme_id","in":"path","required":true,"schema":{"type":"string","title":"Theme Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateThemeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"},"404":{"description":"Theme not found"},"422":{"description":"Validation error"}}},"delete":{"tags":["user_themes"],"summary":"Delete a saved custom theme","description":"Delete a saved custom theme.","operationId":"delete_user_theme_api_user_themes__theme_id__delete","parameters":[{"name":"theme_id","in":"path","required":true,"schema":{"type":"string","title":"Theme Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required"},"404":{"description":"Theme not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/install":{"get":{"tags":["install"],"summary":"Get Installer","description":"Serve the bash installer script.","operationId":"get_installer_install_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/install/skills":{"get":{"tags":["install"],"summary":"List Skills","description":"Return JSON manifest of available skills with checksums.","operationId":"list_skills_install_skills_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/install/skills/{skill_name}":{"get":{"tags":["install"],"summary":"Get Skill","description":"Serve an individual SKILL.md file as plain text.","operationId":"get_skill_install_skills__skill_name__get","parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/install/claude-md":{"get":{"tags":["install"],"summary":"Get Claude Template","description":"Serve the exportable CLAUDE.md template that the bash installer\ndrops into ~/.claude/toto/ for users to copy into their projects.","operationId":"get_claude_template_install_claude_md_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/subscribe":{"post":{"tags":["stripe"],"summary":"Create Checkout","description":"Create a Stripe Checkout session and redirect to payment.","operationId":"create_checkout_subscribe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/subscribe/success":{"get":{"tags":["stripe"],"summary":"Checkout Success","description":"Handle successful Stripe Checkout redirect.","operationId":"checkout_success_subscribe_success_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/subscribe/cancel":{"get":{"tags":["stripe"],"summary":"Checkout Cancel","description":"Handle cancelled Stripe Checkout redirect.","operationId":"checkout_cancel_subscribe_cancel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/subscribe/manage":{"post":{"tags":["stripe"],"summary":"Manage Subscription","description":"Create a Stripe Customer Portal session and redirect.","operationId":"manage_subscription_subscribe_manage_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhooks/stripe":{"post":{"tags":["stripe"],"summary":"Stripe Webhook","description":"Handle Stripe webhook events.","operationId":"stripe_webhook_webhooks_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health check","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AddItemRequest":{"properties":{"task":{"type":"string","title":"Task","description":"Task text (max 500 chars, auto-truncated)"},"notes":{"type":"string","title":"Notes","description":"Optional longer description or notes (legacy, prefer description)","default":""},"description":{"type":"string","title":"Description","description":"Markdown description for the item","default":""},"priority":{"type":"integer","maximum":3.0,"minimum":0.0,"title":"Priority","description":"Priority level: 0=none, 1=low, 2=medium, 3=high","default":0},"category":{"type":"string","title":"Category","description":"Freeform category tag, displayed as a colored chip","default":""},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date","description":"Due date in ISO 8601 format (YYYY-MM-DD)"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Arbitrary JSON metadata (10KB cap, toto_ prefix reserved)"}},"type":"object","required":["task"],"title":"AddItemRequest","examples":[{"category":"errands","description":"Get the organic kind","due_date":"2026-04-15","notes":"Whole milk, 2%","priority":2,"task":"Buy milk"}]},"AnimationManifestResponse":{"properties":{"version":{"type":"string","title":"Version","description":"Manifest schema version"},"categories":{"additionalProperties":true,"type":"object","title":"Categories","description":"Animation categories (completion, deletion) with styles and variants"},"dotgridEffects":{"additionalProperties":true,"type":"object","title":"Dotgrideffects","description":"Dotgrid background effect types and their parameters"},"settingsSchema":{"additionalProperties":true,"type":"object","title":"Settingsschema","description":"Schema for AnimationSettings with defaults and constraints"},"themes":{"additionalProperties":true,"type":"object","title":"Themes","description":"Theme catalog metadata (built-in theme IDs)"}},"type":"object","required":["version","categories","dotgridEffects","settingsSchema","themes"],"title":"AnimationManifestResponse"},"BatchAddItemRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AddItemRequest"},"type":"array","maxItems":50,"minItems":1,"title":"Items","description":"Items to create (max 50)"}},"type":"object","required":["items"],"title":"BatchAddItemRequest","examples":[{"items":[{"task":"Buy milk"},{"priority":1,"task":"Buy eggs"}]}]},"BatchDeleteRequest":{"properties":{"item_ids":{"items":{"type":"string"},"type":"array","maxItems":50,"minItems":1,"title":"Item Ids","description":"Encoded item IDs to delete (max 50)"}},"type":"object","required":["item_ids"],"title":"BatchDeleteRequest","examples":[{"item_ids":["abcdef12","ghijkl34"]}]},"BatchStatusRequest":{"properties":{"updates":{"items":{"$ref":"#/components/schemas/BatchStatusUpdate"},"type":"array","maxItems":50,"minItems":1,"title":"Updates","description":"Status updates (max 50)"}},"type":"object","required":["updates"],"title":"BatchStatusRequest","examples":[{"updates":[{"id":1,"status":"done"},{"id":2,"status":"in_progress"}]}]},"BatchStatusUpdate":{"properties":{"id":{"type":"string","title":"Id","description":"Encoded item ID"},"status":{"type":"string","title":"Status","description":"New status"}},"type":"object","required":["id","status"],"title":"BatchStatusUpdate","examples":[{"id":"abcdef12","status":"done"}]},"Body_items_add_lists__list_id__add_post":{"properties":{"task":{"type":"string","title":"Task"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"}},"type":"object","required":["task"],"title":"Body_items_add_lists__list_id__add_post"},"Body_items_edit_items__item_id__edit_post":{"properties":{"task":{"type":"string","title":"Task"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","required":["task"],"title":"Body_items_edit_items__item_id__edit_post"},"Body_items_update_description_items__item_id__description_post":{"properties":{"description":{"type":"string","title":"Description","default":""}},"type":"object","title":"Body_items_update_description_items__item_id__description_post"},"Body_lists_create_lists_create_post":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"Body_lists_create_lists_create_post"},"Body_lists_rename_lists__list_id__rename_post":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"Body_lists_rename_lists__list_id__rename_post"},"CreateAnimationRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Display name for the saved config"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Full animation config snapshot (JSON object)"}},"type":"object","required":["name","config"],"title":"CreateAnimationRequest"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Human-readable name for the key"},"scope":{"type":"string","title":"Scope","description":"Comma-separated scopes: read, write, admin","default":"read,write"},"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days","description":"Optional expiration in days"}},"type":"object","required":["name"],"title":"CreateApiKeyRequest","examples":[{"expires_in_days":90,"name":"CI Pipeline","scope":"read,write"}]},"CreateListRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Display name for the new list (max 100 chars)"},"description":{"type":"string","title":"Description","description":"Optional subtitle or description for the list","default":""},"default_category":{"type":"string","title":"Default Category","description":"Category auto-applied to new items in this list","default":""},"parent_list_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent List Id","description":"Encoded ID of parent list for sub-list relationships"},"layout_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Layout Metadata","description":"Per-list layout config (listSpan, cardColumns, cardGap, height). 2KB cap."},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Arbitrary JSON metadata (10KB cap, toto_ prefix reserved). Agent-native structured data."}},"type":"object","required":["name"],"title":"CreateListRequest","examples":[{"default_category":"food","description":"Weekly shopping","name":"Groceries"}]},"CreateSublistRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Name for the sub-list (defaults to parent item task text)","default":""}},"type":"object","title":"CreateSublistRequest","examples":[{"name":"Sub-tasks"}]},"CreateThemeRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Display name"},"base_theme":{"type":"string","title":"Base Theme","description":"Built-in theme to derive from"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Full theme config (palette, typography, etc.)"}},"type":"object","required":["name","base_theme","config"],"title":"CreateThemeRequest"},"DeviceRegisterRequest":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name","description":"Human-readable device name, e.g. \"Alex's MacBook\""},"device_type":{"type":"string","pattern":"^(desktop|mobile)$","title":"Device Type","description":"Device type: 'desktop' or 'mobile'"},"has_printer":{"type":"boolean","title":"Has Printer","description":"Whether the device has a DYMO label printer attached","default":false},"setup_code":{"type":"string","maxLength":100,"title":"Setup Code","description":"Optional one-time setup code. Required only when no user session or API key is present. Must match server DEVICE_SETUP_CODE.","default":""}},"type":"object","required":["name","device_type"],"title":"DeviceRegisterRequest","examples":[{"device_type":"desktop","has_printer":true,"name":"Alex's MacBook","setup_code":"optional-if-authed"}]},"DeviceRegisterResponse":{"properties":{"device_id":{"type":"string","title":"Device Id","description":"Encoded unique identifier for the registered device"},"token":{"type":"string","title":"Token","description":"Bearer token for API auth — shown once, never stored in plaintext"}},"type":"object","required":["device_id","token"],"title":"DeviceRegisterResponse"},"EditItemRequest":{"properties":{"task":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task","description":"Updated task text (max 500 chars, auto-truncated)"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"Updated notes (legacy, prefer description)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Updated Markdown description"},"priority":{"anyOf":[{"type":"integer","maximum":3.0,"minimum":0.0},{"type":"null"}],"title":"Priority","description":"Priority level: 0=none, 1=low, 2=medium, 3=high"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Updated category tag"},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date","description":"Updated due date in ISO 8601 format (YYYY-MM-DD)"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Updated JSON metadata (10KB cap, toto_ prefix reserved)"}},"type":"object","title":"EditItemRequest","examples":[{"priority":3,"task":"Buy oat milk"}]},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JobCompleteRequest":{"properties":{"error":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Error","description":"Error message if the print job failed, null/omitted on success"}},"type":"object","title":"JobCompleteRequest","examples":[{}]},"PluginListResponse":{"properties":{"plugins":{"items":{"type":"string"},"type":"array","title":"Plugins","description":"List of plugin JS URLs for dynamic loading"}},"type":"object","required":["plugins"],"title":"PluginListResponse"},"RenderMarkdownRequest":{"properties":{"text":{"type":"string","maxLength":10000,"title":"Text","description":"Markdown text to render"}},"type":"object","required":["text"],"title":"RenderMarkdownRequest"},"SetStatusRequest":{"properties":{"status":{"type":"string","title":"Status","description":"New status: pending, in_progress, done, blocked, or deferred"}},"type":"object","required":["status"],"title":"SetStatusRequest","examples":[{"status":"done"}]},"SettingsSchemaResponse":{"properties":{"settingsSchema":{"additionalProperties":true,"type":"object","title":"Settingsschema","description":"Full settings schema with types, defaults, and constraints for each setting"}},"type":"object","required":["settingsSchema"],"title":"SettingsSchemaResponse"},"SyncChangeRequest":{"properties":{"entity_type":{"type":"string","title":"Entity Type","description":"Entity type: 'list' or 'listitem'"},"entity_id":{"type":"string","title":"Entity Id","description":"Encoded entity ID, or empty for new entities to be created","default":""},"fields":{"additionalProperties":true,"type":"object","title":"Fields","description":"Map of field names to new values"},"updated_at":{"type":"string","title":"Updated At","description":"ISO 8601 timestamp of the client-side change","default":""}},"type":"object","required":["entity_type"],"title":"SyncChangeRequest","examples":[{"entity_id":"abcdef12","entity_type":"listitem","fields":{"status":"done","task":"Updated task"},"updated_at":"2026-04-01T12:00:00"}]},"SyncChangesResponse":{"properties":{"current_seq":{"type":"integer","title":"Current Seq","description":"Current server sync sequence number (user-scoped)"},"lists":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Lists","description":"Lists changed since the requested sequence"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items","description":"Items changed since the requested sequence"},"tombstones":{"items":{"$ref":"#/components/schemas/TombstoneResponse"},"type":"array","title":"Tombstones","description":"Entities deleted since the requested sequence"},"resync_required":{"type":"boolean","title":"Resync Required","description":"True if client should discard local state and do a full resync (since=0)","default":false}},"type":"object","required":["current_seq","lists","items","tombstones"],"title":"SyncChangesResponse"},"SyncPushRequest":{"properties":{"changes":{"items":{"$ref":"#/components/schemas/SyncChangeRequest"},"type":"array","maxItems":1000,"title":"Changes","description":"Batch of client-side changes to push"}},"type":"object","required":["changes"],"title":"SyncPushRequest","examples":[{"changes":[{"entity_id":42,"entity_type":"listitem","fields":{"status":"done"},"updated_at":"2026-04-01T12:00:00"}]}]},"SyncPushResponse":{"properties":{"current_seq":{"type":"integer","title":"Current Seq","description":"Current server sync sequence number after push"},"resolved":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Resolved","description":"Changes that were applied successfully"},"conflicts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conflicts","description":"Changes rejected due to LWW conflict resolution"},"clock_skew_detected":{"type":"boolean","title":"Clock Skew Detected","description":"True if any client timestamp was clamped due to clock skew (>5min drift)","default":false}},"type":"object","required":["current_seq","resolved","conflicts"],"title":"SyncPushResponse"},"ThemeCatalogResponse":{"properties":{"builtin":{"items":{"$ref":"#/components/schemas/ThemeResponse"},"type":"array","title":"Builtin","description":"Built-in themes shipped with Toto"}},"type":"object","required":["builtin"],"title":"ThemeCatalogResponse"},"ThemeResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Unique theme identifier"},"name":{"type":"string","title":"Name","description":"Human-readable theme name"},"description":{"type":"string","title":"Description","description":"Theme description","default":""},"author":{"type":"string","title":"Author","description":"Theme author","default":""},"version":{"type":"string","title":"Version","description":"Theme version","default":""},"colorScheme":{"type":"string","title":"Colorscheme","description":"Color scheme: light or dark","default":"light"},"palette":{"additionalProperties":{"type":"string"},"type":"object","title":"Palette","description":"CSS custom property overrides for colors"},"typography":{"additionalProperties":{"type":"string"},"type":"object","title":"Typography","description":"Font family overrides"},"elevation":{"additionalProperties":{"type":"string"},"type":"object","title":"Elevation","description":"Box shadow overrides"},"animations":{"additionalProperties":true,"type":"object","title":"Animations","description":"Animation color, character, and effect overrides"}},"type":"object","required":["id","name"],"title":"ThemeResponse"},"TombstoneResponse":{"properties":{"entity_type":{"type":"string","title":"Entity Type","description":"Deleted entity type: 'list' or 'listitem'"},"entity_id":{"type":"string","title":"Entity Id","description":"Encoded ID of the deleted entity"},"list_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"List Id","description":"For deleted items: encoded list they belonged to"},"sync_seq":{"type":"integer","title":"Sync Seq","description":"Sync sequence number when deletion occurred"},"deleted_at":{"type":"string","title":"Deleted At","description":"ISO 8601 timestamp of deletion"}},"type":"object","required":["entity_type","entity_id","sync_seq","deleted_at"],"title":"TombstoneResponse"},"UpdateAnimationRequest":{"properties":{"name":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Name","description":"Updated display name"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config","description":"Updated animation config (JSON object)"}},"type":"object","title":"UpdateAnimationRequest"},"UpdateListRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"New display name (max 100 chars)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"New description"},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Visible","description":"Show/hide list in default views"},"default_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Category","description":"Default category for new items"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"List icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","description":"List color"},"parent_list_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent List Id","description":"Encoded ID of parent list"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order","description":"Display sort order"},"layout_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Layout Metadata","description":"Per-list layout config (listSpan, cardColumns, cardGap, height). 2KB cap."},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Arbitrary JSON metadata (10KB cap, toto_ prefix reserved). Agent-native structured data."}},"type":"object","title":"UpdateListRequest","examples":[{"name":"Renamed List","visible":false}]},"UpdateThemeRequest":{"properties":{"name":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Name","description":"Updated display name"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config","description":"Updated theme config"}},"type":"object","title":"UpdateThemeRequest"},"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"}}},"tags":[{"name":"lists","description":"List and item CRUD"},{"name":"devices","description":"Device registration and print jobs"},{"name":"sync","description":"Delta sync for offline-capable clients"},{"name":"labels","description":"Label rendering and printing"},{"name":"sse","description":"Server-Sent Events for real-time updates"},{"name":"settings","description":"User settings and preferences"},{"name":"auth","description":"Web session authentication"},{"name":"animations","description":"Animation manifest and theme catalog"},{"name":"stats","description":"Aggregate item and list statistics"},{"name":"activity","description":"Recent activity feed"},{"name":"api_keys","description":"API key management"}]}