{"api_name":"SoLoSocialStudio External API","version":"v1","base_path":"/api/external/v1","auth":{"api_key_header":"Authorization: Bearer sss_live_... or x-api-key: sss_live_...","session_routes":[{"method":"GET","path":"/api/external/v1/keys"},{"method":"POST","path":"/api/external/v1/keys"},{"method":"DELETE","path":"/api/external/v1/keys/:id"},{"method":"GET","path":"/api/external/v1/connections/:platform/start"},{"method":"GET","path":"/api/external/v1/connections/:platform/callback"},{"method":"PUT","path":"/api/external/v1/settings/password"}]},"scopes":[{"name":"*","description":"Full access to all external API capabilities."},{"name":"posts:read","description":"Read post records and detail payloads."},{"name":"posts:write","description":"Create, update, and delete posts."},{"name":"posts:publish","description":"Trigger immediate publish_now jobs for posts."},{"name":"analytics:read","description":"Read analytics summaries and trend series."},{"name":"schedule:read","description":"Read scheduled jobs and queue state."},{"name":"schedule:write","description":"Reschedule or cancel existing publish jobs."},{"name":"brands:read","description":"List accessible brands and their content counts."},{"name":"platforms:read","description":"Read platform availability and config status."},{"name":"connections:read","description":"Read connected account metadata."},{"name":"connections:write","description":"Create, select, and disconnect connected platform accounts."},{"name":"ai:generate","description":"Generate captions, images, and videos."},{"name":"media-library:read","description":"List media library assets."},{"name":"media-library:write","description":"Import and register media assets."},{"name":"inbox:read","description":"Read social inbox events and summaries."},{"name":"inbox:write","description":"Mark inbox events read/unread."},{"name":"notifications:read","description":"Read operational notifications."},{"name":"review:read","description":"Read post review approvals and comments."},{"name":"review:write","description":"Request/review approvals and post comments."},{"name":"webhooks:read","description":"Read outbound webhook endpoints and deliveries."},{"name":"webhooks:write","description":"Create/update/delete outbound webhook endpoints."},{"name":"settings:read","description":"Read profile and schedule settings."},{"name":"settings:write","description":"Update profile and schedule settings."},{"name":"audit-logs:read","description":"Read workspace audit logs."}],"features":[{"id":"dashboard-home","name":"Dashboard Overview","coverage_status":"covered","app_surfaces":["/dashboard"],"external_resources":["analytics","schedule","posts","connections","platforms"],"documented_routes":["GET /api/external/v1/analytics","GET /api/external/v1/schedule","GET /api/external/v1/posts","GET /api/external/v1/connections","GET /api/external/v1/platforms"],"notes":"Dashboard summary widgets are represented by read routes for analytics, publishing schedule, drafts/posts, connected accounts, and supported platforms."},{"id":"post-composer-and-library","name":"Post Composer and Post Library","coverage_status":"covered","app_surfaces":["/dashboard/posts","/dashboard/posts/new"],"external_resources":["posts","content-folders","media-library","ai","schedule","uploads","review","platforms","connections"],"documented_routes":["GET /api/external/v1/posts","POST /api/external/v1/posts","GET /api/external/v1/posts/:id","PATCH /api/external/v1/posts/:id","POST /api/external/v1/posts/:id/publish-now","DELETE /api/external/v1/posts/:id","GET /api/external/v1/content-folders","POST /api/external/v1/content-folders","PATCH /api/external/v1/content-folders","DELETE /api/external/v1/content-folders","GET /api/external/v1/media-library","POST /api/external/v1/media-library","POST /api/external/v1/uploads/posts/sign","POST /api/external/v1/ai/caption","POST /api/external/v1/ai/image","POST /api/external/v1/ai/video","GET /api/external/v1/ai/video","GET /api/external/v1/ai/usage","GET /api/external/v1/schedule/available-slot","GET /api/external/v1/platforms","GET /api/external/v1/connections","POST /api/external/v1/review/approvals"],"notes":"Create/edit/delete posts, attach stored media, generate AI captions/images/videos, inspect AI usage/budget visibility, organize post folders, reserve schedule slots, submit approvals, and publish immediately."},{"id":"schedule","name":"Publishing Schedule","coverage_status":"covered","app_surfaces":["/dashboard/schedule"],"external_resources":["schedule"],"documented_routes":["GET /api/external/v1/schedule","GET /api/external/v1/schedule/available-slot","GET /api/external/v1/schedule/missing-content","PATCH /api/external/v1/schedule/:id","DELETE /api/external/v1/schedule/:id","DELETE /api/external/v1/schedule/attempts"],"notes":"Calendar list, next-slot lookup, missing-content diagnostics, job updates, and publish-attempt cleanup are represented."},{"id":"analytics","name":"Analytics","coverage_status":"covered","app_surfaces":["/dashboard/analytics"],"external_resources":["analytics"],"documented_routes":["GET /api/external/v1/analytics"],"notes":"External clients can request the same analytics aggregate used by the dashboard."},{"id":"connections","name":"Social Connections","coverage_status":"covered","app_surfaces":["/dashboard/connections"],"external_resources":["platforms","connections"],"documented_routes":["GET /api/external/v1/platforms","GET /api/external/v1/connections","GET /api/external/v1/connections/meta-pages","GET /api/external/v1/connections/:platform/start","GET /api/external/v1/connections/:platform/callback","POST /api/external/v1/connections/:platform","PATCH /api/external/v1/connections/:platform","DELETE /api/external/v1/connections/:platform"],"notes":"Connection listing, Meta page selection, interactive OAuth start/callback, manual Bluesky/Mastodon setup, and disconnect are covered. Per-user OAuth client settings and token verification remain session-only internal routes."},{"id":"media-library","name":"Media Library","coverage_status":"covered","app_surfaces":["/dashboard/media-library"],"external_resources":["media-library","content-folders","ai","uploads"],"documented_routes":["GET /api/external/v1/media-library","POST /api/external/v1/media-library","PATCH /api/external/v1/media-library","DELETE /api/external/v1/media-library","GET /api/external/v1/content-folders","POST /api/external/v1/content-folders","PATCH /api/external/v1/content-folders","DELETE /api/external/v1/content-folders","POST /api/external/v1/uploads/posts/sign","POST /api/external/v1/ai/image","POST /api/external/v1/ai/video","GET /api/external/v1/ai/video","GET /api/external/v1/ai/usage"],"notes":"List/import/register/update/delete media, manage media folders, request signed uploads, generate media assets, and inspect AI video usage/budget visibility."},{"id":"inbox","name":"Inbox","coverage_status":"covered","app_surfaces":["/dashboard/inbox"],"external_resources":["inbox"],"documented_routes":["GET /api/external/v1/inbox","PATCH /api/external/v1/inbox"],"notes":"Read and update inbox/conversation items."},{"id":"notifications","name":"Notifications","coverage_status":"covered","app_surfaces":["/dashboard/notifications","components/layout/Navbar"],"external_resources":["notifications"],"documented_routes":["GET /api/external/v1/notifications"],"notes":"Full notification lists and dashboard summary counts are available through the notifications resource."},{"id":"review","name":"Review and Approvals","coverage_status":"covered","app_surfaces":["/dashboard/review","/dashboard/posts"],"external_resources":["review"],"documented_routes":["GET /api/external/v1/review/approvals","POST /api/external/v1/review/approvals","PATCH /api/external/v1/review/approvals/:id","GET /api/external/v1/review/comments","POST /api/external/v1/review/comments"],"notes":"Approval queue, approval state changes, and review comments are represented."},{"id":"webhooks","name":"Outbound Webhooks","coverage_status":"covered","app_surfaces":["/dashboard/webhooks"],"external_resources":["webhooks"],"documented_routes":["GET /api/external/v1/webhooks/outbound","POST /api/external/v1/webhooks/outbound","PATCH /api/external/v1/webhooks/outbound/:id","DELETE /api/external/v1/webhooks/outbound/:id"],"notes":"List/create/update/delete outbound webhook endpoints and inspect recent deliveries."},{"id":"api-keys","name":"API Keys","coverage_status":"session-only","app_surfaces":["/dashboard/api-keys"],"external_resources":["api-keys"],"documented_routes":["GET /api/external/v1/keys","POST /api/external/v1/keys","DELETE /api/external/v1/keys/:id"],"notes":"Key lifecycle is intentionally session-authenticated so API keys cannot mint or revoke other API keys."},{"id":"settings-and-profile","name":"Settings and Profile","coverage_status":"covered","app_surfaces":["/dashboard/settings","/dashboard/profile"],"external_resources":["settings","connections"],"documented_routes":["GET /api/external/v1/settings","PUT /api/external/v1/settings","PUT /api/external/v1/settings/password","GET /api/external/v1/connections"],"notes":"Workspace settings and password updates are documented. Profile identity details come from the authenticated Supabase session rather than an external API-key route."},{"id":"audit-logs","name":"Audit Logs","coverage_status":"covered","app_surfaces":["/dashboard/audit"],"external_resources":["audit-logs"],"documented_routes":["GET /api/external/v1/audit-logs"],"notes":"External clients can query the audit trail shown in the dashboard."},{"id":"brands","name":"Brand Discovery and Scoping","coverage_status":"covered","app_surfaces":["components/providers/BrandProvider"],"external_resources":["brands"],"documented_routes":["GET /api/external/v1/brands"],"notes":"External callers discover brands and scope requests with x-solo-brand-id or brand_id. Without an explicit brand, API-key routes use the first accessible/default brand. Browser active-brand changes, brand creation/deletion, and schedule migration remain dashboard-only guarded flows."},{"id":"designer-labs","name":"Designer Labs","coverage_status":"internal-only","app_surfaces":["/dashboard/designer-labs/canvaslite","/dashboard/designer-labs/solodesignstudio"],"external_resources":[],"documented_routes":[],"notes":"CanvasLite and SoLoDesignStudio are embedded design-tool UI surfaces, not SoLoSocialStudio external API resources."},{"id":"youtube-advanced","name":"Advanced YouTube Automation","coverage_status":"covered","app_surfaces":["/dashboard/connections","/dashboard/posts/new"],"external_resources":["youtube"],"documented_routes":["GET /api/external/v1/youtube/playlists","POST /api/external/v1/youtube/playlists","POST /api/external/v1/youtube/comments","PATCH /api/external/v1/youtube/videos","DELETE /api/external/v1/youtube/videos","GET /api/external/v1/youtube/channel","GET /api/external/v1/youtube/captions","DELETE /api/external/v1/youtube/captions","POST /api/external/v1/youtube/videos/thumbnail","POST /api/external/v1/youtube/live","GET /api/external/v1/youtube/live","GET /api/external/v1/youtube/search","POST /api/external/v1/youtube/interact"],"notes":"Hosted YouTube publishing only needs connect/upload/basic stats; these routes document optional advanced workspace automation."},{"id":"ai-video-budget-usage","name":"AI Video Budget and Usage Visibility","coverage_status":"covered","app_surfaces":["/dashboard/posts/new","/dashboard/media-library"],"external_resources":["ai","media-library"],"documented_routes":["GET /api/external/v1/ai/usage"],"notes":"External clients can capture visible AI video budget, spend-cap, quota, and generated-video usage before and after a one-generation paid smoke test."}],"routes":[{"method":"GET","path":"/api/external/v1","resource":"meta","auth":"none","required_scopes":[],"description":"External API root summary with quick links.","internal_equivalent":null},{"method":"GET","path":"/api/external/v1/health","resource":"meta","auth":"none","required_scopes":[],"description":"Health check endpoint.","internal_equivalent":null},{"method":"GET","path":"/api/external/v1/reference","resource":"meta","auth":"none","required_scopes":[],"description":"Complete machine-readable route and scope inventory.","internal_equivalent":null},{"method":"GET","path":"/api/external/v1/whoami","resource":"meta","auth":"external-api-key","required_scopes":[],"description":"Resolve current API key identity and granted scopes.","internal_equivalent":null},{"method":"GET","path":"/api/external/v1/brands","resource":"brands","auth":"external-api-key","required_scopes":["brands:read"],"description":"List accessible brands with content counts. Use a valid x-solo-brand-id or ?brand_id=... on brand-scoped routes to target a specific brand; otherwise API-key routes use the first accessible/default brand.","internal_equivalent":"/api/brands"},{"method":"GET","path":"/api/external/v1/posts","resource":"posts","auth":"external-api-key","required_scopes":["posts:read"],"description":"List posts. Supports folder and tag organization metadata, plus optional ?folder=path/to/folder and ?tag=label filters.","internal_equivalent":"/api/posts"},{"method":"POST","path":"/api/external/v1/posts","resource":"posts","auth":"external-api-key","required_scopes":["posts:write"],"description":"Create a post. Supports folder_path, tags, core YouTube upload fields, and publish timing.","internal_equivalent":"/api/posts"},{"method":"GET","path":"/api/external/v1/posts/:id","resource":"posts","auth":"external-api-key","required_scopes":["posts:read"],"description":"Get a post by id.","internal_equivalent":"/api/posts/:id"},{"method":"PATCH","path":"/api/external/v1/posts/:id","resource":"posts","auth":"external-api-key","required_scopes":["posts:write"],"description":"Update a post, including folder_path and tags metadata, or trigger publish_now (requires posts:publish). For scheduled media, media_url must be an SSS storage_path such as library/<user-id>/<file>; import external URLs through /api/external/v1/media-library first.","internal_equivalent":"/api/posts/:id"},{"method":"POST","path":"/api/external/v1/posts/:id/publish-now","resource":"posts","auth":"external-api-key","required_scopes":["posts:publish"],"description":"Queue immediate publish_now execution for a post. Response includes publish_job when queue creation succeeds; queue insertion failures return 500 instead of silently leaving the post Scheduled.","internal_equivalent":"/api/posts/:id (PATCH action=publish_now)"},{"method":"DELETE","path":"/api/external/v1/posts/:id","resource":"posts","auth":"external-api-key","required_scopes":["posts:write"],"description":"Delete a post.","internal_equivalent":"/api/posts/:id"},{"method":"GET","path":"/api/external/v1/content-folders","resource":"content-folders","auth":"external-api-key","required_scopes":[],"scope_alternatives":[["posts:read"],["media-library:read"]],"description":"List explicit folders for posts or media. Requires ?scope=posts or ?scope=media.","internal_equivalent":"/api/content-folders"},{"method":"POST","path":"/api/external/v1/content-folders","resource":"content-folders","auth":"external-api-key","required_scopes":[],"scope_alternatives":[["posts:write"],["media-library:write"]],"description":"Create a folder for posts or media with scope plus either name+parent_path or folder_path.","internal_equivalent":"/api/content-folders"},{"method":"PATCH","path":"/api/external/v1/content-folders","resource":"content-folders","auth":"external-api-key","required_scopes":[],"scope_alternatives":[["posts:write"],["media-library:write"]],"description":"Rename or move a post or media folder. The required scope depends on the body scope.","internal_equivalent":"/api/content-folders"},{"method":"DELETE","path":"/api/external/v1/content-folders","resource":"content-folders","auth":"external-api-key","required_scopes":[],"scope_alternatives":[["posts:write"],["media-library:write"]],"description":"Delete an empty post or media folder. The required scope depends on the body scope.","internal_equivalent":"/api/content-folders"},{"method":"GET","path":"/api/external/v1/analytics","resource":"analytics","auth":"external-api-key","required_scopes":["analytics:read"],"description":"Analytics summary and trend data.","internal_equivalent":"/api/analytics"},{"method":"GET","path":"/api/external/v1/schedule","resource":"schedule","auth":"external-api-key","required_scopes":["schedule:read"],"description":"List publish jobs and queue state for jobs whose post row still exists. Optional query params: tag, post_id. Results are newest-first and capped at 200 rows; use post_id to verify a specific publish-now queue entry. Use missing-content to diagnose orphan queued/running jobs.","internal_equivalent":"/api/schedule"},{"method":"GET","path":"/api/external/v1/schedule/available-slot","resource":"schedule","auth":"external-api-key","required_scopes":["schedule:read"],"description":"Find the next best schedule slot.","internal_equivalent":"/api/schedule/available-slot"},{"method":"GET","path":"/api/external/v1/schedule/missing-content","resource":"schedule","auth":"external-api-key","required_scopes":["schedule:read"],"description":"List queued jobs with missing media assets or missing post records.","internal_equivalent":"/api/schedule/missing-content"},{"method":"PATCH","path":"/api/external/v1/schedule/:id","resource":"schedule","auth":"external-api-key","required_scopes":["schedule:write"],"description":"Reschedule a queued publish job.","internal_equivalent":"/api/schedule/:id"},{"method":"DELETE","path":"/api/external/v1/schedule/:id","resource":"schedule","auth":"external-api-key","required_scopes":["schedule:write"],"description":"Cancel a queued or running publish job; orphan jobs whose post row no longer exists are deleted and return orphaned_post=true, deleted=true.","internal_equivalent":"/api/schedule/:id"},{"method":"GET","path":"/api/external/v1/platforms","resource":"platforms","auth":"external-api-key","required_scopes":["platforms:read"],"description":"List platform readiness and publish support.","internal_equivalent":"/api/platforms"},{"method":"GET","path":"/api/external/v1/connections","resource":"connections","auth":"external-api-key","required_scopes":["connections:read"],"description":"List connected accounts.","internal_equivalent":"/api/connections"},{"method":"GET","path":"/api/external/v1/connections/meta-pages","resource":"connections","auth":"external-api-key","required_scopes":["connections:read"],"description":"List Facebook Pages or Instagram business accounts available through the connected Meta user token for the resolved brand.","internal_equivalent":"/api/connections/meta-pages"},{"method":"GET","path":"/api/external/v1/connections/:platform/start","resource":"connections","auth":"session","required_scopes":[],"description":"Start OAuth connect flow for a platform.","internal_equivalent":"/api/oauth/:platform/start"},{"method":"GET","path":"/api/external/v1/connections/:platform/callback","resource":"connections","auth":"session","required_scopes":[],"description":"OAuth callback bridge for platform connection flow.","internal_equivalent":"/api/oauth/:platform/callback"},{"method":"POST","path":"/api/external/v1/connections/:platform","resource":"connections","auth":"external-api-key","required_scopes":["connections:write"],"description":"Create a manual connection for Bluesky or Mastodon.","internal_equivalent":"/api/connections/:platform"},{"method":"PATCH","path":"/api/external/v1/connections/:platform","resource":"connections","auth":"external-api-key","required_scopes":["connections:write"],"description":"Select a specific Facebook Page or Instagram business account from the connected Meta account for the resolved brand.","internal_equivalent":"/api/connections/:platform"},{"method":"DELETE","path":"/api/external/v1/connections/:platform","resource":"connections","auth":"external-api-key","required_scopes":["connections:write"],"description":"Disconnect a platform account.","internal_equivalent":"/api/connections/:platform"},{"method":"GET","path":"/api/external/v1/notifications","resource":"notifications","auth":"external-api-key","required_scopes":["notifications:read"],"description":"Read queue/token/publish notifications and summary counts.","internal_equivalent":"/api/notifications"},{"method":"GET","path":"/api/external/v1/inbox","resource":"inbox","auth":"external-api-key","required_scopes":["inbox:read"],"description":"Read social inbox events.","internal_equivalent":"/api/inbox"},{"method":"PATCH","path":"/api/external/v1/inbox","resource":"inbox","auth":"external-api-key","required_scopes":["inbox:write"],"description":"Mark inbox events read/unread.","internal_equivalent":"/api/inbox"},{"method":"GET","path":"/api/external/v1/media-library","resource":"media-library","auth":"external-api-key","required_scopes":["media-library:read"],"description":"List media library items. Supports folder and tag organization metadata, plus optional ?folder=path/to/folder and ?tag=label filters.","internal_equivalent":"/api/media-library"},{"method":"POST","path":"/api/external/v1/media-library","resource":"media-library","auth":"external-api-key","required_scopes":["media-library:write"],"description":"Import/register media library items. Supports tags and folder_path metadata. Use source_url to fetch a remote asset into SSS storage, then use the returned storage_path as media_url on post create/update.","internal_equivalent":"/api/media-library"},{"method":"PATCH","path":"/api/external/v1/media-library","resource":"media-library","auth":"external-api-key","required_scopes":["media-library:write"],"description":"Bulk update media library tags and folder_path metadata by passing id or ids.","internal_equivalent":"/api/media-library"},{"method":"DELETE","path":"/api/external/v1/media-library","resource":"media-library","auth":"external-api-key","required_scopes":["media-library:write"],"description":"Delete one or more media library items by id and remove their stored assets when present.","internal_equivalent":"/api/media-library"},{"method":"GET","path":"/api/external/v1/review/approvals","resource":"review","auth":"external-api-key","required_scopes":["review:read"],"description":"List review approvals.","internal_equivalent":"/api/review/approvals"},{"method":"POST","path":"/api/external/v1/review/approvals","resource":"review","auth":"external-api-key","required_scopes":["review:write"],"description":"Create a review approval request.","internal_equivalent":"/api/review/approvals"},{"method":"PATCH","path":"/api/external/v1/review/approvals/:id","resource":"review","auth":"external-api-key","required_scopes":["review:write"],"description":"Approve, reject, request changes, or cancel an approval.","internal_equivalent":"/api/review/approvals/:id"},{"method":"GET","path":"/api/external/v1/review/comments","resource":"review","auth":"external-api-key","required_scopes":["review:read"],"description":"List review comments for a post.","internal_equivalent":"/api/review/comments"},{"method":"POST","path":"/api/external/v1/review/comments","resource":"review","auth":"external-api-key","required_scopes":["review:write"],"description":"Create a review comment for a post.","internal_equivalent":"/api/review/comments"},{"method":"DELETE","path":"/api/external/v1/schedule/attempts","resource":"schedule","auth":"external-api-key","required_scopes":["schedule:write"],"description":"Clear recent publish attempts by scope (failed or all). This does not delete historical canceled schedule jobs/rows.","internal_equivalent":"/api/schedule/attempts"},{"method":"GET","path":"/api/external/v1/settings","resource":"settings","auth":"external-api-key","required_scopes":["settings:read"],"description":"Read profile and schedule settings.","internal_equivalent":"/api/settings"},{"method":"PUT","path":"/api/external/v1/settings","resource":"settings","auth":"external-api-key","required_scopes":["settings:write"],"description":"Update profile and schedule settings.","internal_equivalent":"/api/settings"},{"method":"PUT","path":"/api/external/v1/settings/password","resource":"settings","auth":"session","required_scopes":[],"description":"Update the current user's password.","internal_equivalent":"/api/settings/password"},{"method":"GET","path":"/api/external/v1/audit-logs","resource":"audit-logs","auth":"external-api-key","required_scopes":["audit-logs:read"],"description":"Read workspace audit logs.","internal_equivalent":"/api/audit-logs"},{"method":"POST","path":"/api/external/v1/ai/caption","resource":"ai","auth":"external-api-key","required_scopes":["ai:generate"],"description":"Generate text captions.","internal_equivalent":"/api/ai/caption"},{"method":"POST","path":"/api/external/v1/ai/image","resource":"ai","auth":"external-api-key","required_scopes":["ai:generate"],"description":"Generate image assets and store to media library.","internal_equivalent":"/api/ai/image"},{"method":"POST","path":"/api/external/v1/ai/video","resource":"ai","auth":"external-api-key","required_scopes":["ai:generate"],"description":"Start AI video generation operation.","internal_equivalent":"/api/ai/video"},{"method":"GET","path":"/api/external/v1/ai/video","resource":"ai","auth":"external-api-key","required_scopes":["ai:generate"],"description":"Poll AI video generation operation.","internal_equivalent":"/api/ai/video"},{"method":"GET","path":"/api/external/v1/ai/usage","resource":"ai","auth":"external-api-key","required_scopes":["ai:generate"],"description":"Read AI video usage, budget, quota, credits, and spend-cap visibility for paid smoke-test controls without starting generation.","internal_equivalent":"/api/ai/usage"},{"method":"GET","path":"/api/external/v1/youtube/playlists","resource":"youtube","auth":"external-api-key","required_scopes":["posts:read"],"description":"Advanced YouTube workspace route for playlist lookup on the connected account. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"POST","path":"/api/external/v1/youtube/playlists","resource":"youtube","auth":"external-api-key","required_scopes":["posts:write"],"description":"Advanced YouTube workspace route for playlist placement. Required: 'video_id', 'playlist_id'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"POST","path":"/api/external/v1/youtube/comments","resource":"youtube","auth":"external-api-key","required_scopes":["posts:write"],"description":"Advanced YouTube workspace route for comment publishing. Required: 'video_id', 'text'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"PATCH","path":"/api/external/v1/youtube/videos","resource":"youtube","auth":"external-api-key","required_scopes":["posts:write"],"description":"Advanced YouTube workspace route for video metadata updates. Required: 'video_id', 'snippet'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"DELETE","path":"/api/external/v1/youtube/videos","resource":"youtube","auth":"external-api-key","required_scopes":["posts:write"],"description":"Advanced YouTube workspace route for video deletion. Required parameter: 'video_id'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"GET","path":"/api/external/v1/youtube/channel","resource":"youtube","auth":"external-api-key","required_scopes":["connections:read"],"description":"Get connected YouTube channel metadata and basic statistics used by the hosted publishing flow.","internal_equivalent":null},{"method":"GET","path":"/api/external/v1/youtube/captions","resource":"youtube","auth":"external-api-key","required_scopes":["posts:read"],"description":"Advanced YouTube workspace route for caption lookup. Required parameter: 'video_id'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"DELETE","path":"/api/external/v1/youtube/captions","resource":"youtube","auth":"external-api-key","required_scopes":["posts:write"],"description":"Advanced YouTube workspace route for caption deletion. Required parameters: 'video_id', 'caption_id'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"POST","path":"/api/external/v1/youtube/videos/thumbnail","resource":"youtube","auth":"external-api-key","required_scopes":["posts:write"],"description":"Advanced YouTube workspace route for custom thumbnails. Required: 'video_id', 'media_url'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"POST","path":"/api/external/v1/youtube/live","resource":"youtube","auth":"external-api-key","required_scopes":["posts:write"],"description":"Advanced YouTube workspace route for Live Broadcast and Stream management. Required: 'action'. Supports 'create_broadcast', 'create_stream', 'bind', 'transition', 'chat_post'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"GET","path":"/api/external/v1/youtube/live","resource":"youtube","auth":"external-api-key","required_scopes":["posts:read"],"description":"Advanced YouTube workspace route for YouTube Live data retrieval. Action 'chat_list' requires 'live_chat_id'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"GET","path":"/api/external/v1/youtube/search","resource":"youtube","auth":"external-api-key","required_scopes":["posts:read"],"description":"Advanced YouTube workspace route for YouTube search across videos, channels, or playlists. Required: 'q'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"POST","path":"/api/external/v1/youtube/interact","resource":"youtube","auth":"external-api-key","required_scopes":["posts:write"],"description":"Advanced YouTube workspace route for content interaction. Required: 'action', 'target_id'. Actions: 'like', 'rate', 'subscribe'. Not required for the standard hosted YouTube publishing flow.","internal_equivalent":null},{"method":"POST","path":"/api/external/v1/uploads/posts/sign","resource":"uploads","auth":"external-api-key","required_scopes":["posts:write"],"description":"Create signed upload URL for post assets.","internal_equivalent":null},{"method":"GET","path":"/api/external/v1/webhooks/outbound","resource":"webhooks","auth":"external-api-key","required_scopes":["webhooks:read"],"description":"List outbound webhooks and recent deliveries.","internal_equivalent":"/api/webhooks/outbound"},{"method":"POST","path":"/api/external/v1/webhooks/outbound","resource":"webhooks","auth":"external-api-key","required_scopes":["webhooks:write"],"description":"Create outbound webhook endpoint.","internal_equivalent":"/api/webhooks/outbound"},{"method":"PATCH","path":"/api/external/v1/webhooks/outbound/:id","resource":"webhooks","auth":"external-api-key","required_scopes":["webhooks:write"],"description":"Update outbound webhook endpoint.","internal_equivalent":"/api/webhooks/outbound/:id"},{"method":"DELETE","path":"/api/external/v1/webhooks/outbound/:id","resource":"webhooks","auth":"external-api-key","required_scopes":["webhooks:write"],"description":"Delete outbound webhook endpoint.","internal_equivalent":"/api/webhooks/outbound/:id"},{"method":"GET","path":"/api/external/v1/keys","resource":"api-keys","auth":"session","required_scopes":[],"description":"List API keys for current user.","internal_equivalent":"/api/external/v1/keys"},{"method":"POST","path":"/api/external/v1/keys","resource":"api-keys","auth":"session","required_scopes":[],"description":"Create API key for current user.","internal_equivalent":"/api/external/v1/keys"},{"method":"DELETE","path":"/api/external/v1/keys/:id","resource":"api-keys","auth":"session","required_scopes":[],"description":"Revoke API key for current user.","internal_equivalent":"/api/external/v1/keys/:id"}],"generated_at":"2026-06-10T10:44:26.390Z","route_count":72,"scope_count":24,"feature_count":17,"resources":["ai","analytics","api-keys","audit-logs","brands","connections","content-folders","inbox","media-library","meta","notifications","platforms","posts","review","schedule","settings","uploads","webhooks","youtube"],"internal_exclusions":[{"method":"GET","path":"/api/auth/callback","reason":"Supabase auth redirect callback used by browser login flows."},{"method":"GET","path":"/api/auth/me","reason":"Session-auth identity route for browser UI state; external callers use GET /api/external/v1/whoami."},{"method":"GET","path":"/api/auth/sign-in","reason":"Logto browser sign-in redirect route, not an API-key automation endpoint."},{"method":"GET","path":"/api/auth/sign-out","reason":"Logto browser sign-out redirect route, not an API-key automation endpoint."},{"method":"GET","path":"/api/publish/run","reason":"Internal publish runner endpoint guarded by PUBLISH_RUNNER_SECRET."},{"method":"POST","path":"/api/storage/upload","reason":"Session-auth raw storage upload helper; external callers use POST /api/external/v1/media-library or POST /api/external/v1/uploads/posts/sign."},{"method":"GET","path":"/api/webhooks/meta","reason":"Inbound Meta verification webhook endpoint."},{"method":"POST","path":"/api/webhooks/meta","reason":"Inbound Meta webhook delivery endpoint."},{"method":"GET","path":"/api/connections/verify","reason":"Session-auth route used by the dashboard to verify connected account tokens."},{"method":"POST","path":"/api/brands","reason":"Dashboard brand creation changes workspace structure and active browser state; external callers should use GET /api/external/v1/brands for discovery."},{"method":"PATCH","path":"/api/brands","reason":"Dashboard active-brand switching is browser-session state; external callers scope requests with x-solo-brand-id or brand_id."},{"method":"DELETE","path":"/api/brands","reason":"Brand deletion is destructive and requires the dashboard confirmation flow."},{"method":"POST","path":"/api/brands/move-schedule","reason":"Schedule migration between brands is a dashboard recovery action that requires careful review before moving jobs."},{"method":"GET","path":"/api/settings/platform-oauth/:platform","reason":"Session-auth settings route for managing per-user platform OAuth client credentials."},{"method":"PUT","path":"/api/settings/platform-oauth/:platform","reason":"Session-auth settings route for saving per-user platform OAuth client credentials."},{"method":"DELETE","path":"/api/settings/platform-oauth/:platform","reason":"Session-auth settings route for removing per-user platform OAuth client credentials."}]}