{"openapi":"3.1.0","info":{"title":"Semantic Video Clip AI Agent","version":"1.0.0"},"paths":{"/api/v1/auth/google/login":{"get":{"tags":["Authentication"],"summary":"Google Login","description":"Initiate Google OAuth flow\n\nRedirects user to Google's OAuth consent screen","operationId":"google_login_api_v1_auth_google_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/google/callback":{"get":{"tags":["Authentication"],"summary":"Google Callback","description":"Google OAuth callback - Returns HTML that posts token to opener window\n\n1. Exchanges authorization code for access token\n2. Fetches user profile from Google\n3. Creates/updates user in database\n4. Auto-promotes admin emails\n5. Issues JWT Bearer token (1 hour expiry)\n6. Returns HTML with window.postMessage to deliver token","operationId":"google_callback_api_v1_auth_google_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/me":{"get":{"tags":["Authentication"],"summary":"Get Current User Info","description":"Get current authenticated user information\n\nReturns user profile data from JWT cookie","operationId":"get_current_user_info_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/auth/logout":{"post":{"tags":["Authentication"],"summary":"Logout","description":"Logout (client-side token deletion)\n\nWith JWT Bearer tokens, logout is handled client-side by deleting the token.\nThis endpoint just logs the action for audit.","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/projects":{"get":{"tags":["Admin"],"summary":"List All Projects","description":"List all projects (admin-only) with optional filters\n\nCross-tenant query that returns projects from all users.\nSupports pagination and filtering by status/user.","operationId":"list_all_projects_api_v1_admin_projects_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (pending, processing, completed, failed)","title":"Status"},"description":"Filter by status (pending, processing, completed, failed)"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by user ID","title":"User Id"},"description":"Filter by user ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_AdminProjectListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/projects/{project_id}":{"get":{"tags":["Admin"],"summary":"Get Project Detail","description":"Get full project details (admin-only)\n\nReturns complete project data including JSON fields for debugging.\nIncludes counts for related entities (scenes, clips, frames).","operationId":"get_project_detail_api_v1_admin_projects__project_id__get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminProjectDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Delete Project Admin","description":"Delete any project (admin-only)\n\nCross-tenant deletion for cleanup purposes.\nCascades to all related entities (frames, scenes, clips, tasks, logs).","operationId":"delete_project_admin_api_v1_admin_projects__project_id__delete","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/projects/{project_id}/config":{"get":{"tags":["Admin"],"summary":"Get Project Config","description":"Get project configuration only (admin-only)\n\nLightweight endpoint that returns only the project_config JSON field.\nUseful for debugging processing parameters without fetching full project details.","operationId":"get_project_config_api_v1_admin_projects__project_id__config_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/projects/{project_id}/logs":{"get":{"tags":["Admin"],"summary":"Get Project Logs","description":"Get step logs for a project's task (admin-only)\n\nReturns detailed execution logs for debugging failed projects.\nSupports filtering by log level.","operationId":"get_project_logs_api_v1_admin_projects__project_id__logs_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by log level (INFO, WARNING, ERROR)","title":"Level"},"description":"Filter by log level (INFO, WARNING, ERROR)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_StepLogResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users":{"get":{"tags":["Admin"],"summary":"List All Users","description":"List all users (admin-only)\n\nReturns all users with project counts and last login timestamps.","operationId":"list_all_users_api_v1_admin_users_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_AdminUserListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}":{"get":{"tags":["Admin"],"summary":"Get User Detail","description":"Get user details (admin-only)","operationId":"get_user_detail_api_v1_admin_users__user_id__get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserListItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Admin"],"summary":"Update User Admin","description":"Update user status (admin-only)\n\nAllows promoting/demoting admins and activating/deactivating users.","operationId":"update_user_admin_api_v1_admin_users__user_id__patch","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/projects":{"get":{"tags":["Admin"],"summary":"Get User Projects Admin","description":"Get all projects for a specific user (admin-only)","operationId":"get_user_projects_admin_api_v1_admin_users__user_id__projects_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_AdminProjectListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/signup-offer":{"get":{"tags":["Billing"],"summary":"Get Signup Offer","description":"Public endpoint for landing page — returns signup token grant amount.","operationId":"get_signup_offer_api_v1_billing_signup_offer_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/balance":{"get":{"tags":["Billing"],"summary":"Get Balance","description":"Get current user's token balance.","operationId":"get_balance_api_v1_billing_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/billing/transactions":{"get":{"tags":["Billing"],"summary":"Get Transactions","description":"Get paginated transaction history for current user.","operationId":"get_transactions_api_v1_billing_transactions_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type: purchase, reserve, charge, revert, refund, admin_grant, admin_deduct","title":"Type"},"description":"Filter by type: purchase, reserve, charge, revert, refund, admin_grant, admin_deduct"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/usage":{"get":{"tags":["Billing"],"summary":"Get Usage Summary","description":"Get usage summary for current user.","operationId":"get_usage_summary_api_v1_billing_usage_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Period in days","default":30,"title":"Period"},"description":"Period in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/packs":{"get":{"tags":["Billing"],"summary":"Get Token Packs","description":"Get available token packs for purchase. No auth required.","operationId":"get_token_packs_api_v1_billing_packs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TokenPackResponse"},"type":"array","title":"Response Get Token Packs Api V1 Billing Packs Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/plans":{"get":{"tags":["Billing"],"summary":"Get Subscription Plans","description":"Active subscription plans (incl. free) — feeds the pricing page. No auth.","operationId":"get_subscription_plans_api_v1_billing_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SubscriptionPlanResponse"},"type":"array","title":"Response Get Subscription Plans Api V1 Billing Plans Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/subscribe":{"post":{"tags":["Billing"],"summary":"Create Subscription Checkout","description":"Create a Stripe Checkout Session (mode=subscription) for a paid plan.","operationId":"create_subscription_checkout_api_v1_billing_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/billing/portal":{"post":{"tags":["Billing"],"summary":"Create Billing Portal Session","description":"Stripe Customer Portal session — cancel, payment method, plan switch.","operationId":"create_billing_portal_session_api_v1_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalResponse"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/billing/subscription":{"get":{"tags":["Billing"],"summary":"Get Subscription Status","description":"Current plan + usage in one call — feeds the account/usage UI.","operationId":"get_subscription_status_api_v1_billing_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionStatusResponse"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/billing/checkout":{"post":{"tags":["Billing"],"summary":"Create Checkout","description":"Create a Stripe Checkout Session for a token pack purchase.","operationId":"create_checkout_api_v1_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/billing/webhook":{"post":{"tags":["Billing"],"summary":"Stripe Webhook","description":"Stripe webhook handler. No auth — verified by Stripe signature.\nProcesses checkout.session.completed events to credit tokens.","operationId":"stripe_webhook_api_v1_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/billing/release-stuck":{"post":{"tags":["Billing"],"summary":"Release Own Stuck Reservations","description":"Release the current user's stuck token reservations.\nOnly releases reservations older than the safety threshold (default 5 min).","operationId":"release_own_stuck_reservations_api_v1_billing_release_stuck_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseReservationsRequest","default":{"reason":"Manual release of stuck reservations"}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseReservationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/billing/users":{"get":{"tags":["Billing"],"summary":"Admin List Balances","description":"List all users with their token balances (admin-only).","operationId":"admin_list_balances_api_v1_admin_billing_users_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Sort by: balance, total_spent, created_at","default":"balance","title":"Sort By"},"description":"Sort by: balance, total_spent, created_at"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserBalanceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/users/{user_id}":{"get":{"tags":["Billing"],"summary":"Admin Get User Balance","description":"Get single user balance + details (admin-only).","operationId":"admin_get_user_balance_api_v1_admin_billing_users__user_id__get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserBalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/users/{user_id}/transactions":{"get":{"tags":["Billing"],"summary":"Admin Get User Transactions","description":"Get full transaction history for a user (admin-only).","operationId":"admin_get_user_transactions_api_v1_admin_billing_users__user_id__transactions_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTransactionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/users/{user_id}/adjust":{"post":{"tags":["Billing"],"summary":"Admin Adjust Tokens","description":"Grant or deduct tokens for a user (admin-only).","operationId":"admin_adjust_tokens_api_v1_admin_billing_users__user_id__adjust_post","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAdjustRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/users/{user_id}/release":{"post":{"tags":["Billing"],"summary":"Admin Release User Reservations","description":"Release stuck reservations for a specific user (admin-only).","operationId":"admin_release_user_reservations_api_v1_admin_billing_users__user_id__release_post","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseReservationsRequest","default":{"reason":"Manual release of stuck reservations"}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseReservationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/users/{user_id}/stuck":{"get":{"tags":["Billing"],"summary":"Admin Get Stuck Count","description":"Get count of stuck reservations for a user (admin preview before release).","operationId":"admin_get_stuck_count_api_v1_admin_billing_users__user_id__stuck_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StuckReservationCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/transactions":{"get":{"tags":["Billing"],"summary":"Admin Global Transactions","description":"Global transaction log (admin-only).","operationId":"admin_global_transactions_api_v1_admin_billing_transactions_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTransactionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/revenue":{"get":{"tags":["Billing"],"summary":"Admin Revenue Summary","description":"Revenue dashboard (admin-only).","operationId":"admin_revenue_summary_api_v1_admin_billing_revenue_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/packs":{"get":{"tags":["Billing"],"summary":"Admin List Packs","description":"List all token packs including inactive (admin-only).","operationId":"admin_list_packs_api_v1_admin_billing_packs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TokenPackResponse"},"type":"array","title":"Response Admin List Packs Api V1 Admin Billing Packs Get"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]},"post":{"tags":["Billing"],"summary":"Admin Create Pack","description":"Create a new token pack (admin-only).","operationId":"admin_create_pack_api_v1_admin_billing_packs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePackRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/billing/packs/{pack_id}":{"put":{"tags":["Billing"],"summary":"Admin Update Pack","description":"Update a token pack (admin-only).","operationId":"admin_update_pack_api_v1_admin_billing_packs__pack_id__put","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"integer","title":"Pack Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Billing"],"summary":"Admin Delete Pack","description":"Soft-delete a token pack by deactivating it (admin-only).","operationId":"admin_delete_pack_api_v1_admin_billing_packs__pack_id__delete","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"pack_id","in":"path","required":true,"schema":{"type":"integer","title":"Pack Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/plans":{"get":{"tags":["Billing"],"summary":"Admin List Plans","description":"List all subscription plans including inactive (admin-only).","operationId":"admin_list_plans_api_v1_admin_billing_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SubscriptionPlanResponse"},"type":"array","title":"Response Admin List Plans Api V1 Admin Billing Plans Get"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/billing/plans/{plan_id}":{"put":{"tags":["Billing"],"summary":"Admin Update Plan","description":"Update a subscription plan — Stripe Price IDs, allowance, entitlements (admin-only).","operationId":"admin_update_plan_api_v1_admin_billing_plans__plan_id__put","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPlanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/billing/stripe-events":{"get":{"tags":["Billing"],"summary":"Admin Stripe Events","description":"Webhook event log for debugging (admin-only).","operationId":"admin_stripe_events_api_v1_admin_billing_stripe_events_get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StripeEventListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/settings":{"get":{"tags":["User Settings"],"summary":"Get User Settings","description":"Return current user settings with presigned logo URL (or null).","operationId":"get_user_settings_api_v1_users_me_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/logo":{"post":{"tags":["User Settings"],"summary":"Upload User Logo","description":"Upload a logo image. Stored in S3 with content hash for cache busting.","operationId":"upload_user_logo_api_v1_users_me_logo_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_user_logo_api_v1_users_me_logo_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["User Settings"],"summary":"Delete User Logo","description":"Delete user logo from S3 and clear settings. Idempotent — returns 204 even if no logo exists.","operationId":"delete_user_logo_api_v1_users_me_logo_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gifs/search":{"get":{"tags":["GIFs"],"summary":"Search Gifs","description":"Search for GIFs via Klipy API (cached in Redis).","operationId":"search_gifs_api_v1_gifs_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":24,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GifSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gifs/trending":{"get":{"tags":["GIFs"],"summary":"Trending Gifs","description":"Get trending GIFs via Klipy API (cached in Redis).","operationId":"trending_gifs_api_v1_gifs_trending_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":24,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GifSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/styles":{"get":{"tags":["Export"],"summary":"Get Caption Styles","description":"Return all 15 caption style presets.","operationId":"get_caption_styles_api_v1_export_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptionStylesResponse"}}}}}}},"/api/v1/export/styles/{key}":{"get":{"tags":["Export"],"summary":"Get Caption Style","description":"Return a single caption style preset by key.","operationId":"get_caption_style_api_v1_export_styles__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptionStylePreset"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/captions":{"get":{"tags":["Export"],"summary":"Get Clip Captions","description":"Get word-level captions for a clip.\n\nIf the user has previously saved edits (PUT), returns the saved version.\nOtherwise, slices from the project's Whisper transcription and rebases\ntimestamps to be relative to the clip's start time.","operationId":"get_clip_captions_api_v1_projects__project_id__clips__clip_id__captions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Export"],"summary":"Update Clip Captions","description":"Save user-edited captions for a clip.\n\nPersists the word timings on the clip record so future GET calls\nreturn the edited version instead of the raw transcription.","operationId":"update_clip_captions_api_v1_projects__project_id__clips__clip_id__captions_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptionsUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/settings":{"get":{"tags":["Export"],"summary":"Get Clip Settings","description":"Get saved clip settings (style, emojis, zoom, logo, progress bar).\n\nReturns null settings if the user has never customized this clip.","operationId":"get_clip_settings_api_v1_projects__project_id__clips__clip_id__settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClipSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Export"],"summary":"Update Clip Settings","description":"Save clip settings (style, emojis, zoom, logo, progress bar).\n\nThe frontend calls this as the user edits. On export, the backend\nloads these settings automatically — no need to send them again.","operationId":"update_clip_settings_api_v1_projects__project_id__clips__clip_id__settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClipSettings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClipSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/sfx/suggest":{"post":{"tags":["Export"],"summary":"Suggest Clip Sfx","description":"Ask the LLM to propose SFX placements for this clip. Read-only.","operationId":"suggest_clip_sfx_api_v1_projects__project_id__clips__clip_id__sfx_suggest_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}},{"name":"max_suggestions","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Max Suggestions"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfxSuggestionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/gifs/suggest":{"post":{"tags":["Export"],"summary":"Suggest Clip Gifs","description":"Ask the LLM to propose GIF overlays for this clip, resolved against Klipy. Read-only.","operationId":"suggest_clip_gifs_api_v1_projects__project_id__clips__clip_id__gifs_suggest_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}},{"name":"max_suggestions","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Max Suggestions"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GifSuggestionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/emojis/suggest":{"post":{"tags":["Export"],"summary":"Suggest Clip Emojis","description":"Ask the LLM to propose floating-emoji placements for this clip. Read-only.","operationId":"suggest_clip_emojis_api_v1_projects__project_id__clips__clip_id__emojis_suggest_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}},{"name":"max_suggestions","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Max Suggestions"}},{"name":"min_gap_seconds","in":"query","required":false,"schema":{"type":"number","default":3.0,"title":"Min Gap Seconds"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmojiSuggestionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/logo":{"post":{"tags":["Export"],"summary":"Upload Clip Logo","description":"Upload a per-clip logo override. Stored as logo_s3_key in clip_settings JSON.","operationId":"upload_clip_logo_api_v1_projects__project_id__clips__clip_id__logo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_clip_logo_api_v1_projects__project_id__clips__clip_id__logo_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Export"],"summary":"Delete Clip Logo","description":"Delete per-clip logo from S3 and clip_settings. Idempotent — returns 204 even if no logo exists.","operationId":"delete_clip_logo_api_v1_projects__project_id__clips__clip_id__logo_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/export":{"post":{"tags":["Export"],"summary":"Trigger Export","description":"Trigger a Remotion Lambda render for a clip.\n\nNo request body — the backend assembles the full ExportConfig from:\n  - clip.clip_settings (style, emojis, zoom, logo, progressBar)\n  - clip.captions_data (word timings, or auto-sliced from transcription)\n  - clip start_time / end_time (scene boundaries from database)\n  - original video S3 key (always full quality)","operationId":"trigger_export_api_v1_projects__project_id__clips__clip_id__export_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/exports/{export_id}/status":{"get":{"tags":["Export"],"summary":"Get Export Status","description":"Get the status of a clip export render.\n\nReturns progress (0.0-1.0) while rendering, and a presigned\ndownload URL when complete.","operationId":"get_export_status_api_v1_exports__export_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"export_id","in":"path","required":true,"schema":{"type":"integer","title":"Export Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/exports":{"get":{"tags":["Export"],"summary":"Get Export History","description":"List the user's exports across all projects.\n\nReturns all statuses (completed, failed, rendering). Download URLs\nare regenerated fresh for completed exports (stored URLs may be expired).","operationId":"get_export_history_api_v1_exports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"query","required":false,"schema":{"type":"integer","title":"Clip Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/webhook":{"post":{"tags":["Export"],"summary":"Remotion Webhook","description":"Receive Remotion Lambda render completion webhook.\n\nCalled by Remotion Lambda when a render finishes (success, error, or timeout).\nValidates HMAC-SHA512 signature, then settles billing and updates export record.","operationId":"remotion_webhook_api_v1_export_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/name":{"patch":{"tags":["Export"],"summary":"Rename Clip","description":"Set a clip's user-facing name (shown in lists and the schedule dialog).","operationId":"rename_clip_api_v1_projects__project_id__clips__clip_id__name_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClipRenameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations":{"get":{"tags":["Compilations"],"summary":"List Compilations","description":"List the current user's compilations with summary data.","operationId":"list_compilations_api_v1_compilations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Only compilations auto-created from this project","title":"Source Project Id"},"description":"Only compilations auto-created from this project"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Compilations"],"summary":"Create Compilation","operationId":"create_compilation_api_v1_compilations_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations/available-clips":{"get":{"tags":["Compilations"],"summary":"List Available Clips","description":"User-scoped searchable list of the user's clips for picking into a compilation.","operationId":"list_available_clips_api_v1_compilations_available_clips_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by description or project filename","title":"Q"},"description":"Search by description or project filename"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableClipsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations/{compilation_id}":{"get":{"tags":["Compilations"],"summary":"Get Compilation","operationId":"get_compilation_api_v1_compilations__compilation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Compilations"],"summary":"Update Compilation","operationId":"update_compilation_api_v1_compilations__compilation_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Compilations"],"summary":"Delete Compilation","operationId":"delete_compilation_api_v1_compilations__compilation_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations/suggest":{"post":{"tags":["Compilations"],"summary":"Suggest Compilation Bundles","description":"Propose themed clip bundles across the user's library for a free-form prompt.\nStateless — nothing is persisted until the client calls /from-suggestion.\nPer-user rate-limited; cost control via PF2 option (A).","operationId":"suggest_compilation_bundles_api_v1_compilations_suggest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationSuggestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationSuggestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/compilations/from-suggestion":{"post":{"tags":["Compilations"],"summary":"Create Compilation From Suggestion","description":"Materialize a suggestion bundle into a real Compilation atomically.","operationId":"create_compilation_from_suggestion_api_v1_compilations_from_suggestion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationFromSuggestionRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/compilations/{compilation_id}/clips":{"post":{"tags":["Compilations"],"summary":"Add Clip To Compilation","operationId":"add_clip_to_compilation_api_v1_compilations__compilation_id__clips_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationClipAddRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations/{compilation_id}/clips/{compilation_clip_id}":{"delete":{"tags":["Compilations"],"summary":"Remove Clip From Compilation","operationId":"remove_clip_from_compilation_api_v1_compilations__compilation_id__clips__compilation_clip_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}},{"name":"compilation_clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Clip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Compilations"],"summary":"Patch Compilation Clip","description":"Update one membership's sub-range trim / role / overlay label.","operationId":"patch_compilation_clip_api_v1_compilations__compilation_id__clips__compilation_clip_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}},{"name":"compilation_clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Clip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationClipPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations/{compilation_id}/clips/order":{"put":{"tags":["Compilations"],"summary":"Reorder Compilation Clips","operationId":"reorder_compilation_clips_api_v1_compilations__compilation_id__clips_order_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationClipReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations/{compilation_id}/arrange":{"post":{"tags":["Compilations"],"summary":"Arrange Compilation","description":"Rebuild the compilation's membership in the requested format.\n\nDestructive by design: replaces every membership row (manual trims and\nordering included) — the FE confirms before calling. A degraded result\n(LLM/validation failure → chronological order) still returns 200; the\noutcome is reported in arrangement_metadata.","operationId":"arrange_compilation_api_v1_compilations__compilation_id__arrange_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationArrangeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations/{compilation_id}/export":{"post":{"tags":["Compilations"],"summary":"Trigger Compilation Export","description":"Trigger a Remotion Lambda render for a compilation.","operationId":"trigger_compilation_export_api_v1_compilations__compilation_id__export_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationExportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations/{compilation_id}/exports":{"get":{"tags":["Compilations"],"summary":"List Compilation Exports","description":"List all export records for a compilation, newest first.","operationId":"list_compilation_exports_api_v1_compilations__compilation_id__exports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationExportListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compilations/{compilation_id}/exports/{export_id}/status":{"get":{"tags":["Compilations"],"summary":"Get Compilation Export Status","description":"Progress + download URL for a compilation render. Mirrors the single-clip status endpoint.","operationId":"get_compilation_export_status_api_v1_compilations__compilation_id__exports__export_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"compilation_id","in":"path","required":true,"schema":{"type":"integer","title":"Compilation Id"}},{"name":"export_id","in":"path","required":true,"schema":{"type":"integer","title":"Export Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompilationExportStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/contact":{"post":{"tags":["Contact"],"summary":"Submit Contact","operationId":"submit_contact_api_v1_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/social/connect-token":{"post":{"tags":["Social"],"summary":"Issue Connect Token","description":"Short-lived purpose-scoped token for the OAuth popup URL.\n\nThe popup navigation can't carry an Authorization header. A full API\nbearer token in a URL would leak a real credential into logs/history,\nso this narrow token is all the connect start endpoint accepts.","operationId":"issue_connect_token_api_v1_social_connect_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/social/{platform}/connect":{"get":{"tags":["Social"],"summary":"Social Connect Start","description":"Start the OAuth flow for a platform. Opened in a popup by the FE.","operationId":"social_connect_start_api_v1_social__platform__connect_get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/social/youtube/callback":{"get":{"tags":["Social"],"summary":"Youtube Callback","description":"YouTube OAuth redirect target — closes the popup via postMessage.","operationId":"youtube_callback_api_v1_social_youtube_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/social/instagram/callback":{"get":{"tags":["Social"],"summary":"Instagram Callback","description":"Instagram OAuth redirect target — closes the popup via postMessage.","operationId":"instagram_callback_api_v1_social_instagram_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/social/accounts":{"get":{"tags":["Social"],"summary":"List Social Accounts","description":"Connected accounts for the settings page. Not premium-gated (read-only).","operationId":"list_social_accounts_api_v1_social_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/social/accounts/{account_id}":{"delete":{"tags":["Social"],"summary":"Disconnect Social Account","description":"Disconnect an account: best-effort provider revoke, delete the row.\n\nscheduled_posts.social_account_id is ON DELETE CASCADE — the account's\nentire post history (pending AND published) goes with it. The FE confirm\ndialog states this. Durable S3 copies of pending posts are deleted first.","operationId":"disconnect_social_account_api_v1_social_accounts__account_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"integer","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-posts":{"post":{"tags":["Social"],"summary":"Create Scheduled Post","description":"Schedule a clip or compilation export for publishing.\n\nThe FE triggers the export first (existing export endpoints) and passes\nits id. A completed export is copied to durable storage NOW (exports/\nexpires after 1 day); an in-flight export parks the post in waiting_export\nand the publish sweep advances it on completion.","operationId":"create_scheduled_post_api_v1_scheduled_posts_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledPostCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Social"],"summary":"List Scheduled Posts","description":"Posts in a date range (calendar view). Defaults to ±45 days around now.","operationId":"list_scheduled_posts_api_v1_scheduled_posts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"from_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"From Date"}},{"name":"to_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"To Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-posts/{post_id}":{"patch":{"tags":["Social"],"summary":"Update Scheduled Post","description":"Retime or edit metadata. Only before publishing starts.","operationId":"update_scheduled_post_api_v1_scheduled_posts__post_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledPostUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Social"],"summary":"Cancel Scheduled Post","description":"Cancel a pending post, or remove a finished one from the calendar.\nDeliberately NOT premium-gated: users whose plan lapsed must still be\nable to stop queued publishes.\n\nPending posts are canceled (kept as history); terminal posts are\nhard-deleted — record-only, the published platform video is never touched.\nOnly `publishing` refuses: the upload may be in flight.","operationId":"cancel_scheduled_post_api_v1_scheduled_posts__post_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-posts/metadata-suggest":{"post":{"tags":["Social"],"summary":"Suggest Post Metadata","description":"AI-prefill title/description/hashtags from the clip's transcript.","operationId":"suggest_post_metadata_api_v1_scheduled_posts_metadata_suggest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetadataSuggestRequest"}}},"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/api-keys":{"get":{"tags":["API Keys"],"summary":"List Api Keys","description":"List the caller's API keys (active and revoked), newest first.","operationId":"list_api_keys_api_v1_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Response List Api Keys Api V1 Api Keys Get"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]},"post":{"tags":["API Keys"],"summary":"Create Api Key","description":"Issue a new API key. Plan-gated; capped per user. Returns the key once.","operationId":"create_api_key_api_v1_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/v1/api-keys/{key_id}":{"delete":{"tags":["API Keys"],"summary":"Revoke Api Key","description":"Revoke a key (kept as history). Idempotent — re-revoking is a no-op.","operationId":"revoke_api_key_api_v1_api_keys__key_id__delete","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health":{"get":{"summary":"Health Check","description":"Health check endpoint","operationId":"health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/upload":{"post":{"summary":"Upload Video","description":"Upload video and start processing pipeline.\nNow uses SQLite for storage and Celery for background processing.\n\nNew parameters:\n- tags: Comma-separated tags for video context (e.g., \"product demo,tutorial\")\n- query: Natural language query for scene matching (e.g., \"customer explains features\")\n- min_duration: Minimum scene duration in seconds (default: 5.0)\n- include_captions: Enable captions on exported clips (default: False)\n- karaoke_captions: Enable word-by-word karaoke effect (default: False)\n- karaoke_color: Hex color for karaoke highlight (e.g., \"#cf2a8b\", default: brand green \"#9DC34F\")\n- orientation: Target clip aspect ratio for caption positioning: \"vertical\" (9:16), \"horizontal\" (16:9), \"square\" (1:1), or \"original\" (preserve source orientation)\n- processing_mode: Processing mode: \"automatic\" (detect all scenes), \"semantic\" (query-based), or \"full_video\" (no clipping)\n- smart_crop_enabled: Enable AI-powered smart crop with subject tracking for intelligent framing (default: False)\n- gemini_analysis: Enable Gemini visual scene analysis; when False the pipeline runs Whisper-only and transcript scenes drive clip generation (default: True, still gated by plan entitlement)","operationId":"upload_video_api_v1_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_video_api_v1_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/uploads/init":{"post":{"summary":"Init Direct Upload","description":"Start a direct-to-S3 upload: validate, dedup, reserve tokens, and hand the\nbrowser a presigned POST it uploads the file with.\n\nSecurity model: the presigned POST policy carries a content-length-range\ncondition capped at the declared size_bytes — S3 itself rejects a larger\nbody at the wire. No server-side re-verification of the file happens; a\ngarbage upload fails in the pipeline exactly like a corrupt file on the\nlegacy path (task FAILED, tokens refunded).\n\nThe browser must call POST /uploads/{project_id}/complete after S3\nreturns 204 — that's what dispatches the processing pipeline.","operationId":"init_direct_upload_api_v1_uploads_init_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectUploadInitRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectUploadInitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/uploads/{project_id}/complete":{"post":{"summary":"Complete Direct Upload","description":"Finish a direct-to-S3 upload: verify the object landed in S3, then\ndispatch the processing pipeline.\n\nIdempotency: only valid while the project is UPLOADING — a second call\n(double click, retry after success) gets 409 instead of a second pipeline.","operationId":"complete_direct_upload_api_v1_uploads__project_id__complete_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/upload/from-url":{"post":{"summary":"Upload Video From Url","description":"Ingest a video from a YouTube URL. The video is probed for metadata via\nthe YouTube Data API at request time (best-effort); the actual download\nruns through an Apify actor inside a Celery task so the HTTP response\nreturns within a few seconds. Billing, token reservation, and the\nresponse contract are identical to POST /upload.","operationId":"upload_video_from_url_api_v1_upload_from_url_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoUploadFromUrlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/projects/{project_id}/status":{"get":{"summary":"Get Project Status","description":"Get project status from database","operationId":"get_project_status_api_v1_projects__project_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/active-steps":{"get":{"summary":"Get Project Active Steps","description":"Get all active/completed steps for a project's task.\n\nReturns detailed information about each step in the pipeline:\n- Steps currently running in parallel\n- Completed steps\n- Steps that errored\n\nUse this endpoint to display real-time progress of parallel tasks in the UI.","operationId":"get_project_active_steps_api_v1_projects__project_id__active_steps_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveStepsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips":{"get":{"summary":"Get Project Clips","description":"Get all clips for a project from database","operationId":"get_project_clips_api_v1_projects__project_id__clips_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClipResponse"},"title":"Response Get Project Clips Api V1 Projects  Project Id  Clips Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}":{"get":{"summary":"Get Single Clip","description":"Get a single clip by ID with scene data","operationId":"get_single_clip_api_v1_projects__project_id__clips__clip_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClipResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/stream":{"get":{"summary":"Stream Clip","description":"Return video streaming URL for clip.\n\nPriority: S3 presigned URL > 410 Gone (legacy projects) > local file fallback","operationId":"stream_clip_api_v1_projects__project_id__clips__clip_id__stream_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"JWT token for authentication (alternative to Authorization header)","title":"Token"},"description":"JWT token for authentication (alternative to Authorization header)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/video/stream":{"get":{"summary":"Stream Project Video","description":"Stream full project video file with HTTP range request support.\n\nSupports authentication via:\n- User JWT token (requires project ownership)\n- Anonymous access (presigned URLs handle auth at the S3 level)\n\nIMPORTANT: This endpoint explicitly closes the database connection before\nstreaming to prevent connection pool exhaustion. Database connections are\nheld only during the query, not during the entire video stream.","operationId":"stream_project_video_api_v1_projects__project_id__video_stream_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"JWT token for authentication (alternative to Authorization header)","title":"Token"},"description":"JWT token for authentication (alternative to Authorization header)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/scenes":{"get":{"summary":"Get Project Scenes","description":"Get all scenes for a project with X-CLIP query matching and vision analysis results","operationId":"get_project_scenes_api_v1_projects__project_id__scenes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects":{"get":{"summary":"List Projects","description":"List the current user's projects plus the shared system demo, pinned first.","operationId":"list_projects_api_v1_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ProjectListResponse"},"type":"array","title":"Response List Projects Api V1 Projects Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/projects/{project_id}/vision-analysis":{"post":{"summary":"Run Vision Analysis","description":"Run (or re-run) the smart-crop + speaker-layout analysis on a completed\nproject. Serves failure recovery and post-upload enablement.\n\nPricing: duration-based (same as upload), EXCEPT when the analysis was\nenabled at upload but stored no camera data — that retry is free, the\nuser already paid for it.\n\nPoll GET /projects/{id}/status: project_config.vision_rerun_status\ntransitions running → completed | failed.","operationId":"run_vision_analysis_api_v1_projects__project_id__vision_analysis_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisionAnalysisRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}":{"delete":{"summary":"Delete Project","description":"Comprehensively delete a project and all related data:\n- Database records (projects, tasks, frames, scenes, clips, logs)\n- File system data (videos, frames, processing outputs)\n\nArgs:\n    project_id: UUID of the project to delete\n\nReturns:\n    ProjectDeletionResponse with detailed deletion results","operationId":"delete_project_api_v1_projects__project_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDeletionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/video/download":{"get":{"summary":"Download Project Video","description":"Download the original full video file.\n\nUnlike the streaming endpoint (/video), this forces a file download\nwith proper Content-Disposition header.","operationId":"download_project_video_api_v1_projects__project_id__video_download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/preview-frame":{"get":{"summary":"Get Project Preview Frame","description":"Serve a preview frame for the project","operationId":"get_project_preview_frame_api_v1_projects__project_id__preview_frame_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/timeline":{"get":{"summary":"Get Project Timeline","description":"Get timeline data with all frame thumbnails for UI rendering","operationId":"get_project_timeline_api_v1_projects__project_id__timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimelineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/frames/{frame_id}":{"get":{"summary":"Get Frame Thumbnail","description":"Serve individual frame thumbnail for timeline display","operationId":"get_frame_thumbnail_api_v1_projects__project_id__frames__frame_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"frame_id","in":"path","required":true,"schema":{"type":"string","title":"Frame Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/scenes/{scene_id}/boundaries":{"put":{"summary":"Update Scene Boundaries","description":"Update scene start and end times via slider adjustments","operationId":"update_scene_boundaries_api_v1_projects__project_id__scenes__scene_id__boundaries_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"scene_id","in":"path","required":true,"schema":{"type":"integer","title":"Scene Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSceneBoundariesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSceneBoundariesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/download":{"get":{"summary":"Download Clip","description":"Download clip with current scene boundaries (on-the-fly re-clipping).\n\nQuery params:\n- quality=original: Re-clip from original upload (full quality, -c copy)\n- (default): Re-clip from 480p compressed (preview quality, -c copy)\n\nProcess:\n- Downloads padded clip (or original) from S3 to temp file\n- Re-clips to exact user-adjusted scene boundaries with -c copy\n- Streams trimmed clip to browser\n- Temp files cleaned up via BackgroundTasks","operationId":"download_clip_api_v1_projects__project_id__clips__clip_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}},{"name":"quality","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/clips/{clip_id}/thumbnail":{"get":{"summary":"Get Clip Thumbnail","description":"Get 400x400 JPEG thumbnail for a clip.\n\nSupports authentication via:\n- Authorization: Bearer <token> header (standard)\n- ?token=<jwt> query parameter (for HTML <img> tags)\n\nExample usage in HTML:\n<img src=\"/api/v1/projects/123/clips/456/thumbnail?token=YOUR_JWT_TOKEN\" />\n\nReturns:\n    JPEG image (400x400px with letterboxing)","operationId":"get_clip_thumbnail_api_v1_projects__project_id__clips__clip_id__thumbnail_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"clip_id","in":"path","required":true,"schema":{"type":"integer","title":"Clip Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"JWT token for authentication (alternative to Authorization header)","title":"Token"},"description":"JWT token for authentication (alternative to Authorization header)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sfx":{"get":{"summary":"List Sfx","description":"List all sound effects in the global library. Optional filter by category.","operationId":"list_sfx_api_v1_sfx_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SfxSoundResponse"},"title":"Response List Sfx Api V1 Sfx Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sfx/{sfx_id}/play":{"get":{"summary":"Play Sfx","description":"Redirect to a presigned S3 URL for the sound effect file.","operationId":"play_sfx_api_v1_sfx__sfx_id__play_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sfx_id","in":"path","required":true,"schema":{"type":"integer","title":"Sfx Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ActiveStepInfo":{"properties":{"step_name":{"type":"string","title":"Step Name"},"display_name":{"type":"string","title":"Display Name"},"status":{"type":"string","title":"Status"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"message":{"type":"string","title":"Message"},"level":{"type":"string","title":"Level"}},"type":"object","required":["step_name","display_name","status","message","level"],"title":"ActiveStepInfo","description":"Information about a single active/completed step in the pipeline"},"ActiveStepsResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"task_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Status"},"overall_progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Progress"},"overall_progress_percent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Overall Progress Percent"},"steps":{"items":{"$ref":"#/components/schemas/ActiveStepInfo"},"type":"array","title":"Steps"},"total_steps":{"type":"integer","title":"Total Steps"},"running_steps_count":{"type":"integer","title":"Running Steps Count"},"completed_steps_count":{"type":"integer","title":"Completed Steps Count"},"error_steps_count":{"type":"integer","title":"Error Steps Count"}},"type":"object","required":["project_id","steps","total_steps","running_steps_count","completed_steps_count","error_steps_count"],"title":"ActiveStepsResponse","description":"Response containing all active/completed steps for a project's task"},"AdminAdjustRequest":{"properties":{"amount":{"type":"integer","title":"Amount","description":"Positive = grant tokens, negative = deduct tokens"},"reason":{"type":"string","minLength":1,"title":"Reason","description":"Required reason, logged in transaction"}},"type":"object","required":["amount","reason"],"title":"AdminAdjustRequest"},"AdminProjectDetail":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"filename":{"type":"string","title":"Filename"},"status":{"type":"string","title":"Status"},"video_path":{"type":"string","title":"Video Path"},"video_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Video Metadata"},"project_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Project Config"},"transcription_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Transcription Data"},"task":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Task"},"scenes_count":{"type":"integer","title":"Scenes Count"},"clips_count":{"type":"integer","title":"Clips Count"},"frames_count":{"type":"integer","title":"Frames Count"},"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","user_email","filename","status","video_path","scenes_count","clips_count","frames_count","created_at","updated_at"],"title":"AdminProjectDetail","description":"Full project details for admin debugging"},"AdminProjectListItem":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"filename":{"type":"string","title":"Filename"},"status":{"type":"string","title":"Status"},"task_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Status"},"error_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Summary"},"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","user_email","filename","status","created_at","updated_at"],"title":"AdminProjectListItem","description":"Project item in admin list view"},"AdminTransactionListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AdminTransactionResponse"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["data","total","limit","offset"],"title":"AdminTransactionListResponse"},"AdminTransactionResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"type":{"type":"string","title":"Type"},"amount":{"type":"integer","title":"Amount"},"balance_after":{"type":"integer","title":"Balance After"},"reference_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Type"},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_settled":{"type":"boolean","title":"Is Settled","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","type","amount","balance_after","created_at"],"title":"AdminTransactionResponse"},"AdminUserBalanceListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AdminUserBalanceResponse"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["data","total","skip","limit"],"title":"AdminUserBalanceListResponse"},"AdminUserBalanceResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"balance":{"type":"integer","title":"Balance"},"reserved":{"type":"integer","title":"Reserved"},"available":{"type":"integer","title":"Available"},"total_purchased":{"type":"integer","title":"Total Purchased"},"total_spent":{"type":"integer","title":"Total Spent"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["user_id","email","balance","reserved","available","total_purchased","total_spent"],"title":"AdminUserBalanceResponse"},"AdminUserListItem":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"is_admin":{"type":"boolean","title":"Is Admin"},"is_active":{"type":"boolean","title":"Is Active"},"projects_count":{"type":"integer","title":"Projects Count"},"token_balance":{"type":"integer","title":"Token Balance","default":0},"token_available":{"type":"integer","title":"Token Available","default":0},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","is_admin","is_active","projects_count","created_at"],"title":"AdminUserListItem","description":"User item in admin list view"},"AdminUserUpdate":{"properties":{"is_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Admin"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"AdminUserUpdate","description":"Request body for PATCH /admin/users/{id}"},"AnimationConfig":{"properties":{"type":{"type":"string","title":"Type"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"},"duration":{"type":"number","title":"Duration"},"easing":{"type":"string","title":"Easing"}},"type":"object","required":["type","duration","easing"],"title":"AnimationConfig"},"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreateRequest"},"ApiKeyCreateResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"key":{"type":"string","title":"Key"}},"type":"object","required":["id","name","prefix","key"],"title":"ApiKeyCreateResponse","description":"Returned once at creation — carries the plaintext key. Shown to the user a single time."},"ApiKeyResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","name","prefix"],"title":"ApiKeyResponse","description":"Safe representation — never includes the secret or its hash."},"AvailableClip":{"properties":{"clip_id":{"type":"integer","title":"Clip Id"},"project_id":{"type":"integer","title":"Project Id"},"project_name":{"type":"string","title":"Project Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"duration_sec":{"type":"number","title":"Duration Sec"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"badge":{"$ref":"#/components/schemas/BadgeInfo"},"has_smart_crop":{"type":"boolean","title":"Has Smart Crop"},"project_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Project Created At"}},"type":"object","required":["clip_id","project_id","project_name","description","duration_sec","thumbnail_url","badge","has_smart_crop","project_created_at"],"title":"AvailableClip"},"AvailableClipsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AvailableClip"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"AvailableClipsResponse"},"BadgeInfo":{"properties":{"label":{"type":"string","title":"Label"},"key":{"type":"string","title":"Key"},"color":{"type":"string","title":"Color"}},"type":"object","required":["label","key","color"],"title":"BadgeInfo"},"BalanceResponse":{"properties":{"balance":{"type":"integer","title":"Balance"},"reserved":{"type":"integer","title":"Reserved"},"available":{"type":"integer","title":"Available"},"total_purchased":{"type":"integer","title":"Total Purchased"},"total_spent":{"type":"integer","title":"Total Spent"}},"type":"object","required":["balance","reserved","available","total_purchased","total_spent"],"title":"BalanceResponse"},"Body_upload_clip_logo_api_v1_projects__project_id__clips__clip_id__logo_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_clip_logo_api_v1_projects__project_id__clips__clip_id__logo_post"},"Body_upload_user_logo_api_v1_users_me_logo_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_user_logo_api_v1_users_me_logo_post"},"Body_upload_video_api_v1_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"min_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Duration","default":5.0},"include_captions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Captions","default":false},"karaoke_captions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Karaoke Captions","default":false},"karaoke_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Karaoke Color"},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation","default":"vertical"},"processing_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Processing Mode","default":"automatic"},"smart_crop_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smart Crop Enabled","default":false},"gemini_analysis":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Gemini Analysis","default":true},"compilation_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compilation Format"}},"type":"object","required":["file"],"title":"Body_upload_video_api_v1_upload_post"},"CaptionOverrides":{"properties":{"fontFamily":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fontfamily"},"fontSize":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fontsize"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"highlightColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Highlightcolor"},"strokeColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strokecolor"},"strokeWidth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Strokewidth"},"backgroundColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backgroundcolor"}},"type":"object","title":"CaptionOverrides"},"CaptionStylePreset":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"fontFamily":{"type":"string","title":"Fontfamily"},"fontWeight":{"type":"integer","title":"Fontweight"},"fontSize":{"type":"integer","title":"Fontsize"},"color":{"type":"string","title":"Color"},"highlightColor":{"type":"string","title":"Highlightcolor"},"strokeColor":{"type":"string","title":"Strokecolor"},"strokeWidth":{"type":"integer","title":"Strokewidth"},"backgroundColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backgroundcolor"},"backgroundOpacity":{"type":"number","title":"Backgroundopacity"},"uppercase":{"type":"boolean","title":"Uppercase"},"maxWordsPerLine":{"type":"integer","title":"Maxwordsperline"},"lineHeight":{"type":"number","title":"Lineheight"},"animation":{"$ref":"#/components/schemas/AnimationConfig"},"position":{"$ref":"#/components/schemas/PositionConfig"}},"type":"object","required":["key","name","category","fontFamily","fontWeight","fontSize","color","highlightColor","strokeColor","strokeWidth","backgroundOpacity","uppercase","maxWordsPerLine","lineHeight","animation","position"],"title":"CaptionStylePreset"},"CaptionStylesResponse":{"properties":{"styles":{"items":{"$ref":"#/components/schemas/CaptionStylePreset"},"type":"array","title":"Styles"}},"type":"object","required":["styles"],"title":"CaptionStylesResponse"},"CaptionWord":{"properties":{"text":{"type":"string","title":"Text"},"start":{"type":"number","minimum":0.0,"title":"Start"},"end":{"type":"number","minimum":0.0,"title":"End"},"highlight":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Highlight"}},"type":"object","required":["text","start","end"],"title":"CaptionWord"},"CaptionsConfig":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","default":true},"style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style","default":"clean"},"words":{"anyOf":[{"items":{"$ref":"#/components/schemas/CaptionWord"},"type":"array"},{"type":"null"}],"title":"Words"},"position":{"anyOf":[{"type":"string","enum":["top","center","bottom"]},{"type":"null"}],"title":"Position"},"positionY":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Positiony"},"uppercase":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Uppercase"},"karaoke":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Karaoke"},"overrides":{"anyOf":[{"$ref":"#/components/schemas/CaptionOverrides"},{"type":"null"}]}},"type":"object","title":"CaptionsConfig"},"CaptionsResponse":{"properties":{"words":{"items":{"$ref":"#/components/schemas/CaptionWord"},"type":"array","title":"Words"},"duration":{"type":"number","title":"Duration"}},"type":"object","required":["words","duration"],"title":"CaptionsResponse"},"CaptionsUpdateRequest":{"properties":{"words":{"items":{"$ref":"#/components/schemas/CaptionWord"},"type":"array","title":"Words"}},"type":"object","required":["words"],"title":"CaptionsUpdateRequest"},"CheckoutRequest":{"properties":{"pack_key":{"type":"string","title":"Pack Key","description":"Token pack key: 'starter', 'standard', 'pro'"}},"type":"object","required":["pack_key"],"title":"CheckoutRequest"},"CheckoutResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["checkout_url","session_id"],"title":"CheckoutResponse"},"ClipBadge":{"properties":{"label":{"type":"string","title":"Label"},"key":{"type":"string","title":"Key"},"color":{"type":"string","title":"Color"}},"type":"object","required":["label","key","color"],"title":"ClipBadge"},"ClipRenameRequest":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name"}},"type":"object","required":["name"],"title":"ClipRenameRequest"},"ClipResponse":{"properties":{"clip_id":{"type":"integer","title":"Clip Id"},"start_time":{"type":"number","title":"Start Time"},"end_time":{"type":"number","title":"End Time"},"description":{"type":"string","title":"Description"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"status":{"type":"string","title":"Status"},"is_edited":{"type":"boolean","title":"Is Edited","default":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"features":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Features"},"clip_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clip Path"},"streaming_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Streaming Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"badge":{"anyOf":[{"$ref":"#/components/schemas/ClipBadge"},{"type":"null"}]},"virality":{"anyOf":[{"$ref":"#/components/schemas/ClipVirality"},{"type":"null"}]}},"type":"object","required":["clip_id","start_time","end_time","description","status"],"title":"ClipResponse"},"ClipSettings":{"properties":{"captions":{"anyOf":[{"$ref":"#/components/schemas/CaptionsConfig"},{"type":"null"}]},"emojis":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Emojis"},"zoom":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Zoom"},"logo":{"anyOf":[{"$ref":"#/components/schemas/LogoConfig"},{"type":"null"}]},"progressBar":{"anyOf":[{"$ref":"#/components/schemas/ProgressBarConfig"},{"type":"null"}]},"output":{"anyOf":[{"$ref":"#/components/schemas/app__api__export_schemas__OutputConfig"},{"type":"null"}]},"smartCrop":{"anyOf":[{"$ref":"#/components/schemas/SmartCropConfig"},{"type":"null"}]},"gifs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Gifs"},"sfx":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Sfx"},"orientation":{"anyOf":[{"type":"string","enum":["original","vertical","horizontal","square"]},{"type":"null"}],"title":"Orientation"}},"type":"object","title":"ClipSettings","description":"Full clip editor state — saved per clip, loaded on export.\nAll fields optional; defaults applied at render time."},"ClipSettingsResponse":{"properties":{"clip_id":{"type":"integer","title":"Clip Id"},"settings":{"anyOf":[{"$ref":"#/components/schemas/ClipSettings"},{"type":"null"}]}},"type":"object","required":["clip_id"],"title":"ClipSettingsResponse"},"ClipVirality":{"properties":{"tier":{"type":"string","title":"Tier"},"label":{"type":"string","title":"Label"},"color":{"type":"string","title":"Color"}},"type":"object","required":["tier","label","color"],"title":"ClipVirality"},"CompilationArrangeRequest":{"properties":{"format":{"type":"string","enum":["auto","hook_loop","tutorial","qa_highlights"],"title":"Format"}},"type":"object","required":["format"],"title":"CompilationArrangeRequest"},"CompilationClipAddRequest":{"properties":{"clip_id":{"type":"integer","title":"Clip Id"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","required":["clip_id"],"title":"CompilationClipAddRequest"},"CompilationClipEntry":{"properties":{"compilation_clip_id":{"type":"integer","title":"Compilation Clip Id"},"position":{"type":"integer","title":"Position"},"clip_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Clip Id"},"project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"},"project_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Sec"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"badge":{"anyOf":[{"$ref":"#/components/schemas/BadgeInfo"},{"type":"null"}]},"has_smart_crop":{"type":"boolean","title":"Has Smart Crop"},"missing":{"type":"boolean","title":"Missing"},"start_offset_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Start Offset Sec"},"end_offset_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"End Offset Sec"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"overlay_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overlay Label"},"effective_duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Effective Duration Sec"}},"type":"object","required":["compilation_clip_id","position","clip_id","project_id","project_name","description","duration_sec","thumbnail_url","badge","has_smart_crop","missing"],"title":"CompilationClipEntry"},"CompilationClipPatchRequest":{"properties":{"start_offset_sec":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Start Offset Sec"},"end_offset_sec":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"End Offset Sec"},"role":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Role"},"overlay_label":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Overlay Label"}},"type":"object","title":"CompilationClipPatchRequest"},"CompilationClipReorderItem":{"properties":{"compilation_clip_id":{"type":"integer","title":"Compilation Clip Id"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["compilation_clip_id","position"],"title":"CompilationClipReorderItem"},"CompilationClipReorderRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CompilationClipReorderItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"CompilationClipReorderRequest"},"CompilationCreateRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"output":{"anyOf":[{"$ref":"#/components/schemas/app__api__compilation_schemas__OutputConfig"},{"type":"null"}]}},"type":"object","required":["name"],"title":"CompilationCreateRequest"},"CompilationDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"output":{"$ref":"#/components/schemas/app__api__compilation_schemas__OutputConfig"},"logo_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Logo Config"},"progress_bar_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Progress Bar Config"},"clips":{"items":{"$ref":"#/components/schemas/CompilationClipEntry"},"type":"array","title":"Clips"},"total_duration_sec":{"type":"number","title":"Total Duration Sec"},"has_missing_clips":{"type":"boolean","title":"Has Missing Clips"},"estimated_tokens":{"type":"integer","title":"Estimated Tokens"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"source_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Project Id"},"arrangement_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Arrangement Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","output","logo_config","progress_bar_config","clips","total_duration_sec","has_missing_clips","estimated_tokens","created_at","updated_at"],"title":"CompilationDetail"},"CompilationExportListItem":{"properties":{"export_id":{"type":"integer","title":"Export Id"},"compilation_id":{"type":"integer","title":"Compilation Id"},"status":{"type":"string","title":"Status"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"tokens_charged":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens Charged"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["export_id","compilation_id","status","created_at"],"title":"CompilationExportListItem"},"CompilationExportListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CompilationExportListItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"CompilationExportListResponse"},"CompilationExportResponse":{"properties":{"export_id":{"type":"integer","title":"Export Id"},"compilation_id":{"type":"integer","title":"Compilation Id"},"render_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Render Id"},"status":{"type":"string","title":"Status"},"estimated_tokens":{"type":"integer","title":"Estimated Tokens"},"message":{"type":"string","title":"Message"}},"type":"object","required":["export_id","compilation_id","render_id","status","estimated_tokens","message"],"title":"CompilationExportResponse"},"CompilationExportStatusResponse":{"properties":{"export_id":{"type":"integer","title":"Export Id"},"compilation_id":{"type":"integer","title":"Compilation Id"},"status":{"type":"string","title":"Status"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["export_id","compilation_id","status","created_at"],"title":"CompilationExportStatusResponse"},"CompilationFromSuggestionRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"clip_ids":{"items":{"type":"integer"},"type":"array","maxItems":100,"minItems":1,"title":"Clip Ids"},"output":{"anyOf":[{"$ref":"#/components/schemas/app__api__compilation_schemas__OutputConfig"},{"type":"null"}]}},"type":"object","required":["name","clip_ids"],"title":"CompilationFromSuggestionRequest"},"CompilationListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CompilationSummary"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"CompilationListResponse"},"CompilationSuggestRequest":{"properties":{"prompt":{"type":"string","maxLength":500,"minLength":3,"title":"Prompt"},"min_duration_sec":{"anyOf":[{"type":"number","maximum":3600.0,"minimum":5.0},{"type":"null"}],"title":"Min Duration Sec"},"max_suggestions":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Max Suggestions","default":3}},"type":"object","required":["prompt"],"title":"CompilationSuggestRequest"},"CompilationSuggestResponse":{"properties":{"suggestions":{"items":{"$ref":"#/components/schemas/SuggestionBundle"},"type":"array","title":"Suggestions"}},"type":"object","required":["suggestions"],"title":"CompilationSuggestResponse"},"CompilationSummary":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"clip_count":{"type":"integer","title":"Clip Count"},"total_duration_sec":{"type":"number","title":"Total Duration Sec"},"output":{"$ref":"#/components/schemas/app__api__compilation_schemas__OutputConfig"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"source_project_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Project Id"},"latest_export":{"anyOf":[{"$ref":"#/components/schemas/LatestExportInfo"},{"type":"null"}]},"degraded":{"type":"boolean","title":"Degraded","default":false},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","clip_count","total_duration_sec","output","updated_at","created_at"],"title":"CompilationSummary"},"CompilationUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"output":{"anyOf":[{"$ref":"#/components/schemas/app__api__compilation_schemas__OutputConfig"},{"type":"null"}]},"logo_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Logo Config"},"progress_bar_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Progress Bar Config"}},"type":"object","title":"CompilationUpdateRequest"},"ContactRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"subject":{"type":"string","maxLength":200,"minLength":1,"title":"Subject"},"message":{"type":"string","maxLength":5000,"minLength":1,"title":"Message"}},"type":"object","required":["name","email","subject","message"],"title":"ContactRequest"},"ContactResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"ContactResponse"},"CreatePackRequest":{"properties":{"key":{"type":"string","minLength":1,"title":"Key","description":"Unique key: e.g. 'starter', 'enterprise'"},"name":{"type":"string","minLength":1,"title":"Name","description":"Display name: e.g. 'Enterprise Pack'"},"tokens":{"type":"integer","exclusiveMinimum":0.0,"title":"Tokens","description":"Number of tokens in the pack"},"price_cents":{"type":"integer","exclusiveMinimum":0.0,"title":"Price Cents","description":"Price in cents: e.g. 1200 = $12.00"},"currency":{"type":"string","title":"Currency","default":"usd"},"stripe_price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id"},"bonus_tokens":{"type":"integer","minimum":0.0,"title":"Bonus Tokens","default":0},"is_active":{"type":"boolean","title":"Is Active","default":true},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["key","name","tokens","price_cents"],"title":"CreatePackRequest"},"DirectUploadInitRequest":{"properties":{"filename":{"type":"string","title":"Filename"},"size_bytes":{"type":"integer","title":"Size Bytes"},"sha256":{"type":"string","title":"Sha256"},"duration_sec":{"type":"number","title":"Duration Sec"},"content_type":{"type":"string","title":"Content Type"},"tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"min_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Duration","default":5.0},"include_captions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Captions","default":false},"karaoke_captions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Karaoke Captions","default":false},"karaoke_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Karaoke Color"},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation","default":"vertical"},"processing_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Processing Mode","default":"automatic"},"smart_crop_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smart Crop Enabled","default":false},"gemini_analysis":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Gemini Analysis","default":true},"compilation_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compilation Format"}},"type":"object","required":["filename","size_bytes","sha256","duration_sec","content_type"],"title":"DirectUploadInitRequest","description":"Request body for POST /api/v1/uploads/init.\n\nThe upload options mirror VideoUploadFromUrlRequest / the Form params of\nPOST /api/v1/upload so the frontend reuses the same option set on every\nupload path. The first five fields describe the file the browser is about\nto PUT to S3 — size_bytes becomes the hard content-length-range ceiling on\nthe presigned POST policy."},"DirectUploadInitResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"upload":{"$ref":"#/components/schemas/DirectUploadTarget"},"expires_at":{"type":"string","title":"Expires At"}},"type":"object","required":["project_id","upload","expires_at"],"title":"DirectUploadInitResponse"},"DirectUploadTarget":{"properties":{"url":{"type":"string","title":"Url"},"fields":{"additionalProperties":{"type":"string"},"type":"object","title":"Fields"}},"type":"object","required":["url","fields"],"title":"DirectUploadTarget","description":"Presigned POST payload — browser POSTs `fields` + the file to `url`."},"EmojiSuggestion":{"properties":{"emoji":{"type":"string","title":"Emoji"},"timestamp":{"type":"number","title":"Timestamp"},"duration":{"type":"number","title":"Duration"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["emoji","timestamp","duration","reason"],"title":"EmojiSuggestion","description":"A single LLM-proposed floating-emoji placement."},"EmojiSuggestionsResponse":{"properties":{"clip_id":{"type":"integer","title":"Clip Id"},"suggestions":{"items":{"$ref":"#/components/schemas/EmojiSuggestion"},"type":"array","title":"Suggestions"}},"type":"object","required":["clip_id","suggestions"],"title":"EmojiSuggestionsResponse","description":"Wraps the list returned by POST /clips/{id}/emojis/suggest."},"ExportHistoryItem":{"properties":{"export_id":{"type":"integer","title":"Export Id"},"clip_id":{"type":"integer","title":"Clip Id"},"project_id":{"type":"integer","title":"Project Id"},"status":{"type":"string","title":"Status"},"export_number":{"type":"integer","title":"Export Number"},"tokens_charged":{"type":"integer","title":"Tokens Charged"},"clip_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clip Description"},"clip_duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Clip Duration Sec"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["export_id","clip_id","project_id","status","export_number","tokens_charged","created_at"],"title":"ExportHistoryItem"},"ExportHistoryResponse":{"properties":{"exports":{"items":{"$ref":"#/components/schemas/ExportHistoryItem"},"type":"array","title":"Exports"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["exports","total","limit","offset"],"title":"ExportHistoryResponse"},"ExportResponse":{"properties":{"export_id":{"type":"integer","title":"Export Id"},"render_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Render Id"},"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["export_id","status","message"],"title":"ExportResponse"},"ExportStatusResponse":{"properties":{"export_id":{"type":"integer","title":"Export Id"},"clip_id":{"type":"integer","title":"Clip Id"},"status":{"type":"string","title":"Status"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["export_id","clip_id","status","created_at"],"title":"ExportStatusResponse"},"GifFileVariant":{"properties":{"url":{"type":"string","title":"Url"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"}},"type":"object","required":["url","width","height"],"title":"GifFileVariant"},"GifItem":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"mp4":{"$ref":"#/components/schemas/GifFileVariant"},"preview":{"$ref":"#/components/schemas/GifFileVariant"}},"type":"object","required":["id","slug","mp4","preview"],"title":"GifItem"},"GifSearchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GifItem"},"type":"array","title":"Items"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"has_next":{"type":"boolean","title":"Has Next"}},"type":"object","required":["items","page","per_page","has_next"],"title":"GifSearchResponse"},"GifSuggestion":{"properties":{"source_id":{"type":"string","title":"Source Id"},"slug":{"type":"string","title":"Slug"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"mp4_url":{"type":"string","title":"Mp4 Url"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"},"preview_url":{"type":"string","title":"Preview Url"},"timestamp":{"type":"number","title":"Timestamp"},"duration":{"type":"number","title":"Duration"},"query":{"type":"string","title":"Query"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["source_id","slug","mp4_url","width","height","preview_url","timestamp","duration","query","reason"],"title":"GifSuggestion","description":"A single LLM-proposed GIF overlay placement, resolved against Klipy."},"GifSuggestionsResponse":{"properties":{"clip_id":{"type":"integer","title":"Clip Id"},"suggestions":{"items":{"$ref":"#/components/schemas/GifSuggestion"},"type":"array","title":"Suggestions"}},"type":"object","required":["clip_id","suggestions"],"title":"GifSuggestionsResponse","description":"Wraps the list returned by POST /clips/{id}/gifs/suggest."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LatestExportInfo":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"output_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Url"}},"type":"object","required":["id","status","output_url"],"title":"LatestExportInfo"},"LogoConfig":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","default":false},"imageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imageurl"},"position":{"anyOf":[{"type":"string","enum":["top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},{"type":"null"}],"title":"Position"},"opacity":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Opacity"},"scale":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.01},{"type":"null"}],"title":"Scale"}},"type":"object","title":"LogoConfig"},"LogoUploadResponse":{"properties":{"logo_url":{"type":"string","title":"Logo Url"},"message":{"type":"string","title":"Message"}},"type":"object","required":["logo_url","message"],"title":"LogoUploadResponse"},"MetadataSuggestRequest":{"properties":{"clip_id":{"type":"integer","title":"Clip Id"},"platform":{"type":"string","pattern":"^(youtube|instagram)$","title":"Platform"}},"type":"object","required":["clip_id","platform"],"title":"MetadataSuggestRequest"},"PaginatedResponse_AdminProjectListItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AdminProjectListItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[AdminProjectListItem]"},"PaginatedResponse_AdminUserListItem_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AdminUserListItem"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[AdminUserListItem]"},"PaginatedResponse_StepLogResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/StepLogResponse"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["data","meta"],"title":"PaginatedResponse[StepLogResponse]"},"PaginationMeta":{"properties":{"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["total","skip","limit"],"title":"PaginationMeta","description":"Pagination metadata for collection responses"},"PortalResponse":{"properties":{"portal_url":{"type":"string","title":"Portal Url"}},"type":"object","required":["portal_url"],"title":"PortalResponse"},"PositionConfig":{"properties":{"vertical":{"type":"string","title":"Vertical"},"marginBottom":{"type":"integer","title":"Marginbottom"}},"type":"object","required":["vertical","marginBottom"],"title":"PositionConfig"},"ProgressBarConfig":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","default":false},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"position":{"anyOf":[{"type":"string","enum":["top","bottom"]},{"type":"null"}],"title":"Position"},"height":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Height"}},"type":"object","title":"ProgressBarConfig"},"ProjectConfigResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"project_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Project Config"}},"type":"object","required":["project_id"],"title":"ProjectConfigResponse","description":"Lightweight project configuration response"},"ProjectDeletionResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"database_deleted":{"type":"boolean","title":"Database Deleted"},"qdrant_deleted":{"type":"boolean","title":"Qdrant Deleted"},"files_deleted":{"type":"boolean","title":"Files Deleted"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"stats":{"additionalProperties":{"type":"integer"},"type":"object","title":"Stats"}},"type":"object","required":["project_id","success","message","database_deleted","qdrant_deleted","files_deleted","errors","stats"],"title":"ProjectDeletionResponse"},"ProjectListResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"filename":{"type":"string","title":"Filename"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"video_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Video Metadata"},"preview_frame_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Frame Url"},"is_demo":{"type":"boolean","title":"Is Demo","default":false}},"type":"object","required":["project_id","filename","status","created_at","updated_at"],"title":"ProjectListResponse"},"ProjectStatusResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"status":{"type":"string","title":"Status"},"total_frames":{"type":"integer","title":"Total Frames"},"total_scenes":{"type":"integer","title":"Total Scenes"},"total_clips":{"type":"integer","title":"Total Clips"},"processing_complete":{"type":"boolean","title":"Processing Complete"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"is_demo":{"type":"boolean","title":"Is Demo","default":false},"project_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Project Config"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"task_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Status"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"progress_percent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress Percent"},"current_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Step"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"estimated_completion_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Completion Time"},"estimated_remaining_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Remaining Seconds"}},"type":"object","required":["project_id","status","total_frames","total_scenes","total_clips","processing_complete"],"title":"ProjectStatusResponse"},"ReleaseReservationsRequest":{"properties":{"reason":{"type":"string","title":"Reason","description":"Reason for releasing stuck reservations","default":"Manual release of stuck reservations"}},"type":"object","title":"ReleaseReservationsRequest"},"ReleaseReservationsResponse":{"properties":{"released_count":{"type":"integer","title":"Released Count"},"stuck_before":{"type":"integer","title":"Stuck Before"},"message":{"type":"string","title":"Message"}},"type":"object","required":["released_count","stuck_before","message"],"title":"ReleaseReservationsResponse"},"RevenueSummaryResponse":{"properties":{"period_days":{"type":"integer","title":"Period Days"},"total_tokens_purchased":{"type":"integer","title":"Total Tokens Purchased"},"total_tokens_refunded":{"type":"integer","title":"Total Tokens Refunded"},"net_tokens":{"type":"integer","title":"Net Tokens"},"purchase_count":{"type":"integer","title":"Purchase Count"}},"type":"object","required":["period_days","total_tokens_purchased","total_tokens_refunded","net_tokens","purchase_count"],"title":"RevenueSummaryResponse"},"ScheduledPostCreate":{"properties":{"social_account_id":{"type":"integer","title":"Social Account Id"},"clip_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Clip Id"},"export_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Export Id"},"compilation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Compilation Id"},"compilation_export_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Compilation Export Id"},"scheduled_at":{"type":"string","format":"date-time","title":"Scheduled At"},"title":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Description"},"hashtags":{"items":{"type":"string"},"type":"array","maxItems":30,"title":"Hashtags"},"privacy":{"type":"string","pattern":"^(public|unlisted|private)$","title":"Privacy","default":"public"}},"type":"object","required":["social_account_id","scheduled_at"],"title":"ScheduledPostCreate","description":"A post targets exactly ONE media source: a clip export pair OR a\ncompilation export pair. The FE triggers the export first (existing\nendpoints) and passes its id alongside its parent's."},"ScheduledPostUpdate":{"properties":{"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"title":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Description"},"hashtags":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":30},{"type":"null"}],"title":"Hashtags"},"privacy":{"anyOf":[{"type":"string","pattern":"^(public|unlisted|private)$"},{"type":"null"}],"title":"Privacy"}},"type":"object","title":"ScheduledPostUpdate"},"SfxSoundResponse":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"duration_ms":{"type":"integer","title":"Duration Ms"},"play_url":{"type":"string","title":"Play Url"},"audio_url":{"type":"string","title":"Audio Url"}},"type":"object","required":["id","slug","name","category","duration_ms","play_url","audio_url"],"title":"SfxSoundResponse","description":"Single sound effect in the global library."},"SfxSuggestion":{"properties":{"sfx_id":{"type":"integer","title":"Sfx Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"timestamp":{"type":"number","title":"Timestamp"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["sfx_id","slug","name","timestamp","reason"],"title":"SfxSuggestion","description":"A single LLM-proposed sound effect placement for a clip."},"SfxSuggestionsResponse":{"properties":{"clip_id":{"type":"integer","title":"Clip Id"},"suggestions":{"items":{"$ref":"#/components/schemas/SfxSuggestion"},"type":"array","title":"Suggestions"}},"type":"object","required":["clip_id","suggestions"],"title":"SfxSuggestionsResponse","description":"Wraps the list returned by POST /clips/{id}/sfx/suggest."},"SmartCropConfig":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","default":false},"camera_log":{"anyOf":[{"items":{"$ref":"#/components/schemas/SmartCropKeyframe"},"type":"array"},{"type":"null"}],"title":"Camera Log"},"stackEnabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stackenabled"},"stackedSegments":{"anyOf":[{"items":{"$ref":"#/components/schemas/StackedSegment"},"type":"array"},{"type":"null"}],"title":"Stackedsegments"}},"type":"object","title":"SmartCropConfig"},"SmartCropKeyframe":{"properties":{"timestamp_ms":{"type":"integer","minimum":0.0,"title":"Timestamp Ms"},"camera_center_x":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Camera Center X"},"movement_speed":{"type":"string","enum":["static","slow","medium","fast","instant"],"title":"Movement Speed"}},"type":"object","required":["timestamp_ms","camera_center_x","movement_speed"],"title":"SmartCropKeyframe"},"SpeakerPane":{"properties":{"slot":{"type":"integer","maximum":2.0,"minimum":0.0,"title":"Slot"},"center_x":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Center X"},"center_y":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Center Y"}},"type":"object","required":["slot","center_x","center_y"],"title":"SpeakerPane","description":"One speaker's face position inside a stacked segment (0-1000 coords)."},"StackedSegment":{"properties":{"start_ms":{"type":"integer","minimum":0.0,"title":"Start Ms"},"end_ms":{"type":"integer","minimum":0.0,"title":"End Ms"},"speakers":{"items":{"$ref":"#/components/schemas/SpeakerPane"},"type":"array","maxItems":3,"minItems":2,"title":"Speakers"}},"type":"object","required":["start_ms","end_ms","speakers"],"title":"StackedSegment","description":"A time range rendered as vertically stacked speaker panes.\nIn ExportConfig, times are clip-relative ms (rebased at export build)."},"StepLogResponse":{"properties":{"id":{"type":"integer","title":"Id"},"task_id":{"type":"string","title":"Task Id"},"step_name":{"type":"string","title":"Step Name"},"level":{"type":"string","title":"Level"},"message":{"type":"string","title":"Message"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["id","task_id","step_name","level","message","timestamp"],"title":"StepLogResponse","description":"Step log entry"},"StripeEventListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/StripeEventResponse"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["data","total","limit","offset"],"title":"StripeEventListResponse"},"StripeEventResponse":{"properties":{"id":{"type":"integer","title":"Id"},"stripe_event_id":{"type":"string","title":"Stripe Event Id"},"event_type":{"type":"string","title":"Event Type"},"processed":{"type":"boolean","title":"Processed"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["id","stripe_event_id","event_type","processed","created_at"],"title":"StripeEventResponse"},"StuckReservationCountResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"stuck_count":{"type":"integer","title":"Stuck Count"},"safety_minutes":{"type":"integer","title":"Safety Minutes"}},"type":"object","required":["user_id","stuck_count","safety_minutes"],"title":"StuckReservationCountResponse"},"SubscribeRequest":{"properties":{"plan_key":{"type":"string","title":"Plan Key"},"interval":{"type":"string","pattern":"^(month|year)$","title":"Interval","default":"month"}},"type":"object","required":["plan_key"],"title":"SubscribeRequest"},"SubscriptionPlanResponse":{"properties":{"id":{"type":"integer","title":"Id"},"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"price_monthly_cents":{"type":"integer","title":"Price Monthly Cents"},"price_yearly_cents":{"type":"integer","title":"Price Yearly Cents"},"stripe_price_id_monthly":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id Monthly"},"stripe_price_id_yearly":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id Yearly"},"monthly_tokens":{"type":"integer","title":"Monthly Tokens"},"gemini_analysis":{"type":"boolean","title":"Gemini Analysis"},"smart_crop":{"type":"boolean","title":"Smart Crop"},"monthly_export_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Export Limit"},"watermark":{"type":"boolean","title":"Watermark"},"social_scheduling":{"type":"boolean","title":"Social Scheduling","default":false},"api_access":{"type":"boolean","title":"Api Access","default":false},"is_active":{"type":"boolean","title":"Is Active"},"sort_order":{"type":"integer","title":"Sort Order"}},"type":"object","required":["id","key","name","price_monthly_cents","price_yearly_cents","monthly_tokens","gemini_analysis","smart_crop","watermark","is_active","sort_order"],"title":"SubscriptionPlanResponse"},"SubscriptionStatusResponse":{"properties":{"plan_key":{"type":"string","title":"Plan Key"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"billing_interval":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Interval"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End","default":false},"tokens_available":{"type":"integer","title":"Tokens Available"},"exports_used":{"type":"integer","title":"Exports Used"},"export_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Export Limit"},"watermark":{"type":"boolean","title":"Watermark"},"gemini_analysis":{"type":"boolean","title":"Gemini Analysis"},"smart_crop":{"type":"boolean","title":"Smart Crop"},"social_scheduling":{"type":"boolean","title":"Social Scheduling","default":false},"api_access":{"type":"boolean","title":"Api Access","default":false}},"type":"object","required":["plan_key","tokens_available","exports_used","watermark","gemini_analysis","smart_crop"],"title":"SubscriptionStatusResponse"},"SuggestionBundle":{"properties":{"theme":{"type":"string","maxLength":100,"title":"Theme"},"reason":{"type":"string","maxLength":300,"title":"Reason"},"clip_ids":{"items":{"type":"integer"},"type":"array","title":"Clip Ids"},"total_duration_sec":{"type":"number","title":"Total Duration Sec"}},"type":"object","required":["theme","reason","clip_ids","total_duration_sec"],"title":"SuggestionBundle"},"TimelineFrameItem":{"properties":{"timestamp":{"type":"number","title":"Timestamp"},"frame_id":{"type":"string","title":"Frame Id"},"thumbnail_url":{"type":"string","title":"Thumbnail Url"}},"type":"object","required":["timestamp","frame_id","thumbnail_url"],"title":"TimelineFrameItem"},"TimelineResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"video_url":{"type":"string","title":"Video Url"},"frame_interval":{"type":"number","title":"Frame Interval"},"total_duration":{"type":"number","title":"Total Duration"},"total_frames":{"type":"integer","title":"Total Frames"},"frames":{"items":{"$ref":"#/components/schemas/TimelineFrameItem"},"type":"array","title":"Frames"}},"type":"object","required":["project_id","video_url","frame_interval","total_duration","total_frames","frames"],"title":"TimelineResponse"},"TokenPackResponse":{"properties":{"id":{"type":"integer","title":"Id"},"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"tokens":{"type":"integer","title":"Tokens"},"price_cents":{"type":"integer","title":"Price Cents"},"currency":{"type":"string","title":"Currency"},"stripe_price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id"},"bonus_tokens":{"type":"integer","title":"Bonus Tokens"},"is_active":{"type":"boolean","title":"Is Active"},"sort_order":{"type":"integer","title":"Sort Order"}},"type":"object","required":["id","key","name","tokens","price_cents","currency","bonus_tokens","is_active","sort_order"],"title":"TokenPackResponse"},"TransactionListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TransactionResponse"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["data","total","limit","offset"],"title":"TransactionListResponse"},"TransactionResponse":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"amount":{"type":"integer","title":"Amount"},"balance_after":{"type":"integer","title":"Balance After"},"reference_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Type"},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_settled":{"type":"boolean","title":"Is Settled","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","type","amount","balance_after","created_at"],"title":"TransactionResponse"},"UpdatePackRequest":{"properties":{"stripe_price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"bonus_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bonus Tokens"},"price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Cents"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"UpdatePackRequest"},"UpdatePlanRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"price_monthly_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Monthly Cents"},"price_yearly_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Yearly Cents"},"stripe_price_id_monthly":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id Monthly"},"stripe_price_id_yearly":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id Yearly"},"monthly_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Tokens"},"gemini_analysis":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Gemini Analysis"},"smart_crop":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smart Crop"},"monthly_export_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Export Limit"},"watermark":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Watermark"},"social_scheduling":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Social Scheduling"},"api_access":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Api Access"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"UpdatePlanRequest"},"UpdateSceneBoundariesRequest":{"properties":{"new_start_time":{"type":"number","title":"New Start Time"},"new_end_time":{"type":"number","title":"New End Time"}},"type":"object","required":["new_start_time","new_end_time"],"title":"UpdateSceneBoundariesRequest"},"UpdateSceneBoundariesResponse":{"properties":{"scene_id":{"type":"integer","title":"Scene Id"},"project_id":{"type":"integer","title":"Project Id"},"old_start_time":{"type":"number","title":"Old Start Time"},"old_end_time":{"type":"number","title":"Old End Time"},"new_start_time":{"type":"number","title":"New Start Time"},"new_end_time":{"type":"number","title":"New End Time"},"message":{"type":"string","title":"Message"}},"type":"object","required":["scene_id","project_id","old_start_time","old_end_time","new_start_time","new_end_time","message"],"title":"UpdateSceneBoundariesResponse"},"UsageSummaryResponse":{"properties":{"period_days":{"type":"integer","title":"Period Days"},"tokens_spent":{"type":"integer","title":"Tokens Spent"},"tokens_purchased":{"type":"integer","title":"Tokens Purchased"},"uploads_count":{"type":"integer","title":"Uploads Count"},"exports_count":{"type":"integer","title":"Exports Count"},"minutes_processed":{"type":"number","title":"Minutes Processed"},"minutes_exported":{"type":"number","title":"Minutes Exported"}},"type":"object","required":["period_days","tokens_spent","tokens_purchased","uploads_count","exports_count","minutes_processed","minutes_exported"],"title":"UsageSummaryResponse"},"UserResponse":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"given_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Given Name"},"family_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family Name"},"picture_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Picture Url"},"is_active":{"type":"boolean","title":"Is Active"},"is_admin":{"type":"boolean","title":"Is Admin"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"}},"type":"object","required":["id","email","is_active","is_admin","created_at"],"title":"UserResponse","description":"Public user information returned by API"},"UserSettingsResponse":{"properties":{"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"}},"type":"object","title":"UserSettingsResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VideoUploadFromUrlRequest":{"properties":{"source_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Source Url"},"tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"min_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Duration","default":5.0},"include_captions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Captions","default":false},"karaoke_captions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Karaoke Captions","default":false},"karaoke_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Karaoke Color"},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation","default":"vertical"},"processing_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Processing Mode","default":"automatic"},"smart_crop_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smart Crop Enabled","default":false},"gemini_analysis":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Gemini Analysis","default":true},"compilation_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compilation Format"}},"type":"object","required":["source_url"],"title":"VideoUploadFromUrlRequest","description":"Request body for POST /api/v1/upload/from-url.\n\nMirrors the Form parameters of POST /api/v1/upload so the frontend\ncan reuse the same options for both upload paths."},"VideoUploadResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"message":{"type":"string","title":"Message"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"progress_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Url"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"}},"type":"object","required":["project_id","message","metadata"],"title":"VideoUploadResponse"},"VisionAnalysisRunResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"status":{"type":"string","title":"Status"},"tokens_reserved":{"type":"integer","title":"Tokens Reserved"},"progress_url":{"type":"string","title":"Progress Url"}},"type":"object","required":["project_id","status","tokens_reserved","progress_url"],"title":"VisionAnalysisRunResponse","description":"Response for POST /projects/{id}/vision-analysis (on-demand analysis)."},"app__api__compilation_schemas__OutputConfig":{"properties":{"width":{"type":"integer","title":"Width","default":1080},"height":{"type":"integer","title":"Height","default":1920},"fps":{"type":"integer","title":"Fps","default":30}},"type":"object","title":"OutputConfig"},"app__api__export_schemas__OutputConfig":{"properties":{"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"fps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fps"}},"type":"object","title":"OutputConfig"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}