{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/api/auth/magic-link":{"post":{"summary":"Request Magic Link","operationId":"request_magic_link_api_auth_magic_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/magic-link/verify":{"post":{"summary":"Verify Magic Link","operationId":"verify_magic_link_api_auth_magic_link_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/attribution":{"post":{"summary":"Record Attribution","description":"Record where a brand-new account came from. First touch wins.\n\nFire-and-forget from the client right after sign-in: it never fails the\nsign-up, it just returns ``recorded: false`` when the row already exists or\nthe account is too old to be a genuine sign-up.","operationId":"record_attribution_api_auth_attribution_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me":{"get":{"summary":"Get Me","operationId":"get_me_api_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/google":{"get":{"summary":"Google Login","operationId":"google_login_api_auth_google_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/google/callback":{"get":{"summary":"Google Callback","operationId":"google_callback_api_auth_google_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/plans":{"get":{"summary":"List Plans","operationId":"list_plans_api_billing_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/checkout":{"post":{"summary":"Create Checkout","operationId":"create_checkout_api_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/end-trial":{"post":{"summary":"End Trial","description":"End the free trial immediately: charge the card now and unlock full plan\nminutes. Kept for grandfathered trialing subscriptions — removable once\n``SELECT count(*) FROM subscriptions WHERE status='trialing'`` reaches 0.\nUsed when a trialing user hits the trial minute cap and chooses to\nactivate their plan right away. The subscription webhook flips status→active\n(and thus the full ``minutes_per_period`` allowance) once Stripe confirms.","operationId":"end_trial_api_billing_end_trial_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/portal":{"post":{"summary":"Create Portal","operationId":"create_portal_api_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/invoices":{"get":{"summary":"List Invoices","description":"Legal invoices for the signed-in user: ``{\"invoices\": [{doc_number,\ndoc_date, total, currency, status, public_url, pdf_url}]}``. Free users\n(no Stripe customer yet) get an empty list, not an error.","operationId":"list_invoices_api_billing_invoices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stripe/webhook":{"post":{"summary":"Stripe Webhook","operationId":"stripe_webhook_api_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/social/connect":{"post":{"summary":"Social Connect","description":"Return a branded Upload-Post connection URL for the signed-in managed user.","operationId":"social_connect_api_social_connect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/projects":{"get":{"summary":"List Projects","description":"List the signed-in user's re-openable projects.","operationId":"list_projects_api_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/projects/{job_id}/state":{"put":{"summary":"Save Project State","description":"Persist the browser-only edit state of a project's clips.\n\nBody: {\"clips\": [{\"index\", \"active_layers\", \"server_file\"?}]}. The Remotion\nlayers exist nowhere but the browser, so the frontend syncs them here\n(debounced) to survive reload / reopen.","operationId":"save_project_state_api_projects__job_id__state_put","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/history":{"get":{"summary":"History","description":"List the signed-in user's saved videos with private, time-limited links.","operationId":"history_api_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/keys":{"get":{"summary":"List Keys","operationId":"list_keys_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Key","operationId":"create_key_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/{key_id}":{"delete":{"summary":"Revoke Key","operationId":"revoke_key_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"summary":"Protected Resource","operationId":"protected_resource__well_known_oauth_protected_resource_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"summary":"Protected Resource","operationId":"protected_resource__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/mcp":{"get":{"summary":"Authorization Server","operationId":"authorization_server__well_known_oauth_authorization_server_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"summary":"Authorization Server","operationId":"authorization_server__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/register":{"post":{"summary":"Register Client","operationId":"register_client_oauth_register_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Preflight","operationId":"preflight_oauth_register_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/authorize":{"get":{"summary":"Authorize","operationId":"authorize_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/oauth/client/{client_id}":{"get":{"summary":"Client Info","description":"What the consent screen shows: the name the client registered with.","operationId":"client_info_api_oauth_client__client_id__get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/authorize":{"post":{"summary":"Consent","description":"The user said yes on the dashboard: mint the code, return where to go.","operationId":"consent_api_oauth_authorize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/token":{"post":{"summary":"Token","operationId":"token_oauth_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Preflight","operationId":"preflight_oauth_token_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account":{"delete":{"summary":"Delete Account","operationId":"delete_account_api_account_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"get":{"summary":"Mcp Get","operationId":"mcp_get_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Mcp Endpoint","operationId":"mcp_endpoint_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","description":"Lightweight liveness probe for uptime monitoring.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/ready":{"get":{"summary":"Health Ready","description":"Readiness probe for the Docker HEALTHCHECK (Dockerfile). Traefik's docker\nprovider drops a container from the load balancer as soon as it turns\nunhealthy, so answering 503 from the moment SIGTERM arrives pulls this\ninstance out of rotation while it can still serve, instead of after its\nsocket is gone. Only SIGTERM flips it: a drain triggered by the instance\nmarker starts while the new container is still booting, and going\nunready then would leave nobody routable.","operationId":"health_ready_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/config":{"get":{"summary":"Get Config","operationId":"get_config_api_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/uploads":{"post":{"summary":"Create Upload","description":"Reserve an upload slot. Body (JSON, optional): {\"filename\": \"...\"}.","operationId":"create_upload_api_uploads_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/uploads/{upload_id}":{"put":{"summary":"Put Upload","description":"Receive the raw video body for a reserved slot. Streams to disk, capped\nat MAX_FILE_SIZE_MB; a second PUT replaces the first.","operationId":"put_upload_api_uploads__upload_id__put","parameters":[{"name":"upload_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Upload","description":"Drop a slot and its file before it expires (owner only in cloud mode).","operationId":"delete_upload_api_uploads__upload_id__delete","parameters":[{"name":"upload_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/process":{"post":{"summary":"Process Endpoint","operationId":"process_endpoint_api_process_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_process_endpoint_api_process_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/{job_id}":{"get":{"summary":"Get Status","operationId":"get_status_api_status__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/source-url/{job_id}":{"get":{"summary":"Get Source Url","description":"Mint a short-lived signed URL for this job's source video.\n\nA `<video src>` cannot carry an Authorization header, which is why\n/api/source was left open in the first place. So the owner asks for a\ncapability URL here, with the bearer token, and hands the player that.","operationId":"get_source_url_api_source_url__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/source/{job_id}":{"get":{"summary":"Get Source Video","description":"Stream a job's original source video for the live-analysis preview and\nthe clip editor's source monitor.\n\nUploaded sources are blob URLs in the browser and don't survive a reload,\nso the recovered session points the preview here instead.\n\nThis one endpoint serves the untouched original, which for a URL job is the\nfile we downloaded. Left open it is a public downloader wearing a UUID, so\na cloud job with an owner needs either a signed URL from /api/source-url or\na bearer token on the request. Self-host and ownerless BYOK jobs are\nunchanged: there is no owner to check and no secret to sign with.","operationId":"get_source_video_api_source__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"exp","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Exp"}},{"name":"sig","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/download-all":{"get":{"summary":"Download All Clips","description":"Bundle the current version of every clip of a job into one ZIP.","operationId":"download_all_clips_api_jobs__job_id__download_all_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{job_id}/restore":{"post":{"summary":"Restore Project","operationId":"restore_project_api_projects__job_id__restore_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/edit":{"post":{"summary":"Edit Clip","operationId":"edit_clip_api_edit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clip/{job_id}/{clip_index}/transcript":{"get":{"summary":"Get Clip Transcript","description":"Return word-level captions for a specific clip, formatted for Remotion.","operationId":"get_clip_transcript_api_clip__job_id___clip_index__transcript_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"clip_index","in":"path","required":true,"schema":{"type":"integer","title":"Clip Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clip/{job_id}/{clip_index}/edl":{"get":{"summary":"Get Clip Edl","description":"The clip's editable recipe: which source segments it was cut from, the\nword timeline around them, and whether the source is still available for\ncuts outside the original range.","operationId":"get_clip_edl_api_clip__job_id___clip_index__edl_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"clip_index","in":"path","required":true,"schema":{"type":"integer","title":"Clip Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clip/rerender":{"post":{"summary":"Rerender Clip","description":"Re-render a clip from an edited EDL (the clip editor's save button).\n\nTwo paths, chosen automatically:\n- FAST: every segment stays inside the range the canonical clip was cut\n  from → recut straight from the already-reframed canonical file. No ML,\n  no source needed.\n- SOURCE: a segment reaches outside → recut from the retained source and\n  re-reframe with the same engine the pipeline used. 409 when the source\n  already aged out.","operationId":"rerender_clip_api_clip_rerender_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RerenderRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clip/{job_id}/{clip_index}/scenes":{"get":{"summary":"Get Clip Scenes","description":"Scenes of a clip, each with a SOURCE frame to frame it against.\n\nThe frames come from the uncropped cut, not the delivered clip: the point\nis to show what the automatic crop threw away, which the 9:16 file no\nlonger contains.","operationId":"get_clip_scenes_api_clip__job_id___clip_index__scenes_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"clip_index","in":"path","required":true,"schema":{"type":"integer","title":"Clip Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clip/reframe":{"post":{"summary":"Reframe Clip","description":"Re-render a clip with hand-framed scenes, leaving its cut untouched.\n\nDeliberately separate from /api/clip/rerender: the overrides are keyed by\nscene index, and a scene index only means anything against a given cut. If\nframing rode along with a trim save, changing the trim would silently move\nevery override onto the wrong shot.","operationId":"reframe_clip_api_clip_reframe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReframeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/render":{"post":{"summary":"Proxy Render","description":"Proxy render requests to the Node.js Remotion render service.","operationId":"proxy_render_api_render_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/render/{render_id}":{"get":{"summary":"Proxy Render Status","description":"Proxy render status polling to the Node.js Remotion render service.","operationId":"proxy_render_status_api_render__render_id__get","parameters":[{"name":"render_id","in":"path","required":true,"schema":{"type":"string","title":"Render Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/effects/generate":{"post":{"summary":"Generate Effects Config","description":"Generate structured EffectsConfig JSON for Remotion rendering via Gemini AI.","operationId":"generate_effects_config_api_effects_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EffectsGenerateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subtitle":{"post":{"summary":"Add Subtitles","operationId":"add_subtitles_api_subtitle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubtitleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subtitle/remove":{"post":{"summary":"Remove Subtitles","description":"Point a clip back at its un-captioned original.\n\nClips ship captioned by default now, so there has to be a way out — without\nthis, a user who doesn't want captions is stuck with them. No re-encode and\nno quota: the pipeline always keeps the clean file next to the derived\n``subtitled_<ts>_`` one, so removing is just choosing the other file.","operationId":"remove_subtitles_api_subtitle_remove_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveSubtitlesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hook":{"post":{"summary":"Add Hook","operationId":"add_hook_api_hook_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HookRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/translate/languages":{"get":{"summary":"Get Languages","description":"Return supported languages for translation.","operationId":"get_languages_api_translate_languages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/translate":{"post":{"summary":"Translate Clip","description":"Translate a video clip to a different language using ElevenLabs dubbing.","operationId":"translate_clip_api_translate_post","parameters":[{"name":"X-ElevenLabs-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Elevenlabs-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/social/post":{"post":{"summary":"Post To Socials","operationId":"post_to_socials_api_social_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialPostRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/social/user":{"get":{"summary":"Get Social User","description":"Proxy to fetch user profiles from Upload-Post.\n\nBYOK: uses the caller's key and returns all profiles on that account.\nManaged: uses the server key but returns ONLY the caller's own profile.","operationId":"get_social_user_api_social_user_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/social/analytics":{"get":{"summary":"Social Profile Analytics","description":"Aggregated profile analytics: followers, views, engagement per platform.","operationId":"social_profile_analytics_api_social_analytics_get","parameters":[{"name":"platforms","in":"query","required":false,"schema":{"type":"string","default":"tiktok,instagram,youtube","title":"Platforms"}},{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/social/analytics/posts":{"get":{"summary":"Social Post Analytics","description":"Per-post metrics for the profile's published posts (Upload-Post cache).","operationId":"social_post_analytics_api_social_analytics_posts_get","parameters":[{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"}},{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/social/analytics/impressions":{"get":{"summary":"Social Total Impressions","description":"Total impressions for the profile over a window.\n\nComputed by aggregating the profile-scoped post cache instead of proxying\nUpload-Post's /total-impressions: that endpoint echoes the requested\nprofile but returns account-wide numbers (observed 2026-08-21 — a profile\nwith zero posts got 85K Instagram impressions), which for managed users\nwould leak other tenants' aggregates. The cache endpoint IS scoped by\n?user=, so summing it is both correct and cheap.","operationId":"social_total_impressions_api_social_analytics_impressions_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"breakdown","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Breakdown"}},{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/social/scheduled":{"get":{"summary":"Social Scheduled","description":"Pending scheduled posts for the caller's profile, soonest first.","operationId":"social_scheduled_api_social_scheduled_get","parameters":[{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/social/scheduled/{job_id}":{"delete":{"summary":"Social Cancel Scheduled","description":"Cancel one pending scheduled post, if it belongs to the caller.","operationId":"social_cancel_scheduled_api_social_scheduled__job_id__delete","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumbnail/upload":{"post":{"summary":"Thumbnail Upload","description":"Upload video and start background Whisper transcription immediately.","operationId":"thumbnail_upload_api_thumbnail_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_thumbnail_upload_api_thumbnail_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumbnail/analyze":{"post":{"summary":"Thumbnail Analyze","description":"Analyze a video and suggest viral YouTube titles.","operationId":"thumbnail_analyze_api_thumbnail_analyze_post","parameters":[{"name":"X-Gemini-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Gemini-Key"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_thumbnail_analyze_api_thumbnail_analyze_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumbnail/titles":{"post":{"summary":"Thumbnail Titles","description":"Refine title suggestions or accept a manual title.","operationId":"thumbnail_titles_api_thumbnail_titles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThumbnailTitlesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumbnail/generate":{"post":{"summary":"Thumbnail Generate","description":"Generate YouTube thumbnails with Gemini image generation.\n\nburn_text: the image model paints the scene with clean negative space and\nPIL sets the hook text (Anton, black stroke). Off = the model renders the\ntext itself, which is prettier when it works and misspelled when it does\nnot. frame: url of a frame from /api/thumbnail/frames to use as the\nperson reference when no face photo is uploaded.","operationId":"thumbnail_generate_api_thumbnail_generate_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_thumbnail_generate_api_thumbnail_generate_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumbnail/frames/{session_id}":{"get":{"summary":"Thumbnail Frames","description":"Frames of the session's video with a large, sharp face, as candidates\nfor the thumbnail's person reference. Computed once and cached.","operationId":"thumbnail_frames_api_thumbnail_frames__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumbnail/describe":{"post":{"summary":"Thumbnail Describe","description":"Generate a YouTube description with chapters from the transcript.","operationId":"thumbnail_describe_api_thumbnail_describe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThumbnailDescribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumbnail/publish":{"post":{"summary":"Thumbnail Publish","description":"Kick off a background upload to YouTube via Upload-Post and return immediately.","operationId":"thumbnail_publish_api_thumbnail_publish_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_thumbnail_publish_api_thumbnail_publish_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumbnail/publish/status/{publish_id}":{"get":{"summary":"Thumbnail Publish Status","description":"Poll the status of a background publish job.","operationId":"thumbnail_publish_status_api_thumbnail_publish_status__publish_id__get","parameters":[{"name":"publish_id","in":"path","required":true,"schema":{"type":"string","title":"Publish Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/saasshorts/analyze":{"post":{"summary":"Saasshorts Analyze","description":"Analyze a URL or manual description and generate video scripts.","operationId":"saasshorts_analyze_api_saasshorts_analyze_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaaSAnalyzeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/saasshorts/actor-upload":{"post":{"summary":"Saasshorts Actor Upload","description":"Upload a custom actor image (stored locally only, not S3).","operationId":"saasshorts_actor_upload_api_saasshorts_actor_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_saasshorts_actor_upload_api_saasshorts_actor_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/saasshorts/actor-options":{"post":{"summary":"Saasshorts Actor Options","description":"Generate multiple actor image options for the user to choose from.","operationId":"saasshorts_actor_options_api_saasshorts_actor_options_post","parameters":[{"name":"X-Fal-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Fal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaaSActorRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/saasshorts/gallery":{"get":{"summary":"Saasshorts Video Gallery","description":"List all UGC videos from the public gallery.","operationId":"saasshorts_video_gallery_api_saasshorts_gallery_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/saasshorts/post":{"post":{"summary":"Saasshorts Post To Socials","description":"Post an AI Shorts video to social media via Upload-Post.","operationId":"saasshorts_post_to_socials_api_saasshorts_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaaSPostRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gallery":{"get":{"summary":"Gallery Html Page","description":"SEO gallery page with all generated UGC videos.","operationId":"gallery_html_page_gallery_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/video/{video_id}":{"get":{"summary":"Video Html Page","description":"SEO individual video page with og:video meta tags.","operationId":"video_html_page_video__video_id__get","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/saasshorts/actor-gallery":{"get":{"summary":"Saasshorts Actor Gallery","description":"List all previously generated actor images from public S3.","operationId":"saasshorts_actor_gallery_api_saasshorts_actor_gallery_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/saasshorts/generate":{"post":{"summary":"Saasshorts Generate","description":"Generate a SaaS UGC video from a script. Returns a job_id for polling.","operationId":"saasshorts_generate_api_saasshorts_generate_post","parameters":[{"name":"X-Fal-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Fal-Key"}},{"name":"X-ElevenLabs-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Elevenlabs-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaaSGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/saasshorts/status/{job_id}":{"get":{"summary":"Saasshorts Status","description":"Poll SaaSShorts job status.","operationId":"saasshorts_status_api_saasshorts_status__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/saasshorts/voices":{"get":{"summary":"Saasshorts Voices","description":"List available ElevenLabs voices.","operationId":"saasshorts_voices_api_saasshorts_voices_get","parameters":[{"name":"X-ElevenLabs-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Elevenlabs-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AttributionPayload":{"properties":{"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"landing_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Path"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"}},"type":"object","title":"AttributionPayload"},"Body_process_endpoint_api_process_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"acknowledged":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acknowledged"},"output_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Format"},"layouts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Layouts"},"force_low_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Force Low Quality"},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"},"webhook_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Secret"},"target_clips":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Clips"},"clip_min_seconds":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clip Min Seconds"},"clip_max_seconds":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clip Max Seconds"},"auto_hook":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Hook"},"auto_hook_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Hook Style"},"thumbnail_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Session Id"},"captions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captions"},"upload_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Id"}},"type":"object","title":"Body_process_endpoint_api_process_post"},"Body_saasshorts_actor_upload_api_saasshorts_actor_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_saasshorts_actor_upload_api_saasshorts_actor_upload_post"},"Body_thumbnail_analyze_api_thumbnail_analyze_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","title":"Body_thumbnail_analyze_api_thumbnail_analyze_post"},"Body_thumbnail_generate_api_thumbnail_generate_post":{"properties":{"session_id":{"type":"string","title":"Session Id"},"title":{"type":"string","title":"Title"},"extra_prompt":{"type":"string","title":"Extra Prompt","default":""},"count":{"type":"integer","title":"Count","default":3},"burn_text":{"type":"boolean","title":"Burn Text","default":true},"frame":{"type":"string","title":"Frame","default":""},"face":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"Face"},"background":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"Background"}},"type":"object","required":["session_id","title"],"title":"Body_thumbnail_generate_api_thumbnail_generate_post"},"Body_thumbnail_publish_api_thumbnail_publish_post":{"properties":{"session_id":{"type":"string","title":"Session Id"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"thumbnail_url":{"type":"string","title":"Thumbnail Url"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["session_id","title","description","thumbnail_url"],"title":"Body_thumbnail_publish_api_thumbnail_publish_post"},"Body_thumbnail_upload_api_thumbnail_upload_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"Body_thumbnail_upload_api_thumbnail_upload_post"},"CaptionWordIn":{"properties":{"text":{"type":"string","title":"Text"},"startMs":{"type":"integer","title":"Startms"},"endMs":{"type":"integer","title":"Endms"}},"type":"object","required":["text","startMs","endMs"],"title":"CaptionWordIn","description":"One user-edited caption word, clip-relative ms — the same shape the\n/transcript endpoint hands the subtitle modal."},"CheckoutRequest":{"properties":{"price_id":{"type":"string","title":"Price Id"}},"type":"object","required":["price_id"],"title":"CheckoutRequest"},"ConsentRequest":{"properties":{"client_id":{"type":"string","title":"Client Id"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"code_challenge":{"type":"string","title":"Code Challenge"},"code_challenge_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Challenge Method","default":"S256"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"response_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Type","default":"code"}},"type":"object","required":["client_id","redirect_uri","code_challenge"],"title":"ConsentRequest"},"CreateKeyRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"CreateKeyRequest"},"DeleteAccountRequest":{"properties":{"confirm_email":{"type":"string","title":"Confirm Email"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["confirm_email"],"title":"DeleteAccountRequest"},"EditRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"clip_index":{"type":"integer","title":"Clip Index"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"input_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Filename"}},"type":"object","required":["job_id","clip_index"],"title":"EditRequest"},"EffectsGenerateRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"clip_index":{"type":"integer","title":"Clip Index"},"input_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Filename"}},"type":"object","required":["job_id","clip_index"],"title":"EffectsGenerateRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HookRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"clip_index":{"type":"integer","title":"Clip Index"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","default":""},"input_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Filename"},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","default":"top"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size","default":"M"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style","default":"classic"},"remove":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remove","default":false}},"type":"object","required":["job_id","clip_index"],"title":"HookRequest"},"MagicLinkRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"MagicLinkRequest"},"MagicVerifyRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"MagicVerifyRequest"},"ReframeRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"clip_index":{"type":"integer","title":"Clip Index"},"crop_overrides":{"additionalProperties":true,"type":"object","title":"Crop Overrides"},"reapply_captions":{"type":"boolean","title":"Reapply Captions","default":true}},"type":"object","required":["job_id","clip_index","crop_overrides"],"title":"ReframeRequest"},"RemoveSubtitlesRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"clip_index":{"type":"integer","title":"Clip Index"},"input_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Filename"}},"type":"object","required":["job_id","clip_index"],"title":"RemoveSubtitlesRequest"},"RerenderRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"clip_index":{"type":"integer","title":"Clip Index"},"segments":{"items":{"$ref":"#/components/schemas/RerenderSegment"},"type":"array","title":"Segments"},"snap_to_words":{"type":"boolean","title":"Snap To Words","default":false},"reapply_captions":{"type":"boolean","title":"Reapply Captions","default":true},"framing":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framing"}},"type":"object","required":["job_id","clip_index","segments"],"title":"RerenderRequest"},"RerenderSegment":{"properties":{"start":{"type":"number","title":"Start"},"end":{"type":"number","title":"End"}},"type":"object","required":["start","end"],"title":"RerenderSegment"},"SaaSActorRequest":{"properties":{"actor_description":{"type":"string","title":"Actor Description"},"num_options":{"type":"integer","title":"Num Options","default":3},"product_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Description"}},"type":"object","required":["actor_description"],"title":"SaaSActorRequest"},"SaaSAnalyzeRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"num_scripts":{"type":"integer","title":"Num Scripts","default":3},"style":{"type":"string","title":"Style","default":"ugc"},"language":{"type":"string","title":"Language","default":"en"},"actor_gender":{"type":"string","title":"Actor Gender","default":"female"}},"type":"object","title":"SaaSAnalyzeRequest"},"SaaSGenerateRequest":{"properties":{"script":{"additionalProperties":true,"type":"object","title":"Script"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id"},"actor_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Description"},"selected_actor_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Actor Url"},"retry_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retry Job Id"},"video_mode":{"type":"string","title":"Video Mode","default":"lowcost"},"share_to_gallery":{"type":"boolean","title":"Share To Gallery","default":false}},"type":"object","required":["script"],"title":"SaaSGenerateRequest"},"SaaSPostRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scheduled_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Date"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","default":"UTC"}},"type":"object","required":["job_id","platforms"],"title":"SaaSPostRequest"},"SocialPostRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"clip_index":{"type":"integer","title":"Clip Index"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scheduled_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Date"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","default":"UTC"}},"type":"object","required":["job_id","clip_index","platforms"],"title":"SocialPostRequest"},"SubtitleRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"clip_index":{"type":"integer","title":"Clip Index"},"position":{"type":"string","title":"Position","default":"bottom"},"font_size":{"type":"integer","title":"Font Size","default":16},"font_name":{"type":"string","title":"Font Name","default":"Verdana"},"font_color":{"type":"string","title":"Font Color","default":"#FFFFFF"},"border_color":{"type":"string","title":"Border Color","default":"#000000"},"border_width":{"type":"integer","title":"Border Width","default":2},"bg_color":{"type":"string","title":"Bg Color","default":"#000000"},"bg_opacity":{"type":"number","title":"Bg Opacity","default":0.0},"style":{"type":"string","title":"Style","default":"classic"},"highlight_color":{"type":"string","title":"Highlight Color","default":"#FFD700"},"effect":{"type":"string","title":"Effect","default":"none"},"base_opacity":{"type":"number","title":"Base Opacity","default":1.0},"uppercase":{"type":"boolean","title":"Uppercase","default":false},"input_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Filename"},"words":{"anyOf":[{"items":{"$ref":"#/components/schemas/CaptionWordIn"},"type":"array"},{"type":"null"}],"title":"Words"}},"type":"object","required":["job_id","clip_index"],"title":"SubtitleRequest"},"ThumbnailDescribeRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"title":{"type":"string","title":"Title"}},"type":"object","required":["session_id","title"],"title":"ThumbnailDescribeRequest"},"ThumbnailTitlesRequest":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","title":"ThumbnailTitlesRequest"},"TranslateRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"clip_index":{"type":"integer","title":"Clip Index"},"target_language":{"type":"string","title":"Target Language"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"},"input_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Filename"}},"type":"object","required":["job_id","clip_index","target_language"],"title":"TranslateRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}