{"openapi":"3.1.0","info":{"title":"JubJub API","description":"JubJub Video Content Management API","version":"2.0.0"},"paths":{"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/gpt-actions-schema":{"get":{"tags":["v2 - OpenAPI"],"summary":"Gpt Actions Schema","description":"Serve the GPT Actions OpenAPI schema (no auth required).\n\nReturns JSON by default (for ChatGPT \"Import from URL\").\nAdd ?format=yaml to get the raw YAML instead.","operationId":"gpt_actions_schema_v2_gpt_actions_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/profiles":{"post":{"tags":["Profile"],"summary":"Create Profile","operationId":"create_profile_profiles_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profiles/current":{"get":{"tags":["Profile"],"summary":"Get Profile","operationId":"get_profile_profiles_current_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileAccountInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/complete-registration":{"post":{"tags":["Profile"],"summary":"Complete User Profile After Firebase Registration","description":"Completes user profile after Firebase registration and migrates temporary session data.\n\n    **Flow**:\n    1. User registers via Firebase Auth (createUserWithEmailAndPassword)\n    2. Frontend calls this endpoint with Firebase token + additional data\n    3. System creates enriched profile in Firestore\n    4. Migrates temporary session data (if exists)\n    5. Records tracking events\n\n    **Required Headers**:\n    - Authorization: Bearer {firebase_jwt_token}\n\n    **Data Collected**:\n    - How they found the platform (try_now, google_search, referral, etc.)\n    - Professional information (company, role)\n    - Marketing consents\n    - Referral code (if applicable)","operationId":"complete_registration_complete_registration_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","description":"Firebase JWT token (Bearer token)","title":"Authorization"},"description":"Firebase JWT token (Bearer token)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileCompletionRequest"}}}},"responses":{"200":{"description":"Profile completed and session migrated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileCompletionResponse"},"example":{"success":true,"profile_id":"prof_550e8400-e29b-41d4-a716-446655440000","migration_result":{"containers_created":1,"projects_created":3,"media_migrated":2},"message":"Profile completed successfully! Your 3 projects have been saved."}}}},"401":{"description":"Invalid Firebase token"},"403":{"description":"Invalid temporary session"},"409":{"description":"Profile already exists for this user"},"500":{"description":"Internal server error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications":{"get":{"tags":["Notifications","notifications"],"summary":"List Notifications","description":"List notifications for the authenticated user.\n\n**Query Parameters:**\n- `type`: Filter by notification type (e.g., \"team_invite\", \"launch_success\")\n- `read`: Filter by read status (true/false)\n- `limit`: Maximum number of notifications to return (1-100, default 50)\n- `offset`: Number of notifications to skip for pagination (default 0)\n\n**Returns:**\n- List of notifications with pagination info\n- Total count of matching notifications\n- Unread count","operationId":"list_notifications_notifications_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by notification type","title":"Type"},"description":"Filter by notification type"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by taxonomy category (invites/teams/publishing/social/alerts/system)","title":"Category"},"description":"Filter by taxonomy category (invites/teams/publishing/social/alerts/system)"},{"name":"read","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by read status","title":"Read"},"description":"Filter by read status"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum notifications to return","default":50,"title":"Limit"},"description":"Maximum notifications to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of notifications to skip","default":0,"title":"Offset"},"description":"Number of notifications to skip"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/unread-count":{"get":{"tags":["Notifications","notifications"],"summary":"Get Unread Notifications Count","description":"Get the count of unread notifications for the authenticated user.\n\n**Returns:**\n- `unread_count`: Number of unread notifications","operationId":"get_unread_notifications_count_notifications_unread_count_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/team-unread-counts":{"get":{"tags":["Notifications","notifications"],"summary":"Get Team Unread Counts Endpoint","description":"Unread notification counts bucketed by team for the authenticated user.\n\n**Returns:**\n- `counts`: map of team_id -> unread count. Teams with no unread\n  notifications are omitted (treat a missing key as 0).","operationId":"get_team_unread_counts_endpoint_notifications_team_unread_counts_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamUnreadCountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/stats":{"get":{"tags":["Notifications","notifications"],"summary":"Get Notification Stats Endpoint","description":"Get notification counts for the surface's filter tabs.\n\n**Returns:**\n- `total`: total notifications\n- `unread`: unread count\n- `by_category`: per-category counts (invites, teams, publishing, social,\n  alerts, system). Unfiltered, so the pills show global totals.","operationId":"get_notification_stats_endpoint_notifications_stats_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/{notification_id}/read":{"patch":{"tags":["Notifications","notifications"],"summary":"Mark Notification Read","description":"Mark a specific notification as read.\n\n**Path Parameters:**\n- `notification_id`: The notification ID\n\n**Returns:**\n- Success status with notification ID","operationId":"mark_notification_read_notifications__notification_id__read_patch","parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationMarkReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/mark-all-read":{"patch":{"tags":["Notifications","notifications"],"summary":"Mark All Notifications Read","description":"Mark all notifications as read for the authenticated user.\n\n**Returns:**\n- Number of notifications marked as read","operationId":"mark_all_notifications_read_notifications_mark_all_read_patch","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationMarkAllReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/{notification_id}":{"delete":{"tags":["Notifications","notifications"],"summary":"Delete Notification Endpoint","description":"Delete a specific notification.\n\n**Path Parameters:**\n- `notification_id`: The notification ID\n\n**Returns:**\n- Success status","operationId":"delete_notification_endpoint_notifications__notification_id__delete","parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ws/stats":{"get":{"tags":["WebSocket","websockets"],"summary":"Websocket Stats","description":"Get WebSocket connection statistics (for monitoring/debugging).\n\n**Returns:**\n- Total active connections\n- Number of connected users\n- List of connected user profile IDs","operationId":"websocket_stats_ws_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/agents":{"post":{"tags":["v2 - Agents"],"summary":"Create Agent","description":"Create a new agent key.\n\nReturns the raw secret once — caller must store it securely.\nPublish scopes are off by default and require a paid plan.\nThe splits permission may be set by the signed-in owner, never by an agent key.","operationId":"create_agent_v2_agents_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Agents"],"summary":"List Agents","description":"List all agents owned by the current user.","operationId":"list_agents_v2_agents_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/agents/{agent_id}":{"patch":{"tags":["v2 - Agents"],"summary":"Update Agent","description":"Update an agent's scopes, name, or status.\n\nOnly the owner can update their agents, signed in as themselves: an agent\nkey is refused, and asking to turn the splits permission on says why.","operationId":"update_agent_v2_agents__agent_id__patch","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAgentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - Agents"],"summary":"Revoke Agent","description":"Revoke an agent (soft-delete), or permanently remove with ?permanent=true.","operationId":"revoke_agent_v2_agents__agent_id__delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"permanent","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Permanent"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces":{"post":{"tags":["v2 - Workspaces"],"summary":"Create Workspace","description":"Create a new workspace.\n\nThe authenticated user becomes the owner of the workspace.","operationId":"create_workspace_v2_workspaces_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Workspaces"],"summary":"List Workspaces","description":"List workspaces with optional filtering.\n\n**Filters:**\n- role: \"owner\" (created by), \"member\" (invited to), or omit for all\n- folder_id: Filter by folder\n- include_progress: Include progress calculation (default: true)\n\n**Legacy filters:**\n- owner_id: Filter by owner (deprecated, use role=owner instead)\n\nReturns lightweight card data for efficient list rendering.\nStats (total_contents, etc.) are calculated dynamically from the database.\n\n**Examples:**\n- No params → All workspaces the authenticated user has access to\n- `?role=owner` → Workspaces created by the authenticated user\n- `?role=member` → Workspaces the authenticated user was invited to\n- `?include_progress=false` → Skip progress calculation for performance","operationId":"list_workspaces_v2_workspaces_get","parameters":[{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"}},{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},{"name":"include_progress","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Progress"}},{"name":"archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Archived"}},{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}":{"get":{"tags":["v2 - Workspaces"],"summary":"Get Workspace","description":"Get full details of a workspace.\n\nAccess: Owner, direct member, or team member with WORKSPACE_VIEW permission.\nStats are calculated dynamically from the database.","operationId":"get_workspace_v2_workspaces__workspace_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - Workspaces"],"summary":"Update Workspace","description":"Update a workspace's details.\n\nOnly provided fields will be updated.\nAccess: Owner, direct member with edit rights, or team member with WORKSPACE_EDIT permission.","operationId":"update_workspace_v2_workspaces__workspace_id__patch","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspaceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - Workspaces"],"summary":"Delete Workspace","description":"Delete a workspace.\n\nThis will also delete all contents and media within the workspace.\nAccess: Owner, direct member with admin rights, or team member with WORKSPACE_DELETE permission.","operationId":"delete_workspace_v2_workspaces__workspace_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/my-permissions":{"get":{"tags":["v2 - Workspaces"],"summary":"Get My Workspace Permissions","description":"The caller's permissions in THIS workspace — the workspace twin of\nGET /v2/teams/{team_id}/my-permissions, and the one place that reports\n`publish:approve` (the release). The team route never lists it: the\nrelease is a workspace owner's grant, not a team right.\n\nAccess: anyone who can view the workspace.","operationId":"get_my_workspace_permissions_v2_workspaces__workspace_id__my_permissions_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceMyPermissionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/approvers":{"put":{"tags":["v2 - Workspaces"],"summary":"Set Workspace Approvers","description":"Replace who, besides the owner, may release a launch of this workspace's\ncontent (Permission.PUBLISH_APPROVE). A grant names a person already in\nthe workspace (direct or team member), or the linked team as a whole so\nthe operator's crew is trusted in one action.\n\nAccess: workspace owner only. No role, workspace or team, can grant\nthis; that is the point of it.","operationId":"set_workspace_approvers_v2_workspaces__workspace_id__approvers_put","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetApproversRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/transfer":{"post":{"tags":["v2 - Workspaces"],"summary":"Transfer Workspace","description":"Hand this workspace to another member. The new owner is the client from\nnow on: they hold the release and decide who else does. The old owner\nstays as a direct admin so nothing they were doing stops.\n\nAccess: workspace owner only. The new owner must already be a direct\nmember or a member of the linked team.","operationId":"transfer_workspace_v2_workspaces__workspace_id__transfer_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferWorkspaceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/team":{"put":{"tags":["v2 - Workspaces"],"summary":"Set Workspace Team","description":"Atomically set (or clear) a workspace's team in one request.\n\nReplaces the client-side unlink-then-link pattern, which could leave a\nworkspace orphaned from every team if the second call failed. Validates the\ntarget team up front, then unlinks from the old team and links to the new\none, saving the workspace once. team_id=None unlinks only.\n\nAccess: workspace owner only (matches the link endpoint).","operationId":"set_workspace_team_v2_workspaces__workspace_id__team_put","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetWorkspaceTeamRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/archive":{"post":{"tags":["v2 - Workspaces"],"summary":"Archive Workspace","description":"Archive a workspace: hide it from listings without deleting anything.\n\nReversible via POST /{workspace_id}/unarchive. The workspace remains\nfetchable by id — the archive view needs to read it — and nothing inside it\nis modified.\n\nAccess: same as DELETE (owner, admin member, or team member with\nWORKSPACE_DELETE).","operationId":"archive_workspace_v2_workspaces__workspace_id__archive_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/unarchive":{"post":{"tags":["v2 - Workspaces"],"summary":"Unarchive Workspace","description":"Restore an archived workspace to normal visibility.\n\nClears the archive fields entirely — see Workspace.unarchive() for why the\ntimestamp is not kept as history.\n\nAccess: same as DELETE.","operationId":"unarchive_workspace_v2_workspaces__workspace_id__unarchive_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/batch/delete":{"post":{"tags":["v2 - Workspaces"],"summary":"Delete Workspaces Batch","description":"Delete multiple workspaces at once.\n\nReturns which workspaces were deleted and which were not found.\nMaximum 100 workspaces per request.\nAccess: Must have WORKSPACE_DELETE permission for each workspace.","operationId":"delete_workspaces_batch_v2_workspaces_batch_delete_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDeleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/members/by-email":{"post":{"tags":["v2 - Workspaces"],"summary":"Add Member By Email","description":"Invite an email to this workspace. They join when they accept.\n\nAccess: MEMBERS_INVITE on the workspace. Rate-limited per principal\n(30/min, 200/day). The response is identical for every address.","operationId":"add_member_by_email_v2_workspaces__workspace_id__members_by_email_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberByEmailRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/members/{member_profile_id}":{"patch":{"tags":["v2 - Workspaces"],"summary":"Update Member","description":"Update a workspace member's role or expiration.\n\nCannot update the owner.\nAccess: Owner, direct member with admin rights, or team member with MEMBERS_EDIT_ROLE permission.","operationId":"update_member_v2_workspaces__workspace_id__members__member_profile_id__patch","parameters":[{"name":"member_profile_id","in":"path","required":true,"schema":{"type":"string","title":"Member Profile Id"}},{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - Workspaces"],"summary":"Remove Member","description":"Remove a member from a workspace.\n\nCannot remove the owner.\nAccess: Owner, direct member with admin rights, or team member with MEMBERS_REMOVE permission.","operationId":"remove_member_v2_workspaces__workspace_id__members__member_profile_id__delete","parameters":[{"name":"member_profile_id","in":"path","required":true,"schema":{"type":"string","title":"Member Profile Id"}},{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/members":{"get":{"tags":["v2 - Workspaces"],"summary":"List Members","description":"List all mentionable members of a workspace.\n\nReturns a deduplicated list of members from:\n1. The workspace owner\n2. Direct workspace members\n3. Team members (if workspace is linked to a team)\n\nUsed by the frontend for @mention autocomplete.\nAccess: Owner, direct member, or team member with WORKSPACE_VIEW permission.","operationId":"list_members_v2_workspaces__workspace_id__members_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkspaceMentionableMemberResponse"},"title":"Response List Members V2 Workspaces  Workspace Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/activity":{"get":{"tags":["v2 - Workspaces"],"summary":"Get Workspace Activity","description":"Activity for a single workspace, drawn from its team's audit trail.\n\n⚠️ A SEPARATE ENDPOINT, NOT A `workspace_id` PARAMETER ON\n`GET /v2/teams/{team_id}/activity`. Three reasons, and the first is the one\nthat matters:\n\n  1. THE TEAM ENDPOINT 403s A NON-TEAM-MEMBER (team_routes.py, its\n     `team.is_member` guard). A workspace OWNER need not be in the team —\n     and is exactly who opens a workspace page. Reusing that route would\n     403 the owner on their own workspace. This route is guarded by\n     `require_workspace_context(WORKSPACE_VIEW)`, which resolves all four\n     access paths (owner / direct / team / dual) and lets the owner in.\n  2. The caller has a workspace id and may not know the team id — or there\n     may not be a team at all.\n  3. The resource being described is the workspace.\n\n⚠️ FILTERED IN MEMORY, NOT IN THE QUERY. Deliberate, with a known ceiling:\n  * `TeamAuditEvent.team_id` is required and every repository query filters\n    on it; there is no query path by workspace, so a query-side filter\n    needs a new composite index AND a field that most existing rows lack.\n  * `list_by_team` ALREADY streams the whole team's events and paginates in\n    memory (firestore_team_audit_repository.py `list_by_team`), so filtering\n    here adds no new read pattern — it reuses the one that exists.\n  * The 90-day TTL bounds how large a team's trail can get.\n  * It also catches legacy rows that predate `workspace_id`, which a query\n    on that field could not.\nThe trade is real: we fetch the team's events to keep a subset. If a team\never accumulates thousands of events in 90 days, this should become a\n`list_by_workspace` query with an index on (workspace_id, created_at).\n\nAccess: anyone who can view the workspace.","operationId":"get_workspace_activity_v2_workspaces__workspace_id__activity_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/health/storage":{"get":{"tags":["v2 - Workspaces","v2 - Workspaces","Health"],"summary":"Check Storage Health","description":"Check if workspace storage is properly configured.","operationId":"check_storage_health_v2_workspaces_health_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/workspaces/{workspace_id}/progress":{"get":{"tags":["v2 - Workspaces","v2 - Workspaces"],"summary":"Get Workspace Progress","description":"Get detailed progress information for a workspace.\n\nAccess: Owner, direct member, or team member with WORKSPACE_VIEW permission.\n\nReturns:\n- percentage: Overall progress (0-100)\n- total_contents: Number of contents in workspace\n- breakdown: Detailed breakdown by state (published, scheduled, ready, in_progress, pending)\n- summary: Simple 3-category summary (published, in_progress, pending)\n- contents: Per-content progress details\n\nProgress states and their weights:\n- EMPTY (0%): Content created but no media\n- DRAFT (20%): Has media but no platform config\n- INCOMPLETE (35%): Has config but missing required fields\n- READY (50%): Config complete, ready to publish\n- SCHEDULED (75%): Has a pending launch with scheduled_for\n- PUBLISHING (85%): Currently being published\n- PARTIAL_SUCCESS (90%): Some platforms published successfully\n- PUBLISHED (100%): All target platforms published\n- FAILED (40%): Last publish attempt failed","operationId":"get_workspace_progress_v2_workspaces__workspace_id__progress_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/ownership/opt-out":{"post":{"tags":["v2 - Workspaces"],"summary":"Ownership Opt Out","description":"Opt out of revenue splits for this workspace.\n\nAdds caller's profile_id to workspace.member_opt_outs.\nIdempotent: already opted out returns 200 OK.\nCaller must be a member of the workspace's team.","operationId":"ownership_opt_out_v2_workspaces__workspace_id__ownership_opt_out_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/ownership/opt-in":{"post":{"tags":["v2 - Workspaces"],"summary":"Ownership Opt In","description":"Opt back into revenue splits for this workspace.\n\nRemoves caller's profile_id from workspace.member_opt_outs.","operationId":"ownership_opt_in_v2_workspaces__workspace_id__ownership_opt_in_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/invite-links":{"post":{"tags":["v2 - Workspace Shares"],"summary":"Create Invite Link","description":"Create an invite link for a workspace.\n\nAccess: Owner or admin (requires MEMBERS_INVITE permission).\nLink expires in 7 days.","operationId":"create_invite_link_v2_workspaces__workspace_id__invite_links_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInviteLinkRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspaces/{workspace_id}/invite-links/{token}":{"delete":{"tags":["v2 - Workspace Shares"],"summary":"Revoke Invite Link","description":"Revoke an invite link.\n\nAccess: Owner or admin (requires MEMBERS_INVITE permission).","operationId":"revoke_invite_link_v2_workspaces__workspace_id__invite_links__token__delete","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspace-shares/{token}":{"get":{"tags":["v2 - Workspace Shares (Public)"],"summary":"Get Workspace Share Preview","description":"Get a public preview of a workspace via invite link.\n\nNO authentication required.\nReturns workspace name, content titles/thumbnails, and member names.\nDoes NOT return private content URLs, download links, or sensitive data.","operationId":"get_workspace_share_preview_v2_workspace_shares__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceSharePreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspace-shares/{token}/join":{"post":{"tags":["v2 - Workspace Shares (Public)"],"summary":"Join Via Invite Link","description":"Join a workspace via invite link.\n\nRequires authentication.\nIf auto_accept=true: user is added immediately as viewer.\nIf auto_accept=false: user is added to pending_requests for owner approval.","operationId":"join_via_invite_link_v2_workspace_shares__token__join_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/workspace-shares/{token}/approve/{profile_id}":{"post":{"tags":["v2 - Workspace Shares (Public)"],"summary":"Approve Join Request","description":"Approve a pending join request.\n\nAccess: Workspace owner or admin.","operationId":"approve_join_request_v2_workspace_shares__token__approve__profile_id__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media/upload/request":{"post":{"tags":["v2 - Media"],"summary":"Request a signed URL for upload","description":"Start the upload process by requesting a signed URL.\n\n    The frontend should:\n    1. Call this endpoint with filename and optional content_type\n    2. Use the returned signed_url to PUT the file directly to GCS\n    3. Call /v2/media/{media_id}/upload/complete when done\n\n    The signed URL is valid for 10 minutes.","operationId":"request_upload_v2_media_upload_request_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadRequestDTO"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media/{media_id}/upload/complete":{"post":{"tags":["v2 - Media"],"summary":"Confirm upload completion","description":"Call this after successfully uploading the file to GCS.\n\n    This will:\n    1. Validate the Media exists and is in 'uploading' status\n    2. Make the file publicly accessible\n    3. Extract video metadata (width, height, fps, codec, etc.) for Smart Tags\n    4. Update Media status to 'ready'\n    5. Return the complete Media with public URL and video_metadata","operationId":"complete_upload_v2_media__media_id__upload_complete_post","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadCompleteDTO"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media/ingest-url":{"post":{"tags":["v2 - Media"],"summary":"Ingest media from a public URL","description":"Download a file from a public URL and ingest it into JubJub.\n\n    The backend downloads the file server-side and uploads it to GCS.\n    Useful for GPT Actions and MCP clients that cannot send binary data.\n\n    The URL must be publicly accessible, on http or https, and must not\n    redirect. Private and internal addresses are refused. Max download\n    timeout is 120 seconds; files over MEDIA_INGEST_MAX_BYTES (256 MB by\n    default) are refused with 413.","operationId":"ingest_url_v2_media_ingest_url_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaIngestUrlRequestDTO"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media/search":{"get":{"tags":["v2 - Media"],"summary":"Search media by extracted metadata","description":"Structured search over AI-extracted media metadata (media_search_index_v1).\n\ninclude_unanalysed (discoverable scope only): also return minted pieces\nindexed with no extracted metadata, registered imports. A viewer surface\ncan send people to the platform; an agent buying metadata cannot use them,\nso the default leaves them out.\nFree for human users — pure indexed filters, no inference.\n\nscope:\n  - \"mine\" (default): your own catalogue, scoped to created_by.\n  - \"discoverable\": cross-corpus, only content whose owner opted in.\n\ncursor: opaque bookmark from a previous discoverable response's\nnext_cursor — pass it back verbatim to continue. Ignored for scope=mine\n(owner corpora fit one page).\n\nReturns content cards (content_id, title, thumbnail_id, thumbnail_url,\nfacets) matching ALL supplied filters. Topic matches if it appears in the\ncontent's topics.","operationId":"search_media_metadata_v2_media_search_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"mine","title":"Scope"}},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}},{"name":"sub_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Domain"}},{"name":"content_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"}},{"name":"pacing","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pacing"}},{"name":"movement_intensity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Movement Intensity"}},{"name":"thumbnail_dominant_colour","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Dominant Colour"}},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}},{"name":"face_present","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Face Present"}},{"name":"on_screen_text","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On Screen Text"}},{"name":"music_present","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Music Present"}},{"name":"speech_present","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Speech Present"}},{"name":"thumbnail_face_visible","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Thumbnail Face Visible"}},{"name":"thumbnail_text_overlay","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Thumbnail Text Overlay"}},{"name":"thumbnail_action_shot","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Thumbnail Action Shot"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"include_unanalysed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Unanalysed"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media/discoverability":{"patch":{"tags":["v2 - Media"],"summary":"Opt a content in/out of cross-corpus search","description":"Set whether a content you own is discoverable in the (free) cross-corpus\nmetadata search. Default is ON (opt-out — see\nbackfill_discoverable_default.py); this endpoint is how an owner opts a\npiece out, or back in. Owner only.","operationId":"set_media_discoverability_v2_media_discoverability_patch","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetDiscoverabilityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media/{media_id}":{"get":{"tags":["v2 - Media"],"summary":"Get media details","description":"Get details of a specific media file.\n\nAccess: Must have CONTENT_VIEW permission on the media's workspace.","operationId":"get_media_v2_media__media_id__get","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - Media"],"summary":"Rename a media file","description":"Rename a media file by updating its filename.\n\n    This only updates the display name (filename) in the database.\n    The actual file in GCS is not renamed (it uses media_id as identifier).","operationId":"rename_media_v2_media__media_id__patch","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaRenameRequestDTO"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - Media"],"summary":"Delete a media file","description":"Delete a media file and its record.\n\n    This will also delete the file from GCS.","operationId":"delete_media_v2_media__media_id__delete","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media":{"get":{"tags":["v2 - Media"],"summary":"List media in a workspace","description":"List all media in a workspace.\n\nSupports filtering by type and status.\n\nAccess: Must have CONTENT_VIEW permission on the workspace.","operationId":"list_media_v2_media_get","parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"media_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Type"}},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaListResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media/bulk/rename":{"patch":{"tags":["v2 - Media"],"summary":"Rename multiple media files","description":"Rename multiple media files in a single request.\n\n    Each item in the request specifies a media_id and the new filename.\n    The operation processes all items and returns individual results.\n    Partial success is possible - some items may succeed while others fail.","operationId":"bulk_rename_media_v2_media_bulk_rename_patch","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaBulkRenameRequestDTO"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaBulkRenameResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media/{media_id}/reprocess-metadata":{"post":{"tags":["v2 - Media"],"summary":"Reprocess video metadata","description":"Re-extract video metadata (width, height, fps, codec, etc.) for an existing media.\n\n    Useful for:\n    - Videos uploaded before metadata extraction was implemented\n    - Videos where metadata extraction failed during upload\n    - Forcing a refresh of metadata\n\n    This downloads the video from GCS, extracts metadata via FFprobe, and updates the record.","operationId":"reprocess_metadata_v2_media__media_id__reprocess_metadata_post","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaResponseDTO"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media/health/storage":{"get":{"tags":["v2 - Media","v2 - Media","Health"],"summary":"Check storage connection status","description":"Check if GCS storage and Firestore are properly configured and connected.","operationId":"check_storage_health_v2_media_health_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/media/health/signed-url":{"get":{"tags":["v2 - Media","v2 - Media","Health"],"summary":"Test signed URL generation","description":"Test that GCS can generate a valid signed URL.\n\nGenerates a test signed URL for a dummy path to verify\nthat credentials and bucket access are working correctly.","operationId":"check_signed_url_health_v2_media_health_signed_url_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/catalogue/manifest":{"get":{"tags":["v2 - Catalogue"],"summary":"Public summary of the JubJub media library","description":"Public, unauthenticated summary of the discoverable metadata library.\n\nAggregates media_search_index_v1 (discoverable == true) in Python — no new\nindexes. Cached in catalogue_manifest_v1/current with a 1-hour TTL.\nBest-effort: an empty index returns zeroes, never 404.","operationId":"catalogue_manifest_v2_catalogue_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/contents":{"post":{"tags":["v2 - Contents"],"summary":"Create Content","description":"Create a new content.\n\nThe content will be in 'draft' status initially.\nAfter configuring platforms, it can be marked as 'ready' for publishing.\n\nAccess: Must have CONTENT_CREATE permission on the workspace.","operationId":"create_content_v2_contents_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContentRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Contents"],"summary":"List Contents","description":"List contents in a workspace.\n\n- workspace_id: Required - the workspace to list contents from\n- status: Optional filter by content status\n- folder_id: Optional filter by folder\n\nAccess: Must have CONTENT_VIEW permission on the workspace.","operationId":"list_contents_v2_contents_get","parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","description":"Workspace ID (required)","title":"Workspace Id"},"description":"Workspace ID (required)"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status: draft, ready, published","title":"Status"},"description":"Filter by status: draft, ready, published"},{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/visible":{"get":{"tags":["v2 - Contents"],"summary":"List Visible Contents","description":"Everything this profile MAY SEE, across every workspace it can reach.\n\n🔑 THE VAULT ASKS THE WRONG QUESTION TODAY. It answers \"what did I put\nhere\" — the dashboard queries `onchain_publish_events` by\n`contributors_jubjub_profile_ids array-contains me`, so a teammate's piece\nin a workspace I fully share is invisible to me even though I can open it\nand play it through the workspace door. This endpoint answers \"what may I\nsee\" instead, which is the question a shared workspace implies.\n\n⚠️ THE ACCESS RULE IS NOT REIMPLEMENTED HERE. Every candidate workspace is\nput through `check_workspace_access` — the SAME function\n`require_workspace_context` and `verify_workspace_permission` use, and\ntherefore the same one that already governs playback. A second copy of an\naccess rule is how a leak happens: the copies drift, one of them forgets\na case, and the forgetful one is the one serving media. There is exactly\none rule and this calls it.\n\nCandidates are gathered widely and then FILTERED by that rule, never\ntrusted from the gathering step:\n  * workspaces owned by, or directly listing, this profile\n    (`list_by_profile` — which covers owner + direct member only)\n  * workspaces linked to any team this profile belongs to, which\n    `list_by_profile` does NOT return: that omission is precisely the gap\n    being closed.\n\nMembership is checked per workspace even for team-linked candidates,\nbecause team membership is necessary but not sufficient — the permission\nstill has to hold.","operationId":"list_visible_contents_v2_contents_visible_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}":{"get":{"tags":["v2 - Contents"],"summary":"Get Content","description":"Get full details of a content.\n\nAccess: CONTENT_VIEW on the parent workspace, or the row's creator.\nThe creator branch is for workspace-less rows (channel imports, Farcaster\ncasts): `require_content_access` finds an orphan workspace and refused\nthe creator their own imported post (fixed 2026-10-07). Everyone else is\nchecked exactly as before.\nMetadata-commerce tiers: the owner sees full gated fields; everyone else\nsees free preview fields only (purchase to unlock).","operationId":"get_content_v2_contents__content_id__get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - Contents"],"summary":"Update Content","description":"Update a content's details.\n\nOnly provided fields will be updated.\n\nAccess: Must have CONTENT_EDIT permission on the parent workspace.","operationId":"update_content_v2_contents__content_id__patch","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - Contents"],"summary":"Delete Content","description":"Delete a content and all associated resources (cascade).\n\nDeletes: Content + PlatformConfigs + Media (GCS + DB) + cancels active Launches.\n\nIf the content has pending/scheduled launches:\n- Without `?force=true`: returns 409 Conflict\n- With `?force=true`: cancels all active launches (including Cloud Tasks) and proceeds\n\nAccess: the row's creator, or CONTENT_DELETE permission on the parent\nworkspace. The creator clause exists for workspace-less rows (imports,\nFarcaster casts), which have no parent workspace to hold a permission on.","operationId":"delete_content_v2_contents__content_id__delete","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Force delete even if there are scheduled launches","default":false,"title":"Force"},"description":"Force delete even if there are scheduled launches"},{"name":"confirm_asset_break","in":"query","required":false,"schema":{"type":"boolean","description":"Acknowledge that deleting a tokenised piece breaks the underlying asset an x402 buyer paid for. INDEPENDENT of `force`: that one cancels scheduled launches, this one accepts the asset break. Neither implies the other and both may be required.","default":false,"title":"Confirm Asset Break"},"description":"Acknowledge that deleting a tokenised piece breaks the underlying asset an x402 buyer paid for. INDEPENDENT of `force`: that one cancels scheduled launches, this one accepts the asset break. Neither implies the other and both may be required."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/thumbnail":{"post":{"tags":["v2 - Contents"],"summary":"Set Content Thumbnail From Frame","description":"Set this piece's thumbnail to a frame at the given timestamp.\n\nA NEW media_v2 image is created every time and thumbnail_id is repointed\nat it. The previous image is left exactly where it is, still public, still\nat its URL. That is not tidiness — one of them is already embedded in a\npublished Farcaster cast, and cast previews resolve the image at render\ntime, so overwriting the object would change what a historical post shows.\nOrphaned images are the cheaper problem.\n\nNO `if not content.thumbnail_id` GUARD. That guard belongs to\ncreate_content, where a supplied thumbnail must not be overwritten. Here\nthe piece always has one already — that is what re-picking means — so the\nguard would make this endpoint a permanent no-op.\n\nON FAILURE THIS RETURNS AN ERROR, NOT A SILENT 200. create_content\nswallows extraction failures and continues, which is right at ingest: the\nupload should not fail because ffmpeg timed out. Here the thumbnail IS the\nrequest, so a 200 with the old image still attached would be\nindistinguishable from success — the same invisible failure that let a\nFarcaster cast publish under a camera filename with nothing to explain it.\n\nAccess: CONTENT_EDIT on the parent workspace.","operationId":"set_content_thumbnail_from_frame_v2_contents__content_id__thumbnail_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetThumbnailFromFrameRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetThumbnailFromFrameResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/register":{"post":{"tags":["v2 - Contents"],"summary":"Register imported content for on-chain revenue","description":"Promote an OAuth-imported (`source=\"historical_import\"`) content\nrow from `historical` to `minting`, kicking off the on-chain\nownership deployment state machine.\n\nGuards:\n  - 404 if content not found.\n  - 400 if not a historical import or already past historical state.\n  - 403 if the original platform credential is no longer ACTIVE\n    or no longer belongs to current_user.","operationId":"register_content_for_revenue_v2_contents__content_id__register_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Register Content For Revenue V2 Contents  Content Id  Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/playback-source":{"post":{"tags":["v2 - Contents"],"summary":"Name the host a piece plays from so JubJub meters it without serving it","description":"Write `source_video_url` (and optionally the price) on a piece the\ncaller created.\n\nFor an import this turns \"watched elsewhere\" into a sellable piece:\n`is_watched_elsewhere` (media_search_service) reads the field and the\nstreaming rail's refusal keys on it. For an upload it moves delivery off\nJubJub: the tier decision (playback_url_signer.is_gated_playback, leg 2)\nprefers a fetchable source over the GCS object, so the SDK leaves the\npage's own src alone and the bucket serves nothing. In both cases the\npublic playback route emits it as a Tier 1 source. It is a money gate,\nso the URL is validated with the same predicate the tier decision uses;\na watch page, a URL the page cannot play, or JubJub's own bucket is\nrefused, never stored.\n\nWas import-only until 2026-09-09. The reason given (\"a piece published\nthrough JubJub already has its file\") was backwards: JubJub having the\nfile is why JubJub pays to serve it.\n\nGuards:\n  - 404 if content not found.\n  - 400 if the URL is not a playable file on another host, or the price\n    is above the settlement ceiling.\n  - 403 if the caller is not the creator.","operationId":"set_playback_source_v2_contents__content_id__playback_source_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaybackSourceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Playback Source V2 Contents  Content Id  Playback Source Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/targets":{"post":{"tags":["v2 - Contents"],"summary":"Add Targets","description":"Add platform targets (destinations) to a content.\n\nThis creates PlatformConfig entries for each credential.\nThe user can then configure platform-specific settings for each target.\n\n- credential_ids: List of credential IDs to add as targets\n\nAccess: Must have CONTENT_EDIT permission on the parent workspace, AND\neach credential must be the caller's own or actively shared with the\nworkspace's team. A credential that exists and is neither is reported\nas `not_accessible` with nothing about it — until 2026-09-03 this route\nreturned any credential's account name and username for any id, and\npersisted the config so a launch published through its tokens.","operationId":"add_targets_v2_contents__content_id__targets_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTargetsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTargetsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Contents"],"summary":"List Targets","description":"List all platform targets for a content.\n\nReturns the PlatformConfigs with credential info.\n\nAccess: Must have CONTENT_VIEW permission on the parent workspace.","operationId":"list_targets_v2_contents__content_id__targets_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TargetInfo"},"title":"Response List Targets V2 Contents  Content Id  Targets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/targets/{credential_id}":{"delete":{"tags":["v2 - Contents"],"summary":"Remove Target","description":"Remove a platform target from a content.\n\nThis deletes the PlatformConfig for the specified credential.\n\nAccess: Must have CONTENT_EDIT permission on the parent workspace.","operationId":"remove_target_v2_contents__content_id__targets__credential_id__delete","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/facebook-post-type":{"get":{"tags":["v2 - Contents"],"summary":"Preview Facebook Post Type","description":"The post type a Facebook publish of this piece will use, decided by the\nSAME rule the publish applies (facebook_adapter.explain_post_type), from\nthe piece's video. The publish screens show it beside \"Automatic\" so the\ncreator knows before sending whether it goes as a Reel or a video.","operationId":"preview_facebook_post_type_v2_contents__content_id__facebook_post_type_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"post_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The selected setting: 'auto' (or omitted), 'reel' or 'video'","title":"Post Type"},"description":"The selected setting: 'auto' (or omitted), 'reel' or 'video'"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPostTypePreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/full":{"get":{"tags":["v2 - Contents"],"summary":"Get Content With Configs","description":"Get content with all platform configurations.\n\nThis is useful for the publish/edit screen where you need\nboth content details and all platform configs.\n\n**Query params:**\n- `expand=media`: Include video and thumbnail details with video_metadata\n\nAccess: Must have CONTENT_VIEW permission on the parent workspace.","operationId":"get_content_with_configs_v2_contents__content_id__full_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated fields to expand. Options: media","title":"Expand"},"description":"Comma-separated fields to expand. Options: media"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentWithConfigsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/validate-configs":{"post":{"tags":["v2 - Contents"],"summary":"Validate Configs","description":"Validate all platform configurations for a content.\n\nChecks each config against platform-specific requirements.\nReturns validation results for each config.\n\nUse this before allowing user to proceed to publish step.\n\nAccess: Must have CONTENT_VIEW permission on the parent workspace.","operationId":"validate_configs_v2_contents__content_id__validate_configs_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ValidateConfigsRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateConfigsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/apply-general-settings":{"post":{"tags":["v2 - Contents"],"summary":"Apply General Settings","description":"Apply content's general settings to platform configurations.\n\nCopies specified fields from Content to PlatformConfig.settings.\nUseful for \"Apply to All\" button in the UI.\n\nField mapping:\n- title → title (YouTube, TikTok, Facebook, LinkedIn, Vimeo)\n- description → description, caption (Instagram)\n- tags → tags (YouTube, Vimeo)\n\nAccess: Must have CONTENT_EDIT permission on the parent workspace.","operationId":"apply_general_settings_v2_contents__content_id__apply_general_settings_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyGeneralSettingsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyGeneralSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/playback":{"get":{"tags":["v2 - Contents","v2 - Contents","Streaming"],"summary":"Get Content Playback","description":"Resolve Mux playback metadata for a content item.\n\nPublic endpoint — no auth required. Used by /watch and /embed routes\non the dashboard to load the player before the viewer authenticates.\n\nReturns mux_playback_id, playback URL, price, and ownership info.\n\nTier-2 gating: for gated content the durable Mux URL and playback_id are\nwithheld (null) and `gated=true` is returned, so the client runs the paid\nstreaming-session flow instead of playing the durable URL. `gated` is\nDERIVED here (is_gated_playback), never read from the document.","operationId":"get_content_playback_v2_contents__content_id__playback_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/health/storage":{"get":{"tags":["v2 - Contents","v2 - Contents","Health"],"summary":"Check Storage Health","description":"Check if content storage is properly configured.","operationId":"check_storage_health_v2_contents_health_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/contents/{content_id}/versions":{"get":{"tags":["v2 - Contents","Versions"],"summary":"List Versions","description":"Every version of the piece, newest first, each with a signed URL to\nplay it and its sign-offs. A piece never versioned lists one version.\n\nAccess: CONTENT_VIEW on the piece's workspace.","operationId":"list_versions_v2_contents__content_id__versions_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v2 - Contents","Versions"],"summary":"Add Version","description":"Make an uploaded video the new current version of this piece.\n\nUpload the file first (POST /v2/media/upload/request, PUT, then\nPOST /v2/media/{media_id}/upload/complete), then send its media_id here.\nEarlier versions stay listed and playable. Refused with 409\n(`reason: piece_is_final`) once the piece has been published. Any launch\nwaiting for, or holding, an owner approval is sent back for approval.\n\nAccess: CONTENT_EDIT on the piece's workspace (whoever can edit the piece).","operationId":"add_version_v2_contents__content_id__versions_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddVersionRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/versions/{number}/make-current":{"post":{"tags":["v2 - Contents","Versions"],"summary":"Make Version Current","description":"Make an earlier version the current one again. Its number is kept;\nnothing is renumbered. Refused with 409 once the piece has been published.\n\nAccess: CONTENT_EDIT on the piece's workspace.","operationId":"make_version_current_v2_contents__content_id__versions__number__make_current_post","parameters":[{"name":"number","in":"path","required":true,"schema":{"type":"integer","title":"Number"}},{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/contents/{content_id}/versions/{number}/signoffs":{"post":{"tags":["v2 - Contents","Versions"],"summary":"Sign Off Version","description":"Record that you signed off this version (who, which version, when,\nand in what capacity). A record, not a gate: it does not approve or block\na launch. Signing the same version again replaces your earlier sign-off.\nA new version starts with none. Allowed on a published piece: it changes\nno file.\n\nAccess: CONTENT_VIEW on the piece's workspace (anyone who can review it).","operationId":"sign_off_version_v2_contents__content_id__versions__number__signoffs_post","parameters":[{"name":"number","in":"path","required":true,"schema":{"type":"integer","title":"Number"}},{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignOffRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches":{"post":{"tags":["v2 - Launches"],"summary":"Create Launch","description":"Create a new multi-platform launch.\n\nThis endpoint allows publishing content to multiple platforms at once.\nIf `scheduled_for` is provided, the launch will be scheduled for that time.\nOtherwise, it will execute immediately.\n\n**Request body:**\n- `content_id`: ID of the content to publish\n- `platform_config_ids`: List of PlatformConfig IDs to publish to\n- `scheduled_for`: (optional) When to publish\n- `timezone`: (optional) Timezone for scheduled_for\n\nAccess: Must have PUBLISH_EXECUTE permission on the content's workspace.\nAgents: Require ``publish:execute`` scope.","operationId":"create_launch_v2_launches_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLaunchRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Launches"],"summary":"List Launches","description":"List launches with optional filters.\n\nFilter by workspace, content, or status.\n\nAccess: Must have CONTENT_VIEW permission on the workspace/content.","operationId":"list_launches_v2_launches_get","parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"},{"name":"content_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by content","title":"Content Id"},"description":"Filter by content"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches/validate":{"post":{"tags":["v2 - Launches"],"summary":"Validate Launch","description":"Validate a launch before execution.\n\nThis endpoint checks if all platforms can accept the content\nwithout actually publishing anything.\n\nAccess: Must have CONTENT_VIEW permission on the content's workspace.","operationId":"validate_launch_v2_launches_validate_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateLaunchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateLaunchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches/{launch_id}":{"get":{"tags":["v2 - Launches"],"summary":"Get Launch","description":"Get details of a specific launch including history.\n\nAccess: Must have CONTENT_VIEW permission on the launch's workspace.","operationId":"get_launch_v2_launches__launch_id__get","parameters":[{"name":"launch_id","in":"path","required":true,"schema":{"type":"string","title":"Launch Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches/{launch_id}/summary":{"get":{"tags":["v2 - Launches"],"summary":"Get Launch Summary","description":"Get a summary of launch results.\n\nUseful for displaying in UI after launch completes.\n\nAccess: Must have CONTENT_VIEW permission on the launch's workspace.","operationId":"get_launch_summary_v2_launches__launch_id__summary_get","parameters":[{"name":"launch_id","in":"path","required":true,"schema":{"type":"string","title":"Launch Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches/{launch_id}/cancel":{"post":{"tags":["v2 - Launches"],"summary":"Cancel Launch","description":"Cancel a pending or scheduled launch.\n\nOnly works for launches that haven't started yet.\n\nAccess: Must have PUBLISH_CANCEL permission on the launch's workspace.\nAgents: Require ``publish:schedule`` scope.","operationId":"cancel_launch_v2_launches__launch_id__cancel_post","parameters":[{"name":"launch_id","in":"path","required":true,"schema":{"type":"string","title":"Launch Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches/{launch_id}/platforms/{platform_config_id}":{"delete":{"tags":["v2 - Launches"],"summary":"Cancel Platform","description":"Cancel a single platform within a launch.\n\nOnly works for platforms that are still PENDING or IN_PROGRESS.\nIf all platforms become terminal after this, the launch status updates accordingly.\n\nAccess: Must have PUBLISH_CANCEL permission on the launch's workspace.\nAgents: Require ``publish:schedule`` scope.","operationId":"cancel_platform_v2_launches__launch_id__platforms__platform_config_id__delete","parameters":[{"name":"launch_id","in":"path","required":true,"schema":{"type":"string","title":"Launch Id"}},{"name":"platform_config_id","in":"path","required":true,"schema":{"type":"string","title":"Platform Config Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches/{launch_id}/retry":{"post":{"tags":["v2 - Launches"],"summary":"Retry Failed Platforms","description":"Retry publishing to failed platforms.\n\nOnly works for launches with status 'partial_failure'.\n\nAccess: Must have PUBLISH_EXECUTE permission on the launch's workspace.","operationId":"retry_failed_platforms_v2_launches__launch_id__retry_post","parameters":[{"name":"launch_id","in":"path","required":true,"schema":{"type":"string","title":"Launch Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RetryLaunchRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches/{launch_id}/reschedule":{"patch":{"tags":["v2 - Launches"],"summary":"Reschedule Launch","description":"Move a launch that has not started to a new time.\n\nWorks for pending, scheduled and awaiting_approval launches. The queued\nCloud Task(s) for the old time are cancelled first (until 2026-09-30 this\nroute only rewrote the field, so the old task still fired). A launch that\ncarried the workspace owner's approval is re-parked for a fresh one — the\ntime is part of what was approved; one waiting for approval keeps waiting\nwith the new time recorded. Anything else is re-queued for the new time.\n\nAccess: Must have PUBLISH_SCHEDULE permission on the launch's workspace.\nAgents: Require ``publish:schedule`` scope.","operationId":"reschedule_launch_v2_launches__launch_id__reschedule_patch","parameters":[{"name":"launch_id","in":"path","required":true,"schema":{"type":"string","title":"Launch Id"}},{"name":"scheduled_for","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"Scheduled For"}},{"name":"timezone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches/internal/execute/{launch_id}":{"post":{"tags":["v2 - Launches"],"summary":"Internal Execute Launch","description":"Execute a launch asynchronously. Called by Cloud Tasks, not by users.\n\nThis endpoint receives a callback from Google Cloud Tasks after\n``create_launch`` dispatches the work. It loads the launch from\nFirestore and runs the orchestrator, which may take several minutes\n(e.g. Instagram video processing).\n\n**Authentication:** verified Google OIDC only (``require_cron_oidc``,\nSEC-07) — the same guard as ``process_scheduled_launches`` below, and\nthe same one ``purchase_sweep_dispatcher`` targets.\n\nThis docstring previously claimed the Cloud Tasks header\n``X-CloudTasks-QueueName`` was checked \"to prevent direct invocation from\nexternal clients\". No such check existed anywhere in the function: the\nroute executed a launch — publishing to creators' connected social\naccounts — for anything that could reach the URL. A header would not have\nbeen worth much either, since any caller can send one; that is why SEC-07\nreplaced presence-of-header authorisation across the cron routes.\n\nWhen ``platform_config_id`` is provided, only that single platform\nexecutes (per-platform schedules, Phase 4 Option B). The parent\nlaunch finalises only once every platform has reached a terminal\nstate, so multiple per-platform tasks can fire independently.","operationId":"internal_execute_launch_v2_launches_internal_execute__launch_id__post","parameters":[{"name":"launch_id","in":"path","required":true,"schema":{"type":"string","title":"Launch Id"}},{"name":"platform_config_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When set, run only this single platform within the launch (Phase 4 Option B per-platform schedules). When omitted, run all pending platforms.","title":"Platform Config Id"},"description":"When set, run only this single platform within the launch (Phase 4 Option B per-platform schedules). When omitted, run all pending platforms."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/launches/process-scheduled":{"post":{"tags":["v2 - Launches"],"summary":"Process Scheduled Launches","description":"Process all scheduled launches that are due for execution.\n\nThis endpoint is designed to be called by Cloud Scheduler periodically\n(e.g., every 5 minutes). It finds all launches with:\n- status IN ['pending', 'scheduled']\n- scheduled_for <= now\n\nAnd executes them via the LaunchOrchestrator.\n\n**Authentication:**\nThis endpoint should be protected by Cloud Scheduler's OIDC authentication\nat the infrastructure level, not by user authentication.\n\n**Returns:**\n- processed: number of launches executed\n- results: list of {launch_id, status, error?}","operationId":"process_scheduled_launches_v2_launches_process_scheduled_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/launches/recover-stuck":{"post":{"tags":["v2 - Launches"],"summary":"Recover Stuck Launches","description":"Reset launches stuck in in_progress for more than 10 minutes, and\nimmediate launches that never started (pending, no scheduled_for) for more\nthan NEVER_STARTED_AFTER_MINUTES.\n\nDesigned to be called alongside process-scheduled by Cloud Scheduler.\nCatches launches that were abandoned due to Cloud Run timeout or\nunhandled exceptions in the orchestrator.","operationId":"recover_stuck_launches_v2_launches_recover_stuck_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/launches/health/storage":{"get":{"tags":["v2 - Launches"],"summary":"Check Storage Health","description":"Check if launch storage is working correctly.","operationId":"check_storage_health_v2_launches_health_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/handover/{content_id}":{"get":{"tags":["V2 Handover"],"summary":"Get Handover Options","description":"Where this piece can be handed over, for anyone who may publish it.\n\n`handover_url` is the mobile page the desktop QR code points at. It holds\nthe content id only; the page requires a signed-in publisher. `tiktok`\nlists the accounts publishing would use for this piece.","operationId":"get_handover_options_v2_handover__content_id__get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/handover/{content_id}/video":{"get":{"tags":["V2 Handover"],"summary":"Get Handover Video Url","description":"A short-lived signed GET URL for the piece's video file. Only for\nsomeone who may publish the piece; never cached, never stored: each call\nsigns a fresh one that dies after HANDOVER_URL_TTL_MINUTES.","operationId":"get_handover_video_url_v2_handover__content_id__video_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/handover/{content_id}/instagram":{"post":{"tags":["V2 Handover"],"summary":"Record Instagram Handover","description":"Record that the caller's share sheet handed the video to Instagram.\n\nThe dashboard calls this only after `navigator.share()` resolved. A\ncancelled share (AbortError) never calls it, so nothing is recorded.","operationId":"record_instagram_handover_v2_handover__content_id__instagram_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/handover/{content_id}/tiktok":{"post":{"tags":["V2 Handover"],"summary":"Send To Tiktok Drafts","description":"Send the video to a TikTok drafts inbox (video.upload), in the background.\n\nEverything that can be refused is refused here, before anything starts:\nwho may hand over, which account, the account's drafts access, a token\nthat refreshes, a video file. Then an upload row is written `queued` and\nplatform-upload-job sends it (tiktok_draft_upload.run_upload): the file is\nread from GCS one chunk at a time and PUT to TikTok, and no link to it is\nhanded to anyone. Answers 202 `sending` with an `upload_id` to follow at\nGET /v2/handover/tiktok-uploads/{upload_id}. 409\n`tiktok_reconnect_for_drafts` when the token lacks video.upload; TikTok\npublishing is unaffected by that.","operationId":"send_to_tiktok_drafts_v2_handover__content_id__tiktok_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TikTokHandoverRequest","default":{}}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/handover/tiktok-uploads/{upload_id}":{"get":{"tags":["V2 Handover"],"summary":"Get Tiktok Upload Status","description":"Follow a TikTok drafts upload: `sending`, `processing`, `handed_over`\nor `failed`. Records the handover the first time TikTok reports\nSEND_TO_USER_INBOX. Anyone who may publish the piece may ask.","operationId":"get_tiktok_upload_status_v2_handover_tiktok_uploads__upload_id__get","parameters":[{"name":"upload_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{platform}/auth-url":{"get":{"tags":["Credentials v2"],"summary":"Initiate Oauth","description":"Initiate OAuth flow for a platform.\n\nReturns an auth URL to redirect the user for authorization.\n\nOptional query params for post-callback navigation:\n    return_context_flow: Flow identifier (e.g. \"try_now_onboarding\")\n    return_context_workspace_id: Workspace ID for try-now flows","operationId":"initiate_oauth_v2_credentials__platform__auth_url_get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}},{"name":"return_context_flow","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Context Flow"}},{"name":"return_context_workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Context Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthInitiateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{platform}/callback":{"post":{"tags":["Credentials v2"],"summary":"Oauth Callback","description":"Handle OAuth callback and store credentials.\n\nThis endpoint is called by the frontend after the user authorizes.","operationId":"oauth_callback_v2_credentials__platform__callback_post","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthCallbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthCallbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{platform}/connect-token":{"post":{"tags":["Credentials v2"],"summary":"Connect Token","description":"Connect a token-based platform (Mux, Vimeo OTT).\n\nFor Mux: token_id = Mux Token ID, token_secret = Mux Token Secret\nFor Vimeo OTT: token_id = API key, token_secret = API secret\n\nprofile_id comes from auth cookie only — never from request body.","operationId":"connect_token_v2_credentials__platform__connect_token_post","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthCallbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials":{"get":{"tags":["Credentials v2"],"summary":"List Credentials","description":"List all credentials for the authenticated user.\n\nPass check_tokens=true to include live token_valid checks (adds latency).","operationId":"list_credentials_v2_credentials_get","parameters":[{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by platform","title":"Platform"},"description":"Filter by platform"},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","description":"Include inactive credentials","default":false,"title":"Include Inactive"},"description":"Include inactive credentials"},{"name":"check_tokens","in":"query","required":false,"schema":{"type":"boolean","description":"Validate tokens against platform APIs","default":false,"title":"Check Tokens"},"description":"Validate tokens against platform APIs"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/by-platform":{"get":{"tags":["Credentials v2"],"summary":"List Credentials By Platform","description":"List all credentials grouped by platform.\n\nUseful for the frontend to display credentials organized by platform.\nPass check_tokens=true to include live token_valid checks (adds latency).","operationId":"list_credentials_by_platform_v2_credentials_by_platform_get","parameters":[{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","description":"Include inactive credentials","default":false,"title":"Include Inactive"},"description":"Include inactive credentials"},{"name":"check_tokens","in":"query","required":false,"schema":{"type":"boolean","description":"Validate tokens against platform APIs","default":false,"title":"Check Tokens"},"description":"Validate tokens against platform APIs"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialsByPlatformResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{credential_id}":{"get":{"tags":["Credentials v2"],"summary":"Get Credential","description":"Get details of a specific credential.","operationId":"get_credential_v2_credentials__credential_id__get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Credentials v2"],"summary":"Update Credential","description":"Update a credential (currently only nickname can be updated).","operationId":"update_credential_v2_credentials__credential_id__patch","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCredentialRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Credentials v2"],"summary":"Delete Credential","description":"Delete a credential.\n\nBy default, performs a soft delete (marks as inactive).\nUse hard_delete=true to permanently remove.","operationId":"delete_credential_v2_credentials__credential_id__delete","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"hard_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Permanently delete (default: soft delete)","default":false,"title":"Hard Delete"},"description":"Permanently delete (default: soft delete)"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{credential_id}/tokenise-destination":{"patch":{"tags":["Credentials v2"],"summary":"Set Tokenise Destination","description":"Set where a connected channel's imported history tokenises.\n\nImported channel history has no workspace — nothing is downloaded, so there\nis no container — and registration refuses until a destination exists\n(content_routes.register_content_for_revenue, 409\n`tokenise_destination_unset`). This is the only thing that clears that\nrefusal, and the last gate before a permanent on-chain allocation, so every\nfact is checked HERE rather than assumed from the client having rendered a\nfiltered list of teams.\n\nChanging a destination applies FORWARD ONLY. Content already registered\ncarries its own copy of the destination it was minted under\n(`contents_v2.tokenise_destination_mode` / `tokenise_team_id`), and\n`resolve_registration_destination` reads that copy in preference to the\ncredential. Nothing here touches contents_v2 — that copy is the record, and\nthe split derived from it is already on-chain.","operationId":"set_tokenise_destination_v2_credentials__credential_id__tokenise_destination_patch","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTokeniseDestinationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{credential_id}/revalidate":{"post":{"tags":["Credentials v2"],"summary":"Revalidate Credential Endpoint","description":"Ask the platform whether the STORED credential still works, whatever\n`status` says, and act on the answer. This is what the Reconnect button\ncalls.\n\nTHREE OUTCOMES:\n  alive         the platform accepted the stored credential. Status is\n                `active` again, the auth notification is cleared. No form.\n  dead          the platform answered 401. Status is `needs_reauth`;\n                `needs_input` says what the creator must now supply (for\n                Mux only the secret — the Token ID is `account_id`).\n  undetermined  the platform could not be asked (timeout, 5xx, 429, no\n                probe). NOTHING changed except the evidence stamp; the\n                caller may simply try again.\n\nWhy this exists: the health endpoint below refused non-active rows, the\nlist endpoint's `token_valid` returned False before decrypting, and the\nsweep skipped flagged rows — so a `needs_reauth` written by a refresher\nthat never contacted the platform could never be disproved. Loading the\ncredential regardless of status is the whole point.","operationId":"revalidate_credential_endpoint_v2_credentials__credential_id__revalidate_post","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevalidateCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{credential_id}/health":{"get":{"tags":["Credentials v2"],"summary":"Check Credential Health","description":"Check if a credential's access token is still valid by making\na lightweight API call to the platform. Refreshes first where the\nplatform has a refresher and the stored token is stale.\n\nSame check as POST /{id}/revalidate, kept for the callers of this shape.\nIt no longer marks a credential dead because a platform had no probe,\nand no longer refuses a credential that is already flagged.\n\nReturns:\n    status: \"healthy\" | \"refreshed\" | \"needs_reauth\" | \"unknown\"\n    platform, account_name, detail\n\n\"unknown\" is the third outcome: the platform could not be asked and\nnothing was changed.","operationId":"check_credential_health_v2_credentials__credential_id__health_get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{credential_id}/facebook-pages":{"get":{"tags":["Credentials v2"],"summary":"List Facebook Pages","description":"List Facebook Pages the user manages for a given credential.\n\nReturns page_id, name, and category for each Page.\nThe page_id is needed when creating a PlatformConfig for Facebook.\n\nSupports shared credentials: if the caller is not the owner, they can\npass ?team_id=xxx to check access via SharedCredential.","operationId":"list_facebook_pages_v2_credentials__credential_id__facebook_pages_get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Team ID to check shared credential access","title":"Team Id"},"description":"Team ID to check shared credential access"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPagesListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{credential_id}/facebook-page":{"patch":{"tags":["Credentials v2"],"summary":"Set Facebook Page","description":"Choose the Page this Facebook connection publishes to.\n\nThe Graph API publishes to a Page, never to the account, and an account\nmay manage several. Until this route existed the callback kept whichever\nPage Meta listed first and nothing could change it. The choice is checked\nagainst Meta live: `page_id` must be a Page the account manages NOW, not\none the client remembered.\n\nOWNER ONLY. A team member publishing through a shared credential can read\nthe list (GET facebook-pages, with ?team_id) but not move the owner's\nconnection to another Page.\n\nApplies forward to every config created from now on\n(platform_config_routes._seed_connection_settings), and fills the Page\ninto this credential's existing Facebook configs that carry none, which\nis what an INCOMPLETE Facebook destination needed to become READY.\nConfigs that already name a Page are left alone: that was a choice.","operationId":"set_facebook_page_v2_credentials__credential_id__facebook_page_patch","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetFacebookPageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/{credential_id}/location-search":{"get":{"tags":["Credentials v2"],"summary":"Search Locations","description":"Search for locations via Meta Pages Search API.\n\nReturns locations that can be used as `location_id` in Instagram PlatformConfig.\nWorks with both Facebook and Instagram credentials (both use Meta Graph API).\n\nThe frontend should call this with a debounced search input and display\nresults in an autocomplete dropdown.","operationId":"search_locations_v2_credentials__credential_id__location_search_get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search query (e.g. 'New York')","title":"Q"},"description":"Search query (e.g. 'New York')"},{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Team ID to check shared credential access","title":"Team Id"},"description":"Team ID to check shared credential access"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/credentials/cron/health-sweep":{"post":{"tags":["Credentials v2"],"summary":"Cron Credential Health Sweep","description":"Probe every active credential and mark the ones the platform says are dead.\n\nSame auth as every other scheduled job in this service: Cloud Scheduler\nOIDC, verified by require_cron_oidc against CRON_OIDC_AUDIENCE and the\nCRON_SERVICE_ACCOUNTS allowlist (cron_auth.py:145-156). Nothing else can\ncall it.\n\nNIGHTLY, not hourly. These tokens die on a scale of months — the oldest\ndead one here expired in April — so an hourly sweep is 26 API calls an hour\nto learn nothing, against third-party rate limits, to shorten a detection\nwindow nobody is watching by 23 hours. Nightly also means a marked\ncredential is excluded from the NEXT import cron run rather than the\ncurrent one.\n\n`dry_run=true` classifies and reports without writing, so the first sweep\ncan be read before it marks anything.\n\nMarks ONLY on a definite platform answer. A timeout, a 429 or a 5xx is\nrecorded as undetermined and changes nothing — see\ncredential_health_policy for why that distinction is the point of this job.","operationId":"cron_credential_health_sweep_v2_credentials_cron_health_sweep_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform-configs":{"post":{"tags":["v2 - PlatformConfig"],"summary":"Create Platform Config","description":"Create a new platform configuration for a content.\n\nEach config represents how to publish to a specific platform/account.\nA content can have multiple configs for the same platform with different credentials.\n\nAccess: Must have CONTENT_EDIT permission on the content's workspace.","operationId":"create_platform_config_v2_platform_configs_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePlatformConfigRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - PlatformConfig"],"summary":"List Platform Configs","description":"List all platform configurations for a content.\n\nOptionally filter by platform type.\nPass check_tokens=true to include live token_valid checks (adds latency).\nWhen a token is invalid, a notification is written to the user's feed.\n\nAccess: Must have CONTENT_VIEW permission on the content's workspace.","operationId":"list_platform_configs_v2_platform_configs_get","parameters":[{"name":"content_id","in":"query","required":true,"schema":{"type":"string","description":"Content ID to list configs for","title":"Content Id"},"description":"Content ID to list configs for"},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by platform type","title":"Platform"},"description":"Filter by platform type"},{"name":"check_tokens","in":"query","required":false,"schema":{"type":"boolean","description":"Validate tokens against platform APIs","default":false,"title":"Check Tokens"},"description":"Validate tokens against platform APIs"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformConfigListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform-configs/bulk":{"post":{"tags":["v2 - PlatformConfig"],"summary":"Bulk Create Platform Configs","description":"Create multiple platform configurations for a content at once.\n\nUseful when the user selects multiple platforms/accounts in a single step.\nEach item is processed independently — partial success is possible.\n\nAccess: Must have CONTENT_EDIT permission on the content's workspace.","operationId":"bulk_create_platform_configs_v2_platform_configs_bulk_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreatePlatformConfigsRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreatePlatformConfigsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["v2 - PlatformConfig"],"summary":"Bulk Update Platform Configs","description":"Update multiple platform configurations at once.\n\nUseful when the user configures settings for multiple platforms\nand clicks \"Save All\". Each config in the request will be updated\nindependently - failures on one config won't affect others.\n\nAccess: Must have CONTENT_EDIT permission on each config's content's workspace.","operationId":"bulk_update_platform_configs_v2_platform_configs_bulk_put","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdatePlatformConfigsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdatePlatformConfigsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform-configs/schemas":{"get":{"tags":["v2 - PlatformConfig"],"summary":"Get All Platform Schemas","description":"Get the settings schema for all platforms.\n\nReturns JSON schemas and field definitions for each platform,\nwhich the frontend can use to dynamically generate forms.","operationId":"get_all_platform_schemas_v2_platform_configs_schemas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllPlatformSchemasResponse"}}}}}}},"/v2/platform-configs/schemas/{platform}":{"get":{"tags":["v2 - PlatformConfig"],"summary":"Get Platform Schema","description":"Get the settings schema for a specific platform.\n\nReturns JSON schema and field definitions for the platform,\nwhich the frontend can use to dynamically generate the settings form.","operationId":"get_platform_schema_v2_platform_configs_schemas__platform__get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformSettingsSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform-configs/schemas/{platform}/requirements":{"get":{"tags":["v2 - PlatformConfig"],"summary":"Get Platform Requirements","description":"Get validation requirements for a specific platform.\n\nReturns:\n- required_fields: Fields that must be filled\n- limits: Character/count limits for fields\n- inherits_from_content: Fields that can use Content values as fallback\n- notes: Platform-specific tips\n\nUsed by frontend for:\n- Real-time validation as user types\n- Showing required field indicators\n- Character counters","operationId":"get_platform_requirements_v2_platform_configs_schemas__platform__requirements_get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformRequirementsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform-configs/{config_id}":{"get":{"tags":["v2 - PlatformConfig"],"summary":"Get Platform Config","description":"Get full details of a platform configuration.\n\nAccess: Must have CONTENT_VIEW permission on the content's workspace.","operationId":"get_platform_config_v2_platform_configs__config_id__get","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - PlatformConfig"],"summary":"Update Platform Config","description":"Update a platform configuration.\n\nOnly provided fields will be updated.\n\nAccess: Must have CONTENT_EDIT permission on the content's workspace.","operationId":"update_platform_config_v2_platform_configs__config_id__patch","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePlatformConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - PlatformConfig"],"summary":"Delete Platform Config","description":"Delete a platform configuration.\n\nAccess: Must have CONTENT_EDIT permission on the content's workspace.","operationId":"delete_platform_config_v2_platform_configs__config_id__delete","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform-configs/{config_id}/ready":{"post":{"tags":["v2 - PlatformConfig"],"summary":"Mark Config Ready","description":"Mark a platform configuration as ready for publishing.\n\nValidates that required settings are present for the platform.\n\nAccess: Must have CONTENT_EDIT permission on the content's workspace.","operationId":"mark_config_ready_v2_platform_configs__config_id__ready_post","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform-configs/health/storage":{"get":{"tags":["v2 - PlatformConfig","v2 - PlatformConfig","Health"],"summary":"Check Storage Health","description":"Check if platform config storage is properly configured.","operationId":"check_storage_health_v2_platform_configs_health_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/platform-defaults/{credential_id}":{"get":{"tags":["v2 - PlatformDefaults"],"summary":"Get Platform Default","description":"Get saved default settings for a credential.\n\nReturns empty settings object if no defaults have been saved yet.","operationId":"get_platform_default_v2_platform_defaults__credential_id__get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformDefaultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["v2 - PlatformDefaults"],"summary":"Save Platform Default","description":"Save (create or update) default settings for a credential.\n\nOnly the credential owner can save defaults.\nThe settings dict is partial — include only the fields you want as defaults.","operationId":"save_platform_default_v2_platform_defaults__credential_id__put","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavePlatformDefaultRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformDefaultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - PlatformDefaults"],"summary":"Delete Platform Default","description":"Remove saved defaults for a credential.\n\nOnly the credential owner can delete defaults.","operationId":"delete_platform_default_v2_platform_defaults__credential_id__delete","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","title":"Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams":{"post":{"tags":["v2 - Teams"],"summary":"Create Team","description":"Create a new team.\n\nThe authenticated user becomes the owner of the team.","operationId":"create_team_v2_teams_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTeamRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Teams"],"summary":"List Teams","description":"List all teams the user is a member of.\n\nReturns lightweight card data for efficient list rendering.\n\n**Query params:**\n- `include=workspaces` - Include workspaces inline (avoids N+1 requests)","operationId":"list_teams_v2_teams_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Include related data. Use 'workspaces' to include workspaces inline.","title":"Include"},"description":"Include related data. Use 'workspaces' to include workspaces inline."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TeamListResponse"},{"$ref":"#/components/schemas/TeamListWithWorkspacesResponse"}],"title":"Response List Teams V2 Teams Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/search":{"get":{"tags":["v2 - Teams"],"summary":"Search Teams","description":"Search teams by name.\n\nOnly searches teams the user is a member of.\nReturns matching teams with highlights.","operationId":"search_teams_v2_teams_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}":{"get":{"tags":["v2 - Teams"],"summary":"Get Team","description":"Get full details of a team.\n\nUser must be a member of the team.","operationId":"get_team_v2_teams__team_id__get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - Teams"],"summary":"Update Team","description":"Update a team's details.\n\nRequires TEAM_EDIT permission. The split fields also need FINANCIALS_EDIT,\nand from an agent key they pass agent_split_guard (give, never take, unless\nthe key carries the splits permission).","operationId":"update_team_v2_teams__team_id__patch","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTeamRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - Teams"],"summary":"Delete Team","description":"Delete a team.\n\nOnly the owner can delete a team.\nThis does NOT delete associated workspaces.","operationId":"delete_team_v2_teams__team_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/stats":{"get":{"tags":["v2 - Teams"],"summary":"Get Team Stats","description":"Get aggregated statistics for a team.\n\nCalculates total_contents, total_launches, etc. by summing from all team workspaces.\nThis provides real-time stats without requiring denormalized counters.\n\nUser must be a member of the team.","operationId":"get_team_stats_v2_teams__team_id__stats_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamAggregatedStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/transfer":{"post":{"tags":["v2 - Teams"],"summary":"Transfer Ownership","description":"Transfer team ownership to another admin.\n\nOnly the current owner can transfer ownership.\nThe new owner must be an Admin of the team.","operationId":"transfer_ownership_v2_teams__team_id__transfer_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferOwnershipRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/members":{"get":{"tags":["v2 - Teams"],"summary":"List Members","description":"List all members of a team.\n\nUser must be a member of the team.","operationId":"list_members_v2_teams__team_id__members_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/members/{member_profile_id}":{"patch":{"tags":["v2 - Teams"],"summary":"Update Member Role","description":"Update a member's role.\n\nRequires MEMBERS_MANAGE permission.\nCannot change the owner's role (use transfer ownership instead).","operationId":"update_member_role_v2_teams__team_id__members__member_profile_id__patch","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"member_profile_id","in":"path","required":true,"schema":{"type":"string","title":"Member Profile Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberRoleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - Teams"],"summary":"Remove Member","description":"Remove a member from the team.\n\nRequires MEMBERS_MANAGE permission.\nCannot remove the owner (use delete team instead).","operationId":"remove_member_v2_teams__team_id__members__member_profile_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"member_profile_id","in":"path","required":true,"schema":{"type":"string","title":"Member Profile Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/leave":{"post":{"tags":["v2 - Teams"],"summary":"Leave Team","description":"Leave a team.\n\nThe owner cannot leave (must transfer ownership first).","operationId":"leave_team_v2_teams__team_id__leave_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/my-permissions":{"get":{"tags":["v2 - Teams"],"summary":"Get My Permissions","description":"Get the current user's permissions in a team.\n\nUseful for UI to determine what actions to show.","operationId":"get_my_permissions_v2_teams__team_id__my_permissions_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/workspaces":{"get":{"tags":["v2 - Teams"],"summary":"List Team Workspaces","description":"List all workspaces linked to this team.\n\nUser must be a member of the team.\n\nResponse includes progress information for each workspace:\n- progress: Overall percentage (0-100)\n- progress_summary: Breakdown by category (published, in_progress, pending)","operationId":"list_team_workspaces_v2_teams__team_id__workspaces_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"include_progress","in":"query","required":false,"schema":{"type":"boolean","description":"Include progress calculation","default":true,"title":"Include Progress"},"description":"Include progress calculation"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/workspaces/{workspace_id}":{"post":{"tags":["v2 - Teams"],"summary":"Link Workspace To Team","description":"Link a workspace to a team.\n\nRequirements:\n- User must have WORKSPACE_CREATE permission in the team\n- User must be the workspace owner\n\nNote: Linking a workspace to a team gives all team members access.","operationId":"link_workspace_to_team_v2_teams__team_id__workspaces__workspace_id__post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - Teams"],"summary":"Unlink Workspace From Team","description":"Unlink a workspace from a team.\n\nRequirements:\n- User must have WORKSPACE_CREATE permission in the team OR be workspace owner\n\nNote: Unlinking removes team access but doesn't delete the workspace.","operationId":"unlink_workspace_from_team_v2_teams__team_id__workspaces__workspace_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/activity":{"get":{"tags":["v2 - Teams"],"summary":"Get Team Activity","description":"Get the team activity timeline.\n\nReturns audit events ordered by most recent first.\nCan filter by action type (e.g., member_joined, credential_shared).\n\nUser must be a member of the team.","operationId":"get_team_activity_v2_teams__team_id__activity_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/invites":{"post":{"tags":["v2 - Team Invites"],"summary":"Create Invite","description":"Create an invitation to join the team.\n\nRequires MEMBERS_INVITE permission.\nCannot invite someone who is already a member.\nA repeat invite to the same address replaces the pending one (no 409).","operationId":"create_invite_v2_teams__team_id__invites_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInviteRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Team Invites"],"summary":"List Team Invites","description":"List all invites for a team.\n\nRequires MEMBERS_VIEW permission.\nCan filter by status: pending, accepted, rejected, expired, cancelled.\n\nThe filter is accepted under two names. The dashboard sends\n`status_filter`; the MCP tool `teams_invites_list` sends `status`, and\nuntil 2026-10-09 FastAPI silently dropped that unknown query key, so an\nagent asking for `pending` got every invite the team ever sent. An\nunknown value matches nothing, as it always did.","operationId":"list_team_invites_v2_teams__team_id__invites_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: pending, accepted, rejected, expired, cancelled.","title":"Status Filter"},"description":"Filter: pending, accepted, rejected, expired, cancelled."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Same filter under the name the MCP tool and its schema use.","title":"Status"},"description":"Same filter under the name the MCP tool and its schema use."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/invites/{invite_id}":{"delete":{"tags":["v2 - Team Invites"],"summary":"Cancel Invite","description":"Cancel a pending invitation.\n\nRequires MEMBERS_INVITE permission.\nCan only cancel pending invites.","operationId":"cancel_invite_v2_teams__team_id__invites__invite_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/invites/pending":{"get":{"tags":["v2 - Team Invites"],"summary":"List My Pending Invites","description":"List all pending invites for the current user.\n\nUsed to show a notification badge or list of pending team invitations.","operationId":"list_my_pending_invites_v2_invites_pending_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/invites/{invite_id}/preview":{"get":{"tags":["v2 - Team Invites"],"summary":"Preview Invite","description":"Public, UNAUTHENTICATED preview of an invite.\n\nNO auth dependency, deliberately: the invitee opens this link before they\nhave an account or a session, so any `get_current_user` here would break\nthe whole email flow. The invite_id itself is the credential.\n\nReturns an explicit allowlist (InvitePreviewResponse) — see that model for\nwhat is withheld and why.\n\nA dead or consumed invite answers 200 with `actionable: false` and NO team\nor inviter detail, so the page can say \"this invite has expired\" instead of\na generic error, while a guessed or reused id reveals nothing. Only an\nunknown id is a 404.","operationId":"preview_invite_v2_invites__invite_id__preview_get","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitePreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/invites/{invite_id}/accept":{"post":{"tags":["v2 - Team Invites"],"summary":"Accept Invite","description":"Accept a team invitation.\n\nAdds the user as a member of the team with the invited role.","operationId":"accept_invite_v2_invites__invite_id__accept_post","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/invites/{invite_id}/reject":{"post":{"tags":["v2 - Team Invites"],"summary":"Reject Invite","description":"Reject a team invitation.","operationId":"reject_invite_v2_invites__invite_id__reject_post","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/credentials":{"post":{"tags":["v2 - Shared Credentials"],"summary":"Share Credential","description":"Share one of your credentials with the team.\n\nIMPORTANT: Only the credential owner can share it.\nRequires CREDENTIALS_SHARE permission.\nCannot share the same credential twice with the same team.\n\nEvery check is _share_one's, unchanged. After a share (new or\nreactivated) the team owner is emailed (2026-10-05).","operationId":"share_credential_v2_teams__team_id__credentials_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareCredentialRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Shared Credentials"],"summary":"List Shared Credentials","description":"List all credentials shared with the team.\n\nRequires CREDENTIALS_VIEW permission.\nBy default, only shows active credentials.","operationId":"list_shared_credentials_v2_teams__team_id__credentials_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Inactive"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedCredentialListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/credentials/batch":{"post":{"tags":["v2 - Shared Credentials"],"summary":"Share Credentials Batch","description":"Share several of your credentials with the team in one tap (the share\npop-up, 2026-10-05). Each one goes through _share_one, exactly as the\nsingle route does: same permission, same owner-only rule, same 409 for\none already shared. One credential failing does not stop the rest; each\ngets its own outcome. The team owner gets ONE email naming every\nplatform that was shared.","operationId":"share_credentials_batch_v2_teams__team_id__credentials_batch_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareCredentialsBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/credentials/available":{"get":{"tags":["v2 - Shared Credentials"],"summary":"List Available Credentials","description":"List all credentials available to the user in team context.\n\nReturns both:\n- Personal credentials owned by the user\n- Shared credentials from other team members\n\nUseful for credential selection dropdown when creating a PlatformConfig.","operationId":"list_available_credentials_v2_teams__team_id__credentials_available_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableCredentialsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/credentials/{shared_credential_id}":{"delete":{"tags":["v2 - Shared Credentials"],"summary":"Revoke Shared Credential","description":"Revoke a shared credential.\n\nOnly the owner of the credential or team admin can revoke it.","operationId":"revoke_shared_credential_v2_teams__team_id__credentials__shared_credential_id__delete","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"shared_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Shared Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - Shared Credentials"],"summary":"Update Shared Credential","description":"Update a shared credential's nickname.\n\nOnly the owner can update the nickname.","operationId":"update_shared_credential_v2_teams__team_id__credentials__shared_credential_id__patch","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"shared_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Shared Credential Id"}},{"name":"nickname","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/credentials/{shared_credential_id}/insights":{"patch":{"tags":["v2 - Shared Credentials"],"summary":"Update Shared Credential Insights","description":"Switch team insights on or off for one shared channel (Tom, 2026-10-07).\n\n- history_and_stats: the team's owner and admins may import this\n  channel's history and read its public posts, stats and audience.\n- recent_videos: they may also take caption text, and file links where\n  enabled, for up to 10 recent public posts. Needs history_and_stats.\n\nOnly the credential's owner may change these, and only while the share is\nactive. Switching ON needs the owner signed in as themselves; an agent or\nkey may only switch OFF. Both start off and both clear on revoke.","operationId":"update_shared_credential_insights_v2_teams__team_id__credentials__shared_credential_id__insights_patch","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"shared_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Shared Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareInsightsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/credentials/mine":{"get":{"tags":["v2 - Shared Credentials"],"summary":"List My Shared Credentials","description":"List credentials I have shared with this team.\n\nUseful for \"My Contributions\" view.","operationId":"list_my_shared_credentials_v2_teams__team_id__credentials_mine_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/requested-platforms":{"get":{"tags":["v2 - Team connect onboarding"],"summary":"Get Requested Platforms","description":"The platforms this team asks its members to connect. [] means pick any.","operationId":"get_requested_platforms_v2_teams__team_id__requested_platforms_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["v2 - Team connect onboarding"],"summary":"Set Requested Platforms","description":"Set the list. Owner, admin or manager. Unknown platform ids are refused, not dropped.","operationId":"set_requested_platforms_v2_teams__team_id__requested_platforms_put","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestedPlatformsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/connect-status":{"get":{"tags":["v2 - Team connect onboarding"],"summary":"Get Connect Status","description":"Per member: role, whether the role can share, which platforms are\nconnected, which are shared with this team, and the follow-up state.\nOwner, admin or manager. Public names and member_refs, never emails or\nprofile IDs.","operationId":"get_connect_status_v2_teams__team_id__connect_status_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/connect-email":{"post":{"tags":["v2 - Team connect onboarding"],"summary":"Send Connect Email","description":"The follow-up email, on demand: to one member, or to every member who\nhas not shared anything with the team yet, the owner included and the\nsender never. Same content as the 2-hour follow-up. dry_run=true lists\nexactly who would be emailed and sends nothing. Owner, admin or manager.","operationId":"send_connect_email_v2_teams__team_id__connect_email_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectEmailRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/insights/channels":{"get":{"tags":["v2 - Team insights"],"summary":"List Insight Channels","description":"Every account shared with this team, with what its owner switched on.","operationId":"list_insight_channels_v2_teams__team_id__insights_channels_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/insights/channels/{shared_credential_id}/import":{"post":{"tags":["v2 - Team insights"],"summary":"Import Insight Channel","description":"Import this channel's history now, as its owner, with this credential.\n\nExactly the creator's own import: same rows, same owner, same 24-hour\nwindow (shared with the creator's own button), same job document.","operationId":"import_insight_channel_v2_teams__team_id__insights_channels__shared_credential_id__import_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"shared_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Shared Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/insights/channels/{shared_credential_id}/import-status":{"get":{"tags":["v2 - Team insights"],"summary":"Insight Channel Import Status","operationId":"insight_channel_import_status_v2_teams__team_id__insights_channels__shared_credential_id__import_status_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"shared_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Shared Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/insights/channels/{shared_credential_id}/items":{"get":{"tags":["v2 - Team insights"],"summary":"List Insight Items","description":"The channel's imported public posts, newest first, with latest stats.","operationId":"list_insight_items_v2_teams__team_id__insights_channels__shared_credential_id__items_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"shared_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Shared Credential Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/insights/channels/{shared_credential_id}/items/{content_id}/analytics":{"get":{"tags":["v2 - Team insights"],"summary":"Insight Item Analytics","operationId":"insight_item_analytics_v2_teams__team_id__insights_channels__shared_credential_id__items__content_id__analytics_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"shared_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Shared Credential Id"}},{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/insights/channels/{shared_credential_id}/audience":{"get":{"tags":["v2 - Team insights"],"summary":"Insight Channel Audience","description":"Who watches: read live from the platform, held in this process for\nup to 6 hours, never written anywhere. YouTube only today.","operationId":"insight_channel_audience_v2_teams__team_id__insights_channels__shared_credential_id__audience_get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"shared_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Shared Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/teams/{team_id}/insights/channels/{shared_credential_id}/recent-videos":{"post":{"tags":["v2 - Team insights"],"summary":"Insight Recent Videos","description":"Material from the channel's most recent PUBLIC posts, for learning the\ncreator's voice and style. JubJub stores none of it and runs no AI on it.\n\n- YouTube: caption text (VTT) for up to 5 videos, from the creator's own\n  caption tracks via captions.download.\n- Instagram / Facebook: platform file links that expire on their own,\n  ONLY while TEAM_INSIGHTS_META_VIDEO_LINKS is on (off until Tom confirms\n  Meta's approved use case covers it).\n- TikTok, LinkedIn, everything else: no files.\n\nOnce per 7 days per team and channel, counted only when something came back.","operationId":"insight_recent_videos_v2_teams__team_id__insights_channels__shared_credential_id__recent_videos_post","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"shared_credential_id","in":"path","required":true,"schema":{"type":"string","title":"Shared Credential Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecentVideosRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/team-connect/cron/followups":{"post":{"tags":["v2 - Team connect onboarding"],"summary":"Cron Connect Followups","description":"Every 15 minutes: one follow-up email per team-invite acceptance that is\nover 2 hours old and not yet handled. At most one, ever, per acceptance.","operationId":"cron_connect_followups_v2_team_connect_cron_followups_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles":{"get":{"tags":["v2 - Profiles"],"summary":"Get Profiles Batch","description":"Batch lookup profiles by IDs.\n\nReturns profile summaries for the given IDs, IN REQUEST ORDER (ids that\nwere not found are left out and listed in `not_found`).\n\nPRIVACY (2026-09-25): another person's row is their public profile only:\nno `profile_id`, no `email` (those are on your own row, `is_you`, and for\na platform admin). Match rows to the ids you asked for by position.\n\n**Usage:**\n```\nGET /v2/profiles?ids=prof_abc,prof_xyz,prof_123\n```\n\n**Note:** Maximum 50 IDs per request to prevent abuse.","operationId":"get_profiles_batch_v2_profiles_get","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated list of profile IDs","title":"Ids"},"description":"Comma-separated list of profile IDs","example":"prof_abc123,prof_xyz789"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles/wallet-rails":{"post":{"tags":["v2 - Profiles"],"summary":"Register Wallet Rails","description":"Register wallet rails (Privy wallet) for the authenticated user.\n\nWrites wallet_rails structured metadata and appends the address to\nwallet_addresses for fast array-contains lookups. Both fields are\nwritten in a single Firestore update.\n\nIdempotent: returns 200 if already registered with the same privy_user_id.\nReturns 409 if wallet_rails.evm exists with a different privy_user_id.","operationId":"register_wallet_rails_v2_profiles_wallet_rails_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterWalletRailsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletRailsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Profiles"],"summary":"Get Wallet Rails","description":"Get wallet rails for the authenticated user.\n\nReturns the wallet_rails object if registered, null otherwise.","operationId":"get_wallet_rails_v2_profiles_wallet_rails_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletRailsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles/me":{"patch":{"tags":["v2 - Profiles"],"summary":"Update My Profile","description":"Update the authenticated user's own profile.\n\nPATCH semantics: only fields explicitly provided are written.\nMutable fields: display_name, avatar_url, bio.\nEmail is SET-ONCE: written only when the profile has no email yet (lets a\nwallet-only viewer add an email to publish & get paid); ignored if an email\nalready exists. No verification / Privy / Firebase user is involved.\n\nReturns the updated profile.","operationId":"update_my_profile_v2_profiles_me_patch","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMyProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles/me/handle":{"patch":{"tags":["v2 - Profiles"],"summary":"Update My Handle","description":"Set or change the authenticated user's @handle.\n\nValidation rules (src/utils/handle.py):\n- 3 to 30 chars\n- Lowercase letters, numbers, underscores only\n- Must start with a letter\n- Cannot be on the reserved list\n\nUniqueness: case-insensitive. Returns 409 if another profile holds the\nhandle (the current user holding it is a no-op success).","operationId":"update_my_handle_v2_profiles_me_handle_patch","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMyHandleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles/mentionable":{"get":{"tags":["v2 - Profiles"],"summary":"List Mentionable Profiles","description":"Return profiles matching `prefix` for @mention autocomplete.\n\nRanking:\n  1. `workspace_member` — the workspace's people: owner, direct members,\n     the members of the team the workspace is linked to (`team_id`), and\n     the caller. The same union as GET /v2/workspaces/{id}/members; a\n     team member has access to the workspace, so they are a person in\n     it (2026-09-09: a confirmed team member could not be tagged from a\n     workspace their team owns). Matched on handle, display name OR\n     email, so a member with no handle is found by name and a member\n     with no name yet is found by email. With an empty prefix this is\n     the whole list, which is what a bare \"@\" shows. Sorted by\n     handle/name.\n  2. `recent_collaborator` — profiles whose handle starts with `prefix`\n     and who share a workspace with the caller where activity occurred\n     within the last 90 days. Sorted by `last_collaborated_at` desc,\n     then alphabetical by handle. Skipped for an empty prefix.\n\nThe caller is included. A solo workspace has exactly one person in it,\nand that person could not tag themself (2026-09-05: \"No matching\nprofiles\" on the owner's own workspace).\n\nRecency gate (\"90-day window\"): if no shared workspace has any activity\n(content, launch, or workspace-scope comment) within the last 90 days,\nthe candidate is dropped. v0 simplification documented in\n`_latest_workspace_activity`.","operationId":"list_mentionable_profiles_v2_profiles_mentionable_get","parameters":[{"name":"prefix","in":"query","required":false,"schema":{"type":"string","maxLength":30,"description":"Handle or name prefix, case-insensitive. Empty lists the workspace's people.","default":"","title":"Prefix"},"description":"Handle or name prefix, case-insensitive. Empty lists the workspace's people."},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional workspace_id to boost direct members","title":"Workspace Id"},"description":"Optional workspace_id to boost direct members"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"description":"Maximum results (capped at 25)","default":10,"title":"Limit"},"description":"Maximum results (capped at 25)"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MentionableListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles/{profile_id}":{"get":{"tags":["v2 - Profiles"],"summary":"Get Profile","description":"Get a single profile by ID.\n\nYour own profile in full; anyone else's public profile only (no\nprofile_id, no email) unless you are a platform admin.","operationId":"get_profile_v2_profiles__profile_id__get","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles/{profile_id}/wallets":{"post":{"tags":["v2 - Profiles"],"summary":"Add Wallet","description":"Add a wallet address to a profile.\n\nValidates EVM format (0x + 40 hex chars). Appends if not already present.\nOnly the profile owner can modify their wallets.","operationId":"add_wallet_v2_profiles__profile_id__wallets_post","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddWalletRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles/{profile_id}/wallets/{wallet_address}":{"delete":{"tags":["v2 - Profiles"],"summary":"Remove Wallet","description":"Remove a wallet address from a profile.\n\nOnly the profile owner can modify their wallets.","operationId":"remove_wallet_v2_profiles__profile_id__wallets__wallet_address__delete","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}},{"name":"wallet_address","in":"path","required":true,"schema":{"type":"string","title":"Wallet Address"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles/wallets/claim-agent":{"post":{"tags":["v2 - Profiles"],"summary":"Claim Agent Wallet","description":"Bind a wallet-only agent profile to the signed-in person.\n\nProof is SIWE over the agent's wallet: whoever holds that key made the\nagent, and signing from it says so. Refused for a wallet that is not on\nan `agent_viewer` profile (a person's own wallet is docked through\nwallet-rails, not claimed), and for an agent already owned by someone\nelse. Idempotent for the same owner. Only humans may own agents: an\nagent-key session cannot claim one.","operationId":"claim_agent_wallet_v2_profiles_wallets_claim_agent_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimAgentWalletRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimAgentWalletResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/profiles/me/payouts/release":{"post":{"tags":["v2 - Profiles"],"summary":"Release My Payouts","description":"Re-check the caller's payout identity and release any held tokens.\n\nSafe to call at any time: the on-chain registration is idempotent and\nthe identity check is a read. Returns the reason either way, so a\nsurface can say \"held: verify your email\" rather than nothing.","operationId":"release_my_payouts_v2_profiles_me_payouts_release_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutReleaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/communication/":{"post":{"tags":["v2 - Communication"],"summary":"Create Message","operationId":"create_message_v2_communication__post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMessageRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Communication"],"summary":"List Messages","operationId":"list_messages_v2_communication__get","parameters":[{"name":"scope_type","in":"query","required":true,"schema":{"type":"string","description":"Scope type","title":"Scope Type"},"description":"Scope type"},{"name":"scope_id","in":"query","required":true,"schema":{"type":"string","description":"Scope ID","title":"Scope Id"},"description":"Scope ID"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor","title":"Cursor"},"description":"Pagination cursor"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"thread_root_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to thread","title":"Thread Root Id"},"description":"Filter to thread"},{"name":"collection_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Collection context for media-scope auth fallback","title":"Collection Id"},"description":"Collection context for media-scope auth fallback"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/communication/inbox":{"get":{"tags":["v2 - Communication"],"summary":"List Inbox","description":"Messages relevant to the authenticated user: those that mention them, or\nthose in a workspace they can reach. Server-side scope (no client N+1).\nSorted newest-first, soft-deleted excluded, offset-paginated.\n\nOPEN ONLY, BY DEFAULT. The inbox is the list of things still to deal\nwith; a message marked handled (PATCH /{id}/resolve) leaves it. Without\nthis the list was append-only and a 193-day-old test comment sat at the\ntop of the home page with no way off.","operationId":"list_inbox_v2_communication_inbox_get","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"}},{"name":"include_resolved","in":"query","required":false,"schema":{"type":"boolean","description":"Also return messages already marked handled. Default: open only.","default":false,"title":"Include Resolved"},"description":"Also return messages already marked handled. Default: open only."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/communication/{message_id}":{"get":{"tags":["v2 - Communication"],"summary":"Get Message","operationId":"get_message_v2_communication__message_id__get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - Communication"],"summary":"Edit Message","operationId":"edit_message_v2_communication__message_id__patch","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - Communication"],"summary":"Delete Message","operationId":"delete_message_v2_communication__message_id__delete","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/communication/{message_id}/resolve":{"patch":{"tags":["v2 - Communication"],"summary":"Resolve Decision","description":"Mark a message handled.\n\nA DECISION resolves with a decision_status, as before. A COMMENT resolves\nwith an empty body: it is stamped resolved_at/resolved_by and leaves the\ninbox. Resolved is not read — a comment someone has seen but not acted\non stays open; this is the \"handled\" action, on the message itself.\nAnyone who can write the message's scope may resolve it.","operationId":"resolve_decision_v2_communication__message_id__resolve_patch","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ResolveDecisionRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/communication/legacy-media-comments":{"get":{"tags":["v2 - Communication"],"summary":"List Legacy Media Comments","description":"Read legacy Firestore comments from /media/{mediaId}/comments and\nreturn them in the v2 MessageListResponse shape.\n\nReturned messages have ``origin='legacy'`` and ``event_version=0``\nso the dashboard can render them identically to v2 messages without\nneeding to know the source.","operationId":"list_legacy_media_comments_v2_communication_legacy_media_comments_get","parameters":[{"name":"media_id","in":"query","required":true,"schema":{"type":"string","description":"Media document ID","title":"Media Id"},"description":"Media document ID"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/notifications/socket-token":{"post":{"tags":["v2 - Notifications"],"summary":"Mint Notifications Socket Token","description":"A five-minute token for the notifications WebSocket, bound to the\ncaller's profile and to that socket's audience (2026-09-28).\n\nThe socket used to take the Firebase session cookie on its URL, which\nmeant the dashboard returned that five-day, every-route credential to\npage script. This token is what page script gets instead: the socket\nverifies its signature, audience and expiry\n(notification_socket_token.verify_socket_token) and maps it to the\nprofile; the API's bearer chain does not accept it at all. The caller\nproves who they are with their ordinary credential to reach this route.","operationId":"mint_notifications_socket_token_v2_notifications_socket_token_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocketTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/notifications/":{"get":{"tags":["v2 - Notifications"],"summary":"List Notifications","operationId":"list_notifications_v2_notifications__get","parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor","title":"Cursor"},"description":"Pagination cursor"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only return unread","default":false,"title":"Unread Only"},"description":"Only return unread"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationV2ListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/notifications/unread-count":{"get":{"tags":["v2 - Notifications"],"summary":"Get Unread Count","operationId":"get_unread_count_v2_notifications_unread_count_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/notifications/{notification_id}/read":{"patch":{"tags":["v2 - Notifications"],"summary":"Mark Notification Read","operationId":"mark_notification_read_v2_notifications__notification_id__read_patch","parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/notifications/mark-all-read":{"patch":{"tags":["v2 - Notifications"],"summary":"Mark All Notifications Read","operationId":"mark_all_notifications_read_v2_notifications_mark_all_read_patch","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/notifications/{notification_id}":{"delete":{"tags":["v2 - Notifications"],"summary":"Delete Notification","operationId":"delete_notification_v2_notifications__notification_id__delete","parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/uploads/link":{"post":{"tags":["v2 - Upload Sessions"],"summary":"Create an upload session link","description":"Agent-authenticated. Creates an upload link for a user. The link accepts new files for 24 hours from creation (expires_at); a file that started inside the window always finishes.","operationId":"create_upload_link_v2_uploads_link_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUploadLinkRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUploadLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/uploads/sessions/{upload_session_id}":{"get":{"tags":["v2 - Upload Sessions"],"summary":"Get upload session status","description":"Session-token authenticated. Returns full session state for agent polling.","operationId":"get_upload_session_v2_uploads_sessions__upload_session_id__get","parameters":[{"name":"upload_session_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Session Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-upload-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Upload-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadSessionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/uploads/sessions/{upload_session_id}/request-upload":{"post":{"tags":["v2 - Upload Sessions"],"summary":"Request a signed upload URL for a file","description":"Session-token authenticated. Creates a media_v2 record and returns a signed PUT URL.","operationId":"session_request_upload_v2_uploads_sessions__upload_session_id__request_upload_post","parameters":[{"name":"upload_session_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Session Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-upload-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Upload-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionRequestUploadDTO"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/uploads/sessions/{upload_session_id}/complete":{"post":{"tags":["v2 - Upload Sessions"],"summary":"Mark a file upload as complete","description":"Session-token authenticated. Makes file public, extracts metadata, marks asset ready.","operationId":"session_complete_asset_v2_uploads_sessions__upload_session_id__complete_post","parameters":[{"name":"upload_session_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Session Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-upload-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Upload-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionCompleteAssetDTO"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadSessionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/uploads/sessions/{upload_session_id}/fail":{"post":{"tags":["v2 - Upload Sessions"],"summary":"Record that a file's upload failed in the browser","description":"Session-token authenticated. The browser could not deliver the bytes (the PUT to storage failed after retries). Marks the asset and its media record failed so the session can still finish. A file already marked ready is left alone.","operationId":"session_fail_asset_v2_uploads_sessions__upload_session_id__fail_post","parameters":[{"name":"upload_session_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Session Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-upload-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Upload-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionFailAssetDTO"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadSessionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/uploads/sessions/{upload_session_id}/infer-groupings":{"post":{"tags":["v2 - Upload Sessions"],"summary":"Auto-infer video-thumbnail groupings","description":"Session-token authenticated. Runs heuristic pairing on uploaded assets.","operationId":"infer_groupings_v2_uploads_sessions__upload_session_id__infer_groupings_post","parameters":[{"name":"upload_session_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Session Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-upload-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Upload-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InferGroupingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/uploads/sessions/{upload_session_id}/confirm-groupings":{"post":{"tags":["v2 - Upload Sessions"],"summary":"Confirm video-thumbnail groupings","description":"Session-token authenticated. Stores confirmed groupings. Does NOT create contents.","operationId":"confirm_groupings_v2_uploads_sessions__upload_session_id__confirm_groupings_post","parameters":[{"name":"upload_session_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Session Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-upload-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Upload-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmGroupingsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmGroupingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/uploads/sessions/{upload_session_id}/close":{"post":{"tags":["v2 - Upload Sessions"],"summary":"Close an upload session","description":"Session-token authenticated. Marks the session CLOSED once every file in it has finished (ready or failed). Answers 409 while any file is still uploading. expires_at is not changed. Idempotent: calling on an already-closed session returns 200.","operationId":"close_session_v2_uploads_sessions__upload_session_id__close_post","parameters":[{"name":"upload_session_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Session Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-upload-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Upload-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadSessionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/upload/{upload_session_id}":{"get":{"tags":["v2 - Upload Sessions"],"summary":"Upload page (no login required)","description":"Returns a self-contained HTML upload page. Validate via ?token= query parameter.","operationId":"upload_page_upload__upload_session_id__get","parameters":[{"name":"upload_session_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Session Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/mcp":{"post":{"tags":["v2 - MCP"],"summary":"Mcp Post","description":"MCP Streamable HTTP endpoint.\n\nAccepts a JSON-RPC 2.0 message and returns a JSON-RPC response.\nSupports agent key auth and OAuth 2.1 Bearer token auth.","operationId":"mcp_post_v2_mcp_post","parameters":[{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - MCP"],"summary":"Mcp Get","description":"SSE streaming not supported.","operationId":"mcp_get_v2_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["v2 - MCP"],"summary":"Mcp Delete","description":"Session termination not supported.","operationId":"mcp_delete_v2_mcp_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/approvals/{approval_id}/decide":{"post":{"tags":["v2 - Approvals"],"summary":"Decide Approval","description":"Approve or reject an approval request.\n\nA channel approval: only its credential owner. A workspace_owner\napproval: the workspace owner, or anyone the owner has granted approval\nrights to (read live). Agents need the ``approvals:decide`` scope, off by\ndefault — the owner's own configuration of their own agent.\n\nApproving the last pending approval sends the launch (as scheduled, or\nnow if its time has passed: `sent_now`). Rejecting cancels the launch.\n\n**Path parameters:**\n- `approval_id`: The approval request to decide on\n\n**Request body:**\n- `decision`: \"approved\" or \"rejected\"\n- `reason`: Optional reason (recommended for rejections)\n\n**Responses:**\n- 200: Decision recorded successfully\n- 400: Invalid decision\n- 403: Not the designated approver\n- 404: Approval request not found\n- 410: Approval request has expired\n- 503: Approval service unavailable","operationId":"decide_approval_v2_approvals__approval_id__decide_post","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","title":"Approval Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/approvals/pending":{"get":{"tags":["v2 - Approvals"],"summary":"Get Pending Approvals","description":"Get all pending approval requests for the current user.\n\nReturns approval requests where the current user is the designated\napprover and the status is still \"pending\".\n\n**Responses:**\n- 200: List of pending approvals\n- 503: Approval service unavailable","operationId":"get_pending_approvals_v2_approvals_pending_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PendingApprovalsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/approvals/launch/{launch_id}":{"get":{"tags":["v2 - Approvals"],"summary":"Get Approvals For Launch","description":"Get all approval requests for a specific launch.\n\nReturns all approval requests (any status) associated with the given\nlaunch ID. Useful for checking whether all approvals have been resolved.\n\n**Responses:**\n- 200: List of approvals for this launch\n- 503: Approval service unavailable","operationId":"get_approvals_for_launch_v2_approvals_launch__launch_id__get","parameters":[{"name":"launch_id","in":"path","required":true,"schema":{"type":"string","title":"Launch Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PendingApprovalsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/internal/cleanup-expired-workspaces":{"post":{"tags":["v2 - Internal"],"summary":"Cleanup Expired Workspaces","description":"Delete EXPIRED ANONYMOUS TRIAL workspaces. Never a creator's.\n\n🔴 THIS CRON MAY NOT DELETE OWNED WORKSPACES, AND CANNOT.\nCreator media is inventory: it is what x402 agents buy through\nmedia_search / purchase_metadata / purchase_content. A timer that deletes\nit destroys saleable stock and a creator's archive at once. Owned\nworkspaces are permanent (decision 2026-09-01, workspace_routes.py:521);\nonly anonymous \"Try Now\" sandboxes expire.\n\nTwo independent things keep that true, and only the second is load-bearing:\n\n  1. the query below filters `owner_id == None`, so an owned workspace is\n     not even considered. This is an efficiency and a statement of intent.\n  2. `_delete_trial_workspace_cascade` RE-READS each document and RAISES\n     on anything owned. This is the guarantee. Widening the query cannot\n     widen what gets deleted.\n\nA refusal is logged and counted, never swallowed: if this cron ever selects\nan owned workspace, that is a bug in the selection and the evidence must\nsurvive the run.\n\nScheduled daily; trials live TrialConfig.SESSION_DURATION_HOURS (72h), so a\ndaily tick removes them within a day of expiry. Processes up to batch_size\nper invocation.","operationId":"cleanup_expired_workspaces_v2_internal_cleanup_expired_workspaces_post","parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Batch Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/internal/cleanup-orphaned-media":{"post":{"tags":["v2 - Internal"],"summary":"Cleanup Orphaned Media","description":"Delete media records stuck in 'uploading' status for longer than threshold.\n\nThese are uploads that were started but never completed (user cancelled,\nbrowser closed, network error, etc). The frontend only clears local state,\nleaving orphaned records in Firestore and partial files in GCS.\n\nCalled by Cloud Scheduler (e.g. every hour) or manually.","operationId":"cleanup_orphaned_media_v2_internal_cleanup_orphaned_media_post","parameters":[{"name":"threshold_hours","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Threshold Hours"}},{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Batch Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/internal/cleanup-expired-members":{"post":{"tags":["v2 - Internal"],"summary":"Cleanup Expired Members","description":"Remove workspace members whose expires_at has passed.\n\nIterates over all workspaces, filters out expired members, and saves\nthe updated member list. Called by Cloud Scheduler or manually.","operationId":"cleanup_expired_members_v2_internal_cleanup_expired_members_post","parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Batch Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/internal/cleanup-expired-try-now":{"post":{"tags":["v2 - Internal"],"summary":"Cleanup Expired Try Now","description":"Delete old try-now session documents.\n\n- Expired/abandoned sessions: deleted after retention_days (default 30)\n- Claimed sessions: deleted after claimed_retention_days (default 7)\n  since data is already in profiles/{profileId}.try_now_metadata\n\nWorkspace + media are already cleaned by cleanup-expired-workspaces.\nCalled by Cloud Scheduler weekly (e.g., Sunday 4 AM AEST).","operationId":"cleanup_expired_try_now_v2_internal_cleanup_expired_try_now_post","parameters":[{"name":"retention_days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Retention Days"}},{"name":"claimed_retention_days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Claimed Retention Days"}},{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Batch Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/internal/qa/run":{"post":{"tags":["v2 - Internal"],"summary":"Internal Run Qa","description":"Run the proactive QA test suite. Called by Cloud Scheduler at 2am AEST.","operationId":"internal_run_qa_v2_internal_qa_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/webhooks/farcaster":{"get":{"tags":["v2 - Webhooks"],"summary":"Farcaster Webhook Health","description":"Health check endpoint for Neynar webhook probe.","operationId":"farcaster_webhook_health_v2_webhooks_farcaster_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["v2 - Webhooks"],"summary":"Farcaster Webhook","description":"Handle Neynar cast events for JubJub-connected Farcaster creators.\n\nSignature verification fails closed and propagates 403 on mismatch.\nProcessing failures are swallowed and return 200 so Neynar does not\nretry on our internal errors; genuine 400/403 responses still propagate.","operationId":"farcaster_webhook_v2_webhooks_farcaster_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/try-now/start":{"post":{"tags":["v2 - Try Now"],"summary":"Start Try Now","description":"Start a new try-now session.\n\nCreates a real V2 workspace (owner_id=None, is_trial=True) and a\nTryNowSession for analytics tracking. Returns a trial_token that\nthe frontend must include as X-Trial-Token in all subsequent calls.","operationId":"start_try_now_v2_try_now_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartTryNowRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartTryNowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/try-now/{workspace_id}":{"get":{"tags":["v2 - Try Now"],"summary":"Get Trial Workspace","description":"Get trial workspace data, plus everything a client needs to RESUME.\n\n`resume` is what the website's `?tn_resume=` handler (and a reload on\nthe same device) rebuilds its local state from: the uploaded media with\na signed playback URL and its probed metadata, the content id, the\nthumbnail, the captured email and chosen platforms. Without it a resume\nlink from another device would land on an empty drop zone.","operationId":"get_trial_workspace_v2_try_now__workspace_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"X-Trial-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/try-now/{workspace_id}/contents":{"post":{"tags":["v2 - Try Now"],"summary":"Create Trial Content","description":"Create content in trial workspace. Enforces MAX_CONTENTS limit.","operationId":"create_trial_content_v2_try_now__workspace_id__contents_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"X-Trial-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TryNowCreateContentRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/try-now/{workspace_id}/media/upload-url":{"post":{"tags":["v2 - Try Now"],"summary":"Request Trial Upload","description":"Request a signed URL for media upload in trial workspace.","operationId":"request_trial_upload_v2_try_now__workspace_id__media_upload_url_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"X-Trial-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TryNowUploadRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/try-now/{workspace_id}/media/{media_id}/confirm":{"post":{"tags":["v2 - Try Now"],"summary":"Confirm Trial Upload","description":"Confirm upload completion for trial media.","operationId":"confirm_trial_upload_v2_try_now__workspace_id__media__media_id__confirm_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}},{"name":"X-Trial-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TryNowUploadCompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/try-now/{workspace_id}/contents/{content_id}/platform-configs":{"post":{"tags":["v2 - Try Now"],"summary":"Set Trial Platform Configs","description":"Set platform configs for trial content.\ncredential_id is None — credentials are bound after claim.\nEnforces MAX_PLATFORMS limit.","operationId":"set_trial_platform_configs_v2_try_now__workspace_id__contents__content_id__platform_configs_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"X-Trial-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TryNowBulkPlatformConfigRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/try-now/{workspace_id}/pre-profile":{"patch":{"tags":["v2 - Try Now"],"summary":"Update Pre Profile","description":"Update pre-profile data (micro-survey, behavioral timing, email capture).\nOnly non-null fields are applied.","operationId":"update_pre_profile_v2_try_now__workspace_id__pre_profile_patch","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"X-Trial-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePreProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/try-now/{workspace_id}/progress":{"get":{"tags":["v2 - Try Now"],"summary":"Get Trial Progress","description":"Get trial progress and funnel data.","operationId":"get_trial_progress_v2_try_now__workspace_id__progress_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"X-Trial-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TryNowProgressResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/try-now/claim":{"post":{"tags":["v2 - Try Now"],"summary":"Claim Try Now","description":"Claim a trial workspace after Firebase signup.\n\nRequires:\n- X-Trial-Token header (trial authentication)\n- Authorization: Bearer <firebase_token> (Firebase authentication)","operationId":"claim_try_now_v2_try_now_claim_post","parameters":[{"name":"X-Trial-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimTryNowRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimTryNowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/public/try-now/copy":{"get":{"tags":["v2 - Try Now"],"summary":"Get Try Now Copy","description":"The drop zone's headline/subline/CTA overrides, editable in Firestore\n(`website_config/try_now_copy`, shape `{pages: {...}, variants: {...}}`)\nso messaging can change without a website deploy. An absent doc is an\nempty override, not an error — the site's built-in copy applies.","operationId":"get_try_now_copy_v2_public_try_now_copy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/admin/try-now/metrics/overview":{"get":{"tags":["v2 - Try Now Analytics"],"summary":"Metrics Overview","description":"High-level totals: total sessions, conversion rate, status breakdown.","operationId":"metrics_overview_v2_admin_try_now_metrics_overview_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/try-now/metrics/funnel":{"get":{"tags":["v2 - Try Now Analytics"],"summary":"Metrics Funnel","description":"Step-by-step drop-off: how many sessions reached each step.","operationId":"metrics_funnel_v2_admin_try_now_metrics_funnel_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/try-now/metrics/by-source":{"get":{"tags":["v2 - Try Now Analytics"],"summary":"Metrics By Source","description":"Breakdown per source (landing page / UTM source).","operationId":"metrics_by_source_v2_admin_try_now_metrics_by_source_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/try-now/metrics/by-feature":{"get":{"tags":["v2 - Try Now Analytics"],"summary":"Metrics By Feature","description":"Breakdown per feature_interest.","operationId":"metrics_by_feature_v2_admin_try_now_metrics_by_feature_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/try-now/metrics/by-geo":{"get":{"tags":["v2 - Try Now Analytics"],"summary":"Metrics By Geo","description":"Breakdown per country.","operationId":"metrics_by_geo_v2_admin_try_now_metrics_by_geo_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/try-now/metrics/by-device":{"get":{"tags":["v2 - Try Now Analytics"],"summary":"Metrics By Device","description":"Breakdown per device_type (desktop, mobile, tablet).","operationId":"metrics_by_device_v2_admin_try_now_metrics_by_device_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/try-now/metrics/timeline":{"get":{"tags":["v2 - Try Now Analytics"],"summary":"Metrics Timeline","description":"Time series of sessions created and claimed.","operationId":"metrics_timeline_v2_admin_try_now_metrics_timeline_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Days to look back","default":30,"title":"Period"},"description":"Days to look back"},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","description":"day | week","default":"day","title":"Granularity"},"description":"day | week"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/try-now/metrics/enrichment":{"get":{"tags":["v2 - Try Now Analytics"],"summary":"Metrics Enrichment","description":"PreProfile fill rates: what percentage of sessions filled each field.","operationId":"metrics_enrichment_v2_admin_try_now_metrics_enrichment_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/streaming/sessions":{"post":{"tags":["v2 - Streaming"],"summary":"Create Streaming Session","description":"Create a streaming session for watching content.\n\nRequires the viewer to have a registered wallet for USDC payments.\n\nRate-limited per profile AND per IP. This is DoS-critical, not merely\nabuse control: `create_session` issues a ~300k-gas OPERATOR transaction,\nand operator txs serialise on the operator nonce — so flooding this\nendpoint stalls minting, catalogue deploys and settlement platform-wide,\nnot just streaming. The check must therefore sit BEFORE create_session.","operationId":"create_streaming_session_v2_streaming_sessions_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/streaming/sessions/{session_id}/segment":{"post":{"tags":["v2 - Streaming"],"summary":"Record Streaming Segment","description":"Record a viewed segment (heartbeat from player every 6 seconds).\nAuto-settles when 1 minute of unsettled segments accumulates.","operationId":"record_streaming_segment_v2_streaming_sessions__session_id__segment_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/streaming/sessions/{session_id}/playback-url":{"post":{"tags":["v2 - Streaming"],"summary":"Get Session Playback Url","description":"Tier-2 gated playback: issue a short-lived, session-scoped signed URL.\n\nTHIS is the paywall. Before issuing anything we require, in order:\n  (a) the session exists,\n  (b) it belongs to THIS viewer (verified via the streaming-session token),\n  (c) the session is live and paid (status == \"active\").\nOnly then do we mint a signed, expiring URL via the per-host signer. If no\nsigner can sign the content's host, we 422 — we never return a non-expiring\ndurable URL. There is no public / pre-payment path to this endpoint.","operationId":"get_session_playback_url_v2_streaming_sessions__session_id__playback_url_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaybackUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/streaming/sessions/{session_id}/close":{"post":{"tags":["v2 - Streaming"],"summary":"Close Streaming Session","description":"Close a streaming session and settle any remaining balance.\n\nOptional body: {\"playback_seconds\": <float>} — if provided, the final\nsettlement uses precise playback seconds instead of segment rounding.","operationId":"close_streaming_session_v2_streaming_sessions__session_id__close_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CloseSessionRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/streaming/sessions/{session_id}/beacon-close":{"post":{"tags":["v2 - Streaming"],"summary":"Beacon Close Session","description":"Unauthenticated close endpoint for navigator.sendBeacon on tab close.\n\nsendBeacon cannot carry custom headers, so we verify ownership by\nmatching the viewer_wallet in the request body against the session's\nstored viewer_wallet. The session_id is a UUID (hard to guess) and\nthe close operation is non-destructive (settles money TO the creator).\n\nTHE BODY IS PARSED BY HAND, AND THAT IS THE POINT. This route used to bind\n`request: BeaconCloseRequest`, which makes FastAPI require\n`Content-Type: application/json` — and a JSON Blob is not CORS-simple, so\n`sendBeacon` had to preflight it and the POST was dropped during unload.\nClients now send `text/plain` to avoid the preflight, which a Pydantic body\nmodel answers with 422. `parse_beacon_body` accepts both shapes (and\nform-encoding) so the mini-app's vendored SDK snapshot keeps working\nunchanged while the new bundle rolls out.\n\nAn unreadable DURATION never blocks the close — it is telemetry, and\n`settle_session` bills from segment_count alone. An unreadable WALLET does,\nbecause on an unauthenticated endpoint it is the only authorisation there\nis; that is a 400, never a 500.","operationId":"beacon_close_session_v2_streaming_sessions__session_id__beacon_close_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/streaming/sessions/{session_id}":{"get":{"tags":["v2 - Streaming"],"summary":"Get Streaming Session","description":"Get the current state of a streaming session.","operationId":"get_streaming_session_v2_streaming_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/streaming/cron/settle-idle":{"post":{"tags":["v2 - Streaming"],"summary":"Settle Idle Streaming Sessions","description":"Settle all active sessions that haven't had a segment in 60+ seconds.\n\nDesigned to be called by Cloud Scheduler every 60 seconds.","operationId":"settle_idle_streaming_sessions_v2_streaming_cron_settle_idle_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/pool/cron/settle-crossings":{"post":{"tags":["v2 - Creator Pool"],"summary":"Cron Settle Crossings","description":"Compose at most one new crossing and submit everything pending.\n\nSafe to over-schedule: the ledger lease single-flights concurrent runs\nand the on-chain replay guard makes a double submission a gas-only no-op.","operationId":"cron_settle_crossings_v2_pool_cron_settle_crossings_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/pool/cron/reconcile":{"post":{"tags":["v2 - Creator Pool"],"summary":"Cron Reconcile","description":"Books-vs-chain verification + alerts M-a..M-f. Reads only.","operationId":"cron_reconcile_v2_pool_cron_reconcile_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/pool/accrual/{pot_address}":{"get":{"tags":["v2 - Creator Pool"],"summary":"Accrual Detail","description":"Ledger-side money states for one catalogue pot.\n\nAUTH: authenticated users only (this shipped without a dependency —\ncaught in audit; it was the only unauthenticated money read in the\ncodebase). The full authorisation rule this surface ultimately needs is\nholder-or-owner-scoped and id-keyed: dashboard and MCP speak\ncontent/team ids, pots are catalogue addresses, so the user-facing\nreads belong on an id-keyed sibling endpoint that resolves the pot via\nthe entity doc and checks membership the way catalogue_get does. This\naddress-keyed read stays as the low-level tool: authenticated, and\nexposing only aggregate, non-PII ledger positions.\n\nStates 1-3 of the five-state display (\"earning now\" is per-viewer and\nsummed here; \"held for your catalogue\" is pending_at_hub). Everything\nhere is NON-spendable by definition — states 4-5 (ready to claim / in\nwallet) come from the catalogue contract via the existing claim surfaces\nand are deliberately not blended in.","operationId":"accrual_detail_v2_pool_accrual__pot_address__get","parameters":[{"name":"pot_address","in":"path","required":true,"schema":{"type":"string","title":"Pot Address"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/analytics/content/{content_id}":{"get":{"tags":["v2 - Analytics"],"summary":"Get Content Analytics","description":"Get analytics for a specific content item over a date range.","operationId":"get_content_analytics_v2_analytics_content__content_id__get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"7d, 30d, 90d, all_time","default":"30d","title":"Period"},"description":"7d, 30d, 90d, all_time"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"Date From"},"description":"YYYY-MM-DD"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"Date To"},"description":"YYYY-MM-DD"},{"name":"platforms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated platform filter","title":"Platforms"},"description":"Comma-separated platform filter"},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","description":"total or daily","default":"total","title":"Granularity"},"description":"total or daily"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsRangeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/analytics/portfolio":{"get":{"tags":["v2 - Analytics"],"summary":"Get Portfolio Analytics","description":"Get analytics across all content owned by the authenticated user.","operationId":"get_portfolio_analytics_v2_analytics_portfolio_get","parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"30d","title":"Period"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"platforms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platforms"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"total_views","title":"Sort By"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"extra_periods","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated periods (7d, 30d, 90d) inside the requested range whose totals are also returned, under period_aggregates, from the same snapshot reads.","title":"Extra Periods"},"description":"Comma-separated periods (7d, 30d, 90d) inside the requested range whose totals are also returned, under period_aggregates, from the same snapshot reads."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortfolioAnalyticsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/analytics/content/{content_id}/snapshot":{"get":{"tags":["v2 - Analytics"],"summary":"Get Content Snapshot","description":"Get a single day's analytics snapshot for a content item.","operationId":"get_content_snapshot_v2_analytics_content__content_id__snapshot_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD, defaults to today","title":"Date"},"description":"YYYY-MM-DD, defaults to today"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/analytics/content/{content_id}/totals":{"get":{"tags":["v2 - Analytics"],"summary":"Get Content Totals","description":"Get all-time totals for a content item.","operationId":"get_content_totals_v2_analytics_content__content_id__totals_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/analytics/content/{content_id}/fetch":{"post":{"tags":["v2 - Analytics"],"summary":"Fetch Content Analytics Now","description":"Force fetch analytics for a content item right now.","operationId":"fetch_content_analytics_now_v2_analytics_content__content_id__fetch_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/analytics/cron/daily-fetch":{"post":{"tags":["v2 - Analytics"],"summary":"Cron Daily Analytics Fetch","description":"Daily analytics fetch for all published content.\n\nDesigned to be called by Cloud Scheduler once per day. Works inside a\nwall-clock budget and queues a continuation of itself when rows remain.","operationId":"cron_daily_analytics_fetch_v2_analytics_cron_daily_fetch_post","parameters":[{"name":"hop","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Continuation hop. 0 is the scheduled run; each hop the run queues for itself carries one more.","default":0,"title":"Hop"},"description":"Continuation hop. 0 is the scheduled run; each hop the run queues for itself carries one more."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/quota/cron/watch":{"post":{"tags":["v2 - Quota"],"summary":"Cron Quota Watch","description":"Assess platform API consumption against each ceiling and emit the\n[QUOTA-APPROACH] alert line for anything worth acting on.\n\nDesigned for a daily Cloud Scheduler job, AFTER the daily analytics\nfetch (so last_ok_at reflects today's run, not yesterday's).","operationId":"cron_quota_watch_v2_quota_cron_watch_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/quota/cron/paid-routes-live-check":{"post":{"tags":["v2 - Quota"],"summary":"Cron Paid Routes Live Check","description":"Hourly: both paid x402 routes answer 402 at their public URLs, including\nto the example input they advertise. Emails Tom once when that starts\nfailing and once when it recovers (paid_route_live_check). dry_run checks\nand reports without recording state or sending.","operationId":"cron_paid_routes_live_check_v2_quota_cron_paid_routes_live_check_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/quota/cron/trial-watch":{"post":{"tags":["v2 - Quota"],"summary":"Cron Trial Watch","description":"Emit the [TRIAL-FUNNEL-RISK] line when the try-now funnel is heading\nfor a 429 (an IP nearing the per-IP session cap) or when a trial cleanup\ncron has stopped succeeding (which is what lets sessions pile up against\nthat cap).\n\nLives beside the platform-quota watcher for the same reason the\nAI-credential watcher does: same detector shape (approach-a-ceiling and\nabsence-of-expected-outcome), same alert-token contract, same 20-hour\ndedupe, same dry_run-as-status. Different subject, so a separate route\non a separate schedule.","operationId":"cron_trial_watch_v2_quota_cron_trial_watch_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/quota/cron/trial-recovery-emails":{"post":{"tags":["v2 - Quota"],"summary":"Cron Trial Recovery Emails","description":"Hourly: send \"your video is waiting\" (~2h after an abandoned email\ncapture) and \"expires soon\" (final window) to ACTIVE, idle trial sessions\nwith a captured email — never to a claimed one. Both latched once. See\ntrial_watch_worker.sweep_recovery_emails for why hourly.","operationId":"cron_trial_recovery_emails_v2_quota_cron_trial_recovery_emails_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/quota/cron/ai-credential-watch":{"post":{"tags":["v2 - Quota"],"summary":"Cron Ai Credential Watch","description":"Emit the [AI-CREDENTIAL-STALE] line for any connected AI credential\nthat has not succeeded in AI_CREDENTIAL_STALE_DAYS while something has\ntried and failed.\n\nLives beside the platform-quota watcher because it is the same detector —\nabsence of an expected outcome — and shares its alert-token contract, its\n20-hour dedupe and its dry_run-as-status behaviour. It is a different\nsubject (creator AI keys, not platform API ceilings), so it is a separate\nroute on a separate schedule rather than another `kind` in that sweep.","operationId":"cron_ai_credential_watch_v2_quota_cron_ai_credential_watch_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platforms":{"get":{"tags":["v2 - Platforms"],"summary":"List Platforms","description":"List all supported platforms grouped by category with connection type info.\n\nUsed by frontend platform connect page and MCP.","operationId":"list_platforms_v2_platforms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/ownership/release-pending-payouts":{"post":{"tags":["v2 - Ownership"],"summary":"Release Pending Payouts Cron","description":"Backstop for the payout identity gate (payout_identity.py).\n\nIdentity can attach where no backend call sees it — an email verified\nthrough the dashboard's Firebase reset link flips `email_verified` on\nthe Auth user only. This sweep re-checks every profile whose brand\ntokens are held for identity and releases the ones that now qualify.\nIdempotent; a profile still lacking identity is left held and counted.\nCloud Scheduler hourly is plenty: nothing is lost while held.","operationId":"release_pending_payouts_cron_v2_ownership_release_pending_payouts_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/ownership/recover-stuck-minting":{"post":{"tags":["v2 - Ownership"],"summary":"Recover Stuck Minting","description":"Resume content stuck in ownership_status=\"minting\" for more than 10 minutes.\n\nDesigned to be called by Cloud Scheduler every 10 minutes.\nUses the state machine's ownership_step field to resume from the\nlast completed checkpoint. Idempotent: checks on-chain state before\nretrying each step.","operationId":"recover_stuck_minting_v2_ownership_recover_stuck_minting_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/ownership/recover-stuck-spine":{"post":{"tags":["v2 - Ownership"],"summary":"Recover Stuck Spine","description":"Retry onchain_publish_events stuck in status=\"staged\" for 10+ minutes.\n\nThese events were staged (Firestore doc written) but the on-chain\nJubJubPublishLedger.recordLaunch() tx was never submitted — typically\nbecause the Cloud Run container was terminated mid-task.\n\nDesigned to be called by Cloud Scheduler every 10 minutes (same\ncadence as recover-stuck-minting).","operationId":"recover_stuck_spine_v2_ownership_recover_stuck_spine_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/catalogue/{catalogue_id}/proposals/accept":{"post":{"tags":["v2 - Catalogue"],"summary":"Accept Proposal","description":"Accept a brand token proposal — transfers tokens to caller's wallet.","operationId":"accept_proposal_v2_catalogue__catalogue_id__proposals_accept_post","parameters":[{"name":"catalogue_id","in":"path","required":true,"schema":{"type":"string","title":"Catalogue Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/catalogue/{catalogue_id}/proposals/reject":{"post":{"tags":["v2 - Catalogue"],"summary":"Reject Proposal","description":"Reject a brand token proposal — redistributes bp to remaining members.","operationId":"reject_proposal_v2_catalogue__catalogue_id__proposals_reject_post","parameters":[{"name":"catalogue_id","in":"path","required":true,"schema":{"type":"string","title":"Catalogue Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/catalogue/{catalogue_id}/proposals":{"get":{"tags":["v2 - Catalogue"],"summary":"Get Proposals","description":"Get full allocation state with per-member status. Team members only.","operationId":"get_proposals_v2_catalogue__catalogue_id__proposals_get","parameters":[{"name":"catalogue_id","in":"path","required":true,"schema":{"type":"string","title":"Catalogue Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/catalogue/{catalogue_id}/proposals/repropose":{"post":{"tags":["v2 - Catalogue"],"summary":"Repropose","description":"Modify splits and re-notify — creates a new version.","operationId":"repropose_v2_catalogue__catalogue_id__proposals_repropose_post","parameters":[{"name":"catalogue_id","in":"path","required":true,"schema":{"type":"string","title":"Catalogue Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReproposeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/catalogue/{team_id}/harvest/{content_contract_address}":{"get":{"tags":["v2 - Catalogue"],"summary":"Harvest Status","description":"Read-only status for a content contract's harvest path.\n\nReturns whether auto-forward is enabled (content.catalogueAddress is\nset) and how much USDC is currently pending to be swept to the\ncatalogue on the next router.settle(). This endpoint does NOT write\nto chain — harvest via claimFor() would orphan funds because the\ncatalogue's notifyDistribution is onlyRegisteredContent.\n\nAuth: team owner only.","operationId":"harvest_status_v2_catalogue__team_id__harvest__content_contract_address__get","parameters":[{"name":"team_id","in":"path","required":true,"schema":{"type":"string","title":"Team Id"}},{"name":"content_contract_address","in":"path","required":true,"schema":{"type":"string","title":"Content Contract Address"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/catalogue/{catalogue_id}/holdings":{"get":{"tags":["v2 - Catalogue"],"summary":"Get Holdings","description":"Get content contracts held, revenue, and brand token distribution.\nTeam members only.","operationId":"get_holdings_v2_catalogue__catalogue_id__holdings_get","parameters":[{"name":"catalogue_id","in":"path","required":true,"schema":{"type":"string","title":"Catalogue Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/catalogue/cron/ensure-holders-minted":{"post":{"tags":["v2 - Catalogue"],"summary":"Cron Ensure Holders Minted","description":"Mint any brand-token holder that is still missing, across every\ncatalogue we know about.\n\nTHE BACKSTOP, not the primary mechanism. Minting is ensured at catalogue\ndeploy, on the already-deployed path, and immediately before\nregisterContent — all three inside the window where no revenue can yet have\narrived. This pass exists because that used to be a single fire-and-forget\nside effect of deploy whose one transient failure was permanent and\ninvisible: eight of nine mainnet catalogues had never minted a holder, two\nof them while actively earning.\n\nCheap and safe to run often: a fully-minted catalogue costs one hasMinted\nview call per split and sends no transaction. Catalogues with no code on the\nactive chain are reported, never minted into.\n\nDeploy as a Cloud Scheduler job (suggested: hourly) once verified.","operationId":"cron_ensure_holders_minted_v2_catalogue_cron_ensure_holders_minted_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/wallet/unified-balance":{"get":{"tags":["v2 - Wallet"],"summary":"Get Unified Balance","description":"Aggregate the user's spendable USDC: smart wallet balance + every\ncatalogue's claimable amount. Used by the frontend to render a single\nbalance number and to drive silent auto-claim before a spend.","operationId":"get_unified_balance_v2_wallet_unified_balance_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedBalanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/wallet/streaming-earnings":{"get":{"tags":["v2 - Wallet"],"summary":"Get Streaming Earnings","description":"Net-to-creator STREAMING earnings for today and the last 30 days.\n\nStreaming-only approximation: aggregates streaming_sessions_v2 gross\nsettled USDC, attributes the creator's ownership share, and subtracts\nthe 3% platform fee. Excludes catalogue/licensing/x402 revenue.\n\nNever raises on the no-data path — a creator with no streaming\nsessions gets zeros, and any unexpected read failure degrades to\nzeros (logged) so the wallet hero never breaks on a non-critical stat.","operationId":"get_streaming_earnings_v2_wallet_streaming_earnings_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamingEarningsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform/register-content":{"post":{"tags":["v2 - SDK"],"summary":"Register Content","description":"Register content via platform API key.\n\nFull orchestration: resolve/create profile -> resolve/create workspace\n-> fingerprint the file at media_url (streamed, never stored) -> create\ncontent doc with the developer's URL as its playback source (triggers\nownership deployment in background) -> optional spine entry.\n\nJubJub holds no bytes for the piece. The page's own <video src> plays\nand the SDK meters it (Tier 1); playback-info answers gated=False.\n\nAuth: X-JubJub-Platform-Key header.","operationId":"register_content_v2_platform_register_content_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterContentRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterContentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/public/contents/{content_id}/playback-info":{"get":{"tags":["v2 - SDK"],"summary":"Get Playback Info","description":"Public endpoint — no auth required.\nReturns chain config and content contract for SDK Player integration.\n\nAlso mints a short-lived `playback_grant` (K1-2). The grant is what makes\n`content_id` server-chosen at session-create time. When the caller happens\nto present a bearer token we bind the grant to their profile, which also\nkills cross-viewer replay; an anonymous fetch yields an unbound grant.","operationId":"get_playback_info_v2_public_contents__content_id__playback_info_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaybackInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/public/contents/by-cast-hash/{cast_hash}":{"get":{"tags":["v2 - SDK"],"summary":"Get Content By Cast Hash","description":"Resolve a Farcaster cast hash to a JubJub content item for the\nMini App paywall. Public endpoint — no auth required.\n\nURL priority (3-step):\n  1. source_video_url  — direct playable embed URL (mp4 / CDN /\n     Mux stream) written by the auto-tokenise service. This is\n     the canonical playable URL for the Mini App <video> tag.\n  2. platform_video_url — legacy fallback for pre-fix docs\n     (currently same as farcaster_cast_url for Farcaster-native\n     content but may carry a real video URL for SDK-registered\n     content).\n  3. farcaster_cast_url — last resort (cast permalink page,\n     usually not directly playable). Here as a defensive\n     fallback for pre-fix auto-tokenise docs with no\n     source_video_url.\n  4. None of the above → 404 with retry hint.\n\nThe launches_v2 fallback from FarcasterAdapter._resolve_video_url\nis deliberately skipped here — the Mini App viewer paywall is\nFarcaster-native content only.\n\nTier-2 gating: if the content is marked gated_playback=true, the durable\nURL is paywalled and is NEVER emitted here (video_url is null). The Mini\nApp falls through to the normal gated flow — GET playback-info (sees\ngated=true) → pay → resolve a short-lived signed URL via the AUTHED\nPOST /v2/streaming/sessions/{id}/playback-url endpoint — exactly like any\nother Tier-2 piece.\n\nNote: this endpoint intentionally treats video_url as an opaque\nstring — see content_routes.py for the legacy Mux-specific path\nthat will be replaced in the /watch/[contentId] migration\n(TODO.md:59-66).","operationId":"get_content_by_cast_hash_v2_public_contents_by_cast_hash__cast_hash__get","parameters":[{"name":"cast_hash","in":"path","required":true,"schema":{"type":"string","title":"Cast Hash"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform/keys":{"post":{"tags":["v2 - SDK"],"summary":"Create Platform Key","description":"Generate a new platform API key for the authenticated user.\n\nAuth: Firebase Bearer (normal user auth, NOT platform key).\nThe key is shown ONCE in the response — user must save it.","operationId":"create_platform_key_v2_platform_keys_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - SDK"],"summary":"List Platform Keys","description":"List the authenticated user's platform keys — metadata only.\n\nThe raw key is hashed at issue and can never be shown again; this\nreturns name/scope/status/created_at so a dashboard can show what\nexists and what each key may do.\n\nAuth: Firebase Bearer (normal user auth, NOT platform key).","operationId":"list_platform_keys_v2_platform_keys_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListKeysResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/platform/keys/{key_id}/payout-status":{"get":{"tags":["v2 - SDK"],"summary":"Get Platform Key Payout Status","description":"Whether this platform key has a payout wallet behind it.\n\nAuth: Firebase Bearer, same as POST /v2/platform/keys — and the same\nrefusal for platform-key auth, so a key cannot be used to interrogate\nitself or enumerate a profile's other keys.\n\nRead-only. Resolves the owner's wallet LIVE from their profile; nothing\nis stored on the key and nothing is written here. A key whose owner\nattaches a wallet becomes eligible with no action on the key itself.","operationId":"get_platform_key_payout_status_v2_platform_keys__key_id__payout_status_get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyPayoutStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/public/viewer-session":{"post":{"tags":["v2 - SDK"],"summary":"Create Viewer Session","description":"Create a lightweight session token for an SDK viewer.\n\nPublic endpoint — no auth required. Creates or finds a viewer\nprofile, returns a jj_ session token usable for streaming API calls.\n\nRate-limited per wallet AND per IP: unauthenticated, and each call can\nprovision a profile. The wallet here is attacker-controlled input, so the\nIP bucket is the one that actually bounds provisioning.","operationId":"create_viewer_session_v2_public_viewer_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewerSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewerSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/public/developer-signup":{"post":{"tags":["v2 - SDK"],"summary":"Developer Signup","description":"Public endpoint — no auth required.\nCreates a developer profile and returns a platform API key with\na ready-to-paste code snippet. Rate limited to 3 keys per day.","operationId":"developer_signup_v2_public_developer_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperSignupRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperSignupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/auth/register-viewer":{"post":{"tags":["v2 - Viewer Auth"],"summary":"Register Viewer","description":"Register a streaming viewer or agent — creates Firebase user + JubJub profile.\n\nPUBLIC: No Firebase auth required (viewer doesn't have Firebase yet).\nThe caller proves control of `wallet_address` with a SIWE signature over\na nonce this server issued; nothing below runs until that proof holds.\n\nIdempotent: if a profile already holds this wallet, returns the existing\nprofile without modification — legitimately, because the signature just\nproved the caller controls that wallet.","operationId":"register_viewer_v2_auth_register_viewer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterViewerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterViewerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/auth/exchange-token":{"post":{"tags":["v2 - Viewer Auth"],"summary":"Exchange Token","description":"PUBLIC. Exchange a firebase_custom_token (from register-viewer) for a\nFirebase ID token + refresh token, SERVER-SIDE — so the browser never calls\nthe referrer-restricted Google Identity Toolkit endpoint directly.","operationId":"exchange_token_v2_auth_exchange_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/auth/refresh-token":{"post":{"tags":["v2 - Viewer Auth"],"summary":"Refresh Token","description":"PUBLIC. Refresh an expiring Firebase ID token SERVER-SIDE via the Secure\nToken API, keeping all auth same-origin to api.jubjubapp.com (the browser's\nreferrer-restricted key can't call securetoken.googleapis.com either).","operationId":"refresh_token_v2_auth_refresh_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/auth/exchange-firebase-token":{"post":{"tags":["v2 - Viewer Auth"],"summary":"Exchange Firebase Token","description":"PUBLIC. Verify a Firebase ID token and mint a jj_ session for the EXISTING\nprofile keyed off that Firebase uid (the dashboard account). Session-only —\nnever writes wallet_addresses, never touches wallet_rails, never registers\non-chain.","operationId":"exchange_firebase_token_v2_auth_exchange_firebase_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeFirebaseTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeFirebaseTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/auth/login-password":{"post":{"tags":["v2 - Viewer Auth"],"summary":"Login Password","description":"PUBLIC. Server-side email+password sign-in via Google Identity Toolkit\n(accounts:signInWithPassword). Server-side requests carry no Referer, so the\nreferrer-restricted web key works (same rationale as /exchange-token). On\nsuccess mints a jj_ session for the existing profile. Session-only; no\nwallet / on-chain writes.","operationId":"login_password_v2_auth_login_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeFirebaseTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/auth/firebase-config":{"get":{"tags":["v2 - Viewer Auth"],"summary":"Firebase Config","description":"PUBLIC. Client-safe Firebase Web config so the static mini-app can init\nthe Firebase JS SDK and sign in CLIENT-SIDE (the web apiKey is HTTP-referrer\n-restricted; these are the NEXT_PUBLIC_* values, safe to expose). Reads the\nsame env the OAuth consent page uses (FIREBASE_WEB_*), falling back to\nNEXT_PUBLIC_FIREBASE_* / PROJECT_ID so it works regardless of which naming\nthe Secret Manager mount uses.","operationId":"firebase_config_v2_auth_firebase_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirebaseConfigResponse"}}}}}}},"/v2/auth/wallet-nonce":{"get":{"tags":["v2 - Viewer Auth"],"summary":"Get Wallet Nonce","description":"Issue a fresh SIWE nonce + the canonical message to sign.\n\nThe agent must sign the returned `message_to_sign` exactly as\nreturned (whitespace and line endings included) and POST the\nsignature plus this nonce to /v2/auth/register-viewer.","operationId":"get_wallet_nonce_v2_auth_wallet_nonce_get","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","description":"EVM address that will sign","title":"Address"},"description":"EVM address that will sign"},{"name":"Origin","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NonceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/intelligence/profile":{"get":{"tags":["v2 - Intelligence"],"summary":"Get Intelligence Profile","description":"Get the content intelligence profile for the current user.\nIf not yet analysed, triggers analysis and returns result.","operationId":"get_intelligence_profile_v2_intelligence_profile_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/intelligence/analyse":{"post":{"tags":["v2 - Intelligence"],"summary":"Analyse Intelligence","description":"Force a fresh intelligence analysis for the current user.\nRate limited to once per hour.","operationId":"analyse_intelligence_v2_intelligence_analyse_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/intelligence/recommendations":{"get":{"tags":["v2 - Intelligence"],"summary":"Get Recommendations","description":"Get publish-time recommendations based on the creator's\nhistorical performance patterns.","operationId":"get_recommendations_v2_intelligence_recommendations_get","parameters":[{"name":"title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Proposed video title","title":"Title"},"description":"Proposed video title"},{"name":"duration_seconds","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Video duration in seconds","title":"Duration Seconds"},"description":"Video duration in seconds"},{"name":"hashtags","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated hashtags","title":"Hashtags"},"description":"Comma-separated hashtags"},{"name":"platforms","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated target platforms","title":"Platforms"},"description":"Comma-separated target platforms"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/intelligence/platform-preferences":{"get":{"tags":["v2 - Intelligence"],"summary":"Get Platform Preferences","description":"Get the user's platform preferences for intelligence analysis.\nReturns current preference and all available platforms.","operationId":"get_platform_preferences_v2_intelligence_platform_preferences_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - Intelligence"],"summary":"Set Platform Preferences","description":"Set preferred platforms for intelligence analysis.\nAny user can set any number of platforms — personal\nintelligence has no tier restrictions.\nTriggers fresh analysis with new preferences.","operationId":"set_platform_preferences_v2_intelligence_platform_preferences_patch","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/intelligence/cron/refresh":{"post":{"tags":["v2 - Intelligence"],"summary":"Cron Refresh Intelligence","description":"Nightly intelligence refresh for all profiles.\nCalled by Cloud Scheduler at 4:30am Sydney (after analytics fetch at 3am).","operationId":"cron_refresh_intelligence_v2_intelligence_cron_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/ai-credentials":{"get":{"tags":["v2 - AI Credentials"],"summary":"Get Ai Credentials","description":"Get AI credentials for the current user.\nNever returns encrypted API keys.","operationId":"get_ai_credentials_v2_ai_credentials_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ai-credentials/{provider}":{"post":{"tags":["v2 - AI Credentials"],"summary":"Connect Ai Provider","description":"Connect an AI provider by validating and storing an API key.","operationId":"connect_ai_provider_v2_ai_credentials__provider__post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["v2 - AI Credentials"],"summary":"Disconnect Ai Provider","description":"Disconnect an AI provider — clears the encrypted key.","operationId":"disconnect_ai_provider_v2_ai_credentials__provider__delete","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ai-credentials/{provider}/models":{"get":{"tags":["v2 - AI Credentials"],"summary":"List Provider Models","description":"Models this profile's key can see, plus the authoritative default.\n\nWHY A SEPARATE ENDPOINT rather than widening the connect response. The\nvalidator runs once, at connect time, before anything is stored — but the\nuser needs this list every time they open the form, including long after\nconnecting, and when editing a model on an already-connected provider. A\nconnect-time-only payload cannot serve that, and widening\n`tuple[bool, str]` across all four validators would burden every connect\nwith a list most of them do not need.\n\nNEVER RETURNS ANOTHER USER'S DATA. The caller supplies no key and no\nprofile id: `profile_id` comes from the authenticated session, and the key\nis the one already encrypted under THAT profile's document. There is no\ninput through which another profile could be named.\n\nALWAYS 200, NEVER BLOCKS THE USER. The model field is free text and stays\nthat way, so an unobtainable list is a missing convenience, not an error:\n\n  available=false, reason=\"no_key\"      nothing connected yet\n  available=false, reason=\"unavailable\" provider refused or is unreachable\n                                        (Claude's /v1/models has 404'd\n                                        before — see _validate_claude_key's\n                                        fallback path)\n\n`default_model` is returned in every case, including with no key, because\nthe dashboard needs it for the placeholder before anything is connected.\nIt is read from core.ai_models, which is env-overridable — the backend is\nthe single source of truth and the dashboard must not keep its own copy.","operationId":"list_provider_models_v2_ai_credentials__provider__models_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ai-credentials/active":{"patch":{"tags":["v2 - AI Credentials"],"summary":"Set Active Provider","description":"Set the active AI provider. Must be connected first.","operationId":"set_active_provider_v2_ai_credentials_active_patch","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetActiveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/ai/fill-field":{"post":{"tags":["v2 - AI"],"summary":"Fill Field","operationId":"fill_field_v2_ai_fill_field_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FillFieldRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FillFieldResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/farcaster/siwn/config":{"get":{"tags":["Farcaster"],"summary":"Siwn Config","description":"Return the public NEYNAR_CLIENT_ID the dashboard SIWN widget needs.","operationId":"siwn_config_v2_farcaster_siwn_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiwnConfigResponse"}}}}}}},"/v2/farcaster/siwn/callback":{"post":{"tags":["Farcaster"],"summary":"Siwn Callback","description":"Complete a SIWN connect: verify the approved signer server-side and\npersist the Farcaster credential for the logged-in profile.","operationId":"siwn_callback_v2_farcaster_siwn_callback_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiwnCallbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FarcasterConnectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/farcaster/siwn/connect-url":{"get":{"tags":["Farcaster"],"summary":"Siwn Connect Url","description":"Return a dashboard deeplink that mounts the SIWN widget. Used by the\nMCP/agent surface to hand the human a clickable connect link.","operationId":"siwn_connect_url_v2_farcaster_siwn_connect_url_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiwnConnectUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/farcaster/signer":{"post":{"tags":["Farcaster"],"summary":"Create Managed Signer","description":"Start a Farcaster connect for the logged-in profile: create a Neynar\nmanaged signer, sign its key request with the JubJub app account, and\nhand back the approval url the creator opens in their Farcaster client.\nNothing is stored until GET /signer/{signer_uuid} sees it approved, so a\ncreator who closes the dialog leaves nothing behind but an unapproved\nsigner at Neynar, which expires with its 24 h key request.","operationId":"create_managed_signer_v2_farcaster_signer_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignerCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/farcaster/signer/{signer_uuid}":{"get":{"tags":["Farcaster"],"summary":"Managed Signer Status","description":"Neynar's status for a signer this profile is waiting on. The dashboard\npolls this every few seconds while the approval dialog is open. The first\npoll that finds the signer approved persists the Farcaster credential\n(the same verify-and-store the SIWN callback did) and returns it; later\npolls upsert the same row, so they are harmless.","operationId":"managed_signer_status_v2_farcaster_signer__signer_uuid__get","parameters":[{"name":"signer_uuid","in":"path","required":true,"schema":{"type":"string","title":"Signer Uuid"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignerStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/farcaster/connect-fid":{"post":{"tags":["Farcaster"],"summary":"Connect Fid","description":"Connect a Farcaster FID for INBOUND auto-tokenise, directly from the\nmini-app's SIWE-verified context — no SIWN redirect, no signer.\n\nCast delivery depends only on the FID being present in the Neynar webhook's\nauthor_fids filter (sync_farcaster_webhook_authors) + an active credential\nrow (fid -> profile_id); SIWN's signer is only needed for OUTBOUND\npublishing. This endpoint creates the inbound-only credential and syncs the\nfilter. Auth is the mini-app jj_ session token (get_current_user), NOT the\nFirebase cookie the SIWN callback uses.","operationId":"connect_fid_v2_farcaster_connect_fid_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFidRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFidResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/farcaster/connection":{"get":{"tags":["Farcaster"],"summary":"Farcaster Connection","description":"Whether the caller has an ACTIVE Farcaster credential (drives the\nmini-app's pre-open connected/not-connected state). Read-only.\n\nSingle-field query on profile_id (auto-indexed) + in-memory platform/status\nfilter, so no composite index is needed.","operationId":"farcaster_connection_v2_farcaster_connection_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/farcaster/webhook/reconcile":{"post":{"tags":["Farcaster"],"summary":"Reconcile Webhook","description":"Rebuild the Neynar inbound-webhook author_fids from all active Farcaster\ncredentials and PUT it (idempotent). Heals drift from failed\nconnect/disconnect updates or manual dashboard edits. Cron: hourly.","operationId":"reconcile_webhook_v2_farcaster_webhook_reconcile_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/farcaster/cron/cast-thumbnails":{"post":{"tags":["Farcaster"],"summary":"Cron Cast Thumbnails","description":"A frame for the casts that still have no picture (a native video embed\ncarries none, or the stream gave no frame at ingest): a few per run, from\ntheir stream, newest first, inside a wall-clock budget that fits the\njob's attempt deadline (320 s; see farcaster_cast_thumbnail_service for\nthe arithmetic). Its own job, so ffmpeg's slowness on an unreadable or\nstalled stream can never fail the webhook reconcile. Returns the counts\nfor the log; a run that finds nothing to do is a success.","operationId":"cron_cast_thumbnails_v2_farcaster_cron_cast_thumbnails_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/creator/earnings":{"get":{"tags":["Creator"],"summary":"Get Creator Earnings","description":"Spendable balance + per-content earnings for the signed-in creator.\n\nCalls the SAME service functions the chat's get_wallet_balance +\nget_my_claimable use, then converts raw units to decimals and renames the\nper-content field to earned_usdc (never 'claimable').","operationId":"get_creator_earnings_v2_creator_earnings_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorEarningsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/chat/message":{"post":{"tags":["v2 - Chat"],"summary":"Chat Message","description":"Send a message to the user's active AI provider.\n\nReturns the AI reply as JSON. Uses the creator's own API key\nfrom ai_credentials_v1.","operationId":"chat_message_v2_chat_message_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/import/{platform}":{"post":{"tags":["v2 - Import"],"summary":"Start Platform Import","description":"Start a historical import for one platform.\nRuns in background — returns immediately.\nRate limited: once per 24 hours per platform.","operationId":"start_platform_import_v2_import__platform__post","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/import/all":{"post":{"tags":["v2 - Import"],"summary":"Start All Imports","description":"Start historical imports for ALL connected platforms.\nRuns in background — returns immediately.","operationId":"start_all_imports_v2_import_all_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/import/{platform}/status":{"get":{"tags":["v2 - Import"],"summary":"Get Import Status Endpoint","description":"Get current import job status.","operationId":"get_import_status_endpoint_v2_import__platform__status_get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/import/cron/nightly":{"post":{"tags":["v2 - Import"],"summary":"Cron Nightly Import","description":"Nightly historical import for all users with active credentials.\nCalled by Cloud Scheduler once per day at 4am Sydney time.","operationId":"cron_nightly_import_v2_import_cron_nightly_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/import/cron/media-analysis":{"post":{"tags":["v2 - Import"],"summary":"Cron Media Analysis","description":"Nightly media metadata analysis for unanalysed content.\nCalled by Cloud Scheduler. Uses each creator's own AI provider.","operationId":"cron_media_analysis_v2_import_cron_media_analysis_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/import/cron/transcripts":{"post":{"tags":["v2 - Import"],"summary":"Cron Transcripts","description":"Layer 1 backstop — transcribe eligible content that has none.\n\nTHE ONLY PATH for reference-only content. Farcaster auto-tokenised pieces\nnever pass through upload/complete, so no upload trigger can reach them;\n`run_pending` existed for exactly this and had zero callers until now.\n\nAlso the net under the create-content trigger, for a piece whose upload\nfinished after its content row was written, and for any piece marked\n`pending_ai_key` whose creator has since connected a key.\n\nBYOK-only, like every AI surface: `extract()` hard-stops without a\nconnected audio-capable provider and marks the row rather than spending\nanything. Thumbnail-only historical imports are excluded by\n`is_transcript_candidate` — a JPEG has no audio and attempting one would\nonly consume the run's budget.","operationId":"cron_transcripts_v2_import_cron_transcripts_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/import/cron/reindex-reconcile":{"post":{"tags":["v2 - Import"],"summary":"Cron Reindex Reconcile","description":"Layer-3 backstop: re-index content that SHOULD be searchable but is missing\nfrom media_search_index_v1.\n\nThe search index is written at three points — end of analysis\n(media_metadata_service:upsert at analysis completion), mint completion\n(ownership_recovery_worker after ownership flips active), and here. This sweep\nexists because the first two are event-triggered and can be missed: analysis\nrunning before a mint completes leaves the piece un-indexed until *something*\nre-runs upsert. This makes listing self-healing, not dependent on a single\ntrigger.\n\nSelects contents_v2 rows that are media_analysed==True AND minted\n(ownership_contract_address set AND ownership_status=='active') AND published\n(discoverable OR has an external URL) BUT absent from the index, and upserts\nthem. upsert_search_index self-gates on minted + metadata presence, so a row\nthat no longer qualifies is skipped (and any stale index doc deleted) inside\nthe upsert — this sweep only decides *what to check*.\n\nCalled by Cloud Scheduler (needs a new job — see TODO). Best-effort, batched.","operationId":"cron_reindex_reconcile_v2_import_cron_reindex_reconcile_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/import/cron/farcaster-spine-reconcile":{"post":{"tags":["v2 - Import"],"summary":"Cron Farcaster Spine Reconcile","description":"Backstop for the Farcaster vault-visibility gap.\n\nhandle_cast writes the vault-visible spine row (onchain_publish_events, keyed\nfarcaster_<content_id>) best-effort with no backstop — a failed write leaves\na source=\"farcaster_auto\" cast owned/earning but INVISIBLE in the creator's\nvault (the vault filters onchain_publish_events by\ncontributors_jubjub_profile_ids). This sweep finds such orphans and (re)writes\nthe spine row via record_launch_onchain + _LaunchProxy, reconstructing the\nlaunch from the content doc's own fields. Idempotent + safe:\n\n  - The staged doc is written with .set(merge=True) keyed by launch_id, so a\n    double write merges harmlessly.\n  - We SKIP any row that already has contributors_jubjub_profile_ids. That\n    field is only set once record_launch_onchain reaches step 5 (the full\n    staged write), which is BEFORE its on-chain ledger tx (step 6). So\n    \"no contributors\" ⟹ the on-chain tx never fired ⟹ running\n    record_launch_onchain fires it exactly once (no double-submit); and any\n    already-staged/confirmed row (contributors present) is left untouched.\n\nNOTE: the generic spine-recovery worker (recover_stuck_spine_events) CANNOT\nheal these — it loads the launch from launches_v2, which Farcaster casts do\nnot have. Hence this dedicated sweep.\n\nCalled by Cloud Scheduler (needs a NEW job — see TODO). Best-effort, batched.","operationId":"cron_farcaster_spine_reconcile_v2_import_cron_farcaster_spine_reconcile_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/import/cron/platform-data-retention":{"post":{"tags":["v2 - Import"],"summary":"Cron Platform Data Retention","description":"Refresh or redact platform-supplied text on imported content.\n\nYouTube's Developer Policies require stored titles, channel names and\ndescriptions to be DELETED or REFRESHED within 30 calendar days. Rows are\nselected on AGE (`platform_data_fetched_at`, absent = stale), refreshed via\nvideos.list where the creator still has an active credential, and REDACTED\nwhere they do not — a row nothing can refresh must lose the data, and\nskipping it is how it stays non-compliant forever.\n\nDAILY, not hourly. The threshold is 23 days against a 30-day limit, so a\ndaily run leaves seven days of margin: a week of failures, a deploy freeze\nor a quota exhaustion is survivable without falling out of policy. Hourly\nwould buy nothing and re-stream the corpus 24x.\n\n`dry_run=true` reports what it WOULD do and writes nothing. Redaction is\nirreversible, so the first pass over the backlog is worth reading before it\nis trusted. `limit` overrides the per-run cap (0 = the default).\n\nReturns counts for every outcome — examined, selected, skipped_fresh,\nrefreshed, redacted, deferred, capped, unprocessed — so a run can be\nchecked rather than assumed. `deferred` is the honest one: rows left alone\nbecause a transient API or credential error made them unreadable this\ntime. Those are NOT redacted; destroying a creator's titles over a brief\noutage is unrecoverable. `unprocessed` is the budget's: rows never reached\nat all, which a continuation hop picks up.\n\n`hop` is the continuation counter. 0 is the scheduled run; each hop the\nrun queues for itself carries one more.","operationId":"cron_platform_data_retention_v2_import_cron_platform_data_retention_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Limit"}},{"name":"hop","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Hop"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/tokens/content/{content_id}/ownership":{"get":{"tags":["v2 - Tokens"],"summary":"Get Content Ownership","description":"Get on-chain ownership details for a content item.","operationId":"get_content_ownership_v2_tokens_content__content_id__ownership_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/tokens/content/{content_id}/revenue":{"get":{"tags":["v2 - Tokens"],"summary":"Get Content Revenue","description":"Get streaming revenue stats from the smart contract.","operationId":"get_content_revenue_v2_tokens_content__content_id__revenue_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/tokens/profile/claimable":{"get":{"tags":["v2 - Tokens"],"summary":"Get Profile Claimable","description":"What the current user can claim, in USDC.\n\nReads the CATALOGUE contracts, not the content contracts. Every live\ncontent contract holds its full 10,000 units at the catalogue, so a creator\nwallet's content-contract claimable is structurally zero — this endpoint\nreturned 0.0 for everyone partly because it was asking the wrong contract.\nThe catalogue is where the money is, and it is what\n`/v2/wallet/unified-balance` reads, so the two surfaces now agree by\nconstruction rather than by coincidence.\n\n`total_claimable_usdc` is the catalogue-pending leg ONLY. It deliberately\nexcludes USDC already sitting in the wallet — that is already the\ncreator's, not something they can claim.","operationId":"get_profile_claimable_v2_tokens_profile_claimable_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/tokens/profile/portfolio":{"get":{"tags":["v2 - Tokens"],"summary":"Get Profile Portfolio","description":"Get all content where the current user holds ownership tokens.","operationId":"get_profile_portfolio_v2_tokens_profile_portfolio_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/tokens/wallet/balance":{"get":{"tags":["v2 - Tokens"],"summary":"Get Wallet Balance","description":"Get ETH and USDC balance of the user's connected wallet.","operationId":"get_wallet_balance_v2_tokens_wallet_balance_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/users/by-email":{"get":{"tags":["v2 - Admin"],"summary":"Admin Get User By Email","operationId":"admin_get_user_by_email_v2_admin_users_by_email_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","description":"Exact email address","title":"Email"},"description":"Exact email address"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/users/{profile_id}/credentials":{"get":{"tags":["v2 - Admin"],"summary":"Admin Get User Credentials","description":"All platform + AI credentials for a user.","operationId":"admin_get_user_credentials_v2_admin_users__profile_id__credentials_get","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/users/{profile_id}/notifications":{"get":{"tags":["v2 - Admin"],"summary":"Admin Get User Notifications","description":"Last 50 notifications for a user.","operationId":"admin_get_user_notifications_v2_admin_users__profile_id__notifications_get","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/users/{profile_id}/workspaces":{"get":{"tags":["v2 - Admin"],"summary":"Admin Get User Workspaces","description":"All workspaces owned by a user.","operationId":"admin_get_user_workspaces_v2_admin_users__profile_id__workspaces_get","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/users/{profile_id}/summary":{"get":{"tags":["v2 - Admin"],"summary":"Admin Get User Summary","description":"Combined user investigation — single call for everything.","operationId":"admin_get_user_summary_v2_admin_users__profile_id__summary_get","parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/users":{"get":{"tags":["v2 - Admin"],"summary":"Admin List Users","description":"List all users with health signals.","operationId":"admin_list_users_v2_admin_users_get","parameters":[{"name":"has_errors","in":"query","required":false,"schema":{"type":"boolean","description":"Filter to users with issues only","default":false,"title":"Has Errors"},"description":"Filter to users with issues only"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/deploy":{"post":{"tags":["v2 - Admin"],"summary":"Admin Trigger Deploy","description":"Trigger Cloud Build backend-push-to-main on main branch.","operationId":"admin_trigger_deploy_v2_admin_deploy_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/rollback":{"post":{"tags":["v2 - Admin"],"summary":"Admin Rollback","description":"Roll back Cloud Run traffic to the previous revision.","operationId":"admin_rollback_v2_admin_rollback_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/seed":{"post":{"tags":["v2 - Admin"],"summary":"Admin Seed Agent Configs","description":"Seed agent_config_v1 with defaults. Idempotent — skips existing.","operationId":"admin_seed_agent_configs_v2_admin_agents_seed_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/errors":{"get":{"tags":["v2 - Admin"],"summary":"Admin List Errors","description":"List error events with optional filters.","operationId":"admin_list_errors_v2_admin_errors_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/errors/{event_id}":{"patch":{"tags":["v2 - Admin"],"summary":"Admin Update Error","description":"Update an error event's status.","operationId":"admin_update_error_v2_admin_errors__event_id__patch","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/watcher/run":{"post":{"tags":["v2 - Admin"],"summary":"Admin Run Watcher","description":"Re-trigger the watcher on stale error events (status=ingested, older than 5 min).","operationId":"admin_run_watcher_v2_admin_agents_watcher_run_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents":{"get":{"tags":["v2 - Admin"],"summary":"Admin List Agents","description":"List all agents with config + status.","operationId":"admin_list_agents_v2_admin_agents_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/logs":{"get":{"tags":["v2 - Admin"],"summary":"Admin Get Agent Logs","description":"Recent agent logs.","operationId":"admin_get_agent_logs_v2_admin_agents_logs_get","parameters":[{"name":"agent_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/{agent_name}/config":{"patch":{"tags":["v2 - Admin"],"summary":"Admin Update Agent Config","description":"Update agent config fields.","operationId":"admin_update_agent_config_v2_admin_agents__agent_name__config_patch","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","title":"Agent Name"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/{agent_name}/reset-budget":{"post":{"tags":["v2 - Admin"],"summary":"Admin Reset Budget","description":"Reset an agent's daily token budget counter to zero.","operationId":"admin_reset_budget_v2_admin_agents__agent_name__reset_budget_post","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","title":"Agent Name"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/approvals/{approval_id}/approve":{"post":{"tags":["v2 - Admin"],"summary":"Admin Approve Job","description":"Approve a pending agent job.","operationId":"admin_approve_job_v2_admin_agents_approvals__approval_id__approve_post","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","title":"Approval Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/approvals/{approval_id}/deny":{"post":{"tags":["v2 - Admin"],"summary":"Admin Deny Job","description":"Deny a pending agent job.","operationId":"admin_deny_job_v2_admin_agents_approvals__approval_id__deny_post","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","title":"Approval Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/{agent_name}/clear-approvals":{"post":{"tags":["v2 - Admin"],"summary":"Admin Clear Approvals","description":"Reject all pending approvals for an agent.","operationId":"admin_clear_approvals_v2_admin_agents__agent_name__clear_approvals_post","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","title":"Agent Name"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/{agent_name}/approvals":{"get":{"tags":["v2 - Admin"],"summary":"Admin Get Agent Approvals","description":"List pending approvals for an agent.","operationId":"admin_get_agent_approvals_v2_admin_agents__agent_name__approvals_get","parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","title":"Agent Name"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/clear-queue":{"post":{"tags":["v2 - Admin"],"summary":"Admin Clear Queue","description":"Clear stuck error events (ingested, fixing, investigating) by marking them ignored.","operationId":"admin_clear_queue_v2_admin_agents_clear_queue_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/queue-status":{"get":{"tags":["v2 - Admin"],"summary":"Admin Queue Status","description":"Count error events by status for the admin dashboard.","operationId":"admin_queue_status_v2_admin_agents_queue_status_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/stats/refresh":{"post":{"tags":["v2 - Admin"],"summary":"Admin Refresh Stats","description":"Refresh the accumulated platform stats (full recount).\n\nCalled nightly by the `refresh-platform-stats` Cloud Scheduler job at\n20:00 UTC, and on demand by an admin.","operationId":"admin_refresh_stats_v2_admin_stats_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/admin/stats":{"get":{"tags":["v2 - Admin"],"summary":"Admin Get Stats","description":"Read the current accumulated platform stats.","operationId":"admin_get_stats_v2_admin_stats_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/support-investigator/run":{"post":{"tags":["v2 - Admin"],"summary":"Admin Run Support Investigator","description":"Manually trigger the support investigator on one or all needs_admin events.","operationId":"admin_run_support_investigator_v2_admin_agents_support_investigator_run_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/agents/product-listener/run":{"post":{"tags":["v2 - Admin"],"summary":"Admin Run Product Listener","description":"Manually trigger the product listener agent.","operationId":"admin_run_product_listener_v2_admin_agents_product_listener_run_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/errors/{event_id}/claim":{"post":{"tags":["v2 - Admin"],"summary":"Admin Claim Error","description":"Claim an error event for manual investigation. Agents will stop touching it.","operationId":"admin_claim_error_v2_admin_errors__event_id__claim_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/errors/{event_id}/unclaim":{"post":{"tags":["v2 - Admin"],"summary":"Admin Unclaim Error","description":"Release a claimed error event back to agents.","operationId":"admin_unclaim_error_v2_admin_errors__event_id__unclaim_post","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/qa/run":{"post":{"tags":["v2 - Admin"],"summary":"Admin Run Qa","description":"Run the proactive QA test suite. Returns test results.","operationId":"admin_run_qa_v2_admin_qa_run_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/qa/results":{"get":{"tags":["v2 - Admin"],"summary":"Admin Get Qa Results","description":"Get recent QA run results from qa_results_v1.","operationId":"admin_get_qa_results_v2_admin_qa_results_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/media/run-extraction":{"post":{"tags":["v2 - Admin"],"summary":"Admin Run Extraction","description":"Trigger L0/L1/L2 metadata extraction for a creator's content (or all\ncontent when profile_id is null, capped at 200). Admin-only.\n\nBYOK only — each layer runs on the content owner's connected AI key. JubJub\nnever pays. Returns immediately; extraction runs as background tasks.\n\nSkip logic (force=false): a layer already done for a piece is skipped —\n  l0 done = `provenance` key in media_metadata_v1/{content_id}\n  l1 done = `transcript` key in media_metadata_v1/{content_id}\n  l2 done = intelligence_status == \"complete\" in media_metadata_v1\nforce=true queues every requested layer regardless. Counts are per\n(content, layer): `queued` is layer-tasks fired, `skipped` is layer-tasks\nskipped (already done, or no owner to bill).","operationId":"admin_run_extraction_v2_admin_media_run_extraction_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunExtractionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/errors/report":{"post":{"tags":["v2 - Error Reports"],"summary":"Report Error","description":"Endpoint for users AND client surfaces to report issues into the agent\npipeline (ingest -> error_events_v1 -> watcher/support investigator).\n\nOPTIONAL auth: a valid Bearer token attaches the reporter's profile_id;\nwithout one the report is still accepted anonymously (profile_id=None) so\nPRE-LOGIN crashes reach the agent instead of being rejected with 401.\nAccepts any JSON body — normalised by the ingestor.\n\nHardened (see docs/security-posture.md): rate-limited per profile/IP, and\nthe attacker-controllable fields are size-capped at ingress. The trust gate\nthat stops anonymous reports before the paid RCA call lives downstream in\nthe watcher (only authenticated reports reach RCA). Nothing downstream\nwrites code: the fixer was retired 2026-09-02 (CLAUDE.md, AGENT-01).","operationId":"report_error_v2_errors_report_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/errors/client":{"post":{"tags":["v2 - Error Reports"],"summary":"Report Client Error","description":"Record an automatic client error. High-volume + anonymous-capable, so it\nwrites straight to error_reports_v1 and does NOT route through the agent\nsystem. Fields are truncated to keep docs well under Firestore's 1MB limit.","operationId":"report_client_error_v2_errors_client_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientErrorReport"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v2 - Error Reports"],"summary":"List Client Errors","description":"Admin read of client error reports. Pagination + filter by user_id and date\nrange. Index-free: pulls the most recent FETCH_CAP rows (single-field\ncreated_at order) and filters/paginates in Python — fine for an admin debug\nsurface (the admin UI itself is held for Phase 19).","operationId":"list_client_errors_v2_errors_client_get","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO datetime lower bound (created_at >=)","title":"Since"},"description":"ISO datetime lower bound (created_at >=)"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO datetime upper bound (created_at <=)","title":"Until"},"description":"ISO datetime upper bound (created_at <=)"},{"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"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/reports":{"get":{"tags":["v2 - Admin Reports"],"summary":"List Reports","description":"List report documents.\n\nlive=true:  query Firestore fresh for the latest document per report type.\nlive=false: return stored documents ordered by week_ending descending.","operationId":"list_reports_v2_admin_reports_get","parameters":[{"name":"report_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":4,"title":"Limit"}},{"name":"live","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Live"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/reports/{report_id}":{"get":{"tags":["v2 - Admin Reports"],"summary":"Get Report","description":"Return a single report document by report_id.","operationId":"get_report_v2_admin_reports__report_id__get","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/reports/generate":{"post":{"tags":["v2 - Admin Reports"],"summary":"Generate Reports","description":"Trigger all four report generations + narratives.\nWrites to admin_reports_v1 and returns the four reports.","operationId":"generate_reports_v2_admin_reports_generate_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/signals":{"get":{"tags":["v2 - Admin Signals"],"summary":"List Signals","description":"List product signals with optional filters.","operationId":"list_signals_v2_admin_signals_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/signals/{signal_id}":{"get":{"tags":["v2 - Admin Signals"],"summary":"Get Signal","description":"Get a single signal by ID.","operationId":"get_signal_v2_admin_signals__signal_id__get","parameters":[{"name":"signal_id","in":"path","required":true,"schema":{"type":"string","title":"Signal Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - Admin Signals"],"summary":"Update Signal","description":"Update a signal's status or add notes.","operationId":"update_signal_v2_admin_signals__signal_id__patch","parameters":[{"name":"signal_id","in":"path","required":true,"schema":{"type":"string","title":"Signal Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSignalRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/signals/run-listener":{"post":{"tags":["v2 - Admin Signals"],"summary":"Run Listener","description":"Trigger the product listener agent. Returns immediately.","operationId":"run_listener_v2_admin_signals_run_listener_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/public/studio-enquiry":{"post":{"tags":["v2 - Studio enquiry"],"summary":"Studio Enquiry","operationId":"studio_enquiry_v2_public_studio_enquiry_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioEnquiryRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media-kit/me":{"get":{"tags":["v2 - Media kit"],"summary":"Get My Kit","operationId":"get_my_kit_v2_media_kit_me_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v2 - Media kit"],"summary":"Update My Kit","operationId":"update_my_kit_v2_media_kit_me_patch","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KitUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media-kit/me/refresh":{"post":{"tags":["v2 - Media kit"],"summary":"Refresh My Kit","description":"Re-measure follower counts and analytics figures from the creator's own\nconnections now. The weekly schedule does the same for every kit that is\non; this is for the creator, their agent, or JubJub Creator, which names\nitself in an `X-JubJub-Refreshed-By` header. It updates values only.","operationId":"refresh_my_kit_v2_media_kit_me_refresh_post","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media-kit/me/highlight-candidates":{"get":{"tags":["v2 - Media kit"],"summary":"My Highlight Candidates","operationId":"my_highlight_candidates_v2_media_kit_me_highlight_candidates_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media-kit/me/messages":{"get":{"tags":["v2 - Media kit"],"summary":"My Kit Messages","description":"Conversations started through the kit's contact form, newest first.\nThe creator's own inbox, so the sender's address is here; the creator's\nis in none of these messages and never reaches the sender.","operationId":"my_kit_messages_v2_media_kit_me_messages_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media-kit/me/messages/{message_id}/reply":{"post":{"tags":["v2 - Media kit"],"summary":"Reply To Message","description":"The creator answers. The sender is emailed the reply from a JubJub\naddress with a private link to the conversation; the creator's address\nis in neither.","operationId":"reply_to_message_v2_media_kit_me_messages__message_id__reply_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/media-kit/cron/refresh-figures":{"post":{"tags":["v2 - Media kit"],"summary":"Cron Refresh Figures","description":"Daily: re-measure each kit that is on and was last measured a week or\nmore ago, so every kit is measured weekly. No AI.","operationId":"cron_refresh_figures_v2_media_kit_cron_refresh_figures_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/public/media-kit/{handle}":{"get":{"tags":["v2 - Media kit"],"summary":"Public Kit","operationId":"public_kit_v2_public_media_kit__handle__get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/public/media-kit/{handle}/contact":{"post":{"tags":["v2 - Media kit"],"summary":"Contact Creator","description":"Start a conversation with the creator. The response never carries their\naddress, and neither does anything else on the kit.","operationId":"contact_creator_v2_public_media_kit__handle__contact_post","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/public/media-kit/thread/{token}":{"get":{"tags":["v2 - Media kit"],"summary":"Sender Thread","description":"The conversation as the sender sees it, by the private link in their\nemail. The creator's name only: no email, no ids.","operationId":"sender_thread_v2_public_media_kit_thread__token__get","parameters":[{"name":"token","in":"path","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"}}}}}}},"/v2/public/media-kit/thread/{token}/reply":{"post":{"tags":["v2 - Media kit"],"summary":"Sender Reply","operationId":"sender_reply_v2_public_media_kit_thread__token__reply_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/content-safety":{"get":{"tags":["v2 - Admin"],"summary":"Admin List Content Safety","description":"The pieces at one safety status, held by default: id, title, source,\nthe reason, the scan and when it was checked.","operationId":"admin_list_content_safety_v2_admin_content_safety_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"held","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/content-safety/{content_id}":{"post":{"tags":["v2 - Admin"],"summary":"Admin Set Content Safety","description":"The kill switch. Sets the verdict by hand, with the admin as the\nauthor, and carries out what the verdict means (see the module\ndocstring). A clear on a piece that was held at ingest also releases\nit: the cast or registration publishes and mints as it would have.","operationId":"admin_set_content_safety_v2_admin_content_safety__content_id__post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SafetyDecisionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/content-rights":{"get":{"tags":["v2 - Admin"],"summary":"Admin List Content Rights","operationId":"admin_list_content_rights_v2_admin_content_rights_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"held_for_owner","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/content-rights/{content_id}":{"post":{"tags":["v2 - Admin"],"summary":"Admin Set Content Rights","description":"A rights decision. blocked is the same refusal as a safety block;\nheld_for_owner keeps the piece playing, stops the mint, and parks its\nx402 earnings in the JubJub collection wallet; clear undoes either.","operationId":"admin_set_content_rights_v2_admin_content_rights__content_id__post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RightsDecisionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/content-rights/{content_id}/held-summary":{"get":{"tags":["v2 - Admin"],"summary":"Admin Content Rights Held Summary","description":"What is parked for the real owner: the x402 purchases the sweep left\npending under the rights marker (count and gross), and the streaming\nrevenue settled to the uploader's catalogue since the hold was set,\nwhich the on-chain destination cannot yet redirect.","operationId":"admin_content_rights_held_summary_v2_admin_content_rights__content_id__held_summary_get","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/safety/cron/rescan-errors":{"post":{"tags":["v2 - Content safety"],"summary":"Cron Rescan Errors","description":"Pieces held on a scan error, scanned again: a few per run, newest\nfirst, inside a wall-clock budget that fits the job's attempt deadline\n(320 s, cloudbuild.yaml schedule-safety-rescan-errors). A piece that\nclears is released the way an admin clear releases it; one still\nfailing after five attempts stays held as scan_error:gave_up.","operationId":"cron_rescan_errors_v2_safety_cron_rescan_errors_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/rights/claims":{"post":{"tags":["v2 - Rights claims"],"summary":"File Rights Claim","description":"Anyone may say a video is theirs. Nothing is held until they confirm\nthe email; the answer never reveals whether a claim already existed.","operationId":"file_rights_claim_v2_rights_claims_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimBody"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/rights/claims/{claim_id}/verify":{"get":{"tags":["v2 - Rights claims"],"summary":"Verify Rights Claim","operationId":"verify_rights_claim_v2_rights_claims__claim_id__verify_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"t","in":"query","required":true,"schema":{"type":"string","minLength":10,"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/rights/claims/{claim_id}/choose":{"get":{"tags":["v2 - Rights claims"],"summary":"Choose Rights Claim Page","operationId":"choose_rights_claim_page_v2_rights_claims__claim_id__choose_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"t","in":"query","required":true,"schema":{"type":"string","minLength":10,"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/rights/claims/{claim_id}/choice":{"post":{"tags":["v2 - Rights claims"],"summary":"Choose Rights Claim","operationId":"choose_rights_claim_v2_rights_claims__claim_id__choice_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChoiceBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/rights/claims/{claim_id}/status":{"get":{"tags":["v2 - Rights claims"],"summary":"Rights Claim Status","operationId":"rights_claim_status_v2_rights_claims__claim_id__status_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"t","in":"query","required":true,"schema":{"type":"string","minLength":10,"title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/rights/claims":{"get":{"tags":["v2 - Admin"],"summary":"Admin List Rights Claims","operationId":"admin_list_rights_claims_v2_admin_rights_claims_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"filed","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/rights/claims/{claim_id}/decide":{"post":{"tags":["v2 - Admin"],"summary":"Admin Decide Rights Claim","operationId":"admin_decide_rights_claim_v2_admin_rights_claims__claim_id__decide_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/admin/review/summary":{"get":{"tags":["v2 - Admin"],"summary":"Admin Review Summary","description":"The numbers the studio's review page shows at the top.","operationId":"admin_review_summary_v2_admin_review_summary_get","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"X-JubJub-Service-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Service-Key"}},{"name":"X-JubJub-Agent-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Agent-Key"}},{"name":"X-JubJub-Platform-Key","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Platform-Key"}},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","title":"Origin"}},{"name":"Referer","in":"header","required":false,"schema":{"type":"string","title":"Referer"}},{"name":"X-JubJub-Trial-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Jubjub-Trial-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/paid/media_search":{"post":{"tags":["v2 - Paid (x402 / Bazaar)"],"summary":"Paid Media Search","description":"Cross-corpus metadata search — ALWAYS FREE, no payment gate.\n\nReturns discoverable content with PREVIEW fields only. Agents use\npurchase_metadata / purchase_content to unlock full fields on a piece.\n100%-margin: structured Firestore filters + in-memory facet match, zero\ninference at query time.","operationId":"paid_media_search_v2_paid_media_search_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/paid/cron/recover-settlements":{"post":{"tags":["v2 - Paid (x402 / Bazaar)"],"summary":"Cron Recover Settlements","description":"Run the x402 settle-retry worker.\n\nDesigned to be called by Cloud Scheduler every 5 minutes. Protected by\nCloud Scheduler's OIDC authentication at the infrastructure level; no\nuser auth required. See the Manual Steps section of the feature PR for\nthe exact `gcloud scheduler jobs create` command.","operationId":"cron_recover_settlements_v2_paid_cron_recover_settlements_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/paid/cron/sweep-purchase-distributions":{"post":{"tags":["v2 - Paid (x402 / Bazaar)"],"summary":"Cron Sweep Purchase Distributions","description":"Distribute collected purchase revenue 97/3 through JubJubPaymentRouter.\n\nTwo-phase by necessity: router.settle enforces a $0.20/min rate cap, so a\nsession is opened on one tick and settled on a later one once enough time\nhas elapsed for the accrued amount. Idempotent and safe to over-schedule —\na tick with nothing due is a no-op.\n\nProtected by Cloud Scheduler OIDC at the infrastructure level, matching\n/v2/paid/cron/recover-settlements.\n\n🔴 Behind POOL_PURCHASE_SOURCE this endpoint NO-OPS: hub crossings\ndistribute purchases once the flag is on, and the scheduler job stays\nlive until the owner pauses it — running the old sweep in that window\nwould pay the same purchase out twice (plan: double-distribution\nhazard). One flag gates both the new writer and this endpoint,\natomically.","operationId":"cron_sweep_purchase_distributions_v2_paid_cron_sweep_purchase_distributions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/paid/purchase_metadata":{"post":{"tags":["v2 - Paid (x402 / Bazaar)"],"summary":"Paid Purchase Metadata","description":"x402 — unlock all structured metadata fields for one content piece.\nIdempotent within 24h (valid prior purchase → full fields, no new charge).","operationId":"paid_purchase_metadata_v2_paid_purchase_metadata_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/paid/purchase_content":{"post":{"tags":["v2 - Paid (x402 / Bazaar)"],"summary":"Paid Purchase Content","description":"x402 — metadata_access PLUS full transcript + rights-holder info, with a\nlogged intended_use licence declaration. Idempotent within 24h.","operationId":"paid_purchase_content_v2_paid_purchase_content_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/content/{content_id}/purchase/metadata":{"post":{"tags":["v2 - Commerce"],"summary":"Purchase Metadata","description":"Legacy alias for POST /v2/paid/purchase_metadata.","operationId":"purchase_metadata_v2_content__content_id__purchase_metadata_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/content/{content_id}/purchase/content":{"post":{"tags":["v2 - Commerce"],"summary":"Purchase Content","description":"Legacy alias for POST /v2/paid/purchase_content.","operationId":"purchase_content_v2_content__content_id__purchase_content_post","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watch/{content_id}":{"head":{"tags":["Watch"],"summary":"Watch Content","description":"Return HTML unfurl page with fc:miniapp meta tags for Farcaster.","operationId":"watch_content_watch__content_id__head","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Watch"],"summary":"Watch Content","description":"Return HTML unfurl page with fc:miniapp meta tags for Farcaster.","operationId":"watch_content_watch__content_id__head","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watch/{content_id}/embed.png":{"head":{"tags":["Watch"],"summary":"Watch Embed Image","description":"The cast's preview image: the thumbnail fitted to 3:2 (see\nwatch_embed_image.py). Same gate as the page, so a draft's thumbnail is\nnot served either. Any failure serves the Mini App's own 3:2 og.png\nrather than a broken image, which would drop the embed's preview.","operationId":"watch_embed_image_watch__content_id__embed_png_head","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Watch"],"summary":"Watch Embed Image","description":"The cast's preview image: the thumbnail fitted to 3:2 (see\nwatch_embed_image.py). Same gate as the page, so a draft's thumbnail is\nnot served either. Any failure serves the Mini App's own 3:2 og.png\nrather than a broken image, which would drop the embed's preview.","operationId":"watch_embed_image_watch__content_id__embed_png_head","parameters":[{"name":"content_id","in":"path","required":true,"schema":{"type":"string","title":"Content 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":{"get":{"tags":["OAuth Provider"],"summary":"Protected Resource Metadata","description":"RFC 9728 — Protected Resource Metadata.","operationId":"protected_resource_metadata__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["OAuth Provider"],"summary":"Authorization Server Metadata","description":"RFC 8414 — OAuth Authorization Server Metadata.","operationId":"authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/openapi-gpt.yaml":{"get":{"tags":["OAuth Provider"],"summary":"Gpt Actions Openapi Schema","description":"GPT Actions OpenAPI 3.1 schema (public, cached 1 hour).","operationId":"gpt_actions_openapi_schema_openapi_gpt_yaml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/register":{"post":{"tags":["OAuth Provider"],"summary":"Register Client","description":"RFC 7591 — Dynamic Client Registration.","operationId":"register_client_oauth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/authorize":{"get":{"tags":["OAuth Provider"],"summary":"Authorize","description":"OAuth 2.1 Authorization Endpoint.\n\nRenders a self-contained consent page with embedded Firebase login.\nAfter login, JS POSTs the Firebase ID token to /oauth/authorize/complete.","operationId":"authorize_oauth_authorize_get","parameters":[{"name":"response_type","in":"query","required":true,"schema":{"type":"string","title":"Response Type"}},{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","title":"Redirect Uri"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"code_challenge","in":"query","required":false,"schema":{"type":"string","title":"Code Challenge"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string","title":"Code Challenge Method"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/authorize/complete":{"post":{"tags":["OAuth Provider"],"summary":"Authorize Complete","description":"Exchange a Firebase ID token for an authorization code.\n\nCalled by the consent page JS after successful Firebase login.","operationId":"authorize_complete_oauth_authorize_complete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/token":{"post":{"tags":["OAuth Provider"],"summary":"Token","description":"OAuth 2.1 Token Endpoint.\n\nSupports:\n    grant_type=authorization_code  (code + code_verifier → tokens)\n    grant_type=refresh_token       (refresh_token → rotated tokens)","operationId":"token_oauth_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/messaging":{"get":{"tags":["Health"],"summary":"Check Messaging Health","description":"Check notification system health (Firestore + WebSocket).","operationId":"check_messaging_health_health_messaging_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/whoami":{"get":{"summary":"Whoami","description":"Get current user info from Authorization token","operationId":"whoami_health_whoami_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AcceptResponse":{"properties":{"accepted":{"type":"boolean","title":"Accepted"},"basis_points":{"type":"integer","title":"Basis Points"},"profile_id":{"type":"string","title":"Profile Id"}},"type":"object","required":["accepted","basis_points","profile_id"],"title":"AcceptResponse"},"AddMemberByEmailRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"role":{"type":"string","enum":["admin","editor","viewer"],"title":"Role","default":"viewer"}},"type":"object","required":["email"],"title":"AddMemberByEmailRequest","description":"Add someone to a workspace by email. The answer never says whether\nthe email had an account (security review, 2026-09-25)."},"AddTargetsRequest":{"properties":{"credential_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Credential Ids","description":"List of credential IDs to add as targets"}},"type":"object","required":["credential_ids"],"title":"AddTargetsRequest","description":"Request to add platform targets to a content."},"AddTargetsResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"added":{"items":{"$ref":"#/components/schemas/TargetInfo"},"type":"array","title":"Added"},"skipped":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Skipped","description":"Credentials that were skipped (already exist or invalid)"}},"type":"object","required":["content_id","added"],"title":"AddTargetsResponse","description":"Response after adding targets."},"AddVersionRequest":{"properties":{"media_id":{"type":"string","minLength":1,"title":"Media Id","description":"A ready video in this piece's workspace, used by no other piece"},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note","description":"What changed in this version"}},"type":"object","required":["media_id"],"title":"AddVersionRequest"},"AddWalletRequest":{"properties":{"wallet_address":{"type":"string","title":"Wallet Address","description":"EVM wallet address (0x + 40 hex chars)"}},"type":"object","required":["wallet_address"],"title":"AddWalletRequest"},"AgentListResponse":{"properties":{"agents":{"items":{"$ref":"#/components/schemas/AgentResponse"},"type":"array","title":"Agents"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["agents","total"],"title":"AgentListResponse"},"AgentResponse":{"properties":{"agent_id":{"type":"string","title":"Agent Id"},"name":{"type":"string","title":"Name"},"owner_profile_id":{"type":"string","title":"Owner Profile Id"},"status":{"type":"string","title":"Status"},"scopes":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Scopes"},"is_trusted_publish":{"type":"boolean","title":"Is Trusted Publish"},"limits_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Limits Override"},"created_at":{"type":"string","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["agent_id","name","owner_profile_id","status","scopes","is_trusted_publish","created_at"],"title":"AgentResponse"},"AggregateStatsResponse":{"properties":{"total_views":{"type":"integer","title":"Total Views","default":0},"total_likes":{"type":"integer","title":"Total Likes","default":0},"total_comments":{"type":"integer","title":"Total Comments","default":0},"total_shares":{"type":"integer","title":"Total Shares","default":0},"total_reach":{"type":"integer","title":"Total Reach","default":0},"total_impressions":{"type":"integer","title":"Total Impressions","default":0},"best_platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Platform"},"best_engagement_rate":{"type":"number","title":"Best Engagement Rate","default":0.0},"platform_count":{"type":"integer","title":"Platform Count","default":0},"platforms_ok":{"type":"integer","title":"Platforms Ok","default":0},"platforms_pending":{"type":"integer","title":"Platforms Pending","default":0},"platforms_error":{"type":"integer","title":"Platforms Error","default":0}},"type":"object","title":"AggregateStatsResponse"},"AllPlatformSchemasResponse":{"properties":{"platforms":{"additionalProperties":{"$ref":"#/components/schemas/PlatformSettingsSchema"},"type":"object","title":"Platforms"}},"type":"object","required":["platforms"],"title":"AllPlatformSchemasResponse","description":"Response containing all platform schemas."},"AllocationDTO":{"properties":{"member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Ref"},"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id"},"basis_points":{"type":"integer","title":"Basis Points"}},"type":"object","required":["basis_points"],"title":"AllocationDTO","description":"One holder in a repropose. Name them by `member_ref` (what holdings and\nproposals return); `profile_id` is kept as a legacy alias."},"AnalyticsRangeResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"date_from":{"type":"string","title":"Date From"},"date_to":{"type":"string","title":"Date To"},"snapshots":{"items":{"$ref":"#/components/schemas/SnapshotResponse"},"type":"array","title":"Snapshots","default":[]},"aggregate":{"$ref":"#/components/schemas/AggregateStatsResponse","default":{"total_views":0,"total_likes":0,"total_comments":0,"total_shares":0,"total_reach":0,"total_impressions":0,"best_engagement_rate":0.0,"platform_count":0,"platforms_ok":0,"platforms_pending":0,"platforms_error":0}},"latest_platform_status":{"additionalProperties":{"$ref":"#/components/schemas/PlatformOutcomeResponse"},"type":"object","title":"Latest Platform Status","default":{}},"latest_platforms":{"additionalProperties":{"$ref":"#/components/schemas/PlatformStatsResponse"},"type":"object","title":"Latest Platforms","default":{}}},"type":"object","required":["content_id","date_from","date_to"],"title":"AnalyticsRangeResponse"},"ApplyGeneralSettingsRequest":{"properties":{"fields":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Fields","description":"Fields to apply: title, description, tags"},"overwrite_custom":{"type":"boolean","title":"Overwrite Custom","description":"If true, overwrites configs that have custom values","default":false},"config_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Config Ids","description":"Specific configs to update. If empty, updates all."}},"type":"object","required":["fields"],"title":"ApplyGeneralSettingsRequest","description":"Request to apply content's general settings to platform configs."},"ApplyGeneralSettingsResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"fields_applied":{"items":{"type":"string"},"type":"array","title":"Fields Applied"},"updated":{"items":{"type":"string"},"type":"array","title":"Updated","description":"Config IDs that were updated"},"skipped":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Skipped","description":"Configs skipped with reason"}},"type":"object","required":["content_id","fields_applied"],"title":"ApplyGeneralSettingsResponse","description":"Response after applying general settings."},"ApprovalDecisionRequest":{"properties":{"decision":{"type":"string","pattern":"^(approved|rejected)$","title":"Decision","description":"The decision: 'approved' or 'rejected'"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason","description":"Optional reason for the decision (recommended for rejections)"}},"type":"object","required":["decision"],"title":"ApprovalDecisionRequest","description":"Request body for POST /v2/approvals/{approval_id}/decide."},"ApprovalResponse":{"properties":{"approval_id":{"type":"string","title":"Approval Id"},"launch_id":{"type":"string","title":"Launch Id"},"content_id":{"type":"string","title":"Content Id"},"workspace_id":{"type":"string","title":"Workspace Id"},"team_id":{"type":"string","title":"Team Id"},"approver_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approver Profile Id"},"requester_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requester Profile Id"},"approver":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Approver"},"requester":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Requester"},"is_approver":{"type":"boolean","title":"Is Approver","default":false},"platform":{"type":"string","title":"Platform"},"credential_id":{"type":"string","title":"Credential Id"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name"},"status":{"type":"string","title":"Status"},"policy_source":{"type":"string","title":"Policy Source"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"},"decided_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided At"},"decided_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided By"},"decided_by_profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Decided By Profile"},"notification_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"approver_count":{"type":"integer","title":"Approver Count","default":1},"sent_now":{"type":"boolean","title":"Sent Now","default":false}},"type":"object","required":["approval_id","launch_id","content_id","workspace_id","team_id","platform","credential_id","status","policy_source"],"title":"ApprovalResponse","description":"Response model for an approval request."},"ApproveResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"ApproveResponse"},"ApproverGrantInput":{"properties":{"kind":{"type":"string","enum":["profile","team"],"title":"Kind"},"ref":{"type":"string","minLength":1,"title":"Ref"}},"type":"object","required":["kind","ref"],"title":"ApproverGrantInput","description":"One grant of the release, as the owner states it.\n\n`kind=\"profile\"`: `ref` is a workspace-scoped member_ref (or, from older\nclients, a profile ID) of someone already in the workspace — a direct\nmember or a member of the linked team. `kind=\"team\"`: `ref` is the\nlinked team's id; everyone in that team may then approve."},"AssetResponse":{"properties":{"media_id":{"type":"string","title":"Media Id"},"filename":{"type":"string","title":"Filename"},"content_type":{"type":"string","title":"Content Type"},"media_type":{"type":"string","title":"Media Type"},"size_bytes":{"type":"integer","title":"Size Bytes"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["media_id","filename","content_type","media_type","size_bytes","status","created_at"],"title":"AssetResponse","description":"Single asset in session status response."},"AvailableCredentialResponse":{"properties":{"credential_id":{"type":"string","title":"Credential Id"},"shared_credential_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shared Credential Id"},"platform":{"type":"string","title":"Platform"},"account_name":{"type":"string","title":"Account Name"},"account_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Username"},"account_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Avatar Url"},"display_name":{"type":"string","title":"Display Name"},"is_shared":{"type":"boolean","title":"Is Shared","default":false},"shared_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shared By"}},"type":"object","required":["credential_id","platform","account_name","display_name"],"title":"AvailableCredentialResponse","description":"A credential available for use (personal or shared)."},"AvailableCredentialsResponse":{"properties":{"personal":{"items":{"$ref":"#/components/schemas/AvailableCredentialResponse"},"type":"array","title":"Personal","default":[]},"shared":{"items":{"$ref":"#/components/schemas/AvailableCredentialResponse"},"type":"array","title":"Shared","default":[]}},"type":"object","title":"AvailableCredentialsResponse","description":"All credentials available to a user in a team context."},"BatchDeleteRequest":{"properties":{"workspace_ids":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Workspace Ids","description":"List of workspace IDs to delete"}},"type":"object","required":["workspace_ids"],"title":"BatchDeleteRequest","description":"Request to delete multiple workspaces at once."},"BatchDeleteResponse":{"properties":{"deleted":{"items":{"type":"string"},"type":"array","title":"Deleted","description":"IDs that were successfully deleted"},"not_found":{"items":{"type":"string"},"type":"array","title":"Not Found","description":"IDs that were not found"},"failed":{"items":{"type":"string"},"type":"array","title":"Failed","description":"IDs whose cascade failed; these workspaces still exist"},"total_deleted":{"type":"integer","title":"Total Deleted","description":"Total count of deleted workspaces"}},"type":"object","required":["deleted","not_found","total_deleted"],"title":"BatchDeleteResponse","description":"Response from batch delete operation."},"BulkCreateConfigItem":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform type: youtube, instagram, facebook, tiktok, linkedin, twitter, vimeo"},"credential_id":{"type":"string","title":"Credential Id","description":"ID of the credential/account to use for publishing"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name","description":"Friendly name for the credential (e.g., 'Instagram Página Principal')"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings","description":"Platform-specific settings"}},"type":"object","required":["platform","credential_id"],"title":"BulkCreateConfigItem","description":"Single item in a bulk create request."},"BulkCreatePlatformConfigsRequest":{"properties":{"content_id":{"type":"string","title":"Content Id","description":"Content this config belongs to"},"configs":{"items":{"$ref":"#/components/schemas/BulkCreateConfigItem"},"type":"array","minItems":1,"title":"Configs","description":"List of platform configs to create"}},"type":"object","required":["content_id","configs"],"title":"BulkCreatePlatformConfigsRequest","description":"Request to create multiple platform configs for a content at once."},"BulkCreatePlatformConfigsResponse":{"properties":{"created":{"items":{"$ref":"#/components/schemas/PlatformConfigResponse"},"type":"array","title":"Created"},"errors":{"items":{"$ref":"#/components/schemas/BulkCreateResult"},"type":"array","title":"Errors"},"total_requested":{"type":"integer","title":"Total Requested"},"total_created":{"type":"integer","title":"Total Created"}},"type":"object","required":["created","total_requested","total_created"],"title":"BulkCreatePlatformConfigsResponse","description":"Response for bulk create operation."},"BulkCreateResult":{"properties":{"platform":{"type":"string","title":"Platform"},"credential_id":{"type":"string","title":"Credential Id"},"success":{"type":"boolean","title":"Success"},"config_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Config Id"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["platform","credential_id","success"],"title":"BulkCreateResult","description":"Result for a single config in bulk create."},"BulkUpdateConfigItem":{"properties":{"config_id":{"type":"string","title":"Config Id","description":"ID of the config to update"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings","description":"Platform-specific settings to update"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Update status: not_configured, ready"}},"type":"object","required":["config_id"],"title":"BulkUpdateConfigItem","description":"Single item in a bulk update request."},"BulkUpdatePlatformConfigsRequest":{"properties":{"configs":{"items":{"$ref":"#/components/schemas/BulkUpdateConfigItem"},"type":"array","minItems":1,"title":"Configs","description":"List of configs to update"}},"type":"object","required":["configs"],"title":"BulkUpdatePlatformConfigsRequest","description":"Request to update multiple platform configs at once."},"BulkUpdatePlatformConfigsResponse":{"properties":{"updated":{"items":{"$ref":"#/components/schemas/PlatformConfigCardResponse"},"type":"array","title":"Updated"},"errors":{"items":{"$ref":"#/components/schemas/BulkUpdateResult"},"type":"array","title":"Errors"},"total_requested":{"type":"integer","title":"Total Requested"},"total_updated":{"type":"integer","title":"Total Updated"}},"type":"object","required":["updated","total_requested","total_updated"],"title":"BulkUpdatePlatformConfigsResponse","description":"Response for bulk update operation."},"BulkUpdateResult":{"properties":{"config_id":{"type":"string","title":"Config Id"},"success":{"type":"boolean","title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["config_id","success"],"title":"BulkUpdateResult","description":"Result for a single config in bulk update."},"ChatContext":{"properties":{"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id"},"page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"content_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Id"}},"type":"object","title":"ChatContext"},"ChatMessageRequest":{"properties":{"message":{"type":"string","title":"Message"},"context":{"anyOf":[{"$ref":"#/components/schemas/ChatContext"},{"type":"null"}]}},"type":"object","required":["message"],"title":"ChatMessageRequest"},"ChoiceBody":{"properties":{"t":{"type":"string","minLength":10,"title":"T"},"choice":{"type":"string","enum":["keep_earning","demonetise"],"title":"Choice"},"wallet":{"type":"string","maxLength":42,"minLength":42,"title":"Wallet"}},"type":"object","required":["t","choice","wallet"],"title":"ChoiceBody"},"ClaimAgentWalletRequest":{"properties":{"wallet_address":{"type":"string","title":"Wallet Address","description":"The agent's EVM address (0x + 40 hex)"},"signature":{"type":"string","title":"Signature","description":"EIP-191 signature over the SIWE message from /v2/auth/wallet-nonce"},"nonce":{"type":"string","title":"Nonce","description":"Nonce issued by /v2/auth/wallet-nonce"}},"type":"object","required":["wallet_address","signature","nonce"],"title":"ClaimAgentWalletRequest"},"ClaimAgentWalletResponse":{"properties":{"agent_profile_id":{"type":"string","title":"Agent Profile Id"},"owner_profile_id":{"type":"string","title":"Owner Profile Id"},"already_owned":{"type":"boolean","title":"Already Owned","default":false},"release":{"additionalProperties":true,"type":"object","title":"Release","default":{}}},"type":"object","required":["agent_profile_id","owner_profile_id"],"title":"ClaimAgentWalletResponse"},"ClaimBody":{"properties":{"content_id":{"type":"string","maxLength":64,"minLength":1,"title":"Content Id"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"proof_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Proof Url"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"},"source":{"type":"string","enum":["sdk","watch","other"],"title":"Source","default":"other"}},"type":"object","required":["content_id","name","email"],"title":"ClaimBody"},"ClaimTryNowRequest":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id"},"target_workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Workspace Id"}},"type":"object","required":["workspace_id"],"title":"ClaimTryNowRequest"},"ClaimTryNowResponse":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id"},"profile_id":{"type":"string","title":"Profile Id"},"custom_token":{"type":"string","title":"Custom Token"},"redirect_path":{"type":"string","title":"Redirect Path"},"content_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Id"},"platforms_connected":{"items":{"type":"string"},"type":"array","title":"Platforms Connected","default":[]},"platforms_pending":{"items":{"type":"string"},"type":"array","title":"Platforms Pending","default":[]},"message":{"type":"string","title":"Message","default":"Trial claimed successfully. Connect your social accounts to launch."}},"type":"object","required":["workspace_id","profile_id","custom_token","redirect_path"],"title":"ClaimTryNowResponse"},"ClarificationResponse":{"properties":{"required":{"type":"boolean","title":"Required"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"options":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Options"}},"type":"object","required":["required"],"title":"ClarificationResponse","description":"Clarification state."},"ClientErrorReport":{"properties":{"error_message":{"type":"string","title":"Error Message"},"stack_trace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stack Trace"},"route":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route"},"build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Id"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context"}},"type":"object","required":["error_message"],"title":"ClientErrorReport","description":"Payload from the dashboard error-reporter (unhandled / api_error / timeout)."},"CloseResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"amount_settled":{"type":"integer","title":"Amount Settled"},"status":{"type":"string","title":"Status"}},"type":"object","required":["session_id","amount_settled","status"],"title":"CloseResponse"},"CloseSessionRequest":{"properties":{"playback_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Playback Seconds","description":"Exact playback seconds watched — used for precise final settlement."}},"type":"object","title":"CloseSessionRequest"},"ConfigValidationResult":{"properties":{"config_id":{"type":"string","title":"Config Id"},"platform":{"type":"string","title":"Platform"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name"},"valid":{"type":"boolean","title":"Valid"},"status":{"type":"string","title":"Status"},"errors":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Errors"},"warnings":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Warnings"}},"type":"object","required":["config_id","platform","valid","status"],"title":"ConfigValidationResult","description":"Validation result for a single platform config."},"ConfirmGroupingItem":{"properties":{"grouping_id":{"type":"string","title":"Grouping Id"},"video_media_id":{"type":"string","title":"Video Media Id"},"thumbnail_media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Media Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["grouping_id","video_media_id"],"title":"ConfirmGroupingItem","description":"A single confirmed grouping."},"ConfirmGroupingsRequest":{"properties":{"groupings":{"items":{"$ref":"#/components/schemas/ConfirmGroupingItem"},"type":"array","minItems":1,"title":"Groupings"}},"type":"object","required":["groupings"],"title":"ConfirmGroupingsRequest","description":"Confirm video-thumbnail groupings."},"ConfirmGroupingsResponse":{"properties":{"upload_session_id":{"type":"string","title":"Upload Session Id"},"status":{"type":"string","title":"Status"},"groupings_confirmed_count":{"type":"integer","title":"Groupings Confirmed Count"}},"type":"object","required":["upload_session_id","status","groupings_confirmed_count"],"title":"ConfirmGroupingsResponse","description":"Response after confirming groupings (no content creation)."},"ConnectEmailRequest":{"properties":{"member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Ref","description":"One member; omit for every member who has not shared yet"},"dry_run":{"type":"boolean","title":"Dry Run","description":"List who would be emailed and with which version; send nothing","default":false},"platforms":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Platforms","description":"Platform ids to name in the email, e.g. ['youtube','tiktok']. Omit (or []) for the email as before. Wording only: who is emailed, and which version, do not change."}},"type":"object","title":"ConnectEmailRequest"},"ConnectFidRequest":{"properties":{"fid":{"type":"integer","title":"Fid"},"quick_auth_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quick Auth Token"}},"type":"object","required":["fid"],"title":"ConnectFidRequest"},"ConnectFidResponse":{"properties":{"connected":{"type":"boolean","title":"Connected"},"fid":{"type":"string","title":"Fid"},"already_connected":{"type":"boolean","title":"Already Connected"},"payout_wallet_assigned":{"type":"boolean","title":"Payout Wallet Assigned","default":false},"payout_wallet_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payout Wallet Address"}},"type":"object","required":["connected","fid","already_connected"],"title":"ConnectFidResponse"},"ConnectRequest":{"properties":{"api_key":{"type":"string","title":"Api Key"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","required":["api_key"],"title":"ConnectRequest"},"ConnectionStatusResponse":{"properties":{"connected":{"type":"boolean","title":"Connected"},"fid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fid"}},"type":"object","required":["connected"],"title":"ConnectionStatusResponse"},"ContactRequest":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name"},"email":{"type":"string","maxLength":320,"title":"Email"},"company":{"type":"string","maxLength":200,"title":"Company","default":""},"message":{"type":"string","maxLength":4000,"title":"Message"},"website":{"type":"string","maxLength":500,"title":"Website","default":""}},"type":"object","required":["name","email","message"],"title":"ContactRequest"},"ContentCardResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"video_id":{"type":"string","title":"Video Id"},"thumbnail_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Id"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"current_version":{"type":"integer","title":"Current Version","default":1},"version_count":{"type":"integer","title":"Version Count","default":1},"status":{"type":"string","title":"Status"},"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms","description":"Configured platform names (legacy)"},"platform_configs":{"items":{"$ref":"#/components/schemas/PlatformConfigInfo"},"type":"array","title":"Platform Configs","description":"Platform configs with real status"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"ownership_contract_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Contract Address"},"on_chain_tx_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"On Chain Tx Hash"},"on_chain_confirmed":{"type":"boolean","title":"On Chain Confirmed","default":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"registered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered At"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["content_id","title","description","video_id","thumbnail_id","status","updated_at"],"title":"ContentCardResponse","description":"Lightweight content response for card/list display."},"ContentEarning":{"properties":{"content_id":{"type":"string","title":"Content Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"contract_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Address"},"earned_usdc":{"type":"number","title":"Earned Usdc","default":0.0},"basis_points":{"type":"integer","title":"Basis Points","default":0}},"type":"object","required":["content_id"],"title":"ContentEarning"},"ContentItemDTO":{"properties":{"content_id":{"type":"string","title":"Content Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"content_contract":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Contract"},"total_received_usdc":{"type":"number","title":"Total Received Usdc","default":0.0},"launches":{"items":{"$ref":"#/components/schemas/LaunchDTO"},"type":"array","title":"Launches","default":[]},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"registered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered At"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["content_id"],"title":"ContentItemDTO"},"ContentListResponse":{"properties":{"contents":{"items":{"$ref":"#/components/schemas/ContentCardResponse"},"type":"array","title":"Contents"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["contents","total","limit","offset"],"title":"ContentListResponse","description":"Response for listing contents."},"ContentPreview":{"properties":{"content_id":{"type":"string","title":"Content Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"}},"type":"object","required":["content_id"],"title":"ContentPreview"},"ContentResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"video_id":{"type":"string","title":"Video Id"},"thumbnail_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Id"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"subtitle_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Subtitle Ids"},"current_version":{"type":"integer","title":"Current Version","default":1},"version_count":{"type":"integer","title":"Version Count","default":1},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"is_made_for_kids":{"type":"boolean","title":"Is Made For Kids"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_by_you":{"type":"boolean","title":"Created By You","default":false},"creator":{"anyOf":[{"$ref":"#/components/schemas/PublicPerson"},{"type":"null"}]},"ownership_contract_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Contract Address"},"token_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Id"},"on_chain_tx_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"On Chain Tx Hash"},"on_chain_confirmed":{"type":"boolean","title":"On Chain Confirmed","default":false},"ownership_status":{"type":"string","title":"Ownership Status","default":"pending"},"ownership_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Step"},"ownership_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Reason"},"catalogue_contract_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue Contract Address"},"discoverable":{"type":"boolean","title":"Discoverable","default":false},"provenance_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance Tier"},"provenance_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Provenance Score"},"transcript_available":{"type":"boolean","title":"Transcript Available","default":false},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"topics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topics"},"sentiment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sentiment"},"production_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Production Tier"},"setting":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Setting"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"questions_answered":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Questions Answered"},"training_caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Caption"},"cinematographic":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cinematographic"},"provenance_signals":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Provenance Signals"},"entities_people":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entities People"},"entities_brands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entities Brands"},"entities_locations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entities Locations"},"chapter_markers":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Chapter Markers"},"target_audience":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Target Audience"},"expertise_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expertise Level"},"transcript_full":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Full"},"payment_verified":{"type":"boolean","title":"Payment Verified","default":false},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"registered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered At"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platforms","description":"List of configured platforms (populated separately)"}},"type":"object","required":["content_id","folder_id","title","description","tags","video_id","thumbnail_id","subtitle_ids","language","is_made_for_kids","status","created_at","updated_at","created_by"],"title":"ContentResponse","description":"Full content response."},"ContentWithConfigsResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"video_id":{"type":"string","title":"Video Id"},"thumbnail_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Id"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"subtitle_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Subtitle Ids"},"current_version":{"type":"integer","title":"Current Version","default":1},"version_count":{"type":"integer","title":"Version Count","default":1},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"is_made_for_kids":{"type":"boolean","title":"Is Made For Kids"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_by_you":{"type":"boolean","title":"Created By You","default":false},"creator":{"anyOf":[{"$ref":"#/components/schemas/PublicPerson"},{"type":"null"}]},"ownership_contract_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Contract Address"},"token_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Id"},"on_chain_tx_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"On Chain Tx Hash"},"on_chain_confirmed":{"type":"boolean","title":"On Chain Confirmed","default":false},"ownership_status":{"type":"string","title":"Ownership Status","default":"pending"},"ownership_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Step"},"ownership_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Reason"},"catalogue_contract_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue Contract Address"},"discoverable":{"type":"boolean","title":"Discoverable","default":false},"provenance_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance Tier"},"provenance_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Provenance Score"},"transcript_available":{"type":"boolean","title":"Transcript Available","default":false},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"topics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topics"},"sentiment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sentiment"},"production_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Production Tier"},"setting":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Setting"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"questions_answered":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Questions Answered"},"training_caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Caption"},"cinematographic":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cinematographic"},"provenance_signals":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Provenance Signals"},"entities_people":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entities People"},"entities_brands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entities Brands"},"entities_locations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entities Locations"},"chapter_markers":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Chapter Markers"},"target_audience":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Target Audience"},"expertise_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expertise Level"},"transcript_full":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Full"},"payment_verified":{"type":"boolean","title":"Payment Verified","default":false},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"registered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered At"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platforms","description":"List of configured platforms (populated separately)"},"platform_configs":{"items":{"$ref":"#/components/schemas/TargetInfo"},"type":"array","title":"Platform Configs","description":"All platform configurations for this content"},"video":{"anyOf":[{"$ref":"#/components/schemas/EmbeddedMedia"},{"type":"null"}],"description":"Video media details (only when expand=media)"},"thumbnail":{"anyOf":[{"$ref":"#/components/schemas/EmbeddedMedia"},{"type":"null"}],"description":"Thumbnail media details (only when expand=media)"}},"type":"object","required":["content_id","folder_id","title","description","tags","video_id","thumbnail_id","subtitle_ids","language","is_made_for_kids","status","created_at","updated_at","created_by"],"title":"ContentWithConfigsResponse","description":"Content response with full platform configs."},"CreateAgentRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"scopes":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Scopes","description":"Scope overrides. Missing keys use defaults. Publish scopes default to false."},"is_trusted_publish":{"type":"boolean","title":"Is Trusted Publish","description":"Allow this agent to use publish:execute and publish:schedule scopes.","default":false}},"type":"object","required":["name"],"title":"CreateAgentRequest"},"CreateAgentResponse":{"properties":{"agent_id":{"type":"string","title":"Agent Id"},"name":{"type":"string","title":"Name"},"owner_profile_id":{"type":"string","title":"Owner Profile Id"},"status":{"type":"string","title":"Status"},"scopes":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Scopes"},"is_trusted_publish":{"type":"boolean","title":"Is Trusted Publish"},"raw_key":{"type":"string","title":"Raw Key","description":"The raw secret key. Store it securely — it will NOT be shown again."},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["agent_id","name","owner_profile_id","status","scopes","is_trusted_publish","raw_key","created_at"],"title":"CreateAgentResponse"},"CreateContentRequest":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id","description":"Workspace that owns this content"},"title":{"type":"string","maxLength":500,"minLength":1,"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Tags"},"video_id":{"type":"string","minLength":1,"title":"Video Id","description":"Reference to uploaded Media (video)"},"thumbnail_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Id","description":"Reference to Media (thumbnail)"},"subtitle_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Subtitle Ids","description":"References to subtitle Media"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Primary language code (ISO 639-1)"},"is_made_for_kids":{"type":"boolean","title":"Is Made For Kids","default":false},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By","description":"Profile ID of creator"}},"type":"object","required":["workspace_id","title","video_id"],"title":"CreateContentRequest","description":"Request to create a new content."},"CreateInviteLinkRequest":{"properties":{"auto_accept":{"type":"boolean","title":"Auto Accept","description":"If true, joiners are added immediately. If false, requires owner approval.","default":true},"max_uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Uses","description":"Maximum number of uses. None = unlimited."}},"type":"object","title":"CreateInviteLinkRequest"},"CreateInviteRequest":{"properties":{"invitee_email":{"type":"string","title":"Invitee Email","description":"Email of person to invite"},"role":{"type":"string","title":"Role","description":"Role to assign: admin, manager, editor, publisher, viewer","default":"editor"},"custom_permissions":{"anyOf":[{"items":{"type":"string"},"type":"array","uniqueItems":true},{"type":"null"}],"title":"Custom Permissions","description":"Custom permission overrides"}},"type":"object","required":["invitee_email"],"title":"CreateInviteRequest","description":"Request to create a team invitation."},"CreateKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"scope":{"anyOf":[{"type":"string","enum":["register_content","search"]},{"items":{"type":"string","enum":["register_content","search"]},"type":"array"}],"title":"Scope"}},"type":"object","required":["name","scope"],"title":"CreateKeyRequest"},"CreateKeyResponse":{"properties":{"key":{"type":"string","title":"Key"},"key_id":{"type":"string","title":"Key Id"},"name":{"type":"string","title":"Name"},"created_at":{"type":"string","title":"Created At"},"scope":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scope"}},"type":"object","required":["key","key_id","name","created_at"],"title":"CreateKeyResponse"},"CreateLaunchRequest":{"properties":{"content_id":{"type":"string","title":"Content Id","description":"ID of the content to publish"},"platform_config_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Platform Config Ids","description":"List of PlatformConfig IDs to publish to"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Title for THIS launch, as typed in the Publish dialog. Stored on the launch and used wherever the launch is displayed. When absent, the content's own title is used. Never written back to the content — publishing does not rename the piece."},"first_comment":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"First Comment","description":"General first comment for this launch: posted as a comment on the new post on every selected YouTube, LinkedIn and Farcaster platform that has no first comment of its own (a platform's own, in platform_overrides or its config, wins). Refused with 422 when it is over a selected platform's limit; never truncated."},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For","description":"When to publish. If None, publishes immediately."},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Timezone for scheduled_for (e.g., 'America/Sao_Paulo')"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Client-provided key to prevent duplicate launches"},"platform_schedules":{"anyOf":[{"additionalProperties":{"type":"string","format":"date-time"},"type":"object"},{"type":"null"}],"title":"Platform Schedules","description":"Per-platform schedule overrides keyed by PlatformConfig ID. When set, that platform publishes at the given time instead of scheduled_for. Each timestamp must be in the future."},"platform_overrides":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"Platform Overrides","description":"Per-platform settings overrides keyed by PlatformConfig ID. Each value is merged on top of PlatformConfig.settings (override wins) at publish time. Use to set per-publish YouTube category, Vimeo privacy, TikTok duet flags, etc."}},"type":"object","required":["content_id","platform_config_ids"],"title":"CreateLaunchRequest","description":"Request to create a new launch.","example":{"content_id":"cnt_abc123","platform_config_ids":["cfg_instagram_001","cfg_youtube_002"],"platform_overrides":{"cfg_youtube_002":{"category_name":"Entertainment","made_for_kids":false}},"platform_schedules":{"cfg_youtube_002":"2024-01-20T16:00:00Z"},"scheduled_for":"2024-01-20T15:00:00Z","timezone":"America/Sao_Paulo"}},"CreateMessageRequest":{"properties":{"scope_type":{"type":"string","title":"Scope Type","description":"Scope type: team, workspace, content, media, collection"},"scope_id":{"type":"string","title":"Scope Id","description":"ID of the scoped entity"},"body":{"type":"string","maxLength":10000,"minLength":1,"title":"Body"},"mentions":{"items":{"type":"string"},"type":"array","title":"Mentions","description":"People mentioned, as member_refs (from a member list or a message's mention_profiles). A raw profile ID is still accepted from older clients."},"parent_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Message Id","description":"Reply-to message ID"},"message_type":{"type":"string","title":"Message Type","description":"comment, decision, status_change, system","default":"comment"},"timecode_seconds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Timecode Seconds","description":"Optional video timecode (seconds, >=0). Only valid when scope_type=='media'."},"decision_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Type","description":"approval, review, sign_off"},"author_type":{"type":"string","title":"Author Type","description":"human, agent, system","default":"human"},"author_service_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Service Id"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Arbitrary client metadata (e.g. video timestamp, annotation)"},"collection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Id","description":"Collection context for media-scope auth fallback"}},"type":"object","required":["scope_type","scope_id","body"],"title":"CreateMessageRequest","description":"Request to create a new communication message."},"CreatePlatformConfigRequest":{"properties":{"content_id":{"type":"string","title":"Content Id","description":"Content this config belongs to"},"platform":{"type":"string","title":"Platform","description":"Platform type: youtube, instagram, facebook, tiktok, linkedin, twitter, vimeo"},"credential_id":{"type":"string","title":"Credential Id","description":"ID of the credential/account to use for publishing"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name","description":"Friendly name for the credential (e.g., 'Instagram Página Principal')"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings","description":"Platform-specific settings"}},"type":"object","required":["content_id","platform","credential_id"],"title":"CreatePlatformConfigRequest","description":"Request to create a new platform config."},"CreateProfileResponse":{"properties":{"message":{"type":"string","title":"Message","example":"Profile created successfully"}},"type":"object","required":["message"],"title":"CreateProfileResponse"},"CreateSessionRequest":{"properties":{"content_id":{"type":"string","title":"Content Id","description":"Content to stream"},"playback_grant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Playback Grant","description":"Signed grant from the playback fetch (K1-2). When present its content id WINS over the body's. Required once STREAMING_REQUIRE_PLAYBACK_GRANT is enabled."},"viewer_wallet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewer Wallet","description":"Viewer wallet address (for external wallets)"},"viewer_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewer Profile Id","description":"Viewer profile ID (if authenticated)"},"viewer_type":{"type":"string","title":"Viewer Type","description":"Viewer type: 'human' or 'agent'","default":"human"}},"type":"object","required":["content_id"],"title":"CreateSessionRequest"},"CreateTeamRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["name"],"title":"CreateTeamRequest","description":"Request to create a new team."},"CreateUploadLinkRequest":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id","description":"Target workspace for uploaded media"},"origin_surface":{"type":"string","title":"Origin Surface","description":"Control plane origin: chatgpt, claude, telegram, other"}},"type":"object","required":["workspace_id","origin_surface"],"title":"CreateUploadLinkRequest","description":"Request to create an upload session link."},"CreateUploadLinkResponse":{"properties":{"upload_session_id":{"type":"string","title":"Upload Session Id"},"upload_url":{"type":"string","title":"Upload Url"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"workspace_id":{"type":"string","title":"Workspace Id"}},"type":"object","required":["upload_session_id","upload_url","expires_at","workspace_id"],"title":"CreateUploadLinkResponse","description":"Response after creating an upload session."},"CreateWorkspaceRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"default_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Language"},"default_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Default Tags"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id","description":"Owner ID. If not provided, will use authenticated user's ID."},"kind":{"type":"string","enum":["workspace","collection"],"title":"Kind","description":"'workspace' = project for shipping work. 'collection' = pinboard for grouping references.","default":"workspace"}},"type":"object","required":["name"],"title":"CreateWorkspaceRequest","description":"Request to create a new workspace."},"CreatorEarningsResponse":{"properties":{"total_usdc":{"type":"number","title":"Total Usdc"},"wallet_usdc":{"type":"number","title":"Wallet Usdc"},"pending_usdc":{"type":"number","title":"Pending Usdc"},"content":{"items":{"$ref":"#/components/schemas/ContentEarning"},"type":"array","title":"Content"},"wallet_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wallet Address"}},"type":"object","required":["total_usdc","wallet_usdc","pending_usdc"],"title":"CreatorEarningsResponse"},"CredentialCardResponse":{"properties":{"credential_id":{"type":"string","title":"Credential Id"},"platform":{"type":"string","title":"Platform"},"account_name":{"type":"string","title":"Account Name"},"account_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Username"},"account_id":{"type":"string","title":"Account Id"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"display_name":{"type":"string","title":"Display Name"},"status":{"type":"string","title":"Status"},"is_active":{"type":"boolean","title":"Is Active"},"needs_reauth":{"type":"boolean","title":"Needs Reauth"},"token_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Token Valid","description":"Result of live token validation against the platform API. None if not checked."},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"},"last_check_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Check Source"},"last_check_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Check Outcome","description":"alive | dead | undetermined"},"last_check_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Check Detail"},"tokenise_destination_set":{"type":"boolean","title":"Tokenise Destination Set","description":"True once a destination has been chosen for this channel.","default":false},"tokenise_team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tokenise Team Id","description":"Team the channel's imports tokenise to; null for solo."},"tokenise_destination_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tokenise Destination Mode","description":"'team', 'solo', or null when no destination has been set."},"facebook_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facebook Page Id"},"facebook_page_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facebook Page Name"},"facebook_pages":{"anyOf":[{"items":{"$ref":"#/components/schemas/FacebookPageSummary"},"type":"array"},{"type":"null"}],"title":"Facebook Pages"},"granted_scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Granted Scopes"}},"type":"object","required":["credential_id","platform","account_name","account_username","account_id","nickname","display_name","status","is_active","needs_reauth"],"title":"CredentialCardResponse","description":"Lightweight credential response for lists."},"CredentialListResponse":{"properties":{"credentials":{"items":{"$ref":"#/components/schemas/CredentialCardResponse"},"type":"array","title":"Credentials"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["credentials","total"],"title":"CredentialListResponse","description":"Response for listing credentials."},"CredentialResponse":{"properties":{"credential_id":{"type":"string","title":"Credential Id"},"profile_id":{"type":"string","title":"Profile Id"},"platform":{"type":"string","title":"Platform"},"account_name":{"type":"string","title":"Account Name"},"account_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Username"},"account_id":{"type":"string","title":"Account Id"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"display_name":{"type":"string","title":"Display Name","description":"Best display name (nickname > account_name > account_username)"},"status":{"type":"string","title":"Status"},"is_active":{"type":"boolean","title":"Is Active"},"needs_reauth":{"type":"boolean","title":"Needs Reauth"},"token_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Token Expires At"},"has_refresh_token":{"type":"boolean","title":"Has Refresh Token"},"token_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Token Valid","description":"Result of live token validation against the platform API. None if not checked."},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"},"last_check_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Check Source"},"last_check_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Check Outcome","description":"alive | dead | undetermined"},"last_check_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Check Detail"},"tokenise_destination_set":{"type":"boolean","title":"Tokenise Destination Set","description":"True once a destination has been chosen for this channel.","default":false},"tokenise_team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tokenise Team Id","description":"Team the channel's imports tokenise to; null for solo."},"tokenise_destination_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tokenise Destination Mode","description":"'team', 'solo', or null when no destination has been set."},"facebook_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facebook Page Id"},"facebook_page_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facebook Page Name"},"facebook_pages":{"anyOf":[{"items":{"$ref":"#/components/schemas/FacebookPageSummary"},"type":"array"},{"type":"null"}],"title":"Facebook Pages"},"granted_scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Granted Scopes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["credential_id","profile_id","platform","account_name","account_username","account_id","nickname","display_name","status","is_active","needs_reauth","token_expires_at","has_refresh_token","created_at","updated_at","last_used_at"],"title":"CredentialResponse","description":"Full credential response (without sensitive token data).\n\nTokens are NEVER exposed - only metadata about the credential."},"CredentialsByPlatformResponse":{"properties":{"platforms":{"additionalProperties":{"items":{"$ref":"#/components/schemas/CredentialCardResponse"},"type":"array"},"type":"object","title":"Platforms"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["platforms","total"],"title":"CredentialsByPlatformResponse","description":"Response grouping credentials by platform."},"DecisionBody":{"properties":{"decision":{"type":"string","enum":["claimant","uploader"],"title":"Decision"},"reason":{"type":"string","maxLength":2000,"minLength":1,"title":"Reason"}},"type":"object","required":["decision","reason"],"title":"DecisionBody"},"DeleteCredentialResponse":{"properties":{"deleted":{"type":"boolean","title":"Deleted"},"credential_id":{"type":"string","title":"Credential Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["deleted","credential_id","message"],"title":"DeleteCredentialResponse","description":"Response after deleting a credential."},"DeveloperSignupRequest":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"}},"type":"object","required":["email"],"title":"DeveloperSignupRequest"},"DeveloperSignupResponse":{"properties":{"platform_key":{"type":"string","title":"Platform Key"},"profile_id":{"type":"string","title":"Profile Id"},"email":{"type":"string","title":"Email"},"code_snippet":{"type":"string","title":"Code Snippet"}},"type":"object","required":["platform_key","profile_id","email","code_snippet"],"title":"DeveloperSignupResponse"},"EditMessageRequest":{"properties":{"body":{"type":"string","maxLength":10000,"minLength":1,"title":"Body"},"mentions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mentions","description":"Updated mentions as member_refs (the refs a response's `mentions` carries); null = no change"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Updated metadata; null = no change"},"timecode_seconds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Timecode Seconds","description":"Updated video timecode (seconds, >=0); null = no change. Use 0 to keep position."}},"type":"object","required":["body"],"title":"EditMessageRequest","description":"Request to edit a message body and/or mentions."},"EmbeddedMedia":{"properties":{"media_id":{"type":"string","title":"Media Id"},"filename":{"type":"string","title":"Filename"},"content_type":{"type":"string","title":"Content Type"},"size_bytes":{"type":"integer","title":"Size Bytes"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"status":{"type":"string","title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"video_metadata":{"anyOf":[{"$ref":"#/components/schemas/EmbeddedVideoMetadata"},{"type":"null"}]}},"type":"object","required":["media_id","filename","content_type","size_bytes","status"],"title":"EmbeddedMedia","description":"Media info embedded in content response (for expand=media)."},"EmbeddedVideoMetadata":{"properties":{"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"fps":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fps"},"codec":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codec"},"bitrate_kbps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bitrate Kbps"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation"},"duration_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration Category"}},"type":"object","title":"EmbeddedVideoMetadata","description":"Video metadata embedded in content response."},"ExchangeFirebaseTokenRequest":{"properties":{"id_token":{"type":"string","title":"Id Token","description":"Firebase ID token from a signed-in user"}},"type":"object","required":["id_token"],"title":"ExchangeFirebaseTokenRequest"},"ExchangeFirebaseTokenResponse":{"properties":{"session_token":{"type":"string","title":"Session Token"},"profile_id":{"type":"string","title":"Profile Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["session_token","profile_id"],"title":"ExchangeFirebaseTokenResponse"},"ExchangeTokenRequest":{"properties":{"firebase_custom_token":{"type":"string","title":"Firebase Custom Token","description":"The firebase_custom_token returned by /v2/auth/register-viewer"}},"type":"object","required":["firebase_custom_token"],"title":"ExchangeTokenRequest"},"ExchangeTokenResponse":{"properties":{"id_token":{"type":"string","title":"Id Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"expires_in":{"type":"string","title":"Expires In"}},"type":"object","required":["id_token","refresh_token","expires_in"],"title":"ExchangeTokenResponse"},"FacebookPageResponse":{"properties":{"page_id":{"type":"string","title":"Page Id","description":"Facebook Page ID"},"name":{"type":"string","title":"Name","description":"Page name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Page category (e.g., 'Media/News Company')"}},"type":"object","required":["page_id","name"],"title":"FacebookPageResponse","description":"A Facebook Page the user manages."},"FacebookPageSummary":{"properties":{"page_id":{"type":"string","title":"Page Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["page_id","name"],"title":"FacebookPageSummary","description":"A Page the connection can publish to, as stored on the credential."},"FacebookPagesListResponse":{"properties":{"credential_id":{"type":"string","title":"Credential Id"},"pages":{"items":{"$ref":"#/components/schemas/FacebookPageResponse"},"type":"array","title":"Pages"},"total":{"type":"integer","title":"Total"},"selected_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Page Id","description":"The Page this connection currently publishes to, or null when none is chosen. Change it with PATCH /{credential_id}/facebook-page."}},"type":"object","required":["credential_id","pages","total"],"title":"FacebookPagesListResponse","description":"Response listing Facebook Pages for a credential."},"FacebookPostTypePreview":{"properties":{"post_type":{"type":"string","title":"Post Type","description":"'reel' or 'video'"},"automatic":{"type":"boolean","title":"Automatic","description":"True when the video's shape decided"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Why Automatic chose a regular video: dimensions_unknown, landscape, square, reel_spec, duration_unknown, duration or size. Null otherwise."},"label":{"type":"string","title":"Label","description":"e.g. 'Automatic: will post as a Reel'"}},"type":"object","required":["post_type","automatic","label"],"title":"FacebookPostTypePreview","description":"What a Facebook publish of this piece will be, and the words for it."},"FarcasterConnectResponse":{"properties":{"status":{"type":"string","title":"Status"},"credential_id":{"type":"string","title":"Credential Id"},"fid":{"type":"string","title":"Fid"},"account_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Username"},"verified_primary_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified Primary Address"},"verified_eth_addresses":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Verified Eth Addresses"},"custody_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custody Address"},"payout_wallet_assigned":{"type":"boolean","title":"Payout Wallet Assigned","default":false},"payout_wallet_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payout Wallet Address"}},"type":"object","required":["status","credential_id","fid"],"title":"FarcasterConnectResponse"},"FetchResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"date":{"type":"string","title":"Date"},"platforms_fetched":{"type":"integer","title":"Platforms Fetched","default":0},"platforms_ok":{"type":"integer","title":"Platforms Ok","default":0},"platforms_error":{"type":"integer","title":"Platforms Error","default":0},"platforms_pending":{"type":"integer","title":"Platforms Pending","default":0},"aggregate":{"$ref":"#/components/schemas/AggregateStatsResponse","default":{"total_views":0,"total_likes":0,"total_comments":0,"total_shares":0,"total_reach":0,"total_impressions":0,"best_engagement_rate":0.0,"platform_count":0,"platforms_ok":0,"platforms_pending":0,"platforms_error":0}},"platforms":{"additionalProperties":{"$ref":"#/components/schemas/PlatformOutcomeResponse"},"type":"object","title":"Platforms","default":{}}},"type":"object","required":["content_id","date"],"title":"FetchResponse"},"FieldLimit":{"properties":{"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"min_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Length"},"max_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Count"},"max_length_each":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length Each"}},"type":"object","title":"FieldLimit","description":"Limits for a field value."},"FillFieldRequest":{"properties":{"field":{"type":"string","title":"Field","description":"'title' | 'description' | 'tags'"},"content_id":{"type":"string","minLength":1,"title":"Content Id"},"workspace_id":{"type":"string","minLength":1,"title":"Workspace Id"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Platform identifier (e.g. 'youtube', 'tiktok'). Optional. When omitted, the platform-agnostic template is used."},"current_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Value","description":"The user's draft for this field, if any."},"content_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Content Context","description":"Caller-supplied context override. Keys: title, description, tags, transcript. When omitted, the server fetches what it can from contents_v2 + media_metadata_v1."},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone","description":"Voice / tone hint. Reserved for later iteration; default 'creator' for now.","default":"creator"}},"type":"object","required":["field","content_id","workspace_id"],"title":"FillFieldRequest"},"FillFieldResponse":{"properties":{"value":{"type":"string","title":"Value"},"options":{"items":{"type":"string"},"type":"array","title":"Options","default":[]},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["value"],"title":"FillFieldResponse"},"FirebaseConfigResponse":{"properties":{"apiKey":{"type":"string","title":"Apikey"},"authDomain":{"type":"string","title":"Authdomain"},"projectId":{"type":"string","title":"Projectid"}},"type":"object","required":["apiKey","authDomain","projectId"],"title":"FirebaseConfigResponse"},"GenerateRequest":{"properties":{"week_ending":{"type":"string","title":"Week Ending"}},"type":"object","required":["week_ending"],"title":"GenerateRequest"},"GroupingResponse":{"properties":{"grouping_id":{"type":"string","title":"Grouping Id"},"video_media_id":{"type":"string","title":"Video Media Id"},"thumbnail_media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Media Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"status":{"type":"string","title":"Status"},"confidence":{"type":"number","title":"Confidence"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["grouping_id","video_media_id","status","confidence"],"title":"GroupingResponse","description":"Single grouping in session status response."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HoldingsResponse":{"properties":{"catalogue_id":{"type":"string","title":"Catalogue Id"},"found":{"type":"boolean","title":"Found","default":true},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint"},"catalogue_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue Name"},"catalogue_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue Address"},"content_count":{"type":"integer","title":"Content Count","default":0},"total_revenue_usdc":{"type":"number","title":"Total Revenue Usdc","default":0.0},"brand_token_holders":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Brand Token Holders","default":[]},"content_items":{"items":{"$ref":"#/components/schemas/ContentItemDTO"},"type":"array","title":"Content Items","default":[]}},"type":"object","required":["catalogue_id"],"title":"HoldingsResponse"},"InferGroupingsResponse":{"properties":{"groupings":{"items":{"$ref":"#/components/schemas/GroupingResponse"},"type":"array","title":"Groupings"},"clarification":{"$ref":"#/components/schemas/ClarificationResponse"}},"type":"object","required":["groupings","clarification"],"title":"InferGroupingsResponse","description":"Response after auto-grouping inference."},"InviteLinkResponse":{"properties":{"token":{"type":"string","title":"Token"},"invite_url":{"type":"string","title":"Invite Url"},"workspace_id":{"type":"string","title":"Workspace Id"},"auto_accept":{"type":"boolean","title":"Auto Accept"},"max_uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Uses"},"use_count":{"type":"integer","title":"Use Count"},"expires_at":{"type":"string","title":"Expires At"},"revoked":{"type":"boolean","title":"Revoked"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["token","invite_url","workspace_id","auto_accept","max_uses","use_count","expires_at","revoked","created_at"],"title":"InviteLinkResponse"},"InviteListResponse":{"properties":{"invites":{"items":{"$ref":"#/components/schemas/InviteResponse"},"type":"array","title":"Invites"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["invites","total"],"title":"InviteListResponse","description":"List of invitations."},"InvitePreviewResponse":{"properties":{"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"team_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Avatar Url"},"inviter_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"status":{"type":"string","title":"Status"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"actionable":{"type":"boolean","title":"Actionable"},"email_dispatched":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Dispatched"},"email_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Sent At"}},"type":"object","required":["status","actionable"],"title":"InvitePreviewResponse","description":"What a LOGGED-OUT visitor may learn from an invite link.\n\nAN EXPLICIT ALLOWLIST, BUILT FIELD BY FIELD — never a serialised TeamInvite\nwith fields stripped. The invite_id is a 48-bit bearer capability delivered\nby email (team_invite_routes.py:295), so anyone holding the link reaches\nthis. Constructing the response positively means a field added to\nTeamInvite cannot leak here by default; it would have to be added below.\n\nDELIBERATELY ABSENT, and each for its own reason:\n  invitee_email        product ruling. The link arrived in that person's\n                       inbox, so they already know the address; anyone ELSE\n                       holding the id must not learn it.\n  inviter_email        an address the holder has no claim to.\n  team_id, inviter_profile_id, invitee_profile_id\n                       internal identifiers, useful only for probing other\n                       endpoints.\n  custom_permissions   describes the team's authorisation model.\n  any roster or member count.\n\nEvery display field is Optional because a dead or consumed invite reveals\nNONE of them — see `status`/`actionable` below."},"InviteResponse":{"properties":{"invite_id":{"type":"string","title":"Invite Id"},"team_id":{"type":"string","title":"Team Id"},"team_name":{"type":"string","title":"Team Name"},"team_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Avatar Url"},"inviter_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Profile Id"},"inviter_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Email"},"inviter_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Name"},"inviter":{"anyOf":[{"$ref":"#/components/schemas/PublicPersonResponse"},{"type":"null"}]},"invitee_email":{"type":"string","title":"Invitee Email"},"invitee_email_masked":{"type":"boolean","title":"Invitee Email Masked","default":true},"invitee_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invitee Profile Id"},"invitee":{"anyOf":[{"$ref":"#/components/schemas/PublicPersonResponse"},{"type":"null"}]},"is_mine":{"type":"boolean","title":"Is Mine","default":false},"is_for_you":{"type":"boolean","title":"Is For You","default":false},"role":{"type":"string","title":"Role"},"custom_permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Custom Permissions"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"responded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Responded At"},"expires_in_days":{"type":"integer","title":"Expires In Days","default":0},"email_dispatched":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Dispatched"},"email_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Error"},"email_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Sent At"}},"type":"object","required":["invite_id","team_id","team_name","invitee_email","role","status","created_at","expires_at"],"title":"InviteResponse","description":"Response for a team invitation.\n\nPRIVACY (founder's rule, 2026-09-25). People are public profiles:\n  inviter              the inviter's public profile (team-scoped member_ref).\n  invitee              the invitee's public profile, ONLY once the invite is\n                       accepted (they are a member then), or for the\n                       invitee themself or a platform admin. Before that it\n                       is null: showing the account behind a typed address\n                       would tell the inviter whether that email has a\n                       JubJub account.\n  invitee_email        MASKED (\"t***@example.com\") for everyone except the\n                       invitee themself and a platform admin, who see it in\n                       full. `invitee_email_masked` says which.\n  inviter_profile_id, inviter_email, invitee_profile_id\n                       null unless the caller is that person or a platform\n                       admin."},"JoinResponse":{"properties":{"status":{"type":"string","title":"Status"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},"type":"object","required":["status"],"title":"JoinResponse"},"KeyPayoutStatusResponse":{"properties":{"key_id":{"type":"string","title":"Key Id"},"eligible":{"type":"boolean","title":"Eligible"},"wallet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wallet"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["key_id","eligible"],"title":"KeyPayoutStatusResponse"},"KitUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"bio":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Bio"},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Categories"},"show_avatar":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Avatar"},"platforms":{"anyOf":[{"items":{"$ref":"#/components/schemas/PlatformChoice"},"type":"array","maxItems":20},{"type":"null"}],"title":"Platforms"},"highlights":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Highlights"},"analytics":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":30},{"type":"null"}],"title":"Analytics"},"contact_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Contact Enabled"}},"type":"object","title":"KitUpdate"},"LaunchApprovalSummary":{"properties":{"approval_id":{"type":"string","title":"Approval Id"},"policy_source":{"type":"string","title":"Policy Source","description":"workspace_owner | channel_ownership"},"status":{"type":"string","title":"Status"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"'*' for a workspace_owner approval"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name"},"approver":{"anyOf":[{"$ref":"#/components/schemas/PublicPerson"},{"type":"null"}]},"is_approver":{"type":"boolean","title":"Is Approver","description":"Whether the caller may decide it","default":false},"decided_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided At"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"}},"type":"object","required":["approval_id","policy_source","status"],"title":"LaunchApprovalSummary","description":"One approval a launch is waiting on (or was decided by), by public\nhandle. Enough for a caller to say who is holding the launch and why."},"LaunchDTO":{"properties":{"launch_id":{"type":"string","title":"Launch Id"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"launched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Launched At"},"published_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Url"}},"type":"object","required":["launch_id"],"title":"LaunchDTO"},"LaunchDetailResponse":{"properties":{"launch_id":{"type":"string","title":"Launch Id","description":"Unique launch identifier"},"content_id":{"type":"string","title":"Content Id","description":"ID of the content being published"},"content_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Title","description":"Title of the content"},"content_thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Thumbnail Url","description":"Thumbnail URL of the content"},"workspace_id":{"type":"string","title":"Workspace Id","description":"Workspace ID"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By","description":"Creator's profile ID: only the caller's own (or for a platform admin)"},"created_by_you":{"type":"boolean","title":"Created By You","description":"Whether the caller created this launch","default":false},"creator":{"anyOf":[{"$ref":"#/components/schemas/PublicPerson"},{"type":"null"}],"description":"Who created the launch, by public profile (never an ID or email)"},"status":{"type":"string","title":"Status","description":"Overall status: pending, awaiting_approval, scheduled, in_progress, completed, partial_failure, failed, cancelled, handed_over (sent to the creator's own editor to post; JubJub published nothing), unknown (stored value unrecognised; never executed)"},"platforms":{"items":{"$ref":"#/components/schemas/PlatformLaunchResponse"},"type":"array","title":"Platforms","description":"Status per platform"},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For","description":"Scheduled publish time"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Timezone for scheduled_for"},"platform_schedules":{"anyOf":[{"additionalProperties":{"type":"string","format":"date-time"},"type":"object"},{"type":"null"}],"title":"Platform Schedules","description":"Per-platform schedule overrides keyed by config_id"},"platform_overrides":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"Platform Overrides","description":"Per-platform settings overrides keyed by config_id"},"first_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Comment","description":"General first comment for this launch (per-platform ones win)"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When launch was created"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update time"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"When launch completed"},"total_platforms":{"type":"integer","title":"Total Platforms","description":"Total number of platforms"},"successful_count":{"type":"integer","title":"Successful Count","description":"Number of successful platforms"},"failed_count":{"type":"integer","title":"Failed Count","description":"Number of failed platforms"},"approvals":{"items":{"$ref":"#/components/schemas/LaunchApprovalSummary"},"type":"array","title":"Approvals"},"sent_now":{"type":"boolean","title":"Sent Now","default":false},"history":{"items":{"$ref":"#/components/schemas/LaunchEventResponse"},"type":"array","title":"History","description":"Event history for audit trail"}},"type":"object","required":["launch_id","content_id","workspace_id","status","platforms","created_at","total_platforms","successful_count","failed_count"],"title":"LaunchDetailResponse","description":"Detailed response including history.","example":{"completed_at":"2024-01-17T10:02:00Z","content_id":"cnt_xyz789","created_at":"2024-01-17T10:00:00Z","created_by_you":true,"creator":{"display_name":"Ada","handle":"ada","is_you":true},"failed_count":1,"launch_id":"lch_abc123","platforms":[{"completed_at":"2024-01-17T10:02:00Z","config_id":"cfg_001","platform":"instagram","published_id":"123456789","published_url":"https://instagram.com/reel/abc123","started_at":"2024-01-17T10:00:00Z","status":"success"},{"completed_at":"2024-01-17T10:00:05Z","config_id":"cfg_002","error":"Invalid credentials","platform":"youtube","started_at":"2024-01-17T10:00:00Z","status":"failed"}],"status":"partial_failure","successful_count":1,"total_platforms":2,"workspace_id":"ws_def456"}},"LaunchEventResponse":{"properties":{"event_type":{"type":"string","title":"Event Type","description":"Type of event"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"When the event occurred"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Platform if event is platform-specific"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Additional event details"}},"type":"object","required":["event_type","timestamp"],"title":"LaunchEventResponse","description":"Response for a launch history event."},"LaunchListResponse":{"properties":{"launches":{"items":{"$ref":"#/components/schemas/LaunchResponse"},"type":"array","title":"Launches","description":"List of launches"},"total":{"type":"integer","title":"Total","description":"Total count (for pagination)"},"limit":{"type":"integer","title":"Limit","description":"Requested limit"},"offset":{"type":"integer","title":"Offset","description":"Requested offset"},"published_total":{"type":"integer","title":"Published Total","description":"Launches in the same scope that are not handovers (Send to editor), ignoring the status filter and the page. Answers 'has anything gone out' without reading every page.","default":0}},"type":"object","required":["launches","total","limit","offset"],"title":"LaunchListResponse","description":"Response for listing launches."},"LaunchResponse":{"properties":{"launch_id":{"type":"string","title":"Launch Id","description":"Unique launch identifier"},"content_id":{"type":"string","title":"Content Id","description":"ID of the content being published"},"content_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Title","description":"Title of the content"},"content_thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Thumbnail Url","description":"Thumbnail URL of the content"},"workspace_id":{"type":"string","title":"Workspace Id","description":"Workspace ID"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By","description":"Creator's profile ID: only the caller's own (or for a platform admin)"},"created_by_you":{"type":"boolean","title":"Created By You","description":"Whether the caller created this launch","default":false},"creator":{"anyOf":[{"$ref":"#/components/schemas/PublicPerson"},{"type":"null"}],"description":"Who created the launch, by public profile (never an ID or email)"},"status":{"type":"string","title":"Status","description":"Overall status: pending, awaiting_approval, scheduled, in_progress, completed, partial_failure, failed, cancelled, handed_over (sent to the creator's own editor to post; JubJub published nothing), unknown (stored value unrecognised; never executed)"},"platforms":{"items":{"$ref":"#/components/schemas/PlatformLaunchResponse"},"type":"array","title":"Platforms","description":"Status per platform"},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For","description":"Scheduled publish time"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Timezone for scheduled_for"},"platform_schedules":{"anyOf":[{"additionalProperties":{"type":"string","format":"date-time"},"type":"object"},{"type":"null"}],"title":"Platform Schedules","description":"Per-platform schedule overrides keyed by config_id"},"platform_overrides":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"Platform Overrides","description":"Per-platform settings overrides keyed by config_id"},"first_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Comment","description":"General first comment for this launch (per-platform ones win)"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When launch was created"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update time"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"When launch completed"},"total_platforms":{"type":"integer","title":"Total Platforms","description":"Total number of platforms"},"successful_count":{"type":"integer","title":"Successful Count","description":"Number of successful platforms"},"failed_count":{"type":"integer","title":"Failed Count","description":"Number of failed platforms"},"approvals":{"items":{"$ref":"#/components/schemas/LaunchApprovalSummary"},"type":"array","title":"Approvals"},"sent_now":{"type":"boolean","title":"Sent Now","default":false}},"type":"object","required":["launch_id","content_id","workspace_id","status","platforms","created_at","total_platforms","successful_count","failed_count"],"title":"LaunchResponse","description":"Response for a launch.","example":{"completed_at":"2024-01-17T10:02:00Z","content_id":"cnt_xyz789","created_at":"2024-01-17T10:00:00Z","created_by_you":true,"creator":{"display_name":"Ada","handle":"ada","is_you":true},"failed_count":1,"launch_id":"lch_abc123","platforms":[{"completed_at":"2024-01-17T10:02:00Z","config_id":"cfg_001","platform":"instagram","published_id":"123456789","published_url":"https://instagram.com/reel/abc123","started_at":"2024-01-17T10:00:00Z","status":"success"},{"completed_at":"2024-01-17T10:00:05Z","config_id":"cfg_002","error":"Invalid credentials","platform":"youtube","started_at":"2024-01-17T10:00:00Z","status":"failed"}],"status":"partial_failure","successful_count":1,"total_platforms":2,"workspace_id":"ws_def456"}},"ListKeysResponse":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/PlatformKeySummary"},"type":"array","title":"Keys"}},"type":"object","required":["keys"],"title":"ListKeysResponse"},"LocationSearchResponse":{"properties":{"query":{"type":"string","title":"Query"},"results":{"items":{"$ref":"#/components/schemas/LocationSearchResult"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["query","results","total"],"title":"LocationSearchResponse","description":"Response for location search."},"LocationSearchResult":{"properties":{"location_id":{"type":"string","title":"Location Id","description":"Facebook Page ID representing this location (use as Instagram location_id)"},"name":{"type":"string","title":"Name","description":"Location name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"City name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Country name"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"picture_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Picture Url","description":"Location thumbnail URL"}},"type":"object","required":["location_id","name"],"title":"LocationSearchResult","description":"A location result from Meta Pages Search API."},"MediaBulkRenameItemDTO":{"properties":{"media_id":{"type":"string","title":"Media Id","description":"ID of the media to rename"},"filename":{"type":"string","maxLength":255,"minLength":1,"title":"Filename","description":"New filename for the media"}},"type":"object","required":["media_id","filename"],"title":"MediaBulkRenameItemDTO","description":"Single item in a bulk rename request."},"MediaBulkRenameRequestDTO":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MediaBulkRenameItemDTO"},"type":"array","maxItems":100,"minItems":1,"title":"Items","description":"List of media items to rename"}},"type":"object","required":["items"],"title":"MediaBulkRenameRequestDTO","description":"Request to rename multiple media files at once."},"MediaBulkRenameResponseDTO":{"properties":{"results":{"items":{"$ref":"#/components/schemas/MediaBulkRenameResultDTO"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total","description":"Total items processed"},"successful":{"type":"integer","title":"Successful","description":"Number of successful renames"},"failed":{"type":"integer","title":"Failed","description":"Number of failed renames"}},"type":"object","required":["results","total","successful","failed"],"title":"MediaBulkRenameResponseDTO","description":"Response for bulk rename operation."},"MediaBulkRenameResultDTO":{"properties":{"media_id":{"type":"string","title":"Media Id"},"success":{"type":"boolean","title":"Success"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename","description":"New filename if successful"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"}},"type":"object","required":["media_id","success"],"title":"MediaBulkRenameResultDTO","description":"Result of a single item in bulk rename."},"MediaIngestUrlRequestDTO":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id","description":"Workspace that will own this media"},"url":{"type":"string","title":"Url","description":"Public URL to download the media from.","examples":["https://example.com/video.mp4"]},"filename":{"type":"string","title":"Filename","description":"Filename to use for the ingested media (e.g., 'video.mp4').","examples":["my_video.mp4","thumbnail.jpg"]},"media_type":{"anyOf":[{"type":"string","enum":["video","image","subtitle"]},{"type":"null"}],"title":"Media Type","description":"Type of media. Auto-detected from content_type if omitted."}},"type":"object","required":["workspace_id","url","filename"],"title":"MediaIngestUrlRequestDTO","description":"Request to ingest media from a public URL.\n\nThe backend downloads the file server-side and uploads it to GCS.\nUseful for GPT Actions and MCP clients that cannot send binary data."},"MediaListResponseDTO":{"properties":{"media":{"items":{"$ref":"#/components/schemas/MediaResponseDTO"},"type":"array","title":"Media"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["media","total","limit","offset"],"title":"MediaListResponseDTO","description":"Response for listing media in a workspace."},"MediaRenameRequestDTO":{"properties":{"filename":{"type":"string","maxLength":255,"minLength":1,"title":"Filename","description":"New filename for the media (e.g., 'new_video_name.mp4')"}},"type":"object","required":["filename"],"title":"MediaRenameRequestDTO","description":"Request to rename a single media file."},"MediaResponseDTO":{"properties":{"media_id":{"type":"string","title":"Media Id"},"workspace_id":{"type":"string","title":"Workspace Id"},"type":{"type":"string","title":"Type","description":"Media type: video, image, or subtitle"},"filename":{"type":"string","title":"Filename"},"content_type":{"type":"string","title":"Content Type"},"size_bytes":{"type":"integer","title":"Size Bytes"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds","description":"Duration in seconds (for videos)"},"status":{"type":"string","title":"Status","description":"Processing status: uploading, processing, ready, failed, unreadable. `unreadable` is terminal — the bytes are not a decodable video and re-uploading the same file will not help."},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason","description":"Why, in plain words, when the status needs explaining. Set with `unreadable`; null otherwise. Safe to show to the person."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Public URL of the file (available when status is 'ready')"},"video_metadata":{"anyOf":[{"$ref":"#/components/schemas/MediaVideoMetadataDTO"},{"type":"null"}],"description":"Video metadata for Smart Tags/Rename (only for videos)"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["media_id","workspace_id","type","filename","content_type","size_bytes","status","created_at"],"title":"MediaResponseDTO","description":"Full media response.\n\nReturned after upload completion or when fetching media details."},"MediaUploadCompleteDTO":{"properties":{"size_bytes":{"type":"integer","exclusiveMinimum":0.0,"title":"Size Bytes","description":"Final file size in bytes (frontend knows this after upload)."}},"type":"object","required":["size_bytes"],"title":"MediaUploadCompleteDTO","description":"Request to confirm upload completion.\n\nThe frontend sends this after successfully uploading the file to GCS."},"MediaUploadRequestDTO":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id","description":"Workspace that will own this media"},"filename":{"type":"string","title":"Filename","description":"Original filename (e.g., 'video.mp4'). Used to detect content_type if not provided.","examples":["my_video.mp4","thumbnail.jpg","captions.srt"]},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"MIME type. Auto-detected from filename extension if not provided.","examples":["video/mp4","image/jpeg","text/srt"]},"media_type":{"type":"string","enum":["video","image","subtitle"],"title":"Media Type","description":"Type of media being uploaded.","default":"video"},"size_bytes":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Size Bytes","description":"Total file size in bytes. When provided, the backend also returns a resumable_url for chunked uploads."}},"type":"object","required":["workspace_id","filename"],"title":"MediaUploadRequestDTO","description":"Request to initiate a media upload.\n\nThe frontend sends this to get a signed URL for direct upload to GCS."},"MediaUploadResponseDTO":{"properties":{"media_id":{"type":"string","title":"Media Id","description":"ID of the created Media record"},"signed_url":{"type":"string","title":"Signed Url","description":"Signed URL for single PUT upload. Use for small files or as fallback."},"resumable_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resumable Url","description":"Resumable session URL for chunked uploads. Use PUT with Content-Range headers. Available when size_bytes is provided in the request."},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"When the signed URL expires. Upload must complete before this."},"gcs_path":{"type":"string","title":"Gcs Path","description":"Path where the file will be stored in GCS."},"content_type":{"type":"string","title":"Content Type","description":"Content-Type header to use when uploading."}},"type":"object","required":["media_id","signed_url","expires_at","gcs_path","content_type"],"title":"MediaUploadResponseDTO","description":"Response with signed URL for upload.\n\nThe frontend uses signed_url to PUT the file directly to GCS."},"MediaVideoMetadataDTO":{"properties":{"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"Video width in pixels"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"Video height in pixels"},"fps":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fps","description":"Frames per second"},"codec":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codec","description":"Video codec (h264, h265, etc)"},"bitrate_kbps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bitrate Kbps","description":"Bitrate in kbps"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Aspect ratio like '16:9', '9:16', '1:1'"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution","description":"Resolution label like '1080p', '4K', '720p'"},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation","description":"Orientation: 'horizontal', 'vertical', or 'square'"},"duration_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration Category","description":"Duration category: 'short', 'reel', 'medium', 'long'"}},"type":"object","title":"MediaVideoMetadataDTO","description":"Video-specific metadata for Smart Tags and Smart Rename."},"MemberPreview":{"properties":{"name":{"type":"string","title":"Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["name"],"title":"MemberPreview"},"MentionableListResponse":{"properties":{"profiles":{"items":{"$ref":"#/components/schemas/MentionableProfile"},"type":"array","title":"Profiles"}},"type":"object","required":["profiles"],"title":"MentionableListResponse"},"MentionableProfile":{"properties":{"member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Ref"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"source":{"type":"string","enum":["workspace_member","recent_collaborator"],"title":"Source"},"last_collaborated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Collaborated At","description":"Most recent activity timestamp in a shared workspace (null for workspace_member source)"}},"type":"object","required":["source"],"title":"MentionableProfile","description":"A profile returned by /v2/profiles/mentionable.\n\nPRIVACY (founder's rule, 2026-09-25): no profile ID. `member_ref` is the\nworkspace-scoped opaque id a mention is posted with; comments resolve it\nagainst the workspace (communication_permissions._expand_member_refs).\nIt is null without a `workspace_id`, where there is no scope to mint it in.\n`email` is the caller's own address on their own row, and on other rows\nonly for a JubJub platform admin (workspace/team owners and admins do not\nsee other people's emails, and cannot match on them).\n`display_name` is never an email; with no name it is the placeholder."},"MessageListResponse":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/MessageResponse"},"type":"array","title":"Messages"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for the next page; null means no more results"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["messages"],"title":"MessageListResponse","description":"Cursor-paginated list of messages."},"MessageResponse":{"properties":{"message_id":{"type":"string","title":"Message Id"},"scope_type":{"type":"string","title":"Scope Type"},"scope_id":{"type":"string","title":"Scope Id"},"author_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Profile Id"},"author":{"anyOf":[{"$ref":"#/components/schemas/PersonView"},{"type":"null"}]},"author_type":{"type":"string","title":"Author Type"},"author_service_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Service Id"},"body":{"type":"string","title":"Body"},"mentions":{"items":{"type":"string"},"type":"array","title":"Mentions","description":"member_refs of the people mentioned"},"mention_profiles":{"items":{"$ref":"#/components/schemas/PersonView"},"type":"array","title":"Mention Profiles"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"timecode_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timecode Seconds"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"parent_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Message Id"},"thread_root_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thread Root Id"},"message_type":{"type":"string","title":"Message Type"},"decision_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Type"},"decision_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Status"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"},"event_version":{"type":"integer","title":"Event Version","default":1},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"edited_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Edited At"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"resolved_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved By"},"resolved_by_profile":{"anyOf":[{"$ref":"#/components/schemas/PersonView"},{"type":"null"}]}},"type":"object","required":["message_id","scope_type","scope_id","author_type","body","message_type","created_at"],"title":"MessageResponse","description":"Full message response.\n\nPeople are identified by `author`, `mention_profiles` and\n`resolved_by_profile` (public profiles with member_refs). The raw\n`author_profile_id` and `resolved_by` are present only when they are the\ncaller's own ID (or the caller is a platform admin); otherwise null."},"NonceResponse":{"properties":{"nonce":{"type":"string","title":"Nonce"},"message_to_sign":{"type":"string","title":"Message To Sign"},"expires_at":{"type":"string","title":"Expires At"}},"type":"object","required":["nonce","message_to_sign","expires_at"],"title":"NonceResponse"},"NotificationDeleteResponse":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"message":{"type":"string","title":"Message","default":"Notification deleted"}},"type":"object","title":"NotificationDeleteResponse","description":"Response model for deleting a notification."},"NotificationListResponse":{"properties":{"notifications":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":"array","title":"Notifications"},"total":{"type":"integer","title":"Total"},"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["notifications","total","unread_count"],"title":"NotificationListResponse","description":"Response model for listing notifications."},"NotificationMarkAllReadResponse":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"marked_count":{"type":"integer","title":"Marked Count"}},"type":"object","required":["marked_count"],"title":"NotificationMarkAllReadResponse","description":"Response model for marking all notifications as read."},"NotificationMarkReadResponse":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"notification_id":{"type":"string","title":"Notification Id"},"read":{"type":"boolean","title":"Read","default":true}},"type":"object","required":["notification_id"],"title":"NotificationMarkReadResponse","description":"Response model for marking notification as read."},"NotificationResponse":{"properties":{"type":{"$ref":"#/components/schemas/NotificationType"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"notification_id":{"type":"string","title":"Notification Id"},"recipient_profileId":{"type":"string","title":"Recipient Profileid"},"sender_profileId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Profileid"},"read":{"type":"boolean","title":"Read","default":false},"action_taken":{"type":"boolean","title":"Action Taken","default":false},"created_at":{"type":"string","title":"Created At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"sender":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Sender"}},"type":"object","required":["type","title","message","notification_id","recipient_profileId","created_at"],"title":"NotificationResponse","description":"Notification model for API responses.\n\nOther people are shown by public profile only (2026-09-25):\n`sender_profileId` is null unless it is the recipient's own ID, and\n`sender` is {member_ref, display_name, avatar_url, handle, is_you}.\nSee notification_privacy.py."},"NotificationStatsResponse":{"properties":{"total":{"type":"integer","title":"Total"},"unread":{"type":"integer","title":"Unread"},"by_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Category"}},"type":"object","required":["total","unread","by_category"],"title":"NotificationStatsResponse","description":"Response model for the notification stats endpoint (tab badges).\n\nby_category counts are unfiltered (across the user's whole inbox) so the\nfilter pills show global totals, not page-local ones. A notification may\ncount toward more than one category (see NOTIFICATION_CATEGORIES)."},"NotificationType":{"type":"string","enum":["team_invite","team_invite_accepted","team_invite_rejected","team_member_joined","team_member_left","team_member_removed","team_role_changed","team_deleted","team_ownership_transferred","team_split_pending_released","team_credential_shared","team_credential_revoked","team_insights_used","team_workspace_linked","team_workspace_unlinked","collection_invite","collection_shared","launch_success","launch_failed","launch_scheduled","launch_completed","schedule_reminder","schedule_completed","schedule_failed","system_maintenance","system_update","system_alert","mention","comment","error_platform_auth","error_storage_quota","error_processing","error_ai_credential","agent_pr_ready","agent_fix_failed","agent_budget_warning","agent_budget_exceeded","agent_large_job_pending","agent_error","status_investigating","status_resolved","approval_requested","approval_approved","approval_rejected","launch_approved","approval_rights_granted","approval_rights_revoked","workspace_ownership_transferred","approval_invalidated","content_held_for_review","content_hold_released","rights_claim_filed","rights_claim_resolved"],"title":"NotificationType","description":"Types of notifications supported by the system.\nEasily extensible - just add new values here."},"NotificationV2ListResponse":{"properties":{"notifications":{"items":{"$ref":"#/components/schemas/NotificationV2Response"},"type":"array","title":"Notifications"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false},"unread_count":{"type":"integer","title":"Unread Count","default":0}},"type":"object","required":["notifications"],"title":"NotificationV2ListResponse","description":"Cursor-paginated list of v2 notifications."},"NotificationV2Response":{"properties":{"notification_id":{"type":"string","title":"Notification Id"},"recipient_profile_id":{"type":"string","title":"Recipient Profile Id"},"notification_type":{"type":"string","title":"Notification Type"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"read":{"type":"boolean","title":"Read","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["notification_id","recipient_profile_id","notification_type","created_at"],"title":"NotificationV2Response","description":"Minimal notification projected from communication events.\n\nThe data dict carries structured fields rather than top-level title/body:\n- message_id: source communication message\n- scope_type / scope_id: what the message is attached to\n- thread_root_id: thread context (if reply)\n- decision_type / decision_status: decision context (if decision)\n- author: who triggered it, as a public profile with a member_ref\n  (author_profile_id only when it is the recipient's own ID)"},"OAuthCallbackRequest":{"properties":{"code":{"type":"string","title":"Code"},"state":{"type":"string","title":"State"}},"type":"object","required":["code","state"],"title":"OAuthCallbackRequest","description":"Request body for OAuth callback."},"OAuthCallbackResponse":{"properties":{"credential_id":{"type":"string","title":"Credential Id"},"platform":{"type":"string","title":"Platform"},"account_name":{"type":"string","title":"Account Name"},"account_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Username"},"display_name":{"type":"string","title":"Display Name"},"return_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Return Context"},"message":{"type":"string","title":"Message","default":"Credential stored successfully"}},"type":"object","required":["credential_id","platform","account_name","account_username","display_name"],"title":"OAuthCallbackResponse","description":"Response after successful OAuth callback."},"OAuthInitiateResponse":{"properties":{"auth_url":{"type":"string","title":"Auth Url","description":"URL to redirect user for OAuth"},"state":{"type":"string","title":"State","description":"State token for CSRF protection"}},"type":"object","required":["auth_url","state"],"title":"OAuthInitiateResponse","description":"Response when initiating OAuth flow."},"OnchainStatsResponse":{"properties":{"launch_confirmed":{"type":"boolean","title":"Launch Confirmed","default":false},"tx_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tx Hash"},"block_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Block Number"},"chain":{"type":"string","title":"Chain"},"ownership_contract_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownership Contract Address"},"published_platforms":{"items":{"type":"string"},"type":"array","title":"Published Platforms","default":[]},"token_holders":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Token Holders","default":[]},"total_tokens":{"type":"integer","title":"Total Tokens","default":10000},"revenue_total_received_usdc":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue Total Received Usdc"},"revenue_total_distributed_usdc":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue Total Distributed Usdc"},"revenue_undistributed_usdc":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue Undistributed Usdc"},"revenue_status":{"type":"string","title":"Revenue Status","description":"'ok' — the figures were read from the contract (a zero is a real zero). 'unavailable' — the chain could not be read; the figures are null and must not be rendered as $0. 'no_contract' — the content has no ownership contract deployed.","default":"unavailable"},"last_activity_timestamp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Activity Timestamp"},"status":{"type":"string","title":"Status","default":"no_contract"}},"type":"object","title":"OnchainStatsResponse"},"PasswordLoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"PasswordLoginRequest"},"PayoutReleaseResponse":{"properties":{"profile_id":{"type":"string","title":"Profile Id"},"released":{"type":"boolean","title":"Released"},"reason":{"type":"string","title":"Reason"},"catalogues":{"type":"integer","title":"Catalogues","default":0}},"type":"object","required":["profile_id","released","reason"],"title":"PayoutReleaseResponse"},"PendingApprovalsResponse":{"properties":{"approvals":{"items":{"$ref":"#/components/schemas/ApprovalResponse"},"type":"array","title":"Approvals"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["approvals","count"],"title":"PendingApprovalsResponse","description":"Response model for GET /v2/approvals/pending."},"PendingCatalogueEntry":{"properties":{"catalogue_address":{"type":"string","title":"Catalogue Address","description":"Catalogue contract address"},"amount":{"type":"integer","title":"Amount","description":"Claimable amount in raw USDC units (6 decimals)"}},"type":"object","required":["catalogue_address","amount"],"title":"PendingCatalogueEntry"},"PersonView":{"properties":{"member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Ref"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"is_you":{"type":"boolean","title":"Is You","default":false},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"via_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Via Team"},"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id"}},"type":"object","required":["display_name"],"title":"PersonView","description":"Another person as anyone may see them (founder's rule, 2026-09-25).\n\n`member_ref` is opaque and scoped to the message's context: the workspace\nfor workspace, content and media scopes, the team for a team scope. Post\nit back in `mentions` to mention this person. Never a profile ID or email;\n`profile_id` is filled only for a JubJub platform admin."},"PlatformChoice":{"properties":{"credential_id":{"type":"string","maxLength":200,"title":"Credential Id"},"show_followers":{"type":"boolean","title":"Show Followers","default":false}},"type":"object","required":["credential_id"],"title":"PlatformChoice"},"PlatformConfigCardResponse":{"properties":{"config_id":{"type":"string","title":"Config Id"},"platform":{"type":"string","title":"Platform"},"credential_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Id"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name"},"status":{"type":"string","title":"Status"},"published_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"token_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Token Valid","description":"Whether the credential's token is still valid. None if not checked."},"missing_fields":{"items":{"type":"string"},"type":"array","title":"Missing Fields","description":"Required fields that are missing or empty"},"custom_fields":{"items":{"type":"string"},"type":"array","title":"Custom Fields","description":"Fields that have custom values (not inherited from Content)"}},"type":"object","required":["config_id","platform","credential_id","credential_name","status","published_url","error_message"],"title":"PlatformConfigCardResponse","description":"Lightweight platform config response for lists."},"PlatformConfigInfo":{"properties":{"config_id":{"type":"string","title":"Config Id"},"platform":{"type":"string","title":"Platform"},"status":{"type":"string","title":"Status"},"credential_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Id"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name"}},"type":"object","required":["config_id","platform","status"],"title":"PlatformConfigInfo","description":"Lightweight platform config info for content cards."},"PlatformConfigListResponse":{"properties":{"configs":{"items":{"$ref":"#/components/schemas/PlatformConfigCardResponse"},"type":"array","title":"Configs"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["configs","total"],"title":"PlatformConfigListResponse","description":"Response for listing platform configs."},"PlatformConfigResponse":{"properties":{"config_id":{"type":"string","title":"Config Id"},"content_id":{"type":"string","title":"Content Id"},"platform":{"type":"string","title":"Platform"},"credential_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Id"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name"},"status":{"type":"string","title":"Status"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings"},"published_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Url"},"published_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Id"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"token_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Token Valid","description":"Whether the credential's token is still valid. None if not checked."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["config_id","content_id","platform","credential_id","credential_name","status","settings","published_url","published_id","published_at","error_message","created_at","updated_at"],"title":"PlatformConfigResponse","description":"Full platform config response."},"PlatformDefaultResponse":{"properties":{"credential_id":{"type":"string","title":"Credential Id"},"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id"},"is_mine":{"type":"boolean","title":"Is Mine","default":false},"platform":{"type":"string","title":"Platform"},"settings":{"additionalProperties":true,"type":"object","title":"Settings","description":"Partial settings dict (only the fields the user saved as default)"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["credential_id","platform","settings","updated_at"],"title":"PlatformDefaultResponse","description":"Response when loading saved defaults."},"PlatformKeySummary":{"properties":{"key_id":{"type":"string","title":"Key Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"scope":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scope"}},"type":"object","required":["key_id","name","status","created_at"],"title":"PlatformKeySummary","description":"One key's metadata — never the key itself, which is unrecoverable."},"PlatformLaunchResponse":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform type (youtube, instagram, etc.)"},"config_id":{"type":"string","title":"Config Id","description":"PlatformConfig ID"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name","description":"Name of the credential/account used"},"status":{"type":"string","title":"Status","description":"Status: pending, in_progress, success, failed, skipped, handed_over (given to the creator's editor on that platform, not published), unknown (stored value unrecognised; never published)"},"published_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Url","description":"URL of published content"},"published_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Id","description":"ID on the platform"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Machine-readable failure category (e.g. UNKNOWN_OUTCOME)"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At","description":"When publishing started"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"When publishing completed"},"first_comment":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"First Comment","description":"Outcome of the optional first comment posted after publish: {status: posted|failed|skipped, comment_id, error, at}. Null when none was asked for. A failed comment never fails the publish."}},"type":"object","required":["platform","config_id","status"],"title":"PlatformLaunchResponse","description":"Response for a single platform within a launch."},"PlatformOutcomeResponse":{"properties":{"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Kind"},"error_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Error Code"},"error_subcode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Error Subcode"},"fbtrace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbtrace Id"}},"type":"object","required":["status"],"title":"PlatformOutcomeResponse","description":"What one platform answered on a refresh, reason included."},"PlatformRequirementsResponse":{"properties":{"platform":{"type":"string","title":"Platform"},"display_name":{"type":"string","title":"Display Name"},"required_fields":{"items":{"type":"string"},"type":"array","title":"Required Fields","description":"Fields that must be filled for this platform"},"optional_fields":{"items":{"type":"string"},"type":"array","title":"Optional Fields","description":"Fields that can be filled but are not required"},"limits":{"additionalProperties":{"$ref":"#/components/schemas/FieldLimit"},"type":"object","title":"Limits","description":"Character/count limits for fields"},"inherits_from_content":{"items":{"type":"string"},"type":"array","title":"Inherits From Content","description":"Fields that can inherit from Content (title, description, tags)"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","description":"Platform-specific notes or tips"}},"type":"object","required":["platform","display_name"],"title":"PlatformRequirementsResponse","description":"Platform requirements for validation.\n\nUsed by frontend to:\n- Mark required fields in the form\n- Validate in real-time as user types\n- Show character counters"},"PlatformSchemaField":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"required":{"type":"boolean","title":"Required","default":false},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"default":{"anyOf":[{},{"type":"null"}],"title":"Default"},"enum_values":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Enum Values"},"enum_labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Enum Labels","description":"Value-to-label mapping for selects (e.g. {'1': 'Film & Animation'})"},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"min_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Length"},"ui_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ui Type","description":"How to render: text, textarea, boolean, select, tag_input, number, custom"},"custom_component":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Component","description":"Frontend component name when ui_type='custom' (e.g. cover_picker, page_selector)"},"placeholder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Placeholder"},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint","description":"Tooltip/helper text for the user"},"max_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Count","description":"Max number of items for array fields"},"items_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Items Type","description":"Type of items in array fields (e.g. 'string', 'object')"},"items_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Items Schema","description":"Shape of each item for object arrays (e.g. {'username': 'string'})"},"accept":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept","description":"Accepted file types for file upload fields (e.g. '.srt')"}},"type":"object","required":["name","type"],"title":"PlatformSchemaField","description":"Schema field description for frontend form generation."},"PlatformSettingsSchema":{"properties":{"platform":{"type":"string","title":"Platform"},"display_name":{"type":"string","title":"Display Name"},"fields":{"items":{"$ref":"#/components/schemas/PlatformSchemaField"},"type":"array","title":"Fields"},"json_schema":{"additionalProperties":true,"type":"object","title":"Json Schema"}},"type":"object","required":["platform","display_name","fields","json_schema"],"title":"PlatformSettingsSchema","description":"Schema for a platform's settings."},"PlatformStatsResponse":{"properties":{"platform":{"type":"string","title":"Platform"},"views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Views"},"likes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Likes"},"comments":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Comments"},"shares":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shares"},"saves":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saves"},"reach":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reach"},"impressions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Impressions"},"reactions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reactions"},"video_views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Views"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"avg_view_duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg View Duration Seconds"},"watch_time_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Watch Time Minutes"},"engagement_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Engagement Rate"},"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Kind"},"error_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Error Code"},"error_subcode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Error Subcode"},"fbtrace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbtrace Id"}},"type":"object","required":["platform","status"],"title":"PlatformStatsResponse"},"PlaybackInfoResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"price_per_minute_usdc":{"type":"number","title":"Price Per Minute Usdc"},"content_contract":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Contract"},"payment_router":{"type":"string","title":"Payment Router"},"usdc_address":{"type":"string","title":"Usdc Address"},"chain_id":{"type":"integer","title":"Chain Id"},"chain_name":{"type":"string","title":"Chain Name"},"gated":{"type":"boolean","title":"Gated","default":false},"playback_grant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Playback Grant"}},"type":"object","required":["content_id","price_per_minute_usdc","payment_router","usdc_address","chain_id","chain_name"],"title":"PlaybackInfoResponse"},"PlaybackSourceRequest":{"properties":{"source_video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Video Url","description":"A direct .mp4 or HLS .m3u8 URL (a Mux stream URL also counts). Null removes the file."},"price_per_minute":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Per Minute","description":"USDC per minute of playback. Absent keeps the current price."}},"type":"object","title":"PlaybackSourceRequest","description":"Where a piece plays from: a file on the creator's own host.\n\nTwo cases, one rule. An import has no file at JubJub (it lives on YouTube\nor TikTok, and nothing there can be metered), so without a source it is\nwatched on its platform. An upload has a file at JubJub, and that is the\nproblem: JubJub pays egress to serve it, more per minute than the whole\nviewer charge. Either way the creator names where the bytes come from\n(their own site, Mux, Cloudflare Stream, Bunny, S3) and the piece plays\nand meters from there. Tier 1: the page's own <video src> plays, the SDK\ncounts minutes. The URL is public, so this is metered, not paywalled."},"PlaybackUrlResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Short-lived, session-scoped signed playback URL"},"expires_in_seconds":{"type":"integer","title":"Expires In Seconds","description":"Seconds until the signed URL expires"}},"type":"object","required":["url","expires_in_seconds"],"title":"PlaybackUrlResponse"},"PortfolioAnalyticsResponse":{"properties":{"profile_id":{"type":"string","title":"Profile Id"},"date_from":{"type":"string","title":"Date From"},"date_to":{"type":"string","title":"Date To"},"total_content_count":{"type":"integer","title":"Total Content Count","default":0},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"type":"integer","title":"Limit","default":10},"has_more":{"type":"boolean","title":"Has More","default":false},"aggregate":{"$ref":"#/components/schemas/AggregateStatsResponse","default":{"total_views":0,"total_likes":0,"total_comments":0,"total_shares":0,"total_reach":0,"total_impressions":0,"best_engagement_rate":0.0,"platform_count":0,"platforms_ok":0,"platforms_pending":0,"platforms_error":0}},"top_content":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Content","default":[]},"platform_breakdown":{"additionalProperties":{"type":"integer"},"type":"object","title":"Platform Breakdown","default":{}},"platform_engagement_breakdown":{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"object","title":"Platform Engagement Breakdown","default":{}},"platform_view_status":{"additionalProperties":{"type":"string"},"type":"object","title":"Platform View Status","default":{}},"platform_view_detail":{"additionalProperties":{"type":"string"},"type":"object","title":"Platform View Detail","default":{}},"period_aggregates":{"additionalProperties":{"$ref":"#/components/schemas/AggregateStatsResponse"},"type":"object","title":"Period Aggregates","default":{}}},"type":"object","required":["profile_id","date_from","date_to"],"title":"PortfolioAnalyticsResponse"},"ProfileAccountInfo":{"properties":{"profileId":{"type":"string","title":"Profileid","default":"profileId","example":"0C9CXonv1ARy969l1hCbuQfvZvq2"},"email":{"type":"string","title":"Email","default":"email","example":"jub@jub.com"},"emailVerified":{"type":"boolean","title":"Emailverified","default":"emailVerified","example":false},"passwordUpdatedAt":{"type":"integer","title":"Passwordupdatedat","default":"passwordUpdatedAt","example":1715656357703},"providerUserInfo":{"items":{"$ref":"#/components/schemas/ProviderUserInfo"},"type":"array","title":"Provideruserinfo","default":"providerUserInfo","example":[{"email":"jub@jub.com","federatedId":"jub@jub.com","providerId":"password","rawId":"jub@jub.com"}]},"validSince":{"type":"string","title":"Validsince","default":"validSince","example":"1715656357"},"disabled":{"type":"boolean","title":"Disabled","default":"disabled","example":false},"lastLoginAt":{"type":"string","title":"Lastloginat","default":"lastLoginAt","example":"1715673878912"},"createdAt":{"type":"string","title":"Createdat","default":"createdAt","example":"1715656357703"},"lastRefreshAt":{"type":"string","title":"Lastrefreshat","default":"lastRefreshAt","example":"2024-05-14T08:04:38.912Z"},"user_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Type","description":"User type: 'professor' or 'student'","example":"professor"}},"type":"object","title":"ProfileAccountInfo"},"ProfileBatchResponse":{"properties":{"profiles":{"items":{"$ref":"#/components/schemas/ProfileSummary"},"type":"array","title":"Profiles"},"not_found":{"items":{"type":"string"},"type":"array","title":"Not Found","description":"Profile IDs that were not found"}},"type":"object","required":["profiles"],"title":"ProfileBatchResponse","description":"Response for batch profile lookup."},"ProfileCompletionRequest":{"properties":{"display_name":{"type":"string","title":"Display Name","description":"User's full name"},"user_source":{"type":"string","title":"User Source","description":"How user found the platform","example":"try_now"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code","description":"Referral code"},"discovery_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discovery Details","description":"Details about how they discovered us"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role","description":"Professional role"},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case","description":"Primary use case"},"temp_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Temp Session Id","description":"Temporary session ID"},"claim_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Token","description":"Token to claim the session"},"newsletter_consent":{"type":"boolean","title":"Newsletter Consent","description":"Consent for newsletter","default":false},"product_updates_consent":{"type":"boolean","title":"Product Updates Consent","description":"Consent for product updates","default":false},"user_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Type","description":"User type: 'professor' or 'student'"}},"type":"object","required":["display_name","user_source"],"title":"ProfileCompletionRequest","description":"Data to complete profile after Firebase registration."},"ProfileCompletionResponse":{"properties":{"success":{"type":"boolean","title":"Success","example":true},"profile_id":{"type":"string","title":"Profile Id","example":"prof_abc123"},"migration_result":{"additionalProperties":true,"type":"object","title":"Migration Result"},"message":{"type":"string","title":"Message","example":"Profile completed successfully!"}},"type":"object","required":["success","profile_id","message"],"title":"ProfileCompletionResponse","description":"Response after completing profile."},"ProfileSummary":{"properties":{"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id"},"is_you":{"type":"boolean","title":"Is You","default":false},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"wallet_rails":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Wallet Rails"}},"type":"object","title":"ProfileSummary","description":"Lightweight profile data for display purposes.\n\nPRIVACY (founder's rule, 2026-09-25): for anyone but the caller themself\n(`is_you`) and a platform admin, this is the PUBLIC profile only:\n`profile_id` and `email` are null, `display_name` is a public name or\ntheir role, else \"Member\" (2026-10-08). Your own record carries both."},"ProviderUserInfo":{"properties":{"providerId":{"type":"string","title":"Providerid","default":"providerId","example":"password"},"federatedId":{"type":"string","title":"Federatedid","default":"federatedId","example":"jub@jub.com"},"email":{"type":"string","title":"Email","default":"email","example":"jub@jub.com"},"rawId":{"type":"string","title":"Rawid","default":"rawId","example":"jub@jub.com"}},"type":"object","title":"ProviderUserInfo"},"PublicPerson":{"properties":{"member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Ref"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"is_you":{"type":"boolean","title":"Is You","default":false},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"via_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Via Team"}},"type":"object","required":["display_name"],"title":"PublicPerson","description":"A person by public profile. Never an ID, never an email."},"PublicPersonResponse":{"properties":{"member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Ref"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"is_you":{"type":"boolean","title":"Is You","default":false},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"via_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Via Team"}},"type":"object","required":["display_name"],"title":"PublicPersonResponse","description":"Another person as anyone may see them (founder's rule, 2026-09-25).\n\nNever a profile ID, never an email. `member_ref` is the opaque, per-context\nhandle routes accept for this person (null where there is no context to\nmint one in). `display_name` is a public name or, with none, the person's\nrole and team where the response knows them (\"Admin (via Kong)\"), else\n\"Member\" (2026-10-08; never \"JubJub member\")."},"RecentVideosRequest":{"properties":{"count":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Count","default":10}},"type":"object","title":"RecentVideosRequest"},"RefreshTokenRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token","description":"The refresh_token returned by /v2/auth/exchange-token"}},"type":"object","required":["refresh_token"],"title":"RefreshTokenRequest"},"RefreshTokenResponse":{"properties":{"id_token":{"type":"string","title":"Id Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"expires_in":{"type":"string","title":"Expires In"}},"type":"object","required":["id_token","refresh_token","expires_in"],"title":"RefreshTokenResponse"},"RegisterContentRequest":{"properties":{"creator_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Email"},"creator_wallet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Wallet"},"title":{"type":"string","minLength":1,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"media_url":{"type":"string","minLength":1,"title":"Media Url"},"price_per_minute":{"type":"number","maximum":0.15,"minimum":0.0,"title":"Price Per Minute","description":"USDC per minute of playback. Maximum $0.15/min — above this the on-chain payment router rejects every settlement, so the content could never be paid out.","default":0.005},"platform_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Name"},"platform_video_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Video Id"},"platform_video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Video Url"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["title","media_url"],"title":"RegisterContentRequest"},"RegisterContentResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id"},"creator_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Ref"},"workspace_id":{"type":"string","title":"Workspace Id"},"media_id":{"type":"string","title":"Media Id"},"ownership_status":{"type":"string","title":"Ownership Status"},"catalogue_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue Address"},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash"},"message":{"type":"string","title":"Message"}},"type":"object","required":["content_id","workspace_id","media_id","ownership_status","message"],"title":"RegisterContentResponse"},"RegisterViewerRequest":{"properties":{"wallet_address":{"type":"string","title":"Wallet Address","description":"EVM address the caller controls"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Email if available"},"wallet_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wallet Type","description":"'external', 'smart_wallet' or 'embedded'"},"signature":{"type":"string","minLength":1,"title":"Signature","description":"EIP-191 signature over the SIWE message"},"nonce":{"type":"string","minLength":1,"title":"Nonce","description":"Nonce previously issued by /v2/auth/wallet-nonce"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Optional display name"}},"additionalProperties":true,"type":"object","required":["wallet_address","signature","nonce"],"title":"RegisterViewerRequest"},"RegisterViewerResponse":{"properties":{"profile_id":{"type":"string","title":"Profile Id"},"wallet_address":{"type":"string","title":"Wallet Address"},"created":{"type":"boolean","title":"Created"},"message":{"type":"string","title":"Message"},"firebase_custom_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firebase Custom Token"},"session_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"}},"type":"object","required":["profile_id","wallet_address","created","message"],"title":"RegisterViewerResponse"},"RegisterWalletRailsRequest":{"properties":{"wallet_address":{"type":"string","title":"Wallet Address","description":"Primary EVM address (smart wallet if available, else embedded EOA)"},"privy_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Privy User Id","description":"Privy DID e.g. did:privy:xxxx (Privy path)"},"embedded_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embedded Address","description":"Embedded EOA signer address (if different from primary)"},"wallet_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wallet Type","description":"'smart_wallet', 'embedded', or 'external'"},"signature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signature","description":"EIP-191 signature over the SIWE message from /v2/auth/wallet-nonce (external path)"},"nonce":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nonce","description":"Nonce previously issued by /v2/auth/wallet-nonce (external path)"}},"type":"object","required":["wallet_address"],"title":"RegisterWalletRailsRequest"},"RejectResponse":{"properties":{"rejected":{"type":"boolean","title":"Rejected"},"profile_id":{"type":"string","title":"Profile Id"},"redistributed_to":{"items":{"type":"string"},"type":"array","title":"Redistributed To"},"redistributed_to_members":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Redistributed To Members","default":[]}},"type":"object","required":["rejected","profile_id","redistributed_to"],"title":"RejectResponse"},"ReplyRequest":{"properties":{"text":{"type":"string","maxLength":4000,"title":"Text"}},"type":"object","required":["text"],"title":"ReplyRequest"},"ReproposeRequest":{"properties":{"allocations":{"items":{"$ref":"#/components/schemas/AllocationDTO"},"type":"array","title":"Allocations"}},"type":"object","required":["allocations"],"title":"ReproposeRequest"},"RequestedPlatformsRequest":{"properties":{"platforms":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Platforms","description":"Platform ids, e.g. ['youtube','tiktok']. [] = pick any."}},"type":"object","title":"RequestedPlatformsRequest"},"ResolveDecisionRequest":{"properties":{"decision_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Status","description":"approved, rejected, withdrawn (decisions only)"},"resolution":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Resolution"}},"type":"object","title":"ResolveDecisionRequest","description":"Request to resolve a message.\n\nFor a DECISION, `decision_status` is required (approved, rejected,\nwithdrawn). For a COMMENT the body may be empty: resolving it means\n\"handled\", and it leaves the inbox."},"RetryLaunchRequest":{"properties":{"platform_config_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platform Config Ids","description":"Specific platforms to retry. If None, retries all failed."},"force":{"type":"boolean","title":"Force","description":"If True, also retry platforms with error_code=UNKNOWN_OUTCOME. Requires explicit platform_config_ids (no force 'retry all').","default":false}},"type":"object","title":"RetryLaunchRequest","description":"Request to retry failed platforms in a launch."},"RevalidateCredentialResponse":{"properties":{"credential_id":{"type":"string","title":"Credential Id"},"platform":{"type":"string","title":"Platform"},"account_id":{"type":"string","title":"Account Id","description":"Platform identifier; the Token ID for Mux."},"outcome":{"type":"string","title":"Outcome","description":"alive | dead | undetermined"},"status":{"type":"string","title":"Status","description":"Credential status AFTER this check."},"detail":{"type":"string","title":"Detail"},"checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Checked At"},"needs_input":{"items":{"type":"string"},"type":"array","title":"Needs Input","description":"What a reconnect must ask the creator for when dead. Mux: token_secret. Vimeo: token. Vimeo OTT: api_key. OAuth: oauth (a consent redirect). Empty when alive or undetermined."}},"type":"object","required":["credential_id","platform","account_id","outcome","status","detail","checked_at"],"title":"RevalidateCredentialResponse","description":"What the platform said when asked about the STORED credential.\n\nThree outcomes, not two. `undetermined` means the platform could not be\nasked (timeout, 5xx, rate limit, no probe) and NOTHING was changed; the\ncaller may simply try again. Only `alive` and `dead` move `status`."},"RightsDecisionBody":{"properties":{"status":{"type":"string","enum":["clear","held_for_owner","blocked"],"title":"Status"},"claimant":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Claimant","description":"{name, contact, profile_id|None}"},"proof":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Proof","description":"{type, platform, platform_video_id, platform_published_at, notes}"},"reason":{"type":"string","maxLength":2000,"minLength":1,"title":"Reason"}},"type":"object","required":["status","reason"],"title":"RightsDecisionBody"},"RunExtractionRequest":{"properties":{"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id"},"layers":{"items":{"type":"string"},"type":"array","title":"Layers","default":["l0","l1","l2"]},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","title":"RunExtractionRequest"},"SafetyDecisionBody":{"properties":{"status":{"type":"string","enum":["clear","held","blocked"],"title":"Status"},"reason":{"type":"string","maxLength":2000,"minLength":1,"title":"Reason"}},"type":"object","required":["status","reason"],"title":"SafetyDecisionBody"},"SavePlatformDefaultRequest":{"properties":{"settings":{"additionalProperties":true,"type":"object","title":"Settings","description":"Partial settings dict with default values"}},"type":"object","required":["settings"],"title":"SavePlatformDefaultRequest","description":"Request to save defaults for a credential."},"SegmentResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"segment_count":{"type":"integer","title":"Segment Count"},"amount_settled":{"type":"integer","title":"Amount Settled"},"status":{"type":"string","title":"Status"}},"type":"object","required":["session_id","segment_count","amount_settled","status"],"title":"SegmentResponse"},"SessionCompleteAssetDTO":{"properties":{"media_id":{"type":"string","title":"Media Id","description":"Media ID to mark complete"},"size_bytes":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Size Bytes","description":"Final file size in bytes"}},"type":"object","required":["media_id"],"title":"SessionCompleteAssetDTO","description":"Mark a single asset upload as complete."},"SessionFailAssetDTO":{"properties":{"media_id":{"type":"string","title":"Media Id","description":"Media ID whose upload failed"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason","description":"What the browser saw (status code, message)"}},"type":"object","required":["media_id"],"title":"SessionFailAssetDTO","description":"The browser could not deliver a file. Marks it finished (failed)."},"SessionRequestUploadDTO":{"properties":{"filename":{"type":"string","minLength":1,"title":"Filename","description":"Original filename"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"MIME type (auto-detected if omitted)"},"media_type":{"type":"string","title":"Media Type","description":"video or image","default":"video"},"size_bytes":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Size Bytes","description":"Total file size in bytes. Enables resumable (chunked) upload."}},"type":"object","required":["filename"],"title":"SessionRequestUploadDTO","description":"Request a signed upload URL for a single file."},"SessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"content_id":{"type":"string","title":"Content Id"},"on_chain_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"On Chain Session Id"},"rail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rail"},"amount_settled":{"type":"integer","title":"Amount Settled"},"max_amount":{"type":"integer","title":"Max Amount"},"segment_count":{"type":"integer","title":"Segment Count","default":0},"status":{"type":"string","title":"Status"}},"type":"object","required":["session_id","content_id","amount_settled","max_amount","status"],"title":"SessionResponse"},"SessionUploadResponse":{"properties":{"media_id":{"type":"string","title":"Media Id"},"signed_url":{"type":"string","title":"Signed Url"},"resumable_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resumable Url","description":"Resumable session URL for chunked uploads. Available when size_bytes is provided."},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"gcs_path":{"type":"string","title":"Gcs Path"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["media_id","signed_url","expires_at","gcs_path","content_type"],"title":"SessionUploadResponse","description":"Response after requesting a signed upload URL."},"SetActiveRequest":{"properties":{"provider":{"type":"string","title":"Provider"}},"type":"object","required":["provider"],"title":"SetActiveRequest"},"SetApproversRequest":{"properties":{"approvers":{"items":{"$ref":"#/components/schemas/ApproverGrantInput"},"type":"array","title":"Approvers"}},"type":"object","title":"SetApproversRequest","description":"PUT /v2/workspaces/{id}/approvers — replaces the grant list. Owner only."},"SetDiscoverabilityRequest":{"properties":{"content_id":{"type":"string","title":"Content Id"},"discoverable":{"type":"boolean","title":"Discoverable"}},"type":"object","required":["content_id","discoverable"],"title":"SetDiscoverabilityRequest"},"SetFacebookPageRequest":{"properties":{"page_id":{"type":"string","minLength":1,"title":"Page Id","description":"A page_id from GET /{credential_id}/facebook-pages"}},"type":"object","required":["page_id"],"title":"SetFacebookPageRequest","description":"Choose the Page a Facebook connection publishes to."},"SetThumbnailFromFrameRequest":{"properties":{"timestamp_seconds":{"type":"number","minimum":0.0,"title":"Timestamp Seconds","description":"Seconds into the video to extract. Passed to extract_thumbnail as seek_to, which takes precedence over its 25%-of-duration default."}},"type":"object","required":["timestamp_seconds"],"title":"SetThumbnailFromFrameRequest","description":"Pick a frame from the content's video as its thumbnail."},"SetThumbnailFromFrameResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"thumbnail_id":{"type":"string","title":"Thumbnail Id"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Public URL of the new thumbnail. None when STORAGE_BUCKET is unset (local dev); the id is authoritative either way."}},"type":"object","required":["content_id","thumbnail_id"],"title":"SetThumbnailFromFrameResponse","description":"The newly created thumbnail. The previous one is left in place."},"SetTokeniseDestinationRequest":{"properties":{"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id","description":"Team to tokenise this channel's imports under."},"solo":{"type":"boolean","title":"Solo","description":"Set true to tokenise solo. Mutually exclusive with team_id.","default":false}},"type":"object","title":"SetTokeniseDestinationRequest","description":"Where this channel's imported history tokenises.\n\nExactly one of the two. `solo` is an explicit flag rather than \"team_id\nomitted\" on purpose: omission is what \"never chose\" looks like, and if\nabsence meant solo, a client that forgot the field would commit the user to\na permanent 100%-to-me mint without anyone deciding that."},"SetWorkspaceTeamRequest":{"properties":{"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id","description":"Team to link to. None unlinks from any current team."}},"type":"object","title":"SetWorkspaceTeamRequest","description":"Atomic set-team: link/unlink in one request. team_id=None unlinks."},"ShareCredentialRequest":{"properties":{"credential_id":{"type":"string","title":"Credential Id","description":"ID of the credential to share"},"nickname":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Nickname","description":"Custom label for this credential in the team"}},"type":"object","required":["credential_id"],"title":"ShareCredentialRequest","description":"Request to share a credential with the team."},"ShareCredentialsBatchRequest":{"properties":{"credential_ids":{"items":{"type":"string"},"type":"array","maxItems":20,"minItems":1,"title":"Credential Ids"}},"type":"object","required":["credential_ids"],"title":"ShareCredentialsBatchRequest"},"ShareInsightsRequest":{"properties":{"history_and_stats":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"History And Stats"},"recent_videos":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recent Videos"}},"type":"object","title":"ShareInsightsRequest","description":"The owner's two team-insights switches. Omit one to leave it as it is."},"SharedCredentialListResponse":{"properties":{"credentials":{"items":{"$ref":"#/components/schemas/SharedCredentialResponse"},"type":"array","title":"Credentials"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["credentials","total"],"title":"SharedCredentialListResponse","description":"List of shared credentials."},"SharedCredentialResponse":{"properties":{"shared_credential_id":{"type":"string","title":"Shared Credential Id"},"credential_id":{"type":"string","title":"Credential Id"},"team_id":{"type":"string","title":"Team Id"},"owner_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Profile Id"},"owner_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Name"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"owner":{"anyOf":[{"$ref":"#/components/schemas/PublicPersonResponse"},{"type":"null"}]},"is_mine":{"type":"boolean","title":"Is Mine","default":false},"platform":{"type":"string","title":"Platform"},"account_name":{"type":"string","title":"Account Name"},"account_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Username"},"account_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Avatar Url"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"is_active":{"type":"boolean","title":"Is Active"},"usage_count":{"type":"integer","title":"Usage Count","default":0},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"shared_at":{"type":"string","format":"date-time","title":"Shared At"},"history_and_stats":{"type":"boolean","title":"History And Stats","default":false},"recent_videos":{"type":"boolean","title":"Recent Videos","default":false}},"type":"object","required":["shared_credential_id","credential_id","team_id","platform","account_name","is_active","shared_at"],"title":"SharedCredentialResponse","description":"Response for a shared credential.\n\nPRIVACY (2026-09-25): the sharer is `owner` (public profile, team-scoped\nmember_ref) and `owner_name` (public name). `owner_profile_id` and\n`owner_email` are filled only for the sharer themself (`is_mine`) and a\nplatform admin."},"SignOffRequest":{"properties":{"role":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Role","description":"The capacity you sign off in, e.g. 'Compliance'"},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note"}},"type":"object","title":"SignOffRequest"},"SignerCreateResponse":{"properties":{"signer_uuid":{"type":"string","title":"Signer Uuid"},"status":{"type":"string","title":"Status"},"approval_url":{"type":"string","title":"Approval Url"}},"type":"object","required":["signer_uuid","status","approval_url"],"title":"SignerCreateResponse"},"SignerStatusResponse":{"properties":{"signer_uuid":{"type":"string","title":"Signer Uuid"},"status":{"type":"string","title":"Status"},"approval_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approval Url"},"connection":{"anyOf":[{"$ref":"#/components/schemas/FarcasterConnectResponse"},{"type":"null"}]}},"type":"object","required":["signer_uuid","status"],"title":"SignerStatusResponse"},"SiwnCallbackRequest":{"properties":{"signer_uuid":{"type":"string","title":"Signer Uuid"},"fid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fid"}},"type":"object","required":["signer_uuid"],"title":"SiwnCallbackRequest"},"SiwnConfigResponse":{"properties":{"client_id":{"type":"string","title":"Client Id"}},"type":"object","required":["client_id"],"title":"SiwnConfigResponse"},"SiwnConnectUrlResponse":{"properties":{"connect_url":{"type":"string","title":"Connect Url"}},"type":"object","required":["connect_url"],"title":"SiwnConnectUrlResponse"},"SnapshotResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"snapshot_date":{"type":"string","title":"Snapshot Date"},"platforms":{"additionalProperties":{"$ref":"#/components/schemas/PlatformStatsResponse"},"type":"object","title":"Platforms","default":{}},"aggregate":{"$ref":"#/components/schemas/AggregateStatsResponse","default":{"total_views":0,"total_likes":0,"total_comments":0,"total_shares":0,"total_reach":0,"total_impressions":0,"best_engagement_rate":0.0,"platform_count":0,"platforms_ok":0,"platforms_pending":0,"platforms_error":0}},"onchain":{"$ref":"#/components/schemas/OnchainStatsResponse","default":{"launch_confirmed":false,"chain":"base","published_platforms":[],"token_holders":[],"total_tokens":10000,"revenue_status":"unavailable","status":"no_contract"}},"fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fetched At"}},"type":"object","required":["content_id","snapshot_date"],"title":"SnapshotResponse"},"SocketTokenResponse":{"properties":{"token":{"type":"string","title":"Token"},"expires_in":{"type":"integer","title":"Expires In"},"audience":{"type":"string","title":"Audience"}},"type":"object","required":["token","expires_in","audience"],"title":"SocketTokenResponse","description":"What the dashboard puts on the socket URL instead of the session\ncookie. `expires_in` is seconds; mint again on every connect."},"SplitEntry":{"properties":{"member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Ref"},"invite_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Id"},"basis_points":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Basis Points"}},"type":"object","required":["basis_points"],"title":"SplitEntry","description":"A single custom split allocation.\n\n`profile_id` takes the member's `member_ref` (what member lists return\nsince 2026-09-25) or, from older clients, a member's profile ID; the route\nresolves it against the team's members before anything is stored."},"SplitOverride":{"properties":{"mode":{"type":"string","title":"Mode","description":"equal | custom | no_distribution"},"custom_splits":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Custom Splits","description":"[{profile_id, basis_points}] when mode=custom"}},"type":"object","required":["mode"],"title":"SplitOverride","description":"Workspace-level split override."},"StartTryNowRequest":{"properties":{"feature_interest":{"type":"string","title":"Feature Interest","default":"general"},"source":{"type":"string","title":"Source","default":"direct"},"landing_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Page Id"},"locale":{"type":"string","title":"Locale","default":"en"},"creator_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Type"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"audience_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Size"},"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"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"referrer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer Url"}},"type":"object","title":"StartTryNowRequest"},"StartTryNowResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"workspace_id":{"type":"string","title":"Workspace Id"},"trial_token":{"type":"string","title":"Trial Token"},"expires_at":{"type":"string","title":"Expires At"},"flow":{"additionalProperties":true,"type":"object","title":"Flow"}},"type":"object","required":["session_id","workspace_id","trial_token","expires_at","flow"],"title":"StartTryNowResponse"},"StreamingEarningsResponse":{"properties":{"earned_today_usdc":{"type":"integer","title":"Earned Today Usdc","description":"Net-to-creator streaming earnings settled since 00:00 UTC today, in raw USDC units (6 decimals). Streaming only — see source.","default":0},"earned_30d_usdc":{"type":"integer","title":"Earned 30D Usdc","description":"Net-to-creator streaming earnings settled in the last 30 days, in raw USDC units (6 decimals). Streaming only — see source.","default":0},"source":{"type":"string","title":"Source","description":"Always 'streaming'. Signals these figures cover streaming revenue only and exclude catalogue/licensing/x402 revenue.","default":"streaming"}},"type":"object","title":"StreamingEarningsResponse"},"StudioEnquiryRequest":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name"},"company":{"type":"string","maxLength":200,"title":"Company"},"role":{"type":"string","maxLength":200,"title":"Role"},"email":{"type":"string","maxLength":320,"title":"Email"},"source":{"type":"string","maxLength":200,"title":"Source","default":""}},"type":"object","required":["name","company","role","email"],"title":"StudioEnquiryRequest"},"TargetInfo":{"properties":{"config_id":{"type":"string","title":"Config Id"},"credential_id":{"type":"string","title":"Credential Id"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name"},"platform":{"type":"string","title":"Platform"},"account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Name"},"account_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Username"},"status":{"type":"string","title":"Status"}},"type":"object","required":["config_id","credential_id","credential_name","platform","status"],"title":"TargetInfo","description":"Information about a single target (platform config)."},"TeamAggregatedStatsResponse":{"properties":{"team_id":{"type":"string","title":"Team Id"},"member_count":{"type":"integer","title":"Member Count","default":0},"workspace_count":{"type":"integer","title":"Workspace Count","default":0},"shared_credential_count":{"type":"integer","title":"Shared Credential Count","default":0},"total_contents":{"type":"integer","title":"Total Contents","default":0},"total_launches":{"type":"integer","title":"Total Launches","default":0},"successful_launches":{"type":"integer","title":"Successful Launches","default":0},"pending_launches":{"type":"integer","title":"Pending Launches","default":0},"launch_success_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Launch Success Rate"},"last_activity_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity At"}},"type":"object","required":["team_id"],"title":"TeamAggregatedStatsResponse","description":"Aggregated statistics for a team, calculated from workspaces."},"TeamCardResponse":{"properties":{"team_id":{"type":"string","title":"Team Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"owner":{"anyOf":[{"$ref":"#/components/schemas/PublicPersonResponse"},{"type":"null"}]},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"my_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"My Role"},"member_count":{"type":"integer","title":"Member Count","default":0},"workspace_count":{"type":"integer","title":"Workspace Count","default":0}},"type":"object","required":["team_id","name"],"title":"TeamCardResponse","description":"Lightweight team response for list views.\n\nPRIVACY (2026-09-25): no `owner_id`. The owner is `owner` (public profile\nwith a team-scoped member_ref); `is_owner` says whether the caller owns it."},"TeamListResponse":{"properties":{"teams":{"items":{"$ref":"#/components/schemas/TeamCardResponse"},"type":"array","title":"Teams"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["teams","total","limit","offset"],"title":"TeamListResponse","description":"Paginated list of teams."},"TeamListWithWorkspacesResponse":{"properties":{"teams":{"items":{"$ref":"#/components/schemas/TeamWithWorkspacesResponse"},"type":"array","title":"Teams"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["teams","total","limit","offset"],"title":"TeamListWithWorkspacesResponse","description":"List of teams with workspaces included."},"TeamMemberResponse":{"properties":{"member_ref":{"type":"string","title":"Member Ref"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"role":{"type":"string","title":"Role"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"invited_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invited By"},"is_you":{"type":"boolean","title":"Is You","default":false}},"type":"object","required":["member_ref","display_name","role","joined_at"],"title":"TeamMemberResponse","description":"Response DTO for a team member.\n\nPRIVACY (founder's rule, 2026-09-25): no profile ID ever. `member_ref` is\nthe opaque handle routes accept for this member. `email` is the member's\nown address on their OWN row (is_you) and, on every row, only for the\nplatform admin or the team's owner or an admin signed in interactively\n(Tom, 2026-10-07; never an agent key). `display_name` is a public name or,\nwith none, the member's role, never an email.\n`invited_by` is the inviter's public name, not their ID."},"TeamResponse":{"properties":{"team_id":{"type":"string","title":"Team Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"owner_member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Member Ref"},"owner":{"anyOf":[{"$ref":"#/components/schemas/PublicPersonResponse"},{"type":"null"}]},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"my_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"My Role"},"owner_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Display Name"},"owner_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Avatar Url"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"members":{"items":{"$ref":"#/components/schemas/TeamMemberResponse"},"type":"array","title":"Members","default":[]},"stats":{"$ref":"#/components/schemas/TeamStatsResponse"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"default_split_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Split Mode"},"default_custom_splits":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Default Custom Splits"},"pending_invite_split":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Pending Invite Split"},"requested_platforms":{"items":{"type":"string"},"type":"array","title":"Requested Platforms","default":[]},"catalogue_contract_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalogue Contract Address"},"minted_allocation":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Minted Allocation"},"split_locked":{"type":"boolean","title":"Split Locked","default":false},"split_locked_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Split Locked Reason"},"saved_split_matches_minted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Saved Split Matches Minted"}},"type":"object","required":["team_id","name","stats","created_at"],"title":"TeamResponse","description":"Full team response with all details."},"TeamStatsResponse":{"properties":{"member_count":{"type":"integer","title":"Member Count","default":0},"workspace_count":{"type":"integer","title":"Workspace Count","default":0},"shared_credential_count":{"type":"integer","title":"Shared Credential Count","default":0},"total_contents":{"type":"integer","title":"Total Contents","default":0},"total_launches":{"type":"integer","title":"Total Launches","default":0}},"type":"object","title":"TeamStatsResponse","description":"Response DTO for team statistics."},"TeamUnreadCountsResponse":{"properties":{"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"}},"type":"object","required":["counts"],"title":"TeamUnreadCountsResponse","description":"Unread notification counts bucketed by team_id.\n\n`counts` maps team_id -> number of unread notifications scoped to that team\n(via the notification's data.team_id). Teams with zero unread are omitted,\nso the dashboard treats a missing key as 0."},"TeamWithWorkspacesResponse":{"properties":{"team_id":{"type":"string","title":"Team Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"owner":{"anyOf":[{"$ref":"#/components/schemas/PublicPersonResponse"},{"type":"null"}]},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"my_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"My Role"},"member_count":{"type":"integer","title":"Member Count","default":0},"workspace_count":{"type":"integer","title":"Workspace Count","default":0},"workspaces":{"items":{"$ref":"#/components/schemas/WorkspaceSummary"},"type":"array","title":"Workspaces","default":[]}},"type":"object","required":["team_id","name"],"title":"TeamWithWorkspacesResponse","description":"Team card with workspaces included (for expanded view). No `owner_id`\n(2026-09-25): `owner` public profile and `is_owner`, as TeamCardResponse."},"TikTokHandoverRequest":{"properties":{"credential_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Id","description":"Which TikTok account. Optional when there is exactly one."}},"type":"object","title":"TikTokHandoverRequest"},"TokenConnectRequest":{"properties":{"token_id":{"type":"string","title":"Token Id"},"token_secret":{"type":"string","title":"Token Secret"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"}},"type":"object","required":["token_id","token_secret"],"title":"TokenConnectRequest","description":"Request body for token-based platform connection (Mux, Vimeo OTT)."},"TransferOwnershipRequest":{"properties":{"new_owner_member_ref":{"type":"string","title":"New Owner Member Ref","description":"The new owner's member_ref (or, from older clients, profile ID). Must be an Admin."}},"type":"object","required":["new_owner_member_ref"],"title":"TransferOwnershipRequest","description":"Request to transfer team ownership."},"TransferWorkspaceRequest":{"properties":{"new_owner_member_ref":{"type":"string","minLength":1,"title":"New Owner Member Ref","description":"Workspace-scoped member_ref (or, from older clients, a profile ID) of a direct or team member"}},"type":"object","required":["new_owner_member_ref"],"title":"TransferWorkspaceRequest","description":"POST /v2/workspaces/{id}/transfer — hand the workspace to a member."},"TryNowBulkPlatformConfigRequest":{"properties":{"configs":{"items":{"$ref":"#/components/schemas/TryNowPlatformConfigRequest"},"type":"array","minItems":1,"title":"Configs"}},"type":"object","required":["configs"],"title":"TryNowBulkPlatformConfigRequest"},"TryNowCreateContentRequest":{"properties":{"title":{"type":"string","maxLength":500,"minLength":1,"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"video_id":{"type":"string","title":"Video Id","description":"Reference to uploaded Media (video)"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},"type":"object","required":["title","video_id"],"title":"TryNowCreateContentRequest"},"TryNowPlatformConfigRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings"}},"type":"object","required":["platform"],"title":"TryNowPlatformConfigRequest"},"TryNowProgressResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"workspace_id":{"type":"string","title":"Workspace Id"},"steps_completed":{"items":{"type":"string"},"type":"array","title":"Steps Completed"},"current_step":{"type":"string","title":"Current Step"},"furthest_step":{"type":"string","title":"Furthest Step"},"expires_at":{"type":"string","title":"Expires At"},"time_remaining_seconds":{"type":"integer","title":"Time Remaining Seconds"},"pre_profile_fields_filled":{"type":"integer","title":"Pre Profile Fields Filled"},"flow":{"additionalProperties":true,"type":"object","title":"Flow"}},"type":"object","required":["session_id","workspace_id","steps_completed","current_step","furthest_step","expires_at","time_remaining_seconds","pre_profile_fields_filled","flow"],"title":"TryNowProgressResponse"},"TryNowUploadCompleteRequest":{"properties":{"size_bytes":{"type":"integer","exclusiveMinimum":0.0,"title":"Size Bytes"}},"type":"object","required":["size_bytes"],"title":"TryNowUploadCompleteRequest"},"TryNowUploadRequest":{"properties":{"filename":{"type":"string","title":"Filename","description":"Original filename (e.g., 'video.mp4')"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"media_type":{"type":"string","title":"Media Type","description":"video | image | subtitle","default":"video"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes","description":"Known file size for resumable uploads"}},"type":"object","required":["filename"],"title":"TryNowUploadRequest"},"UnifiedBalanceResponse":{"properties":{"total_usdc":{"type":"integer","title":"Total Usdc","description":"wallet_balance + sum(pending_in_catalogues). Raw USDC units (6 decimals). This is the single number the frontend displays as the user's balance."},"wallet_balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wallet Balance","description":"USDC.balanceOf(wallet) in raw units, or NULL when that read failed. Null is not zero: a zero here would be a specific, spendable-looking claim about a balance nobody could read. Check `wallet_balance_read` before treating it as a number."},"wallet_balance_read":{"type":"boolean","title":"Wallet Balance Read","description":"False when USDC.balanceOf failed. `total_usdc` then excludes the wallet leg entirely and is a floor, not a total.","default":true},"pending_in_catalogues":{"items":{"$ref":"#/components/schemas/PendingCatalogueEntry"},"type":"array","title":"Pending In Catalogues","description":"Per-catalogue claimable breakdown: unclaimed revenue sitting in catalogue contracts, spendable only after a catalogue.claim(). The frontend renders the sum as the claimable figure and uses the per-entry addresses to target claim() calls. Entries with a zero amount are omitted."},"partial":{"type":"boolean","title":"Partial","description":"True when EITHER leg was incomplete — the wallet balance could not be read, or one or more catalogues were skipped. A consumer summing `total_usdc` has no other way to know something is missing. Auto-claim in particular must not treat a partial picture as a complete one: claiming against it is acting on a number known to be short.","default":false},"skipped_catalogues":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Skipped Catalogues","description":"Catalogues left out of the sum, each with the reason. Populated for codeless addresses (pre-cutover leftovers); a live catalogue that fails to answer produces a 503 instead of an entry here."},"wallet_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wallet Address"}},"type":"object","required":["total_usdc"],"title":"UnifiedBalanceResponse"},"UnreadCountResponse":{"properties":{"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["unread_count"],"title":"UnreadCountResponse","description":"Response model for unread count endpoint."},"UpdateAgentRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"scopes":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Scopes"},"is_trusted_publish":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Trusted Publish","description":"Allow this agent to use publish:execute and publish:schedule scopes."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Set to 'revoked' to revoke"},"limits_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Limits Override"}},"type":"object","title":"UpdateAgentRequest"},"UpdateContentRequest":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Tags"},"video_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Id"},"thumbnail_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Id"},"subtitle_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Subtitle Ids"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"is_made_for_kids":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Made For Kids"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Content status: draft, ready"},"discoverable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discoverable","description":"Whether the piece may appear in metadata search once it has gone out. Owner only."}},"additionalProperties":true,"type":"object","title":"UpdateContentRequest","description":"Request to update a content. All fields optional.\n\nA field this request does not know is REFUSED (400 naming it, by the route), never ignored (2026-10-08): an\nupdate that answered 200 while dropping `discoverable` told the caller a private piece had been made private\nwhen it had not. Unknown fields are kept here (extra=\"allow\") only so the route can name them."},"UpdateCredentialRequest":{"properties":{"nickname":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Nickname","description":"User-defined friendly name for this credential"}},"type":"object","title":"UpdateCredentialRequest","description":"Request to update a credential (nickname only - tokens handled separately)."},"UpdateMemberRequest":{"properties":{"role":{"anyOf":[{"type":"string","enum":["admin","editor","viewer"]},{"type":"null"}],"title":"Role"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","title":"UpdateMemberRequest","description":"Request to update a workspace member's role or expiration."},"UpdateMemberRoleRequest":{"properties":{"role":{"type":"string","title":"Role","description":"New role: admin, manager, editor, publisher, viewer"},"custom_permissions":{"anyOf":[{"items":{"type":"string"},"type":"array","uniqueItems":true},{"type":"null"}],"title":"Custom Permissions","description":"Custom permission overrides"}},"type":"object","required":["role"],"title":"UpdateMemberRoleRequest","description":"Request to update a member's role."},"UpdateMyHandleRequest":{"properties":{"handle":{"type":"string","maxLength":30,"minLength":3,"title":"Handle","description":"3 to 30 chars, lowercase letters, numbers, or underscores, starting with a letter."}},"type":"object","required":["handle"],"title":"UpdateMyHandleRequest","description":"PATCH /v2/profiles/me/handle — claim or change @handle."},"UpdateMyProfileRequest":{"properties":{"display_name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Display Name","description":"Public display name shown to other users."},"avatar_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Avatar Url","description":"URL of the profile avatar image."},"bio":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Bio","description":"Free-form profile bio text."},"email":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"title":"Email","description":"Contact/payout email. SET-ONCE: only written when the profile has no email yet (e.g. a wallet-only viewer adding an email to publish & get paid). Ignored if an email already exists. Plain field — no verification, no Privy, no Firebase user creation."}},"type":"object","title":"UpdateMyProfileRequest","description":"PATCH /v2/profiles/me — self-update of mutable profile fields."},"UpdatePlatformConfigRequest":{"properties":{"credential_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Id","description":"Change the credential/account to use"},"credential_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Name","description":"Update the friendly name"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings","description":"Platform-specific settings to update"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Update status: not_configured, ready"}},"type":"object","title":"UpdatePlatformConfigRequest","description":"Request to update a platform config."},"UpdatePreProfileRequest":{"properties":{"self_reported_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Self Reported Role"},"self_reported_team_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Self Reported Team Size"},"self_reported_frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Self Reported Frequency"},"email_captured":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Captured"},"opted_in_marketing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Opted In Marketing"},"preferred_platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferred Platforms"},"time_on_upload_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Time On Upload Step"},"time_on_platforms_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Time On Platforms Step"},"time_on_customize_step":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Time On Customize Step"},"total_session_duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Session Duration"}},"type":"object","title":"UpdatePreProfileRequest","description":"Partial update — only send the fields being updated."},"UpdateSignalRequest":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"UpdateSignalRequest"},"UpdateTeamRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"default_split_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Split Mode","description":"equal | custom | no_distribution"},"default_custom_splits":{"anyOf":[{"items":{"$ref":"#/components/schemas/SplitEntry"},"type":"array"},{"type":"null"}],"title":"Default Custom Splits","description":"Custom splits (required when mode=custom, must sum to 10000)"}},"type":"object","title":"UpdateTeamRequest","description":"Request to update team details."},"UpdateWorkspaceRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"default_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Language"},"default_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Default Tags"},"split_override":{"anyOf":[{"$ref":"#/components/schemas/SplitOverride"},{"type":"null"}],"description":"Override team default splits for this workspace"},"member_opt_outs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Member Opt Outs","description":"Members who opted out of revenue splits, by member_ref (legacy: a member's profile ID)"}},"type":"object","title":"UpdateWorkspaceRequest","description":"Request to update a workspace. All fields optional."},"UploadSessionStatusResponse":{"properties":{"upload_session_id":{"type":"string","title":"Upload Session Id"},"workspace_id":{"type":"string","title":"Workspace Id"},"status":{"type":"string","title":"Status"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"closed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closed At"},"assets":{"items":{"$ref":"#/components/schemas/AssetResponse"},"type":"array","title":"Assets"},"groupings":{"items":{"$ref":"#/components/schemas/GroupingResponse"},"type":"array","title":"Groupings"},"clarification":{"$ref":"#/components/schemas/ClarificationResponse"}},"type":"object","required":["upload_session_id","workspace_id","status","expires_at","assets","groupings","clarification"],"title":"UploadSessionStatusResponse","description":"Full session status for agent polling."},"ValidateConfigsRequest":{"properties":{"config_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Config Ids","description":"Specific config IDs to validate. If empty, validates all configs."}},"type":"object","title":"ValidateConfigsRequest","description":"Request to validate configs (optional - can validate all or specific ones)."},"ValidateConfigsResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"all_valid":{"type":"boolean","title":"All Valid"},"total_configs":{"type":"integer","title":"Total Configs"},"valid_count":{"type":"integer","title":"Valid Count"},"invalid_count":{"type":"integer","title":"Invalid Count"},"results":{"items":{"$ref":"#/components/schemas/ConfigValidationResult"},"type":"array","title":"Results"}},"type":"object","required":["content_id","all_valid","total_configs","valid_count","invalid_count","results"],"title":"ValidateConfigsResponse","description":"Response from validating all platform configs for a content."},"ValidateLaunchRequest":{"properties":{"content_id":{"type":"string","title":"Content Id","description":"ID of the content to validate"},"platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platforms","description":"Optional list of platforms to validate (e.g., ['youtube', 'instagram']). If None, validates all configs for this content."}},"type":"object","required":["content_id"],"title":"ValidateLaunchRequest","description":"Request to validate a launch before execution."},"ValidateLaunchResponse":{"properties":{"content_id":{"type":"string","title":"Content Id","description":"Content ID that was validated"},"all_valid":{"type":"boolean","title":"All Valid","description":"Whether all platforms passed validation"},"results":{"items":{"$ref":"#/components/schemas/ValidationResultResponse"},"type":"array","title":"Results","description":"Validation results per platform"},"can_launch":{"type":"boolean","title":"Can Launch","description":"Whether the launch can proceed (all required validations pass)"}},"type":"object","required":["content_id","all_valid","results","can_launch"],"title":"ValidateLaunchResponse","description":"Response for launch validation."},"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"},"ValidationResultResponse":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform type"},"config_id":{"type":"string","title":"Config Id","description":"PlatformConfig ID"},"is_valid":{"type":"boolean","title":"Is Valid","description":"Whether validation passed"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"Validation errors"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"Validation warnings"}},"type":"object","required":["platform","config_id","is_valid"],"title":"ValidationResultResponse","description":"Response for a platform validation result."},"VersionListResponse":{"properties":{"content_id":{"type":"string","title":"Content Id"},"current_version":{"type":"integer","title":"Current Version"},"version_count":{"type":"integer","title":"Version Count"},"final":{"type":"boolean","title":"Final"},"final_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Reason"},"versions":{"items":{"$ref":"#/components/schemas/VersionResponse"},"type":"array","title":"Versions"}},"type":"object","required":["content_id","current_version","version_count","final","versions"],"title":"VersionListResponse"},"VersionResponse":{"properties":{"number":{"type":"integer","title":"Number"},"is_current":{"type":"boolean","title":"Is Current"},"media_id":{"type":"string","title":"Media Id"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"added_by":{"anyOf":[{"$ref":"#/components/schemas/PublicPerson"},{"type":"null"}]},"video":{"anyOf":[{"$ref":"#/components/schemas/EmbeddedMedia"},{"type":"null"}],"description":"The file, with a signed URL to play it"},"signoffs":{"items":{"$ref":"#/components/schemas/VersionSignOffResponse"},"type":"array","title":"Signoffs"},"signed_off_by_you":{"type":"boolean","title":"Signed Off By You","default":false}},"type":"object","required":["number","is_current","media_id"],"title":"VersionResponse"},"VersionSignOffResponse":{"properties":{"signed_by":{"anyOf":[{"$ref":"#/components/schemas/PublicPerson"},{"type":"null"}]},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Signed At"}},"type":"object","title":"VersionSignOffResponse"},"ViewerSessionRequest":{"properties":{"content_id":{"type":"string","minLength":1,"title":"Content Id"},"wallet_address":{"type":"string","minLength":1,"title":"Wallet Address"},"signature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signature","description":"personal_sign of the SIWE message from GET /v2/auth/wallet-nonce"},"nonce":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nonce","description":"Nonce issued by GET /v2/auth/wallet-nonce"}},"type":"object","required":["content_id","wallet_address"],"title":"ViewerSessionRequest"},"ViewerSessionResponse":{"properties":{"session_token":{"type":"string","title":"Session Token"},"profile_id":{"type":"string","title":"Profile Id"},"wallet_address":{"type":"string","title":"Wallet Address"}},"type":"object","required":["session_token","profile_id","wallet_address"],"title":"ViewerSessionResponse"},"WalletListResponse":{"properties":{"wallet_addresses":{"items":{"type":"string"},"type":"array","title":"Wallet Addresses"}},"type":"object","required":["wallet_addresses"],"title":"WalletListResponse"},"WalletRailsResponse":{"properties":{"wallet_rails":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Wallet Rails"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"WalletRailsResponse"},"WorkspaceApproverResponse":{"properties":{"kind":{"type":"string","enum":["profile","team"],"title":"Kind"},"member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Ref","description":"For kind=profile: the grantee's workspace-scoped member_ref"},"person":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Person","description":"For kind=profile: {member_ref, display_name, avatar_url, handle, is_you}"},"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id","description":"For kind=team: the linked team"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"granted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Granted At"}},"type":"object","required":["kind"],"title":"WorkspaceApproverResponse","description":"One grant of the release (Workspace.approvers), by public handle only."},"WorkspaceMemberResponse":{"properties":{"member_ref":{"type":"string","title":"Member Ref"},"role":{"type":"string","title":"Role"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"is_you":{"type":"boolean","title":"Is You","default":false},"can_approve":{"type":"boolean","title":"Can Approve","description":"Holds the release here: the owner, or granted by the owner","default":false}},"type":"object","required":["member_ref","role","joined_at"],"title":"WorkspaceMemberResponse","description":"Member info in response.\n\nPRIVACY (founder's rule, 2026-09-25): no profile ID. `member_ref` is the\nopaque handle the member routes accept."},"WorkspaceMentionableMemberResponse":{"properties":{"member_ref":{"type":"string","title":"Member Ref"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"name":{"type":"string","title":"Name"},"is_you":{"type":"boolean","title":"Is You","default":false},"role":{"type":"string","title":"Role"},"source":{"type":"string","enum":["owner","direct","team"],"title":"Source","description":"How the member has access: owner, direct (workspace member), or team (inherited)"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"via_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Via Team"}},"type":"object","required":["member_ref","name","role","source"],"title":"WorkspaceMentionableMemberResponse","description":"A member of a workspace (member list and @mention autocomplete).\n\nPRIVACY (founder's rule, 2026-09-25): no profile ID; mention with\n`member_ref`. `email` is the caller's own address on their own row\n(`is_you`) and, on other rows, only for a JubJub platform admin or an\nowner or admin of the workspace's team signed in interactively (Tom,\n2026-10-07; agent keys never see emails). `name` is a public name or, with\nnone, the member's role and team, never an email."},"WorkspaceMyPermissionsResponse":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role","description":"owner | admin | editor | viewer | a team role | null"},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"owner | member | team | dual | approver | trial | null"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"can_publish":{"type":"boolean","title":"Can Publish","default":false},"can_approve":{"type":"boolean","title":"Can Approve","default":false}},"type":"object","required":["workspace_id","permissions"],"title":"WorkspaceMyPermissionsResponse","description":"GET /v2/workspaces/{id}/my-permissions — the one answer to \"what may\nI do here\", the workspace twin of GET /v2/teams/{id}/my-permissions.\n\n`permissions` lists `publish:approve` only for the owner and for people\nthe owner granted it to; the team route never lists it."},"WorkspaceProgressSummary":{"properties":{"published":{"type":"integer","title":"Published","default":0},"in_progress":{"type":"integer","title":"In Progress","default":0},"pending":{"type":"integer","title":"Pending","default":0}},"type":"object","title":"WorkspaceProgressSummary","description":"Quick progress summary (3 categories) for workspace listing."},"WorkspaceResponse":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id"},"owner_member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Member Ref"},"owner":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Owner","description":"The owner's public profile: {member_ref, display_name, avatar_url, handle, is_you}. Null for an unclaimed trial."},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id","description":"Team this workspace belongs to (if linked)"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name","description":"Name of the linked team (for display)"},"my_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"My Role","description":"Role of the requesting user: 'owner', 'admin', 'editor', 'viewer', or null if not a member"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"kind":{"type":"string","enum":["workspace","collection"],"title":"Kind","default":"workspace"},"archived":{"type":"boolean","title":"Archived","default":false},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"archived_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archived By"},"archived_by_member_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archived By Member Ref"},"members":{"items":{"$ref":"#/components/schemas/WorkspaceMemberResponse"},"type":"array","title":"Members"},"approvers":{"items":{"$ref":"#/components/schemas/WorkspaceApproverResponse"},"type":"array","title":"Approvers","description":"Who, besides the owner, may release a launch of this workspace's content"},"can_approve":{"type":"boolean","title":"Can Approve","description":"Whether the caller may release a launch here","default":false},"stats":{"$ref":"#/components/schemas/WorkspaceStatsResponse"},"default_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Language"},"default_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Default Tags"},"split_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Split Override","description":"Workspace-level ownership/revenue split override"},"member_opt_outs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Member Opt Outs","description":"member_refs of members who opted out of the ownership split (never profile IDs)"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan","description":"Plan the workspace was created under"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When this workspace expires (None = permanent)"},"claimed_from_trial_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed From Trial At","description":"When this workspace was claimed out of the try-now flow (None if it never was)"}},"type":"object","required":["workspace_id","folder_id","name","description","cover_image_url","members","stats","default_language","default_tags","created_at","updated_at"],"title":"WorkspaceResponse","description":"Full workspace response."},"WorkspaceSharePreview":{"properties":{"workspace_name":{"type":"string","title":"Workspace Name"},"workspace_id":{"type":"string","title":"Workspace Id"},"created_by_name":{"type":"string","title":"Created By Name"},"auto_accept":{"type":"boolean","title":"Auto Accept"},"expires_at":{"type":"string","title":"Expires At"},"use_count":{"type":"integer","title":"Use Count"},"max_uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Uses"},"revoked":{"type":"boolean","title":"Revoked"},"contents":{"items":{"$ref":"#/components/schemas/ContentPreview"},"type":"array","title":"Contents"},"members":{"items":{"$ref":"#/components/schemas/MemberPreview"},"type":"array","title":"Members"}},"type":"object","required":["workspace_name","workspace_id","created_by_name","auto_accept","expires_at","use_count","max_uses","revoked","contents","members"],"title":"WorkspaceSharePreview"},"WorkspaceStatsResponse":{"properties":{"total_contents":{"type":"integer","title":"Total Contents"},"launched_contents":{"type":"integer","title":"Launched Contents"},"scheduled_contents":{"type":"integer","title":"Scheduled Contents"},"draft_contents":{"type":"integer","title":"Draft Contents"},"total_members":{"type":"integer","title":"Total Members"},"pending_launches":{"type":"integer","title":"Pending Launches"}},"type":"object","required":["total_contents","launched_contents","scheduled_contents","draft_contents","total_members","pending_launches"],"title":"WorkspaceStatsResponse","description":"Workspace statistics in response."},"WorkspaceSummary":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"owner":{"anyOf":[{"$ref":"#/components/schemas/PublicPersonResponse"},{"type":"null"}]},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"kind":{"type":"string","enum":["workspace","collection"],"title":"Kind","default":"workspace"},"total_contents":{"type":"integer","title":"Total Contents","default":0},"launched_contents":{"type":"integer","title":"Launched Contents","default":0},"progress":{"type":"integer","title":"Progress","default":0},"progress_summary":{"anyOf":[{"$ref":"#/components/schemas/WorkspaceProgressSummary"},{"type":"null"}]}},"type":"object","required":["workspace_id","name"],"title":"WorkspaceSummary","description":"Lightweight workspace data for inline display.\n\nPRIVACY (2026-09-25): no `owner_id`; `owner` is the owner's public profile\n(workspace-scoped member_ref) and `is_owner` says whether it is the caller."}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"Firebase Session","description":"Firebase session token (o mesmo que o frontend envia)"}}},"security":[{"BearerAuth":[]}]}