{"openapi":"3.1.0","info":{"title":"LinkVault API","version":"1.8.672"},"paths":{"/admin/sync/activity":{"get":{"tags":["admin"],"summary":"Admin Sync Activity","description":"Recent sync request activity + per-user issue rollup (this instance only).\n\nBacked by the in-memory ring buffer in services.admin.sync_activity.","operationId":"admin_sync_activity_admin_sync_activity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/logs/stream":{"get":{"tags":["admin"],"summary":"Stream Logs","description":"Stream this container process's logs over SSE.\n\nHistory and follow come from the in-memory ring only. Replaying\n/tmp/linkvault.log dumped the whole file in one burst and froze the\nbrowser so Stop could not run.","operationId":"stream_logs_admin_logs_stream_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/stats/instances":{"get":{"tags":["admin"],"summary":"Admin Stats Instances","description":"Per-process API heartbeats (multi-instance); admin UI polls ~1s.\n\nOnly instances seen within the last INSTANCE_HEARTBEAT_WINDOW_HOURS are\nreturned (ADM-13 E: old Cloud Run revisions otherwise pile up forever).","operationId":"admin_stats_instances_admin_stats_instances_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/stats/system":{"get":{"tags":["admin"],"summary":"Admin Stats System","description":"ADM-04: storage & capacity metrics + local connections gauge.\n\nStorage payload comes from the admin_storage_stats RPC (migration 00056);\nwhen the RPC is not applied yet it is reported explicitly unavailable\ninstead of erroring. Per-instance inflight gauges are in\n/admin/stats/instances (inflight_requests, once 00056 is applied).","operationId":"admin_stats_system_admin_stats_system_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/stats/overview":{"get":{"tags":["admin"],"summary":"Admin Stats Overview","description":"ADM-12: cross-domain rollup for the Operations Dashboard.\n\n``?section=`` returns one domain so the page can paint each card as soon\nas that query finishes. Omitting it still returns the full rollup.","operationId":"admin_stats_overview_admin_stats_overview_get","parameters":[{"name":"section","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/sync-health":{"get":{"tags":["admin"],"summary":"Admin Stats Sync Health","description":"Link update windows only. The sync page does not need the full /admin/stats gather.","operationId":"admin_stats_sync_health_admin_stats_sync_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/stats/job-runs":{"get":{"tags":["admin"],"summary":"Admin Stats Job Runs","description":"Paginated/filtered `internal_job_runs` for the admin Job log browser.","operationId":"admin_stats_job_runs_admin_stats_job_runs_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/scheduler":{"get":{"tags":["admin"],"summary":"Admin Stats Scheduler","description":"Job registry + expected Cloud Scheduler config + what actually ran.\n\nThe ``expected`` block is the repository's configuration (jobs/registry.py,\nmirroring the setup script) — this endpoint does **not** query GCP. The\n``observed`` block comes from ``internal_job_runs`` so a scheduler whose real\nbody or cadence drifted from the repo is visible by comparison.","operationId":"admin_stats_scheduler_admin_stats_scheduler_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/stats/processing-logs":{"get":{"tags":["admin"],"summary":"Admin Stats Processing Logs","description":"Paginated/filtered ``processing_step_logs`` (M16) for admin UI + tools.","operationId":"admin_stats_processing_logs_admin_stats_processing_logs_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"execution_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Type"}},{"name":"device_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},{"name":"link_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Id"}},{"name":"step_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step Key"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats":{"get":{"tags":["admin"],"summary":"Admin Stats","description":"Entity counts, process-cache counters, and the latest job run.\n\nSync deltas live on ``/admin/stats/sync-health``. AI incidents live on\nthe overview. This payload is shared by the System and Processing pages.","operationId":"admin_stats_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/stats/daily":{"get":{"tags":["admin"],"summary":"Admin Stats Daily","description":"Per-day counts of new entities (requires admin_daily_stats RPC in Supabase).","operationId":"admin_stats_daily_admin_stats_daily_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/ai-usage":{"get":{"tags":["admin"],"summary":"Admin Stats Ai Usage","description":"Aggregate AI token usage and request outcomes from ``processing_step_logs``.\n\nGroups by ``step_key`` for token/call breakdown; each step includes\n``requests_ok``, ``requests_error``, ``errors_timeout`` (HTTP 408 or\n``timeout`` in ``error_detail``), and ``errors_other``.\nAlso returns per-model link counts from ``links.ai_model_used``.\nScans at most *scan* recent rows (default 5 000, max 20 000).\nAggregation core: ``services.admin.metrics`` (single source, ADM-02).","operationId":"admin_stats_ai_usage_admin_stats_ai_usage_get","parameters":[{"name":"scan","in":"query","required":false,"schema":{"type":"integer","default":5000,"title":"Scan"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/users":{"get":{"tags":["admin"],"summary":"Admin List Users","operationId":"admin_list_users_admin_stats_users_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"plan_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Code"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/users/{user_id}":{"get":{"tags":["admin"],"summary":"Admin User Detail","operationId":"admin_user_detail_admin_stats_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/users/{user_id}/audit":{"get":{"tags":["admin"],"summary":"Admin User Audit","operationId":"admin_user_audit_admin_stats_users__user_id__audit_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/users/{user_id}/plan":{"post":{"tags":["admin"],"summary":"Admin User Set Plan","operationId":"admin_user_set_plan_admin_stats_users__user_id__plan_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/SetPlanBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/users/{user_id}/clear-overrides":{"post":{"tags":["admin"],"summary":"Admin User Clear Overrides","operationId":"admin_user_clear_overrides_admin_stats_users__user_id__clear_overrides_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/users/{user_id}/reset-ai":{"post":{"tags":["admin"],"summary":"Admin User Reset Ai","operationId":"admin_user_reset_ai_admin_stats_users__user_id__reset_ai_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/freemium/flags":{"get":{"tags":["admin"],"summary":"Admin Freemium Flags Get","operationId":"admin_freemium_flags_get_admin_stats_freemium_flags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"patch":{"tags":["admin"],"summary":"Admin Freemium Flags Patch","operationId":"admin_freemium_flags_patch_admin_stats_freemium_flags_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/freemium/catalog":{"get":{"tags":["admin"],"summary":"Admin Freemium Catalog Get","operationId":"admin_freemium_catalog_get_admin_stats_freemium_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/stats/freemium/catalog/{plan_code}":{"patch":{"tags":["admin"],"summary":"Admin Freemium Catalog Patch","operationId":"admin_freemium_catalog_patch_admin_stats_freemium_catalog__plan_code__patch","parameters":[{"name":"plan_code","in":"path","required":true,"schema":{"type":"string","title":"Plan Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogPatchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/freemium/catalog/{plan_code}/reapply":{"post":{"tags":["admin"],"summary":"Admin Freemium Catalog Reapply","operationId":"admin_freemium_catalog_reapply_admin_stats_freemium_catalog__plan_code__reapply_post","parameters":[{"name":"plan_code","in":"path","required":true,"schema":{"type":"string","title":"Plan Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/links-browser":{"get":{"tags":["admin"],"summary":"Admin Stats Links Browser","description":"Paginated links for admin browser (service role).","operationId":"admin_stats_links_browser_admin_stats_links_browser_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"link_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Link Id"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"updated_at_desc","title":"Sort"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Page Size"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}},{"name":"device_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device Id"}},{"name":"user_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Id"}},{"name":"workspace_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Workspace Id"}},{"name":"content_access","in":"query","required":false,"schema":{"type":"string","default":"","title":"Content Access"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/devices":{"get":{"tags":["admin"],"summary":"Admin Stats Devices","description":"Lightweight device lookup for the links-browser device filter (ADM-06).","operationId":"admin_stats_devices_admin_stats_devices_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/teams":{"get":{"tags":["admin"],"summary":"Admin Stats Teams","description":"List/search workspaces & teams with member/link counts (service role).","operationId":"admin_stats_teams_admin_stats_teams_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/teams/{workspace_id}":{"get":{"tags":["admin"],"summary":"Admin Stats Team Detail","description":"Workspace detail with full member roster (email via auth admin API).","operationId":"admin_stats_team_detail_admin_stats_teams__workspace_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/teams/{workspace_id}/members/add":{"post":{"tags":["admin"],"summary":"Admin Teams Add Member","operationId":"admin_teams_add_member_admin_stats_teams__workspace_id__members_add_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/teams/{workspace_id}/members/remove":{"post":{"tags":["admin"],"summary":"Admin Teams Remove Member","operationId":"admin_teams_remove_member_admin_stats_teams__workspace_id__members_remove_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/teams/{workspace_id}/members/role":{"post":{"tags":["admin"],"summary":"Admin Teams Change Member Role","operationId":"admin_teams_change_member_role_admin_stats_teams__workspace_id__members_role_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats/url-blocklist":{"get":{"tags":["admin"],"summary":"Admin Stats Url Blocklist","operationId":"admin_stats_url_blocklist_admin_stats_url_blocklist_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin"],"summary":"Admin Create Url Blocklist","operationId":"admin_create_url_blocklist_admin_stats_url_blocklist_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"}}}}}}},"/admin/stats/url-blocklist/{row_id}":{"patch":{"tags":["admin"],"summary":"Admin Patch Url Blocklist","operationId":"admin_patch_url_blocklist_admin_stats_url_blocklist__row_id__patch","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"string","title":"Row Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete Url Blocklist","operationId":"admin_delete_url_blocklist_admin_stats_url_blocklist__row_id__delete","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"string","title":"Row Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/links/detail/{link_id}":{"get":{"tags":["admin"],"summary":"Admin Link Detail","description":"Return all link fields for the admin detail popup.","operationId":"admin_link_detail_admin_links_detail__link_id__get","parameters":[{"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"}}}}}}},"/admin/links/content/{link_id}":{"get":{"tags":["admin"],"summary":"Admin Link Content","description":"Admin-safe content URL for a link's stored file or source URL.","operationId":"admin_link_content_admin_links_content__link_id__get","parameters":[{"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"}}}}}}},"/admin/links/actions/set-state":{"post":{"tags":["admin"],"summary":"Admin Links Set State","description":"Set ai_processing_state (and optionally is_deleted) on selected links.","operationId":"admin_links_set_state_admin_links_actions_set_state_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"}}}}}}},"/admin/links/actions/reprocess":{"post":{"tags":["admin"],"summary":"Admin Links Reprocess","description":"Clear AI outputs, reset to pending, and fire the processing pipeline in background.","operationId":"admin_links_reprocess_admin_links_actions_reprocess_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"}}}}}}},"/admin/links/actions/fix-format":{"post":{"tags":["admin"],"summary":"Admin Links Fix Format","description":"Check (dry_run) or fix content_format + Markdown reformatting.\n\n``ids`` limits to selected links; ``scan: true`` checks up to 500 links\nstill flagged ``plain`` (the only ones that can be wrong).","operationId":"admin_links_fix_format_admin_links_actions_fix_format_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"}}}}}}},"/admin/links/language/missing":{"get":{"tags":["admin"],"summary":"Admin Links Language Missing","description":"Links without content_language, each with a detector suggestion.","operationId":"admin_links_language_missing_admin_links_language_missing_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/links/actions/set-language":{"post":{"tags":["admin"],"summary":"Admin Links Set Language","description":"Set content_language: ``items`` = [{id, language}].","operationId":"admin_links_set_language_admin_links_actions_set_language_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"}}}}}}},"/admin/links/actions/delete-tts":{"post":{"tags":["admin"],"summary":"Admin Delete Cached Tts","operationId":"admin_delete_cached_tts_admin_links_actions_delete_tts_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"}}}}}}},"/admin/links/actions/delete-translation":{"post":{"tags":["admin"],"summary":"Admin Delete Cached Translation","operationId":"admin_delete_cached_translation_admin_links_actions_delete_translation_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"}}}}}}},"/admin/links/actions/soft-delete":{"post":{"tags":["admin"],"summary":"Admin Links Soft Delete","operationId":"admin_links_soft_delete_admin_links_actions_soft_delete_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"}}}}}}},"/admin/links/actions/add-blocklist":{"post":{"tags":["admin"],"summary":"Admin Links Add Blocklist","description":"Create blocklist rows from URLs (host suffix) or explicit pattern list.","operationId":"admin_links_add_blocklist_admin_links_actions_add_blocklist_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"}}}}}}},"/admin/categories":{"get":{"tags":["admin"],"summary":"Admin Categories Page","operationId":"admin_categories_page_admin_categories_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/api/categories":{"get":{"tags":["admin"],"summary":"Admin List","operationId":"admin_list_admin_api_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin"],"summary":"Admin Create","operationId":"admin_create_admin_api_categories_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/categories/export":{"get":{"tags":["admin"],"summary":"Admin Export","operationId":"admin_export_admin_api_categories_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/api/categories/import":{"post":{"tags":["admin"],"summary":"Admin Import","operationId":"admin_import_admin_api_categories_import_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/api/categories/{category_id}":{"patch":{"tags":["admin"],"summary":"Admin Update","operationId":"admin_update_admin_api_categories__category_id__patch","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"string","title":"Category Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete","operationId":"admin_delete_admin_api_categories__category_id__delete","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"string","title":"Category Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/categories/merge":{"post":{"tags":["admin"],"summary":"Admin Merge","operationId":"admin_merge_admin_api_categories_merge_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/categories/maintenance":{"get":{"tags":["admin"],"summary":"Admin Maintenance Last","operationId":"admin_maintenance_last_admin_api_categories_maintenance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin"],"summary":"Admin Maintenance Run","operationId":"admin_maintenance_run_admin_api_categories_maintenance_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/login":{"get":{"tags":["admin"],"summary":"Login Form","operationId":"login_form_admin_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["admin"],"summary":"Login Submit","operationId":"login_submit_admin_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_submit_admin_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/logout":{"get":{"tags":["admin"],"summary":"Logout","operationId":"logout_admin_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/processing":{"get":{"tags":["admin"],"summary":"Admin Processing Page","description":"ADM-05: Data Processing domain page — state, metrics, jobs, issues, logs.","operationId":"admin_processing_page_admin_processing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/jobs":{"get":{"tags":["admin"],"summary":"Admin Jobs Page","description":"Retired HTML route (ADM-05) — merged into /admin/processing.","operationId":"admin_jobs_page_admin_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/jobs/run":{"post":{"tags":["admin"],"summary":"Admin Jobs Run","operationId":"admin_jobs_run_admin_jobs_run_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_jobs_run_admin_jobs_run_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"}}}}}}},"/admin/dashboard":{"get":{"tags":["admin"],"summary":"Dashboard","operationId":"dashboard_admin_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/general":{"get":{"tags":["admin"],"summary":"Admin General Page","description":"ADM-11: General page — model config, environment vars, security, session.\n\nThis is the ONLY page that runs the side-effectful model reconcile\n(automatic repair of unavailable slugs) — see ADM-13 D5.","operationId":"admin_general_page_admin_general_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/general/models":{"get":{"tags":["admin"],"summary":"Admin General Models","description":"Model datalist plus the one reconcile pass for the General page.","operationId":"admin_general_models_admin_general_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/config/update":{"post":{"tags":["admin"],"summary":"Update Config","operationId":"update_config_admin_config_update_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/health":{"get":{"tags":["admin"],"summary":"Health Metrics","description":"Retired HTML route (ADM-13) — content moved to System/Processing pages.","operationId":"health_metrics_admin_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/system":{"get":{"tags":["admin"],"summary":"Admin System Page","description":"ADM-03: System domain page — instances, host stats, entities, API usage, logs.","operationId":"admin_system_page_admin_system_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/sync":{"get":{"tags":["admin"],"summary":"Admin Sync Page","description":"ADM-08: Synchronisation domain page — sync KPIs + sync diagnostics.","operationId":"admin_sync_page_admin_sync_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/teams":{"get":{"tags":["admin"],"summary":"Admin Teams Page","description":"ADM-10: Teams & Workspaces domain page (JSON from /admin/stats/teams).","operationId":"admin_teams_page_admin_teams_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/users":{"get":{"tags":["admin"],"summary":"Admin Users Page","description":"SF-40: Users & Plans — Soft Freemium support (JSON from /admin/stats/users*).","operationId":"admin_users_page_admin_users_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/processing-logs":{"get":{"tags":["admin"],"summary":"Admin Processing Logs Page","description":"Retired HTML route (ADM-05) — merged into /admin/processing (query preserved).","operationId":"admin_processing_logs_page_admin_processing_logs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/links-browser":{"get":{"tags":["admin"],"summary":"Admin Links Browser Page","description":"M19: searchable links table (JSON from GET /admin/stats/links-browser).","operationId":"admin_links_browser_page_admin_links_browser_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/security":{"get":{"tags":["admin"],"summary":"Admin Security Page","description":"Retired HTML route (ADM-11) — merged into /admin/general (query preserved).","operationId":"admin_security_page_admin_security_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/environment":{"get":{"tags":["admin"],"summary":"Environment Page","description":"Retired HTML route (ADM-11) — merged into /admin/general.","operationId":"environment_page_admin_environment_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/links/{link_id}":{"get":{"tags":["admin"],"summary":"Admin Link Detail Page","description":"ADM-07: standalone general link detail page (HTML).\n\nSingle path segment — never shadows /links/detail/{id}, /links/content/{id}\nor /links/actions/* (all two segments deep).","operationId":"admin_link_detail_page_admin_links__link_id__get","parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/extension/download/chrome":{"get":{"tags":["extension"],"summary":"Download Chrome","description":"302 to public URL, stream from Azure/API, or stream from disk.","operationId":"download_chrome_extension_download_chrome_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/extension/download/edge":{"get":{"tags":["extension"],"summary":"Download Edge","description":"302 to public URL, stream from Azure/API, or stream from disk.","operationId":"download_edge_extension_download_edge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/extension/info":{"get":{"tags":["extension"],"summary":"Extension Info","description":"Returns current extension package metadata (version, sizes).","operationId":"extension_info_extension_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/releases/":{"get":{"tags":["releases"],"summary":"List Components","description":"List available component names.","operationId":"list_components_api_v1_releases__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/releases":{"get":{"tags":["releases"],"summary":"List Components","description":"List available component names.","operationId":"list_components_api_v1_releases_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/releases/manifest":{"get":{"tags":["releases"],"summary":"Get Latest Manifest","description":"Public release manifest for marketing (Azure Blob via account key).\n\nPrefer ``latest.json``, but enrich/rebuild from ``inventory.json`` so a\npartial upload (Windows exe-only) cannot hide APK/extension/DMG from the site.","operationId":"get_latest_manifest_api_v1_releases_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/releases/version-check":{"get":{"tags":["releases"],"summary":"Version Check","description":"Tell a client whether a newer release exists and where to download it.\n\nQuery params:\n    current   client's current version string (e.g. ``1.1.322``)\n    platform  android | ios | macos | windows (default android)\n\nResponse:\n    {\n      \"platform\": \"android\",\n      \"currentVersion\": \"1.1.322\",\n      \"latestVersion\": \"1.1.360\",     # null when no release found\n      \"updateAvailable\": true,\n      \"downloadUrl\": \"https://linkvault.pve.ch/apps\"\n    }","operationId":"version_check_api_v1_releases_version_check_get","parameters":[{"name":"current","in":"query","required":true,"schema":{"type":"string","title":"Current"}},{"name":"platform","in":"query","required":false,"schema":{"type":"string","default":"android","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/releases/{component}":{"get":{"tags":["releases"],"summary":"List Component Versions","description":"List all versions available for a component (newest first). Does not include filenames.","operationId":"list_component_versions_api_v1_releases__component__get","parameters":[{"name":"component","in":"path","required":true,"schema":{"type":"string","title":"Component"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/releases/{component}/latest":{"get":{"tags":["releases"],"summary":"Download Component Latest","description":"Stream the latest version of a component.","operationId":"download_component_latest_api_v1_releases__component__latest_get","parameters":[{"name":"component","in":"path","required":true,"schema":{"type":"string","title":"Component"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/releases/{component}/{version}":{"get":{"tags":["releases"],"summary":"Download Component Version","description":"Stream a specific version of a component.","operationId":"download_component_version_api_v1_releases__component___version__get","parameters":[{"name":"component","in":"path","required":true,"schema":{"type":"string","title":"Component"}},{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/auth/oauth/initiate":{"post":{"tags":["extension-auth"],"summary":"Initiate Supabase OAuth for any web client","description":"Returns a Supabase OAuth authorization URL constructed server-side. Used by all web-based clients (browser extension, web app, web desktop). The client passes the returned URL to chrome.identity.launchWebAuthFlow or a browser redirect. No Supabase credentials are required in client code. Mobile apps (iOS/Android) do not use this endpoint.","operationId":"initiate_oauth_api_v1_ext_auth_oauth_initiate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthInitiateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthInitiateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/auth/id-token/exchange":{"post":{"tags":["extension-auth"],"summary":"Exchange a provider ID token for a Supabase session","description":"Accepts a Google or Apple ID token (e.g. from Google Sign-In / GSI) and exchanges it for a Supabase session via GoTrue. Returns session tokens and basic user info. Used by web clients that obtain an ID token client-side (e.g. FedCM / One Tap) but do not hold Supabase credentials.","operationId":"exchange_id_token_api_v1_ext_auth_id_token_exchange_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdTokenExchangeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdTokenExchangeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/auth/refresh":{"post":{"tags":["extension-auth"],"summary":"Refresh Supabase session (web clients)","description":"Exchanges a Supabase refresh_token for new access/refresh tokens via GoTrue. Used by the Next.js webapp (HttpOnly cookie rotation) and any web client that stores refresh tokens server-side. Rate-limited per IP like oauth/initiate. Requires SUPABASE_URL and SUPABASE_ANON_KEY on the API.","operationId":"refresh_oauth_tokens_api_v1_ext_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthRefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthRefreshResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/links":{"get":{"tags":["extension-links"],"summary":"List Links","description":"Return a cursor-paginated list of the authenticated user's links, newest first.","operationId":"list_links_api_v1_ext_links_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor from previous response","title":"Cursor"},"description":"Pagination cursor from previous response"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Records per page (1–100)","default":20,"title":"Limit"},"description":"Records per page (1–100)"},{"name":"is_favorite","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to favorite links","title":"Is Favorite"},"description":"Filter to favorite links"},{"name":"is_private","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to private (no-AI) links","title":"Is Private"},"description":"Filter to private (no-AI) links"},{"name":"source_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a comma-separated set of source_type values","title":"Source Type"},"description":"Filter to a comma-separated set of source_type values"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace scope (defaults to personal workspace)","title":"Workspace Id"},"description":"Workspace scope (defaults to personal workspace)"},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"App language. Translated titles are returned only when stored.","title":"Locale"},"description":"App language. Translated titles are returned only when stored."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__ext_links_router__ListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["extension-links"],"summary":"Create Link","description":"Create a new link. Returns 201 immediately; AI enrichment runs in background.","operationId":"create_link_api_v1_ext_links_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Target workspace. Defaults to the caller's personal workspace.","title":"Workspace Id"},"description":"Target workspace. Defaults to the caller's personal workspace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/links/search":{"get":{"tags":["extension-links"],"summary":"Search Links","description":"Full-text search across the user's links with optional category and tag filters.\n\nWhen q is shorter than 2 chars the endpoint returns an empty result set.\nWhen q is absent or empty the RPC falls back to chronological listing.\nResults are ranked by the PostgreSQL search_links RPC (GIN-indexed tsvector).\nmatch_rank is included in the response model for future use; always null for now\nbecause the view does not expose ts_rank as a separate column.\n\n``search_links`` RPC (00016) has no ``source_type`` argument. When ``source_type``\nis set, this handler uses the PostgREST ``links`` query builder (same as the\nworkspace path) so the filter is applied before ``limit`` — not a Python slice\nof an already-paginated RPC page.","operationId":"search_links_api_v1_ext_links_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Full-text search query (min 2 chars to activate FTS)","title":"Q"},"description":"Full-text search query (min 2 chars to activate FTS)"},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category UUID","title":"Category Id"},"description":"Filter by category UUID"},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated tag UUIDs","title":"Tag Ids"},"description":"Comma-separated tag UUIDs"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Records per page (1–100)","default":20,"title":"Limit"},"description":"Records per page (1–100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor from previous response","title":"Cursor"},"description":"Pagination cursor from previous response"},{"name":"is_favorite","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to favorite links","title":"Is Favorite"},"description":"Filter to favorite links"},{"name":"is_private","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to private (no-AI) links","title":"Is Private"},"description":"Filter to private (no-AI) links"},{"name":"source_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a comma-separated set of source_type values","title":"Source Type"},"description":"Filter to a comma-separated set of source_type values"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace scope (defaults to personal workspace)","title":"Workspace Id"},"description":"Workspace scope (defaults to personal workspace)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/links/{link_id}":{"get":{"tags":["extension-links"],"summary":"Get Link","description":"Return a single link by ID with resolved category_name and tag_names.","operationId":"get_link_api_v1_ext_links__link_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["extension-links"],"summary":"Update Link","description":"Partially update mutable fields on an existing link.","operationId":"update_link_api_v1_ext_links__link_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["extension-links"],"summary":"Delete Link","description":"Soft-delete a link by setting is_deleted=true.","operationId":"delete_link_api_v1_ext_links__link_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/links/{link_id}/status":{"get":{"tags":["extension-links"],"summary":"Get Link Status","description":"Return the AI processing state for a link. Use for polling after creation.","operationId":"get_link_status_api_v1_ext_links__link_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/_SingleStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/links/{link_id}/media-url":{"get":{"tags":["extension-links"],"summary":"Get Link Media Url","description":"Return a short-lived signed URL for the file attached to a link.\n\nValidates that the link belongs to the authenticated user and that a\n``remote_media_path`` exists, then proxies a Supabase Storage sign request.\nReturns ``{\"data\": {\"signed_url\": \"...\", \"expires_at\": \"...\"}}`` on success\nor 404 if the link has no attachment.","operationId":"get_link_media_url_api_v1_ext_links__link_id__media_url_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Link Media Url Api V1 Ext Links  Link Id  Media Url Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/links/{link_id}/translation":{"post":{"tags":["extension-links"],"summary":"Translate Link","operationId":"translate_link_api_v1_ext_links__link_id__translation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/links/{link_id}/language":{"post":{"tags":["extension-links"],"summary":"Set Language","operationId":"set_language_api_v1_ext_links__link_id__language_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/links/{link_id}/speech":{"post":{"tags":["extension-links"],"summary":"Create Link Speech","operationId":"create_link_speech_api_v1_ext_links__link_id__speech_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeechBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/favorites/sync":{"get":{"tags":["extension-favorites"],"summary":"Favorites Sync","description":"Return current favorites when the user's link watermark advanced.","operationId":"favorites_sync_api_v1_ext_favorites_sync_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Client watermark (ISO-8601). When unchanged, responds 304.","title":"Since"},"description":"Client watermark (ISO-8601). When unchanged, responds 304."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoritesSyncResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/categories":{"get":{"tags":["extension-meta"],"summary":"List Categories","description":"Product-wide global catalogue + per-workspace link counts.\n\nLeftover clients that still hit ``GET /ext/categories`` get the same ids as\n``GET /ext/global-categories``. Cached per user/workspace/locale for 60 s.","operationId":"list_categories_api_v1_ext_categories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace scope (defaults to personal workspace)","title":"Workspace Id"},"description":"Workspace scope (defaults to personal workspace)"},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Catalogue locale (locales/manifest.json -> backend_catalogue_locales); unknown values fall back to en","title":"Locale"},"description":"Catalogue locale (locales/manifest.json -> backend_catalogue_locales); unknown values fall back to en"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoriesListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["extension-meta"],"summary":"Mutate Categories","operationId":"mutate_categories_api_v1_ext_categories_put","security":[{"HTTPBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["extension-meta"],"summary":"Mutate Categories","operationId":"mutate_categories_api_v1_ext_categories_post","security":[{"HTTPBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/ext/categories/{category_id}":{"delete":{"tags":["extension-meta"],"summary":"Mutate Category","operationId":"mutate_category_api_v1_ext_categories__category_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"string","title":"Category Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["extension-meta"],"summary":"Mutate Category","operationId":"mutate_category_api_v1_ext_categories__category_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"string","title":"Category Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/tags":{"get":{"tags":["extension-meta"],"summary":"List Tags","description":"Return all tags for the authenticated user sorted by usage frequency.\n\nIncludes ``link_count`` (non-deleted links only). Results are not paginated\n(hard limit: 1000) and cached per-user for 60 s.","operationId":"list_tags_api_v1_ext_tags_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace scope (defaults to personal workspace)","title":"Workspace Id"},"description":"Workspace scope (defaults to personal workspace)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/tiktok/meta":{"get":{"tags":["extension-tiktok"],"summary":"Get Tiktok Meta","description":"Fetch TikTok page HTML server-side and return rehydration metadata.","operationId":"get_tiktok_meta_api_v1_ext_tiktok_meta_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"TikTok video or photo URL","title":"Url"},"description":"TikTok video or photo URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TikTokMetaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/entitlements":{"get":{"tags":["extension-entitlements"],"summary":"Get Entitlements","description":"Return effective Soft Freemium entitlements for the authenticated user.","operationId":"get_entitlements_api_v1_ext_entitlements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntitlementsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ext/processing/preflight":{"post":{"tags":["extension-entitlements"],"summary":"Processing Preflight","description":"Check whether URL/hash already has completed AI content (no quota consume).","operationId":"processing_preflight_api_v1_ext_processing_preflight_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/links":{"get":{"tags":["mobile-sync"],"summary":"Get All Links","description":"GET /api/v1/mobile/links\n\nFetches links with optional filters:\n- No query params: all non-deleted links\n- ?updated_after=<iso>: differential sync (includes soft-deleted records)\n- ?is_deleted=true: only deleted link IDs (minimal response)\n- ?limit=&cursor=: keyset pagination (M13-P2-03). Omitting ``limit`` keeps legacy\n  single-response behavior (``order=updated_at.desc`` for full sync). When\n  ``limit`` is set, ordering is ``updated_at.asc,id.asc`` with opaque cursor.\n- ?source_type=a,b: PostgREST ``source_type=in.(a,b)`` (optional; omit for full sync).\n\nRate limit: 200 reads/min per user.","operationId":"get_all_links_api_v1_mobile_links_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"updated_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated After"}},{"name":"is_deleted","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Deleted"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"source_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a comma-separated set of source_type values","title":"Source Type"},"description":"Filter to a comma-separated set of source_type values"},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"App language. Translated titles are returned only when stored.","title":"Locale"},"description":"App language. Translated titles are returned only when stored."},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get All Links Api V1 Mobile Links Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/{link_id}/status":{"get":{"tags":["mobile-sync"],"summary":"Get Link Status","description":"GET /api/v1/mobile/links/{link_id}/status — narrow AI fields for polling (M13-P9).\n\nPrefer this over GET /links/{id} (full row) while ``ai_processing_state`` is non-terminal.","operationId":"get_link_status_api_v1_mobile_links__link_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Link Status Api V1 Mobile Links  Link Id  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/{link_id}":{"get":{"tags":["mobile-sync"],"summary":"Get Link By Id","description":"GET /api/v1/mobile/links/{link_id}\n\nReturns a single non-deleted link row for the authenticated user (M14 LSYNC-04 poll).","operationId":"get_link_by_id_api_v1_mobile_links__link_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Link By Id Api V1 Mobile Links  Link Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mobile-sync"],"summary":"Soft Delete Link","description":"DELETE /api/v1/mobile/links/{link_id}\n\nSoft-delete a single link:\n- Sets is_deleted = true, deleted_at = now()\n- Verifies the link belongs to the authenticated user\n- Returns 204 No Content on success\n- Returns 404 if link not found or belongs to different user\n\nRate limit: 60 writes/min per user.","operationId":"soft_delete_link_api_v1_mobile_links__link_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/batch":{"post":{"tags":["mobile-sync"],"summary":"Batch Upsert Links","description":"POST /api/v1/mobile/links/batch\n\nUpsert a batch of links from local cache.\n- Max 500 records per request\n- Validates every record's user_id matches authenticated user\n- Conflict strategy: upsert on id, last-write-wins by updated_at\n- Returns count of records inserted or updated\n\nRate limit: 60 writes/min per user.","operationId":"batch_upsert_links_api_v1_mobile_links_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__mobile_links_router__BatchUpsertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Batch Upsert Links Api V1 Mobile Links Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/soft-delete-batch":{"post":{"tags":["mobile-sync"],"summary":"Batch Soft Delete Links","description":"POST /api/v1/mobile/links/soft-delete-batch\n\nSoft-delete up to 500 link ids in one request (deduplicated). Rows must belong\nto the authenticated user and have ``is_deleted=false`` to be updated.\n\nRate limit: 60 writes/min per user (one request = one write for limit purposes).","operationId":"batch_soft_delete_links_api_v1_mobile_links_soft_delete_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSoftDeleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSoftDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/{link_id}/translation":{"post":{"tags":["mobile-sync"],"summary":"Translate Link","operationId":"translate_link_api_v1_mobile_links__link_id__translation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/{link_id}/language":{"post":{"tags":["mobile-sync"],"summary":"Set Language","operationId":"set_language_api_v1_mobile_links__link_id__language_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/{link_id}/speech":{"post":{"tags":["mobile-sync"],"summary":"Create Link Speech","operationId":"create_link_speech_api_v1_mobile_links__link_id__speech_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeechBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/tags":{"get":{"tags":["mobile-sync"],"summary":"Get Tags","description":"Return tags with optional filters.\n\n- No params: all non-deleted tags\n- updated_after=<iso>: differential sync (includes soft-deleted)\n- is_deleted=true: only deleted tag IDs\n- limit/cursor: keyset pagination (same contract as GET /links; ``is_deleted=true`` unpaged)","operationId":"get_tags_api_v1_mobile_tags_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace scope (defaults to personal)","title":"Workspace Id"},"description":"Workspace scope (defaults to personal)"},{"name":"updated_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 UTC timestamp for differential sync","title":"Updated After"},"description":"ISO 8601 UTC timestamp for differential sync"},{"name":"is_deleted","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by is_deleted flag","title":"Is Deleted"},"description":"Filter by is_deleted flag"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/routers__mobile_tags_router__ListResponse"},{"$ref":"#/components/schemas/routers__mobile_tags_router__DeletedIdsResponse"}],"title":"Response Get Tags Api V1 Mobile Tags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/tags/batch":{"post":{"tags":["mobile-sync"],"summary":"Batch Upsert Tags","description":"Upsert an array of tag records. Conflict on id, last-write-wins by updated_at.","operationId":"batch_upsert_tags_api_v1_mobile_tags_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__mobile_tags_router__BatchUpsertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchUpsertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/tags/soft-delete-batch":{"post":{"tags":["mobile-sync"],"summary":"Batch Soft Delete Tags","description":"POST /api/v1/mobile/tags/soft-delete-batch — up to 500 tag ids per request.","operationId":"batch_soft_delete_tags_api_v1_mobile_tags_soft_delete_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSoftDeleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSoftDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/tags/{tag_id}":{"delete":{"tags":["mobile-sync"],"summary":"Delete Tag","description":"Soft-delete a tag by setting is_deleted=true and deleted_at=now().","operationId":"delete_tag_api_v1_mobile_tags__tag_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/categories":{"get":{"tags":["mobile-sync"],"summary":"Get Categories","description":"Empty leftover user-catalogue read. Use ``GET /global-categories``.\n\nWorkspace scope is still enforced so foreign-workspace probes stay 403.","operationId":"get_categories_api_v1_mobile_categories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace scope (defaults to personal)","title":"Workspace Id"},"description":"Workspace scope (defaults to personal)"},{"name":"updated_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Ignored — leftover user catalogue is empty","title":"Updated After"},"description":"Ignored — leftover user catalogue is empty"},{"name":"is_deleted","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by is_deleted flag","title":"Is Deleted"},"description":"Filter by is_deleted flag"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/routers__mobile_categories_router__ListResponse"},{"$ref":"#/components/schemas/routers__mobile_categories_router__DeletedIdsResponse"}],"title":"Response Get Categories Api V1 Mobile Categories Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/categories/batch":{"post":{"tags":["mobile-sync"],"summary":"Batch Upsert Categories","operationId":"batch_upsert_categories_api_v1_mobile_categories_batch_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/categories/soft-delete-batch":{"post":{"tags":["mobile-sync"],"summary":"Batch Soft Delete Categories","operationId":"batch_soft_delete_categories_api_v1_mobile_categories_soft_delete_batch_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/categories/{category_id}":{"delete":{"tags":["mobile-sync"],"summary":"Delete Category","operationId":"delete_category_api_v1_mobile_categories__category_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"string","title":"Category Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/devices":{"get":{"tags":["mobile-sync"],"summary":"Get Devices","description":"Return all devices for the authenticated user.","operationId":"get_devices_api_v1_mobile_devices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/routers__mobile_devices_router__ListResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["mobile-sync"],"summary":"Upsert Device","description":"Upsert a device record. Conflict on id.","operationId":"upsert_device_api_v1_mobile_devices_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertDeviceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/devices/{device_id}":{"delete":{"tags":["mobile-sync"],"summary":"Delete Device","description":"Hard-delete a device.","operationId":"delete_device_api_v1_mobile_devices__device_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/account/summary":{"get":{"tags":["mobile-account"],"summary":"Get Account Summary","description":"Profile + auth identity + storage usage + content counts for the account page.","operationId":"get_account_summary_api_v1_mobile_account_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountSummaryResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/account/data":{"delete":{"tags":["mobile-account"],"summary":"Delete Account Data","description":"Delete all links, categories, and tags. Devices and memberships are untouched.","operationId":"delete_account_data_api_v1_mobile_account_data_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/account":{"delete":{"tags":["mobile-account"],"summary":"Delete Account","description":"Irreversibly delete the account: stored data, then the Supabase auth user.\n\nDeleting the auth user cascades devices, profile, user_settings, owned\nworkspaces with no other members, team memberships, and team invites\n(all `ON DELETE CASCADE` from `auth.users`). Blocked while the caller owns\na team that still has other members — see `_owned_teams_with_other_members`.","operationId":"delete_account_api_v1_mobile_account_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/account-link/tickets":{"post":{"tags":["mobile-account-link"],"summary":"Create Ticket","description":"Create a pending merge ticket (initiator side, recent-auth required).\n\nErrors:\n    * 503 ``merge_disabled`` — MERGE_ALLOWED is off.\n    * 403 ``recent_auth_required`` — caller has not signed in recently.\n    * 409 ``merge_already_in_flight`` — partial unique index blocks a second\n      in-flight ticket for the same initiator.\n    * 422 — invalid provider.","operationId":"create_ticket_api_v1_mobile_account_link_tickets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTicketRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/account-link/tickets/{ticket_id}":{"get":{"tags":["mobile-account-link"],"summary":"Get Ticket Preview","description":"Return the two-sided preview for a merge ticket.\n\nThe caller is compared against the ticket's initiator/resolved parties.\nTerminal tickets (expired, cancelled, merged, failed) return 410.\n\nErrors:\n    * 503 ``merge_disabled`` — MERGE_ALLOWED is off.\n    * 404 ``not_found_ticket`` — ticket id does not exist.\n    * 403 ``ticket_access_denied`` — caller is not a party to this ticket.\n    * 410 ``merge_ticket_expired`` — terminal ticket.","operationId":"get_ticket_preview_api_v1_mobile_account_link_tickets__ticket_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mobile-account-link"],"summary":"Cancel Ticket","description":"Cancel a pending or confirmed merge ticket (either side).\n\nErrors:\n    * 503 ``merge_disabled`` — MERGE_ALLOWED is off.\n    * 404 ``not_found_ticket`` — ticket id does not exist.\n    * 403 ``ticket_access_denied`` — caller is not a party to this ticket.\n    * 422 ``cannot_cancel_status`` — ticket is already running, merged,\n      failed, expired or cancelled.","operationId":"cancel_ticket_api_v1_mobile_account_link_tickets__ticket_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/account-link/tickets/{ticket_id}/confirm":{"post":{"tags":["mobile-account-link"],"summary":"Confirm Ticket","description":"Confirm which account becomes primary (secondary side, recent-auth required).\n\n``primary='current'`` makes the authenticated caller the primary and the\ninitiator the secondary. ``primary='other'`` keeps the initiator as primary.\n\nErrors:\n    * 503 ``merge_disabled`` — MERGE_ALLOWED is off.\n    * 403 ``recent_auth_required`` — caller has not signed in recently.\n    * 403 ``initiator_cannot_confirm`` — the initiator must sign in as the\n      secondary and confirm from that session.\n    * 404 ``not_found_ticket`` — ticket id does not exist.\n    * 410 ``merge_ticket_expired`` — terminal or expired ticket.\n    * 422 ``invalid_primary_choice`` — primary would equal secondary.","operationId":"confirm_ticket_api_v1_mobile_account_link_tickets__ticket_id__confirm_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmTicketRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmTicketResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/account-link/tickets/{ticket_id}/execute":{"post":{"tags":["mobile-account-link"],"summary":"Execute Ticket","description":"Advance the merge by one bounded chunk (confirming side only).\n\nSafe to call repeatedly and after completion: ``merged`` / ``failed`` are\npassed through to ``advance_merge``, which returns the persisted cursor\nwithout re-running. Aborted tickets (``expired`` / ``cancelled``) still\nyield 410 so a client that is mid-poll learns the ticket was revoked.\n\nErrors:\n    * 503 ``merge_disabled`` — MERGE_ALLOWED is off.\n    * 404 ``not_found_ticket`` — ticket id does not exist.\n    * 403 ``ticket_access_denied`` — only the confirming (secondary) side\n      may execute the merge.\n    * 410 ``merge_ticket_expired`` — ticket was expired or cancelled.","operationId":"execute_ticket_api_v1_mobile_account_link_tickets__ticket_id__execute_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteMergeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/provision":{"post":{"tags":["devices"],"summary":"Provision Device","description":"Create an orphan device row (user_id NULL). Native platforms only.","operationId":"provision_device_api_v1_devices_provision_post","parameters":[{"name":"X-Device-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/resolve":{"post":{"tags":["devices"],"summary":"Resolve Device","description":"Bind orphan device or return/create web & extension devices.","operationId":"resolve_device_api_v1_devices_resolve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/profile":{"get":{"tags":["mobile-sync"],"summary":"Get Profile","description":"Get the authenticated user's profile.","operationId":"get_profile_api_v1_mobile_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetProfileResponse"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["mobile-sync"],"summary":"Update Profile","description":"Partially update the authenticated user's profile.","operationId":"update_profile_api_v1_mobile_profile_patch","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/profile/storage-usage":{"get":{"tags":["mobile-sync"],"summary":"Get Storage Usage","description":"Get the authenticated user's storage usage.\n\n`used` is computed from storage.objects via compute_storage_used_bytes (RPC).\nAt current scale a per-request sum is fine; a materialized counter with triggers\non storage.objects is the scale-up path if this becomes hot.","operationId":"get_storage_usage_api_v1_mobile_profile_storage_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageUsageResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/entitlements":{"get":{"tags":["mobile-entitlements"],"summary":"Get Entitlements","description":"Return effective Soft Freemium entitlements for the authenticated user.","operationId":"get_entitlements_api_v1_mobile_entitlements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntitlementsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/processing/preflight":{"post":{"tags":["mobile-entitlements"],"summary":"Processing Preflight","description":"Check whether URL/hash already has completed AI content (no quota consume).","operationId":"processing_preflight_api_v1_mobile_processing_preflight_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/settings":{"get":{"tags":["mobile-sync"],"summary":"Get Settings","description":"Get the authenticated user's settings. Returns empty object if no settings exist.","operationId":"get_settings_api_v1_mobile_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSettingsResponse"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["mobile-sync"],"summary":"Upsert Settings","description":"Upsert the entire settings document for the authenticated user.","operationId":"upsert_settings_api_v1_mobile_settings_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/media/upload":{"post":{"tags":["mobile-sync"],"summary":"Upload Media","description":"Upload a file to the user's media storage bucket.","operationId":"upload_media_api_v1_mobile_media_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_media_api_v1_mobile_media_upload_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload Media Api V1 Mobile Media Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/media/{path}":{"get":{"tags":["mobile-sync"],"summary":"Get Media Signed Url","description":"Get a signed URL for downloading a file.","operationId":"get_media_signed_url_api_v1_mobile_media__path__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Media Signed Url Api V1 Mobile Media  Path  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mobile-sync"],"summary":"Delete Media","description":"Delete a file from storage.","operationId":"delete_media_api_v1_mobile_media__path__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/sync/log":{"post":{"tags":["mobile-sync"],"summary":"Mobile Sync Log","description":"POST /api/v1/mobile/sync/log — same payload as /api/v1/sync/log, JWT auth.\n\nClients use this route so logging uses the same Supabase session as other\nmobile sync calls (no separate API key).","operationId":"mobile_sync_log_api_v1_mobile_sync_log_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncLogRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/sync/manifest":{"get":{"tags":["mobile-sync"],"summary":"Sync Manifest","description":"GET /api/v1/mobile/sync/manifest — id + content_hash + tombstones (M14 LSYNC-05).","operationId":"sync_manifest_api_v1_mobile_sync_manifest_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"since","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"ISO8601 — rows with updated_at > since (differential)","title":"Since"},"description":"ISO8601 — rows with updated_at > since (differential)"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sync Manifest Api V1 Mobile Sync Manifest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/sync/conflicts":{"get":{"tags":["mobile-sync"],"summary":"Get Unresolved Conflicts","description":"GET /api/v1/mobile/sync/conflicts\n\nFetches unresolved conflicts for the authenticated user.\n\nQuery parameters:\n- `resolution`: Filter by resolution state (default: \"pending\")\n\nReturns:\n- 200: Array of conflict records\n- 401: Invalid or missing JWT\n- 500: Internal server error\n\nRate limit: 200 reads/min per user (shared read limit).","operationId":"get_unresolved_conflicts_api_v1_mobile_sync_conflicts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"resolution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by resolution state (default: pending)","default":"pending","title":"Resolution"},"description":"Filter by resolution state (default: pending)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConflictsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mobile-sync"],"summary":"Create Conflict","description":"POST /api/v1/mobile/sync/conflicts\n\nCreates a new conflict record for the authenticated user.\n\nRequest body:\n```json\n{\n  \"entity_type\": \"link|category|tag\",\n  \"entity_id\": \"uuid\",\n  \"local_version\": 1,\n  \"remote_version\": 2\n}\n```\n\nReturns:\n- 201: Newly created conflict record\n- 401: Invalid or missing JWT\n- 422: Invalid entity_type or validation error\n- 500: Internal server error\n\nRate limit: 60 writes/min per user.","operationId":"create_conflict_api_v1_mobile_sync_conflicts_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConflictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConflictResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/sync/conflicts/{conflict_id}":{"patch":{"tags":["mobile-sync"],"summary":"Resolve Conflict","description":"PATCH /api/v1/mobile/sync/conflicts/{conflict_id}\n\nResolves a conflict record by setting the resolution and resolved_at timestamp.\n\nPath parameters:\n- `conflict_id`: UUID of the conflict record\n\nRequest body:\n```json\n{\n  \"resolution\": \"local_wins|remote_wins|merged|auto\"\n}\n```\n\nReturns:\n- 200: Updated conflict record with resolved_at timestamp\n- 401: Invalid or missing JWT\n- 404: Conflict not found or not owned by user\n- 422: Invalid resolution value\n- 500: Internal server error\n\nRate limit: 60 writes/min per user.","operationId":"resolve_conflict_api_v1_mobile_sync_conflicts__conflict_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conflict_id","in":"path","required":true,"schema":{"type":"string","title":"Conflict Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveConflictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveConflictResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/sync/delta":{"get":{"tags":["mobile-sync"],"summary":"Get Sync Delta","description":"GET /api/v1/mobile/sync/delta\n\nCombined differential sync for one workspace. Resolves membership once,\nthen fans out seven PostgREST queries concurrently. Never returns a\npartial body — any sub-query failure yields 500.\n\nRate limit: counts as one read against the shared 200 reads/min limiter.","operationId":"get_sync_delta_api_v1_mobile_sync_delta_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","description":"Workspace UUID (required)","title":"Workspace Id"},"description":"Workspace UUID (required)"},{"name":"updated_after","in":"query","required":true,"schema":{"type":"string","description":"ISO 8601 UTC timestamp for differential sync","title":"Updated After"},"description":"ISO 8601 UTC timestamp for differential sync"},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"App language. Translated titles are returned only when stored.","title":"Locale"},"description":"App language. Translated titles are returned only when stored."},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Sync Delta Api V1 Mobile Sync Delta Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/pairing/start":{"post":{"tags":["mobile-pairing"],"summary":"Pairing Start","operationId":"pairing_start_api_v1_mobile_pairing_start_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairingStartResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/pairing/verify":{"post":{"tags":["mobile-pairing"],"summary":"Pairing Verify","operationId":"pairing_verify_api_v1_mobile_pairing_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairingVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairingVerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/links/resolve":{"post":{"tags":["mobile-resolve"],"summary":"Resolve Link","description":"Find active link by workspace + canonical content_hash, or insert a pending row.","operationId":"resolve_link_api_v1_mobile_links_resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/teams":{"get":{"tags":["mobile-teams"],"summary":"List Teams","description":"List teams the caller belongs to.","operationId":"list_teams_api_v1_mobile_teams_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamListResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["mobile-teams"],"summary":"Create Team","description":"Create a team workspace and owner membership.","operationId":"create_team_api_v1_mobile_teams_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTeamRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/teams/{team_id}":{"patch":{"tags":["mobile-teams"],"summary":"Rename Team","description":"Rename a team (owner only).","operationId":"rename_team_api_v1_mobile_teams__team_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameTeamRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mobile-teams"],"summary":"Delete Team","description":"Soft-delete a team (owner only).","operationId":"delete_team_api_v1_mobile_teams__team_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/teams/{team_id}/dissolve":{"post":{"tags":["mobile-teams"],"summary":"Dissolve Team","description":"Dissolve a team workspace into the owner's personal workspace (chunked).","operationId":"dissolve_team_api_v1_mobile_teams__team_id__dissolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DissolveProgressResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/teams/{team_id}/dissolve/status":{"get":{"tags":["mobile-teams"],"summary":"Dissolve Team Status","description":"Poll dissolve progress without performing work.","operationId":"dissolve_team_status_api_v1_mobile_teams__team_id__dissolve_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DissolveProgressResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/teams/{team_id}/members":{"get":{"tags":["mobile-teams"],"summary":"List Members","description":"List team members (any member).","operationId":"list_members_api_v1_mobile_teams__team_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/teams/{team_id}/members/{member_user_id}":{"delete":{"tags":["mobile-teams"],"summary":"Remove Member","description":"Remove a member or leave the team.","operationId":"remove_member_api_v1_mobile_teams__team_id__members__member_user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"member_user_id","in":"path","required":true,"schema":{"type":"string","title":"Member User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/teams/{team_id}/invites":{"post":{"tags":["mobile-invites"],"summary":"Create Invite","description":"Create an invite token (returned once; only hash stored). Owners only.","operationId":"create_invite_api_v1_mobile_teams__team_id__invites_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInviteRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInviteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["mobile-invites"],"summary":"List Invites","description":"List active invites for a team (members who created or owner see all).","operationId":"list_invites_api_v1_mobile_teams__team_id__invites_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/teams/{team_id}/invites/{invite_id}":{"delete":{"tags":["mobile-invites"],"summary":"Revoke Invite","description":"Revoke an invite (owner or creator).","operationId":"revoke_invite_api_v1_mobile_teams__team_id__invites__invite_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/invites/{token}":{"get":{"tags":["mobile-invites"],"summary":"Preview Invite","description":"Preview an invite (unauthenticated, rate-limited per IP).","operationId":"preview_invite_api_v1_mobile_invites__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitePreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/invites/{token}/accept":{"post":{"tags":["mobile-invites"],"summary":"Accept Invite","description":"Accept an invite and join the team (idempotent).","operationId":"accept_invite_api_v1_mobile_invites__token__accept_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/{link_id}/move":{"post":{"tags":["mobile-links"],"summary":"Move Link","description":"Move a link to another workspace (membership required on source and target).","operationId":"move_link_api_v1_mobile_links__link_id__move_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveCopyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Move Link Api V1 Mobile Links  Link Id  Move Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/{link_id}/copy":{"post":{"tags":["mobile-links"],"summary":"Copy Link","description":"Copy a link into another workspace (new id, duplicated media).","operationId":"copy_link_api_v1_mobile_links__link_id__copy_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveCopyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Copy Link Api V1 Mobile Links  Link Id  Copy Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/link-user-state":{"get":{"tags":["mobile-links"],"summary":"List Link User State","description":"Fetch per-user read state rows for links in the resolved workspace.","operationId":"list_link_user_state_api_v1_mobile_link_user_state_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"updated_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated After"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkUserStateListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/link-user-state/batch":{"post":{"tags":["mobile-links"],"summary":"Batch Upsert Link User State","description":"Upsert per-user read state for accessible links in the workspace.","operationId":"batch_upsert_link_user_state_api_v1_mobile_link_user_state_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"x-machine-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Machine-Id"}},{"name":"X-LinkVault-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkUserStateBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkUserStateBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/links/import":{"post":{"tags":["mobile-links-import"],"summary":"Import Links","description":"Import links from inline export JSON and/or a public HTTPS export URL.","operationId":"import_links_api_v1_mobile_links_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinksImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinksImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ext/links/import":{"post":{"tags":["extension-links-import"],"summary":"Import Links","description":"Import links from inline export JSON and/or a public HTTPS export URL.","operationId":"import_links_api_v1_ext_links_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinksImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinksImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/mobile/global-categories":{"get":{"tags":["mobile-global-categories"],"summary":"List Global Categories","operationId":"list_global_categories_api_v1_mobile_global_categories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"locale","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Locale"}},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Inactive"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Global Categories Api V1 Mobile Global Categories Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ext/global-categories":{"get":{"tags":["extension-global-categories"],"summary":"List Global Categories","operationId":"list_global_categories_api_v1_ext_global_categories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"locale","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Locale"}},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Inactive"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Global Categories Api V1 Ext Global Categories Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/internal/jobs/run":{"post":{"tags":["internal"],"summary":"Post Internal Jobs","description":"Run AI reaper and/or link health batch. Requires ``LV_INTERNAL_JOBS_SECRET``.","operationId":"post_internal_jobs_api_v1_internal_jobs_run_post","parameters":[{"name":"X-LinkVault-Internal-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Internal-Key"}},{"name":"X-LinkVault-Job-Source","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Linkvault-Job-Source"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalJobsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Internal Jobs Api V1 Internal Jobs Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health":{"get":{"summary":"Health","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/v1/auth/validate":{"get":{"summary":"Validate Key","operationId":"validate_key_api_v1_auth_validate_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sync/log":{"post":{"summary":"Log Sync Event","description":"Log sync events from the client to the backend for real-time visibility.","operationId":"log_sync_event_api_v1_sync_log_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncLogRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/process":{"post":{"summary":"Process Entry","operationId":"process_entry_api_v1_process_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcceptInviteResponse":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id"},"role":{"type":"string","title":"Role"},"already_member":{"type":"boolean","title":"Already Member","default":false}},"type":"object","required":["workspace_id","role"],"title":"AcceptInviteResponse"},"AccountCounts":{"properties":{"links":{"type":"integer","title":"Links"},"categories":{"type":"integer","title":"Categories"},"tags":{"type":"integer","title":"Tags"}},"type":"object","required":["links","categories","tags"],"title":"AccountCounts"},"AccountPreview":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"links":{"type":"integer","title":"Links"},"categories":{"type":"integer","title":"Categories"},"tags":{"type":"integer","title":"Tags"},"private_links":{"type":"integer","title":"Private Links"},"owned_teams":{"type":"integer","title":"Owned Teams"},"foreign_memberships":{"type":"integer","title":"Foreign Memberships"},"storage_bytes":{"type":"integer","title":"Storage Bytes"}},"type":"object","required":["label","links","categories","tags","private_links","owned_teams","foreign_memberships","storage_bytes"],"title":"AccountPreview"},"AccountStorage":{"properties":{"used_bytes":{"type":"integer","title":"Used Bytes"},"limit_bytes":{"type":"integer","title":"Limit Bytes"}},"type":"object","required":["used_bytes","limit_bytes"],"title":"AccountStorage"},"AccountSummary":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_sign_in_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sign In At"},"storage":{"$ref":"#/components/schemas/AccountStorage"},"counts":{"$ref":"#/components/schemas/AccountCounts"}},"type":"object","required":["user_id","storage","counts"],"title":"AccountSummary"},"AccountSummaryResponse":{"properties":{"data":{"$ref":"#/components/schemas/AccountSummary"}},"type":"object","required":["data"],"title":"AccountSummaryResponse"},"BatchSoftDeleteRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Ids"}},"type":"object","required":["ids"],"title":"BatchSoftDeleteRequest","description":"Body for POST ``/links|tags|categories/soft-delete-batch``."},"BatchSoftDeleteResponse":{"properties":{"requested":{"type":"integer","title":"Requested"},"soft_deleted":{"type":"integer","title":"Soft Deleted"}},"type":"object","required":["requested","soft_deleted"],"title":"BatchSoftDeleteResponse","description":"Counts after batch soft-delete (``is_deleted`` set for matching rows)."},"BatchUpsertResponse":{"properties":{"data":{"additionalProperties":{"type":"integer"},"type":"object","title":"Data"}},"type":"object","required":["data"],"title":"BatchUpsertResponse"},"Body_admin_jobs_run_admin_jobs_run_post":{"properties":{"task":{"type":"string","title":"Task"}},"type":"object","required":["task"],"title":"Body_admin_jobs_run_admin_jobs_run_post"},"Body_login_submit_admin_login_post":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"Body_login_submit_admin_login_post"},"Body_upload_media_api_v1_mobile_media_upload_post":{"properties":{"link_id":{"type":"string","title":"Link Id"},"filename":{"type":"string","title":"Filename"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},"type":"object","required":["link_id","filename","file"],"title":"Body_upload_media_api_v1_mobile_media_upload_post"},"CatalogPatchBody":{"properties":{"ai_monthly_limit":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Ai Monthly Limit"},"translation_monthly_limit":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Translation Monthly Limit"},"tts_monthly_limit":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Tts Monthly Limit"},"max_storage_bytes":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Storage Bytes"},"max_storage_mb":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Storage Mb"},"soft_device_warn_at":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Soft Device Warn At"},"max_team_size":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Team Size"},"max_owned_teams":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Owned Teams"},"allow_import":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Import"},"allow_reprocess":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Reprocess"},"clear_soft_device_warn":{"type":"boolean","title":"Clear Soft Device Warn","default":false}},"type":"object","title":"CatalogPatchBody"},"CategoriesListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CategoryResponse"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/MetaListMeta"}},"type":"object","required":["data","meta"],"title":"CategoriesListResponse"},"CategoryResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"link_count":{"type":"integer","title":"Link Count"}},"type":"object","required":["id","name","link_count"],"title":"CategoryResponse"},"ConfirmTicketRequest":{"properties":{"primary":{"type":"string","enum":["current","other"],"title":"Primary"}},"type":"object","required":["primary"],"title":"ConfirmTicketRequest"},"ConfirmTicketResponse":{"properties":{"status":{"type":"string","title":"Status"},"ticket_id":{"type":"string","title":"Ticket Id"}},"type":"object","required":["status","ticket_id"],"title":"ConfirmTicketResponse"},"ConflictRecord":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"type":"string","title":"Entity Id"},"local_version":{"additionalProperties":true,"type":"object","title":"Local Version"},"remote_version":{"additionalProperties":true,"type":"object","title":"Remote Version"},"resolution":{"type":"string","title":"Resolution"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"}},"type":"object","required":["id","user_id","entity_type","entity_id","local_version","remote_version","resolution","created_at"],"title":"ConflictRecord","description":"A single conflict record."},"CreateConflictRequest":{"properties":{"entity_type":{"$ref":"#/components/schemas/EntityTypeEnum","description":"Entity type: link, category, or tag"},"entity_id":{"type":"string","title":"Entity Id","description":"UUID of the conflicted entity"},"local_version":{"additionalProperties":true,"type":"object","title":"Local Version","description":"Local version snapshot (JSONB)"},"remote_version":{"additionalProperties":true,"type":"object","title":"Remote Version","description":"Remote version snapshot (JSONB)"}},"type":"object","required":["entity_type","entity_id","local_version","remote_version"],"title":"CreateConflictRequest","description":"Request body for POST /api/v1/mobile/sync/conflicts."},"CreateConflictResponse":{"properties":{"data":{"$ref":"#/components/schemas/ConflictRecord"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"}},"type":"object","required":["data"],"title":"CreateConflictResponse","description":"Response for POST /api/v1/mobile/sync/conflicts."},"CreateInviteRequest":{"properties":{"max_uses":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Max Uses"},"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days"},"role":{"type":"string","title":"Role","default":"member"}},"type":"object","title":"CreateInviteRequest"},"CreateInviteResponse":{"properties":{"token":{"type":"string","title":"Token"},"deep_link":{"type":"string","title":"Deep Link"},"qr_payload":{"type":"string","title":"Qr Payload"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"invite_id":{"type":"string","title":"Invite Id"}},"type":"object","required":["token","deep_link","qr_payload","expires_at","invite_id"],"title":"CreateInviteResponse"},"CreateLinkRequest":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"raw_information":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Information"},"page_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Page Metadata"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"is_private":{"type":"boolean","title":"Is Private","default":false},"is_favorite":{"type":"boolean","title":"Is Favorite","default":false}},"type":"object","title":"CreateLinkRequest"},"CreateTeamRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"CreateTeamRequest"},"CreateTicketRequest":{"properties":{"provider":{"type":"string","enum":["google","apple","email"],"title":"Provider"}},"type":"object","required":["provider"],"title":"CreateTicketRequest"},"DissolveProgressResponse":{"properties":{"status":{"type":"string","title":"Status"},"done":{"type":"integer","title":"Done"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["status","done","total"],"title":"DissolveProgressResponse"},"EntitlementsData":{"properties":{"plan_code":{"type":"string","title":"Plan Code"},"plan_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Expires At"},"overrides_active":{"type":"boolean","title":"Overrides Active"},"free_auto_ai_enabled":{"type":"boolean","title":"Free Auto Ai Enabled"},"enforce_ai_quota":{"type":"boolean","title":"Enforce Ai Quota"},"ai_month_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Month Key"},"ai_month_used":{"type":"integer","title":"Ai Month Used"},"limits":{"$ref":"#/components/schemas/EntitlementsLimits"}},"type":"object","required":["plan_code","overrides_active","free_auto_ai_enabled","enforce_ai_quota","ai_month_used","limits"],"title":"EntitlementsData"},"EntitlementsLimits":{"properties":{"ai_monthly_limit":{"type":"integer","title":"Ai Monthly Limit"},"ai_month_remaining":{"type":"integer","title":"Ai Month Remaining"},"max_storage_bytes":{"type":"integer","title":"Max Storage Bytes"},"soft_device_warn_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Soft Device Warn At"},"max_team_size":{"type":"integer","title":"Max Team Size"},"max_owned_teams":{"type":"integer","title":"Max Owned Teams"},"allow_import":{"type":"boolean","title":"Allow Import"},"allow_reprocess":{"type":"boolean","title":"Allow Reprocess"}},"type":"object","required":["ai_monthly_limit","ai_month_remaining","max_storage_bytes","max_team_size","max_owned_teams","allow_import","allow_reprocess"],"title":"EntitlementsLimits"},"EntitlementsResponse":{"properties":{"data":{"$ref":"#/components/schemas/EntitlementsData"}},"type":"object","required":["data"],"title":"EntitlementsResponse"},"EntityTypeEnum":{"type":"string","enum":["link","category","tag"],"title":"EntityTypeEnum","description":"Allowed entity types."},"ExecuteMergeResponse":{"properties":{"status":{"type":"string","title":"Status"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"done":{"type":"integer","title":"Done"},"total":{"type":"integer","title":"Total"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["status","phase","done","total"],"title":"ExecuteMergeResponse"},"ExtLinkResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"type":"string","title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Summary"},"content_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Format"},"content_access":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Access"},"source_type":{"type":"string","title":"Source Type"},"is_favorite":{"type":"boolean","title":"Is Favorite"},"is_private":{"type":"boolean","title":"Is Private","default":false},"ai_processing_state":{"type":"string","title":"Ai Processing State"},"ai_processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ai Processed At"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"tag_names":{"items":{"type":"string"},"type":"array","title":"Tag Names"},"tag_ids":{"items":{"type":"string"},"type":"array","title":"Tag Ids"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"remote_media_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remote Media Path"},"display_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Title"},"display_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Summary"},"content_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Language"}},"type":"object","required":["id","title","url","description","content_summary","source_type","is_favorite","ai_processing_state","ai_processed_at","category_name","category_id","tag_names","tag_ids","created_at","updated_at"],"title":"ExtLinkResponse"},"ExtLinkSearchResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"type":"string","title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Summary"},"content_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Format"},"content_access":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Access"},"source_type":{"type":"string","title":"Source Type"},"is_favorite":{"type":"boolean","title":"Is Favorite"},"is_private":{"type":"boolean","title":"Is Private","default":false},"ai_processing_state":{"type":"string","title":"Ai Processing State"},"ai_processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ai Processed At"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"tag_names":{"items":{"type":"string"},"type":"array","title":"Tag Names"},"tag_ids":{"items":{"type":"string"},"type":"array","title":"Tag Ids"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"remote_media_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remote Media Path"},"display_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Title"},"display_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Summary"},"content_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Language"},"match_rank":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Match Rank"}},"type":"object","required":["id","title","url","description","content_summary","source_type","is_favorite","ai_processing_state","ai_processed_at","category_name","category_id","tag_names","tag_ids","created_at","updated_at"],"title":"ExtLinkSearchResponse"},"ExtractedUrl":{"properties":{"url":{"type":"string","title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"type":{"type":"string","title":"Type"}},"type":"object","required":["url","type"],"title":"ExtractedUrl"},"FavoriteItem":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","url","title","updated_at"],"title":"FavoriteItem"},"FavoritesSyncData":{"properties":{"watermark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Watermark"},"items":{"items":{"$ref":"#/components/schemas/FavoriteItem"},"type":"array","title":"Items"}},"type":"object","required":["watermark","items"],"title":"FavoritesSyncData"},"FavoritesSyncResponse":{"properties":{"data":{"$ref":"#/components/schemas/FavoritesSyncData"}},"type":"object","required":["data"],"title":"FavoritesSyncResponse"},"FlagsBody":{"properties":{"free_auto_ai_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Free Auto Ai Enabled"},"enforce_ai_quota":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enforce Ai Quota"},"enforce_translation_quota":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enforce Translation Quota"},"enforce_tts_quota":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enforce Tts Quota"}},"type":"object","title":"FlagsBody"},"GetProfileResponse":{"properties":{"data":{"$ref":"#/components/schemas/MobileProfileRecord"}},"type":"object","required":["data"],"title":"GetProfileResponse"},"GetSettingsResponse":{"properties":{"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["data"],"title":"GetSettingsResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","default":"ok"},"version":{"type":"string","title":"Version"},"environment":{"type":"string","title":"Environment","default":"PRODUCTION"}},"type":"object","required":["version"],"title":"HealthResponse"},"IdTokenExchangeRequest":{"properties":{"provider":{"type":"string","title":"Provider"},"id_token":{"type":"string","minLength":20,"title":"Id Token"},"nonce":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nonce"}},"type":"object","required":["provider","id_token"],"title":"IdTokenExchangeRequest","description":"Exchange a provider-issued ID token (e.g. from Google GSI) for a Supabase session."},"IdTokenExchangeResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"user_id":{"type":"string","title":"User Id"},"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name"}},"type":"object","required":["access_token","refresh_token","user_id","email","name"],"title":"IdTokenExchangeResponse"},"InternalJobsRequest":{"properties":{"tasks":{"items":{"type":"string"},"type":"array","title":"Tasks","description":"Job names to run in one request."}},"type":"object","title":"InternalJobsRequest"},"InviteListItem":{"properties":{"id":{"type":"string","title":"Id"},"uses":{"type":"integer","title":"Uses"},"max_uses":{"type":"integer","title":"Max Uses"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"created_by":{"type":"string","title":"Created By"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","uses","max_uses","expires_at","created_at","created_by"],"title":"InviteListItem"},"InviteListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/InviteListItem"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"InviteListResponse"},"InvitePreviewResponse":{"properties":{"team_name":{"type":"string","title":"Team Name"},"inviter_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Display Name"},"member_count":{"type":"integer","title":"Member Count"},"is_full":{"type":"boolean","title":"Is Full"}},"type":"object","required":["team_name","inviter_display_name","member_count","is_full"],"title":"InvitePreviewResponse"},"LanguageBody":{"properties":{"content_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Language"}},"type":"object","title":"LanguageBody"},"LinkStatusResponse":{"properties":{"id":{"type":"string","title":"Id"},"ai_processing_state":{"type":"string","title":"Ai Processing State"},"ai_processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ai Processed At"},"suggested_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Title"},"suggested_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Description"},"suggested_category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Category Name"},"suggested_tag_names":{"items":{"type":"string"},"type":"array","title":"Suggested Tag Names"}},"type":"object","required":["id","ai_processing_state","ai_processed_at","suggested_title","suggested_description","suggested_category_name","suggested_tag_names"],"title":"LinkStatusResponse"},"LinkUserStateBatchRequest":{"properties":{"records":{"items":{"$ref":"#/components/schemas/LinkUserStateRecord"},"type":"array","maxItems":500,"title":"Records"}},"type":"object","required":["records"],"title":"LinkUserStateBatchRequest"},"LinkUserStateBatchResponse":{"properties":{"upserted":{"type":"integer","title":"Upserted"}},"type":"object","required":["upserted"],"title":"LinkUserStateBatchResponse"},"LinkUserStateListResponse":{"properties":{"records":{"items":{"$ref":"#/components/schemas/LinkUserStateRecord"},"type":"array","title":"Records"},"server_time":{"type":"string","title":"Server Time"}},"type":"object","required":["records","server_time"],"title":"LinkUserStateListResponse"},"LinkUserStateRecord":{"properties":{"link_id":{"type":"string","title":"Link Id"},"is_read":{"type":"boolean","title":"Is Read","default":false},"read_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Read At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"version":{"type":"integer","title":"Version","default":1}},"type":"object","required":["link_id"],"title":"LinkUserStateRecord"},"LinksImportItem":{"properties":{"url":{"type":"string","title":"Url"},"status":{"type":"string","title":"Status"},"link_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Id"},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash"},"got_content":{"type":"boolean","title":"Got Content","default":false},"ai_processed":{"type":"boolean","title":"Ai Processed","default":false},"ai_fields":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ai Fields"}},"type":"object","required":["url","status"],"title":"LinksImportItem"},"LinksImportRequest":{"properties":{"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"export":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Export"},"process_private":{"type":"boolean","title":"Process Private","description":"When true, queue AI for private imported links (default: skip AI).","default":false}},"type":"object","title":"LinksImportRequest","description":"Import from a public HTTPS URL and/or an inline export object."},"LinksImportResponse":{"properties":{"imported":{"type":"integer","title":"Imported"},"skipped":{"type":"integer","title":"Skipped"},"got_content":{"type":"integer","title":"Got Content"},"ai_processed":{"type":"integer","title":"Ai Processed"},"items":{"items":{"$ref":"#/components/schemas/LinksImportItem"},"type":"array","title":"Items"}},"type":"object","required":["imported","skipped","got_content","ai_processed"],"title":"LinksImportResponse"},"ListConflictsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ConflictRecord"},"type":"array","title":"Data"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"}},"type":"object","required":["data"],"title":"ListConflictsResponse","description":"Response for GET /api/v1/mobile/sync/conflicts."},"MemberListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MemberRecord"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"MemberListResponse"},"MemberRecord":{"properties":{"user_id":{"type":"string","title":"User Id"},"role":{"type":"string","title":"Role"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["user_id","role","joined_at"],"title":"MemberRecord"},"MetaListMeta":{"properties":{"total":{"type":"integer","title":"Total"}},"type":"object","required":["total"],"title":"MetaListMeta"},"MobileCategoryIdOnly":{"properties":{"id":{"type":"string","title":"Id"}},"type":"object","required":["id"],"title":"MobileCategoryIdOnly"},"MobileCategoryRecord":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"name":{"type":"string","title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"created_by_device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Device Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_deleted":{"type":"boolean","title":"Is Deleted"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"version":{"type":"integer","title":"Version"}},"type":"object","required":["id","user_id","name","created_at","updated_at","is_deleted","deleted_at","version"],"title":"MobileCategoryRecord"},"MobileDeviceRecord":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"device_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"push_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Push Token"},"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","created_at","updated_at"],"title":"MobileDeviceRecord"},"MobileLinkRecord":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Summary"},"source_type":{"type":"string","title":"Source Type"},"is_favorite":{"type":"boolean","title":"Is Favorite","default":false},"is_private":{"type":"boolean","title":"Is Private","default":false},"is_read":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Read"},"read_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Read At"},"ai_tags":{"items":{"type":"string"},"type":"array","title":"Ai Tags"},"ai_processing_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Processing State"},"ai_processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ai Processed At"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"tag_names":{"items":{"type":"string"},"type":"array","title":"Tag Names"},"tag_ids":{"items":{"type":"string"},"type":"array","title":"Tag Ids"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_deleted":{"type":"boolean","title":"Is Deleted","default":false},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"version":{"type":"integer","title":"Version","default":1},"remote_media_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remote Media Path"},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash"},"raw_information":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Information"},"content_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Format"},"content_access":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Access"},"http_status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status Code"},"last_health_check_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Health Check At"},"created_by_device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Device Id"},"content_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Language"}},"type":"object","required":["id","user_id","source_type","created_at","updated_at"],"title":"MobileLinkRecord","description":"A single link record for sync operations."},"MobileProfileRecord":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"storage_used_bytes":{"type":"integer","title":"Storage Used Bytes"},"storage_limit_bytes":{"type":"integer","title":"Storage Limit Bytes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","storage_used_bytes","storage_limit_bytes","created_at","updated_at"],"title":"MobileProfileRecord"},"MobileTagIdOnly":{"properties":{"id":{"type":"string","title":"Id"}},"type":"object","required":["id"],"title":"MobileTagIdOnly"},"MobileTagRecord":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"name":{"type":"string","title":"Name"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"created_by_device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Device Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_deleted":{"type":"boolean","title":"Is Deleted"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"version":{"type":"integer","title":"Version"}},"type":"object","required":["id","user_id","name","created_at","updated_at","is_deleted","deleted_at","version"],"title":"MobileTagRecord"},"MoveCopyRequest":{"properties":{"target_workspace_id":{"type":"string","minLength":1,"title":"Target Workspace Id"},"preserve_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Preserve Private"}},"type":"object","required":["target_workspace_id"],"title":"MoveCopyRequest"},"OAuthInitiateRequest":{"properties":{"provider":{"type":"string","title":"Provider"},"redirect_to":{"type":"string","title":"Redirect To"}},"type":"object","required":["provider","redirect_to"],"title":"OAuthInitiateRequest"},"OAuthInitiateResponse":{"properties":{"oauth_url":{"type":"string","title":"Oauth Url"}},"type":"object","required":["oauth_url"],"title":"OAuthInitiateResponse"},"OAuthRefreshRequest":{"properties":{"refresh_token":{"type":"string","minLength":10,"title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"OAuthRefreshRequest"},"OAuthRefreshResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"expires_in":{"type":"integer","title":"Expires In","default":3600},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token","refresh_token"],"title":"OAuthRefreshResponse"},"PaginationMeta":{"properties":{"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["next_cursor","total","limit"],"title":"PaginationMeta"},"PairingStartResponse":{"properties":{"pairing_session_id":{"type":"string","title":"Pairing Session Id"},"code_display":{"type":"string","title":"Code Display","description":"Shown once on initiator device; do not log."},"expires_at":{"type":"string","title":"Expires At"},"ttl_seconds":{"type":"integer","title":"Ttl Seconds"}},"type":"object","required":["pairing_session_id","code_display","expires_at","ttl_seconds"],"title":"PairingStartResponse"},"PairingVerifyRequest":{"properties":{"pairing_session_id":{"type":"string","title":"Pairing Session Id"},"code":{"type":"string","title":"Code"}},"type":"object","required":["pairing_session_id","code"],"title":"PairingVerifyRequest"},"PairingVerifyResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"PairingVerifyResponse"},"PreflightData":{"properties":{"processed":{"type":"boolean","title":"Processed"},"source":{"type":"string","title":"Source"},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash"}},"type":"object","required":["processed","source"],"title":"PreflightData"},"PreflightRequest":{"properties":{"url":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Url"},"content_hash":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Content Hash"}},"type":"object","title":"PreflightRequest"},"PreflightResponse":{"properties":{"data":{"$ref":"#/components/schemas/PreflightData"}},"type":"object","required":["data"],"title":"PreflightResponse"},"ProcessResponse":{"properties":{"link_id":{"type":"string","title":"Link Id"},"transaction_id":{"type":"string","title":"Transaction Id"},"state":{"type":"string","title":"State"},"state_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Message"},"suggested_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Title"},"content_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Description"},"content_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Summary"},"content_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Format"},"content_access":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Access"},"suggested_category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Category Name"},"suggested_tag_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Suggested Tag Names"},"ai_model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Model Used"},"extracted_urls":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExtractedUrl"},"type":"array"},{"type":"null"}],"title":"Extracted Urls"},"resolved_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Url"}},"type":"object","required":["link_id","transaction_id","state"],"title":"ProcessResponse"},"ProvisionRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"device_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Name"}},"type":"object","required":["platform"],"title":"ProvisionRequest"},"ProvisionResponse":{"properties":{"device_id":{"type":"string","title":"Device Id"},"platform":{"type":"string","title":"Platform"}},"type":"object","required":["device_id","platform"],"title":"ProvisionResponse"},"RenameTeamRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"RenameTeamRequest"},"ResolutionEnum":{"type":"string","enum":["pending","local_wins","remote_wins","merged","auto"],"title":"ResolutionEnum","description":"Allowed resolution values."},"ResolveConflictRequest":{"properties":{"resolution":{"$ref":"#/components/schemas/ResolutionEnum","description":"Resolution: local_wins, remote_wins, merged, or auto"}},"type":"object","required":["resolution"],"title":"ResolveConflictRequest","description":"Request body for PATCH /api/v1/mobile/sync/conflicts/{id}."},"ResolveConflictResponse":{"properties":{"data":{"$ref":"#/components/schemas/ConflictRecord"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"}},"type":"object","required":["data"],"title":"ResolveConflictResponse","description":"Response for PATCH /api/v1/mobile/sync/conflicts/{id}."},"ResolveLinkRequest":{"properties":{"url":{"type":"string","minLength":1,"title":"Url"},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash"},"source_type":{"type":"string","title":"Source Type","default":"url"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"raw_information":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Information"}},"type":"object","required":["url"],"title":"ResolveLinkRequest"},"ResolveLinkResponse":{"properties":{"link_id":{"type":"string","title":"Link Id"},"existed":{"type":"boolean","title":"Existed"},"ai_processing_state":{"type":"string","title":"Ai Processing State"},"url":{"type":"string","title":"Url"}},"type":"object","required":["link_id","existed","ai_processing_state","url"],"title":"ResolveLinkResponse"},"ResolveRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"existing_device_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Existing Device Id"},"device_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Name"}},"type":"object","required":["platform"],"title":"ResolveRequest"},"ResolveResponse":{"properties":{"device_id":{"type":"string","title":"Device Id"},"platform":{"type":"string","title":"Platform"},"device_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Name"},"bound":{"type":"boolean","title":"Bound","default":false}},"type":"object","required":["device_id","platform"],"title":"ResolveResponse"},"SearchListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ExtLinkSearchResponse"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"SearchListResponse"},"SetPlanBody":{"properties":{"plan_code":{"type":"string","title":"Plan Code"},"gift_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Gift Days"},"clear_overrides":{"type":"boolean","title":"Clear Overrides","default":false}},"type":"object","required":["plan_code"],"title":"SetPlanBody"},"SingleResponse":{"properties":{"data":{"$ref":"#/components/schemas/ExtLinkResponse"}},"type":"object","required":["data"],"title":"SingleResponse"},"SpeechBody":{"properties":{"locale":{"type":"string","maxLength":16,"minLength":2,"title":"Locale"},"source":{"type":"string","enum":["original","translation"],"title":"Source"}},"type":"object","required":["locale","source"],"title":"SpeechBody"},"StorageUsageRecord":{"properties":{"storage_used_bytes":{"type":"integer","title":"Storage Used Bytes"},"storage_limit_bytes":{"type":"integer","title":"Storage Limit Bytes"},"storage_available_bytes":{"type":"integer","title":"Storage Available Bytes"}},"type":"object","required":["storage_used_bytes","storage_limit_bytes","storage_available_bytes"],"title":"StorageUsageRecord"},"StorageUsageResponse":{"properties":{"data":{"$ref":"#/components/schemas/StorageUsageRecord"}},"type":"object","required":["data"],"title":"StorageUsageResponse"},"SyncLogRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"device_id":{"type":"string","title":"Device Id"},"sync_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sync Id"},"event_type":{"type":"string","title":"Event Type"},"event_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Event Data"},"severity":{"type":"string","title":"Severity","default":"info"},"is_debug":{"type":"boolean","title":"Is Debug","default":false}},"type":"object","required":["user_id","device_id","event_type"],"title":"SyncLogRequest","description":"Request for logging sync events from the client to the backend."},"TagResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"link_count":{"type":"integer","title":"Link Count"}},"type":"object","required":["id","name","link_count"],"title":"TagResponse"},"TagsListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TagResponse"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/MetaListMeta"}},"type":"object","required":["data","meta"],"title":"TagsListResponse"},"TeamDetailResponse":{"properties":{"data":{"$ref":"#/components/schemas/TeamRecord"}},"type":"object","required":["data"],"title":"TeamDetailResponse"},"TeamListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TeamRecord"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"TeamListResponse"},"TeamRecord":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"role":{"type":"string","title":"Role"},"member_count":{"type":"integer","title":"Member Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"max_team_size":{"type":"integer","title":"Max Team Size","default":5}},"type":"object","required":["id","name","role","member_count","created_at"],"title":"TeamRecord"},"TenantInfo":{"properties":{"name":{"type":"string","title":"Name"},"rate_limit":{"type":"integer","title":"Rate Limit"},"max_file_size_bytes":{"type":"integer","title":"Max File Size Bytes"}},"type":"object","required":["name","rate_limit","max_file_size_bytes"],"title":"TenantInfo"},"TicketCreatedResponse":{"properties":{"ticket_id":{"type":"string","title":"Ticket Id"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["ticket_id","expires_at"],"title":"TicketCreatedResponse"},"TicketPreviewResponse":{"properties":{"initiator":{"$ref":"#/components/schemas/AccountPreview"},"caller":{"$ref":"#/components/schemas/AccountPreview"},"secondary_is_empty":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Secondary Is Empty"},"status":{"type":"string","title":"Status"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"done":{"type":"integer","title":"Done"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["initiator","caller","secondary_is_empty","status","phase","done","total"],"title":"TicketPreviewResponse"},"TikTokMetaResponse":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"creator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator"},"creatorId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creatorid"},"views":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Views"},"likes":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Likes"},"commentCount":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Commentcount"},"hashtags":{"items":{"type":"string"},"type":"array","title":"Hashtags"},"subtitleUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitleurl"}},"type":"object","title":"TikTokMetaResponse","description":"Field names match web/lib/webapp/linkCaptureEnrichment.ts TikTokRehydration (+ hashtags)."},"TranslateBody":{"properties":{"locale":{"type":"string","maxLength":16,"minLength":2,"title":"Locale"}},"type":"object","required":["locale"],"title":"TranslateBody"},"UpdateLinkRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"is_favorite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Favorite"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"is_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Private"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"UpdateLinkRequest"},"UpdateProfileResponse":{"properties":{"data":{"$ref":"#/components/schemas/MobileProfileRecord"}},"type":"object","required":["data"],"title":"UpdateProfileResponse"},"UpsertDeviceRequest":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"device_name":{"type":"string","title":"Device Name"},"platform":{"type":"string","title":"Platform"},"push_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Push Token"},"alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alias"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","user_id","device_name","platform"],"title":"UpsertDeviceRequest","description":"Body for POST /api/v1/mobile/devices (merge-duplicates upsert)."},"UpsertResponse":{"properties":{"data":{"$ref":"#/components/schemas/MobileDeviceRecord"}},"type":"object","required":["data"],"title":"UpsertResponse"},"UpsertSettingsResponse":{"properties":{"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["data"],"title":"UpsertSettingsResponse"},"ValidateResponse":{"properties":{"valid":{"type":"boolean","title":"Valid","default":true},"tenant":{"$ref":"#/components/schemas/TenantInfo"}},"type":"object","required":["tenant"],"title":"ValidateResponse"},"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"},"_SingleStatusResponse":{"properties":{"data":{"$ref":"#/components/schemas/LinkStatusResponse"}},"type":"object","required":["data"],"title":"_SingleStatusResponse"},"routers__ext_links_router__ListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ExtLinkResponse"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"ListResponse"},"routers__mobile_categories_router__DeletedIdsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MobileCategoryIdOnly"},"type":"array","title":"Data"},"meta":{"additionalProperties":{"type":"integer"},"type":"object","title":"Meta"},"server_time":{"type":"string","title":"Server Time"}},"type":"object","required":["data","meta","server_time"],"title":"DeletedIdsResponse"},"routers__mobile_categories_router__ListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MobileCategoryRecord"},"type":"array","title":"Data"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"},"server_time":{"type":"string","title":"Server Time"}},"type":"object","required":["data","meta","server_time"],"title":"ListResponse"},"routers__mobile_devices_router__ListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MobileDeviceRecord"},"type":"array","title":"Data"},"meta":{"additionalProperties":{"type":"integer"},"type":"object","title":"Meta"}},"type":"object","required":["data","meta"],"title":"ListResponse"},"routers__mobile_links_router__BatchUpsertRequest":{"properties":{"records":{"items":{"$ref":"#/components/schemas/MobileLinkRecord"},"type":"array","maxItems":500,"title":"Records"}},"type":"object","required":["records"],"title":"BatchUpsertRequest","description":"Request body for POST /api/v1/mobile/links/batch."},"routers__mobile_tags_router__BatchUpsertRequest":{"properties":{"records":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Records"}},"type":"object","required":["records"],"title":"BatchUpsertRequest"},"routers__mobile_tags_router__DeletedIdsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MobileTagIdOnly"},"type":"array","title":"Data"},"meta":{"additionalProperties":{"type":"integer"},"type":"object","title":"Meta"},"server_time":{"type":"string","title":"Server Time"}},"type":"object","required":["data","meta","server_time"],"title":"DeletedIdsResponse"},"routers__mobile_tags_router__ListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MobileTagRecord"},"type":"array","title":"Data"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"},"server_time":{"type":"string","title":"Server Time"}},"type":"object","required":["data","meta","server_time"],"title":"ListResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}