{"openapi":"3.0.3","info":{"title":"AgentSocial API","version":"1.0.0","description":"Agent-first social media management API"},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key"},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{}},"paths":{"/privacy":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/terms":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/health":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ready":{"get":{"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"postgres":{"type":"string"},"redis":{"type":"string"}},"required":["status","postgres"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"postgres":{"type":"string"},"redis":{"type":"string"}},"required":["status","postgres"],"additionalProperties":false}}}}}}},"/api/v1/auth/register":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/auth/login":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/auth/me":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/auth/api-keys":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"permissions":{"type":"array","items":{"type":"string","enum":["read","write","admin"]}},"expires_at":{"type":"string","format":"date-time"}},"required":["name"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/oauth/authorize":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"api_key":{"type":"string","minLength":1},"client_id":{"type":"string","minLength":1,"maxLength":200},"redirect_uri":{"type":"string","format":"uri","maxLength":1000},"code_challenge":{"type":"string","minLength":43,"maxLength":128},"code_challenge_method":{"type":"string","enum":["S256","plain"],"default":"S256"},"scope":{"type":"string","maxLength":200,"default":""},"state":{"type":"string","maxLength":500}},"required":["api_key","client_id","redirect_uri","code_challenge"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/oauth/token":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"grant_type":{"type":"string","enum":["authorization_code","refresh_token"]},"code":{"type":"string"},"redirect_uri":{"type":"string","format":"uri"},"code_verifier":{"type":"string","minLength":43,"maxLength":128},"refresh_token":{"type":"string"},"client_id":{"type":"string"}},"required":["grant_type"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/mcp/":{"post":{"responses":{"200":{"description":"Default Response"}}},"get":{"responses":{"200":{"description":"Default Response"}}},"delete":{"responses":{"200":{"description":"Default Response"}}}},"/developers/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/developers/llms.txt":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/developers/scopes":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/brands/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/brands/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/brands/{id}/report-branding":{"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/brands/{id}/muapi-key":{"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/onboarding/status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update a channel","tags":["Channels"],"description":"Rename a channel and/or merge settings (auto_reply_enabled, auto_reply_message, post_defaults). Omitted fields are unchanged.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the channel"},"settings":{"type":"object","properties":{"auto_reply_enabled":{"type":"boolean"},"auto_reply_message":{"type":"string"},"post_defaults":{"type":"object","properties":{"add_utm":{"type":"boolean"},"utm_source":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/facebook/auth":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/instagram/auth":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/twitter/auth":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/linkedin/auth":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/tiktok/auth":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/connect":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","minLength":1},"platform":{"type":"string","enum":["twitter","linkedin","facebook","instagram","youtube","tiktok","wordpress","bluesky"]}},"required":["brand_id","platform"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/{id}/composio-sync":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/{id}/disconnect":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/posts/":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","minLength":1},"content":{"type":"string","minLength":1,"maxLength":5000},"content_html":{"type":"string"},"channels":{"type":"array","items":{"type":"string"},"minItems":1},"media":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["image","video"]},"url":{"type":"string","format":"uri"},"alt_text":{"type":"string"}},"required":["type","url"],"additionalProperties":false}},"scheduled_at":{"type":"string","format":"date-time"},"timezone":{"type":"string","default":"UTC"},"tags":{"type":"array","items":{"type":"string"}},"platform_variants":{"type":"object","additionalProperties":{"type":"object","properties":{"content":{"type":"string"}},"additionalProperties":false}}},"required":["brand_id","content","channels"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}},"get":{"parameters":[{"schema":{"type":"string"},"in":"query","name":"brand_id","required":false},{"schema":{"type":"string","enum":["draft","in_review","approved","rejected","scheduled","published","failed","cancelled"]},"in":"query","name":"status","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false},{"schema":{"type":"string"},"in":"query","name":"date_from","required":false},{"schema":{"type":"string"},"in":"query","name":"date_to","required":false},{"schema":{"type":"integer","default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","default":0},"in":"query","name":"offset","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/posts/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","minLength":1,"maxLength":5000},"content_html":{"type":"string"},"channels":{"type":"array","items":{"type":"string"}},"scheduled_at":{"type":"string","format":"date-time"},"timezone":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/posts/{id}/publish":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/posts/{id}/submit-for-review":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/posts/{id}/approve":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/posts/{id}/reject":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/posts/{id}/review-comments":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/posts/{id}/cancel":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/posts/{id}/duplicate":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/api-keys/":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"permissions":{"type":"array","items":{"type":"string","enum":["read","write","admin"]}},"expires_in_days":{"type":"number","minimum":1,"maximum":365}},"required":["name"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}},"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/api-keys/{id}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/api-keys/me":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/comments/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/comments/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/comments/{id}/reply":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","minLength":1,"maxLength":1000},"use_ai_suggestion":{"type":"boolean","default":false}},"required":["content"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/comments/bulk":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"minItems":1},"action":{"type":"string","enum":["mark_read","mark_unread","archive","set_priority"]},"priority":{"type":"string","enum":["low","medium","high","urgent"]}},"required":["ids","action"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/comments/{id}/suggest-reply":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"tone":{"type":"string","enum":["friendly","professional","humorous"],"default":"friendly"},"include_cta":{"type":"boolean","default":false}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/media/":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/media/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/analytics/dashboard":{"get":{"parameters":[{"schema":{"type":"string"},"in":"query","name":"brand_id","required":false},{"schema":{"type":"string"},"in":"query","name":"channel_id","required":false},{"schema":{"type":"string","enum":["24h","7d","30d","90d","custom"],"default":"7d"},"in":"query","name":"period","required":false},{"schema":{"type":"string"},"in":"query","name":"start_date","required":false},{"schema":{"type":"string"},"in":"query","name":"end_date","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/analytics/posts/{post_id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"post_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/analytics/export":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","minLength":1},"period":{"type":"string","enum":["24h","7d","30d","90d","custom"]},"format":{"type":"string","enum":["pdf","csv","xlsx"],"default":"pdf"},"include_charts":{"type":"boolean","default":true},"branded":{"type":"boolean","default":true}},"required":["brand_id","period"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/analytics/exports/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/analytics/exports/{id}/download":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/analytics/exports/{id}/share":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/analytics/exports/share/{shareId}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"shareId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/analytics/exports/shared/{token}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"token","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/webhooks/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["post.scheduled","post.published","post.failed","comment.received","generate.completed","generate.failed","message.delivered","message.failed","call.completed"]}},"secret":{"type":"string","minLength":16},"active":{"type":"boolean","default":true}},"required":["url","events"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/webhooks/{id}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/callback/twitter":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/callback/linkedin":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/callback/instagram":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/facebook/callback":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/callback/tiktok":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/sync/analytics":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"channel_id":{"type":"string","format":"uuid"},"start_date":{"type":"string"},"end_date":{"type":"string"}},"required":["brand_id"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/browser-connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/channels/browser-supported":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/competitors/":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"platform":{"type":"string","enum":["twitter","instagram","facebook","tiktok","linkedin"]},"handle":{"type":"string","minLength":1,"maxLength":100}},"required":["brand_id","platform","handle"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/competitors/{profileId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"profileId","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"profileId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/competitors/{profileId}/refresh":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"profileId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/competitors/refresh-all":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"}},"required":["brand_id"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/competitors/{profileId}/posts":{"get":{"parameters":[{"schema":{"type":"number","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"path","name":"profileId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/listening/keywords":{"post":{"responses":{"200":{"description":"Default Response"}}},"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/listening/keywords/{id}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/listening/hits":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"keyword_id","required":false},{"schema":{"type":"string","enum":["twitter","instagram","facebook","tiktok","linkedin","youtube"]},"in":"query","name":"platform","required":false},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"reviewed","required":false},{"schema":{"type":"number","minimum":1,"maximum":200,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"number","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/listening/hits/{id}":{"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/listening/settings":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/listening/collect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/plans":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/status":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/init-plans":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/checkout":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"plan":{"type":"string","enum":["pro","agency"]}},"required":["brand_id","plan"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/cancel":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"}},"required":["brand_id"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/check-access":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true},{"schema":{"type":"string"},"in":"query","name":"feature","required":true},{"schema":{"type":"number","default":0},"in":"query","name":"current","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/webhook":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/tiers":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/subscription":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/subscription/upgrade":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"target_tier_id":{"type":"string","enum":["core","pro","elite"]}},"required":["brand_id","target_tier_id"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/subscription/downgrade":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"target_tier_id":{"type":"string","enum":["core","pro","elite"]}},"required":["brand_id","target_tier_id"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/subscription/cancel":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"reason":{"type":"string"}},"required":["brand_id"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/billing/history":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clipify/sources":{"post":{"tags":["Clipify"],"description":"Create a new video source and start processing","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"},"sourceType":{"type":"string","enum":["upload","youtube","podcast","url"],"default":"upload"},"language":{"type":"string","default":"en"},"maxClips":{"type":"number","minimum":1,"maximum":20,"default":5},"formats":{"type":"array","items":{"type":"string","enum":["9:16","16:9","1:1"]},"default":["9:16"]},"style":{"type":"string","enum":["opus","karaoke","minimal"],"default":"opus"},"reframeMode":{"type":"string","enum":["pan","split-screen","center-crop"],"default":"center-crop"}},"additionalProperties":false}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string","nullable":true},"status":{"type":"string"},"sourceUrl":{"type":"string","nullable":true},"sourceType":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","title","status","sourceUrl","sourceType","createdAt"],"additionalProperties":false},"message":{"type":"string"}},"required":["source","message"],"additionalProperties":false}}}}}},"get":{"tags":["Clipify"],"description":"List all video sources for brand","responses":{"200":{"description":"Default Response"}}}},"/api/v1/clipify/sources/{id}/upload":{"post":{"tags":["Clipify"],"description":"Upload a video file for processing","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clipify/sources/{id}":{"get":{"tags":["Clipify"],"description":"Get video source details and generated clips","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"tags":["Clipify"],"description":"Delete video source and all clips","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clipify/clips":{"get":{"tags":["Clipify"],"description":"List all clips for brand","responses":{"200":{"description":"Default Response"}}}},"/api/v1/clipify/clips/{id}":{"get":{"tags":["Clipify"],"description":"Get clip details","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"tags":["Clipify"],"description":"Delete a clip","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clipify/clips/{id}/render":{"post":{"tags":["Clipify"],"description":"Re-render a clip with new settings","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"format":{"type":"string","enum":["9:16","16:9","1:1"]},"style":{"type":"string","enum":["opus","karaoke","minimal"]},"reframeMode":{"type":"string","enum":["pan","split-screen","center-crop"]},"language":{"type":"string"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clipify/clips/{id}/video":{"get":{"tags":["Clipify"],"description":"Stream clip video file","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clipify/clips/{id}/transcript":{"get":{"tags":["Clipify"],"description":"Get clip transcript with word timestamps","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/widget":{"get":{"responses":{"200":{"description":"Default Response"}}},"put":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/widget/sessions":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/widget/sessions/{sessionId}/messages":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"sessionId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/widget/sessions/{sessionId}/end":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"sessionId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/widget/analytics":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/widget/followups":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/widget/followups/{id}/retry":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/reviews":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/reviews/{reviewId}/respond":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"reviewId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/reviews/{reviewId}/ai-suggest":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"reviewId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/reviews/{reviewId}/flag":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"reviewId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/reviews/{reviewId}/escalate":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"reviewId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/reviews/flagged":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/reviews/bulk-ai-suggest":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/posts":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/posts/{postId}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"postId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/questions":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/questions/{questionId}/answer":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"questionId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/{id}/questions/{questionId}/ai-suggest":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"questionId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/solicitations":{"post":{"responses":{"200":{"description":"Default Response"}}},"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/solicitations/{id}/send":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/solicitations/{id}/track":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/solicitations/stats":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/booking/config":{"get":{"responses":{"200":{"description":"Default Response"}}},"put":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/booking/stats":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/booking/recent":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/ads/accounts":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/ads/accounts/{accountId}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"accountId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/ads/campaigns":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/ads/stats":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/conversion/track":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/conversion/stats":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gbp/conversion/trend":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/auth/google/connect":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/auth/google/callback":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/auth/google/status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/auth/google/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/campaigns/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/campaigns/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/campaigns/{id}/stats":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/campaigns/{id}/messages":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/manager/dashboard":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/manager/clients":{"get":{"parameters":[{"schema":{"type":"string","enum":["starter","growth","pro","enterprise"]},"in":"query","name":"tier","required":false},{"schema":{"type":"string","enum":["active","onboarding","at_risk","churned","paused"]},"in":"query","name":"status","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/manager/clients/{brandId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/manager/clients/{brandId}/assign":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"managerId":{"type":"string"}},"required":["managerId"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/manager/clients/{brandId}/notes":{"put":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"notes":{"type":"string"}},"required":["notes"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/profiles/{slug}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/profiles/{slug}/reviews":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/profiles/{slug}/services":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/profiles/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/landing-pages/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/landing-pages/{slug}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/landing-pages/{slug}/publish":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/landing-pages/{slug}/unpublish":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/twilio/sms":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/twilio/sms-status":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/twilio/voice-status":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/twilio/call-status":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/twilio/voice":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/twilio/calls":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/twilio/sms/send":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/composio/accounts":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/composio/accounts/{accountId}":{"delete":{"summary":"Delete a Composio connected account","tags":["Channels"],"description":"Safe by default: if a channel that is not disconnected still uses this account, returns 409 account_in_use listing those channels. Pass cascade=true to delete anyway and mark those channels disconnected (keeping their id, name and history) in the same operation; reconnecting the platform later re-links the same channel.","parameters":[{"schema":{"type":"string"},"in":"query","name":"brand_id","required":true,"description":"Brand that owns the connected account"},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"cascade","required":false,"description":"Disconnect dependent channels instead of returning 409"},{"schema":{"type":"string"},"in":"path","name":"accountId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/composio/connect":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","minLength":1},"toolkit":{"type":"string","enum":["twitter","linkedin","facebook","instagram","tiktok","youtube"]},"redirect_url":{"type":"string","format":"uri"},"replace":{"type":"boolean"}},"required":["brand_id","toolkit"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/composio/execute":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","minLength":1},"action_name":{"type":"string","minLength":1},"params":{"type":"object","additionalProperties":{},"default":{}},"connected_account_id":{"type":"string"}},"required":["brand_id","action_name"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ai/status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ai/voice":{"get":{"responses":{"200":{"description":"Default Response"}}},"put":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ai/best-times":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ai/captions":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ai/plan":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ai/plan/apply":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/hub/{brandId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandId","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/profiles":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/profiles/{profileId}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"profileId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/accounts":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/accounts/{accountId}/health":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"accountId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/accounts/{accountId}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"accountId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/connect/{platform}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"platform","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"platform","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/posts":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/posts/{postId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"postId","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"postId","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"postId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/posts/{postId}/retry":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"postId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/inbox/conversations":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/inbox/conversations/{conversationId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"conversationId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/inbox/conversations/{conversationId}/messages":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"conversationId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/inbox/conversations/{conversationId}/send":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"conversationId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/inbox/comments":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/inbox/posts/{postId}/comments":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"postId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/inbox/posts/{postId}/reply":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"postId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/inbox/reviews":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/inbox/reviews/{reviewId}/reply":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"reviewId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/contacts":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/contacts/{contactId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/contacts/bulk":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/broadcasts":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/broadcasts/{broadcastId}/send":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"broadcastId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/broadcasts/{broadcastId}/schedule":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"broadcastId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/broadcasts/{broadcastId}/recipients":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"broadcastId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/sequences":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/sequences/{sequenceId}/activate":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"sequenceId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/sequences/{sequenceId}/enroll":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"sequenceId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/automations":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/automations/{automationId}":{"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"automationId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/analytics/posts":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/analytics/daily":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/analytics/best-time":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/media/presign":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/social/usage":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gemini/text":{"post":{"tags":["Gemini"],"description":"Generate text content using Gemini (social posts, captions, ad copy)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":10000},"model":{"type":"string"},"maxTokens":{"type":"number","minimum":1,"maximum":8192},"temperature":{"type":"number","minimum":0,"maximum":2},"topP":{"type":"number","minimum":0,"maximum":1},"systemInstruction":{"type":"string","maxLength":4000}},"required":["prompt"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"model":{"type":"string"},"usage":{"type":"object","properties":{"promptTokens":{"type":"number"},"completionTokens":{"type":"number"},"totalTokens":{"type":"number"}},"required":["promptTokens","completionTokens","totalTokens"],"additionalProperties":false}},"required":["text","model"],"additionalProperties":false}}}}}}},"/api/v1/gemini/image":{"post":{"tags":["Gemini"],"description":"Generate images using Gemini Omni","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":4000},"model":{"type":"string"},"numberOfImages":{"type":"number","minimum":1,"maximum":4},"aspectRatio":{"type":"string","enum":["1:1","3:4","4:3","9:16","16:9"]}},"required":["prompt"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"images":{"type":"array","items":{"type":"object","properties":{"data":{"type":"string"},"mimeType":{"type":"string"}},"required":["data","mimeType"],"additionalProperties":false}},"model":{"type":"string"}},"required":["images","model"],"additionalProperties":false}}}}}}},"/api/v1/gemini/video":{"post":{"tags":["Gemini"],"description":"Generate video using Gemini Omni (async — returns jobId for polling)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":4000},"model":{"type":"string"},"aspectRatio":{"type":"string","enum":["16:9","9:16"]},"negativePrompt":{"type":"string","maxLength":1000},"numberOfVideos":{"type":"number","minimum":1,"maximum":4},"personGeneration":{"type":"string","enum":["allow_all","allow_adult"]}},"required":["prompt"],"additionalProperties":false}}},"required":true},"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"status":{"type":"string"},"model":{"type":"string"},"message":{"type":"string"}},"required":["jobId","status","model","message"],"additionalProperties":false}}}}}}},"/api/v1/gemini/video/edit":{"post":{"tags":["Gemini"],"description":"Edit existing video using Gemini Omni (async — returns jobId for polling)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"videoUrl":{"type":"string","format":"uri"},"prompt":{"type":"string","minLength":1,"maxLength":4000},"model":{"type":"string"},"negativePrompt":{"type":"string","maxLength":1000}},"required":["videoUrl","prompt"],"additionalProperties":false}}},"required":true},"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"status":{"type":"string"},"model":{"type":"string"},"message":{"type":"string"}},"required":["jobId","status","model","message"],"additionalProperties":false}}}}}}},"/api/v1/gemini/video/{jobId}":{"get":{"tags":["Gemini"],"description":"Poll video generation/edit job status","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"jobId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"jobType":{"type":"string"},"status":{"type":"string"},"model":{"type":"string"},"prompt":{"type":"string"},"videos":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"mimeType":{"type":"string"}},"required":["url","mimeType"],"additionalProperties":false}},"error":{"type":"string"},"createdAt":{"type":"string"}},"required":["jobId","jobType","status"],"additionalProperties":false}}}}}}},"/api/v1/gemini/status":{"get":{"tags":["Gemini"],"description":"Check Gemini API key status and brand usage metrics","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"object","properties":{"configured":{"type":"boolean"},"model":{"type":"string"},"error":{"type":"string"}},"required":["configured"],"additionalProperties":false},"usage":{"type":"object","properties":{"textCalls":{"type":"number"},"imageCalls":{"type":"number"},"videoCalls":{"type":"number"},"videoEdits":{"type":"number"},"totalCalls":{"type":"number"}},"required":["textCalls","imageCalls","videoCalls","videoEdits","totalCalls"],"additionalProperties":false}},"required":["apiKey"],"additionalProperties":false}}}}}}},"/api/v1/gemini/jobs":{"get":{"tags":["Gemini"],"description":"List Gemini generation jobs for brand","responses":{"200":{"description":"Default Response"}}}},"/api/v1/gemini/omni/video":{"post":{"tags":["Gemini Omni Flash"],"description":"Generate video using Gemini Omni Flash (text-to-video or image-to-video). Async — returns jobId.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":8000},"model":{"type":"string"},"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1","4:5"]},"duration":{"type":"number","minimum":1,"maximum":120},"resolution":{"type":"string","enum":["720p","1080p","4K"]},"withAudio":{"type":"boolean"},"negativePrompt":{"type":"string","maxLength":1000},"numberOfVideos":{"type":"number","minimum":1,"maximum":4},"personGeneration":{"type":"string","enum":["allow_all","allow_adult"]},"style":{"type":"string","enum":["social-short","cinematic","promotional","tutorial"]},"mood":{"type":"string","enum":["upbeat","professional","cozy","exciting"]},"voiceover":{"type":"boolean"},"music":{"type":"boolean"},"referenceImageUrl":{"type":"string","format":"uri"}},"required":["prompt"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gemini/omni/video/edit":{"post":{"tags":["Gemini Omni Flash"],"description":"Edit existing video using Gemini Omni Flash conversational editing. Async — returns jobId.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"videoJobId":{"type":"string","format":"uuid"},"instruction":{"type":"string","minLength":1,"maxLength":4000},"targetSegmentStartMs":{"type":"number"},"targetSegmentEndMs":{"type":"number"},"preserveElements":{"type":"array","items":{"type":"string"}},"withAudio":{"type":"boolean"},"negativePrompt":{"type":"string","maxLength":1000},"model":{"type":"string"}},"required":["videoJobId","instruction"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/gemini/omni/templates":{"get":{"tags":["Gemini Omni Flash"],"description":"List available salon video templates for quick generation","responses":{"200":{"description":"Default Response"}}}},"/api/v1/gemini/omni/templates/{templateId}":{"post":{"tags":["Gemini Omni Flash"],"description":"Generate video from a pre-built salon template","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"templateId":{"type":"string","enum":["salon-promo-15","salon-before-after","salon-seasonal","salon-ad-60"]},"customPrompt":{"type":"string","maxLength":4000},"overrides":{"type":"object","properties":{"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1","4:5"]},"duration":{"type":"number","minimum":1,"maximum":120},"resolution":{"type":"string","enum":["720p","1080p","4K"]},"withAudio":{"type":"boolean"},"style":{"type":"string","enum":["social-short","cinematic","promotional","tutorial"]},"mood":{"type":"string","enum":["upbeat","professional","cozy","exciting"]}},"additionalProperties":false}},"required":["templateId"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"path","name":"templateId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/image":{"post":{"summary":"Generate an image","tags":["Generation"],"description":"Generates an image (muapi default model: nano-banana). Waits up to 25s: returns 200 with images when done, otherwise 202 with a job to poll via GET /generate/jobs/{jobId}. Emits generate.completed / generate.failed webhooks.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":8000},"model":{"type":"string"},"provider":{"type":"string","enum":["muapi","gemini"]},"aspectRatio":{"type":"string","enum":["1:1","3:4","4:3","9:16","16:9"]},"numberOfImages":{"type":"number","minimum":1,"maximum":4},"referenceImages":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":14},"negativePrompt":{"type":"string","maxLength":1000},"brand_id":{"type":"string","format":"uuid","description":"Brand to generate for. Alternative to the x-brand-id header."}},"required":["prompt"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand to generate for (required unless brand_id is given). Must be a brand you own."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string"},"model":{"type":"string"},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"data":{"type":"string"},"mimeType":{"type":"string"}},"required":["mimeType"],"additionalProperties":false}},"cost":{"type":"number","nullable":true},"job":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid","description":"Same as id (kept for older clients)"},"kind":{"type":"string","enum":["image","video","video_edit"]},"status":{"type":"string","enum":["queued","processing","completed","failed"]},"brand_id":{"type":"string","format":"uuid"},"provider":{"type":"string"},"model":{"type":"string"},"provider_job_id":{"type":"string","nullable":true},"outputs":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"mimeType":{"type":"string"}},"required":["url","mimeType"],"additionalProperties":false}},"result":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false,"nullable":true,"description":"First output, for convenience"},"error":{"type":"string","nullable":true},"error_details":{"nullable":true},"cost":{"type":"object","properties":{"currency":{"type":"string","enum":["USD"]},"estimated_usd":{"type":"number","nullable":true},"actual_usd":{"type":"number","nullable":true,"description":"Cost reported by muapi; 0 for failed jobs"}},"required":["currency","estimated_usd","actual_usd"],"additionalProperties":false},"created_at":{"type":"string"},"updated_at":{"type":"string"},"completed_at":{"type":"string","nullable":true}},"required":["id","jobId","kind","status","brand_id","provider","model","provider_job_id","outputs","result","error","cost","created_at","updated_at","completed_at"],"additionalProperties":false}},"required":["provider","model","images","cost"],"additionalProperties":false}}}},"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"job":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid","description":"Same as id (kept for older clients)"},"kind":{"type":"string","enum":["image","video","video_edit"]},"status":{"type":"string","enum":["queued","processing","completed","failed"]},"brand_id":{"type":"string","format":"uuid"},"provider":{"type":"string"},"model":{"type":"string"},"provider_job_id":{"type":"string","nullable":true},"outputs":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"mimeType":{"type":"string"}},"required":["url","mimeType"],"additionalProperties":false}},"result":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false,"nullable":true,"description":"First output, for convenience"},"error":{"type":"string","nullable":true},"error_details":{"nullable":true},"cost":{"type":"object","properties":{"currency":{"type":"string","enum":["USD"]},"estimated_usd":{"type":"number","nullable":true},"actual_usd":{"type":"number","nullable":true,"description":"Cost reported by muapi; 0 for failed jobs"}},"required":["currency","estimated_usd","actual_usd"],"additionalProperties":false},"created_at":{"type":"string"},"updated_at":{"type":"string"},"completed_at":{"type":"string","nullable":true}},"required":["id","jobId","kind","status","brand_id","provider","model","provider_job_id","outputs","result","error","cost","created_at","updated_at","completed_at"],"additionalProperties":false},"message":{"type":"string"}},"required":["job","message"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"504":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/generate/video":{"post":{"summary":"Generate a video (async)","tags":["Generation"],"description":"Starts a video job and returns 202 immediately. The server polls muapi; read progress via GET /generate/jobs/{jobId} (or GET /generate/video/{jobId}), or subscribe to generate.completed / generate.failed webhooks. Per-model limits come from muapi (e.g. veo3.1-lite-text-to-video only accepts duration 8) and are returned as 422 invalid_generation_params.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":8000},"model":{"type":"string"},"provider":{"type":"string","enum":["muapi","gemini"]},"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1","4:5"]},"duration":{"type":"number","minimum":1,"maximum":120},"resolution":{"type":"string","enum":["720p","1080p","4K","4k"]},"negativePrompt":{"type":"string","maxLength":1000},"referenceImageUrl":{"type":"string","format":"uri"},"numberOfVideos":{"type":"number","minimum":1,"maximum":4},"personGeneration":{"type":"string","enum":["allow_all","allow_adult"]},"withAudio":{"type":"boolean"},"style":{"type":"string","enum":["social-short","cinematic","promotional","tutorial"]},"mood":{"type":"string","enum":["upbeat","professional","cozy","exciting"]},"brand_id":{"type":"string","format":"uuid","description":"Brand to generate for. Alternative to the x-brand-id header."}},"required":["prompt"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand to generate for (required unless brand_id is given). Must be a brand you own."}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"status":{"type":"string"},"model":{"type":"string"},"provider":{"type":"string"},"cost":{"type":"number","nullable":true,"description":"Actual cost if known, else the estimate (USD)"},"message":{"type":"string"},"job":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid","description":"Same as id (kept for older clients)"},"kind":{"type":"string","enum":["image","video","video_edit"]},"status":{"type":"string","enum":["queued","processing","completed","failed"]},"brand_id":{"type":"string","format":"uuid"},"provider":{"type":"string"},"model":{"type":"string"},"provider_job_id":{"type":"string","nullable":true},"outputs":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"mimeType":{"type":"string"}},"required":["url","mimeType"],"additionalProperties":false}},"result":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false,"nullable":true,"description":"First output, for convenience"},"error":{"type":"string","nullable":true},"error_details":{"nullable":true},"cost":{"type":"object","properties":{"currency":{"type":"string","enum":["USD"]},"estimated_usd":{"type":"number","nullable":true},"actual_usd":{"type":"number","nullable":true,"description":"Cost reported by muapi; 0 for failed jobs"}},"required":["currency","estimated_usd","actual_usd"],"additionalProperties":false},"created_at":{"type":"string"},"updated_at":{"type":"string"},"completed_at":{"type":"string","nullable":true}},"required":["id","jobId","kind","status","brand_id","provider","model","provider_job_id","outputs","result","error","cost","created_at","updated_at","completed_at"],"additionalProperties":false}},"required":["jobId","status","model","provider","cost","message"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"504":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/generate/video/edit":{"post":{"summary":"Edit a video (async)","tags":["Generation"],"description":"Starts a video edit job and returns 202. Poll GET /generate/jobs/{jobId}.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"videoUrl":{"type":"string","format":"uri"},"prompt":{"type":"string","minLength":1,"maxLength":4000},"model":{"type":"string"},"provider":{"type":"string","enum":["muapi","gemini"]},"negativePrompt":{"type":"string","maxLength":1000},"brand_id":{"type":"string","format":"uuid","description":"Brand to generate for. Alternative to the x-brand-id header."}},"required":["videoUrl","prompt"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand to generate for (required unless brand_id is given). Must be a brand you own."}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"status":{"type":"string"},"model":{"type":"string"},"provider":{"type":"string"},"cost":{"type":"number","nullable":true,"description":"Actual cost if known, else the estimate (USD)"},"message":{"type":"string"},"job":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid","description":"Same as id (kept for older clients)"},"kind":{"type":"string","enum":["image","video","video_edit"]},"status":{"type":"string","enum":["queued","processing","completed","failed"]},"brand_id":{"type":"string","format":"uuid"},"provider":{"type":"string"},"model":{"type":"string"},"provider_job_id":{"type":"string","nullable":true},"outputs":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"mimeType":{"type":"string"}},"required":["url","mimeType"],"additionalProperties":false}},"result":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false,"nullable":true,"description":"First output, for convenience"},"error":{"type":"string","nullable":true},"error_details":{"nullable":true},"cost":{"type":"object","properties":{"currency":{"type":"string","enum":["USD"]},"estimated_usd":{"type":"number","nullable":true},"actual_usd":{"type":"number","nullable":true,"description":"Cost reported by muapi; 0 for failed jobs"}},"required":["currency","estimated_usd","actual_usd"],"additionalProperties":false},"created_at":{"type":"string"},"updated_at":{"type":"string"},"completed_at":{"type":"string","nullable":true}},"required":["id","jobId","kind","status","brand_id","provider","model","provider_job_id","outputs","result","error","cost","created_at","updated_at","completed_at"],"additionalProperties":false}},"required":["jobId","status","model","provider","cost","message"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"504":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/generate/jobs/{jobId}":{"get":{"summary":"Get a generation job","tags":["Generation"],"description":"Status, output URLs, error details and estimated vs actual cost for an image/video job. No brand header needed; access is checked through brand ownership.","parameters":[{"schema":{"type":"string"},"in":"path","name":"jobId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid","description":"Same as id (kept for older clients)"},"kind":{"type":"string","enum":["image","video","video_edit"]},"status":{"type":"string","enum":["queued","processing","completed","failed"]},"brand_id":{"type":"string","format":"uuid"},"provider":{"type":"string"},"model":{"type":"string"},"provider_job_id":{"type":"string","nullable":true},"outputs":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"mimeType":{"type":"string"}},"required":["url","mimeType"],"additionalProperties":false}},"result":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false,"nullable":true,"description":"First output, for convenience"},"error":{"type":"string","nullable":true},"error_details":{"nullable":true},"cost":{"type":"object","properties":{"currency":{"type":"string","enum":["USD"]},"estimated_usd":{"type":"number","nullable":true},"actual_usd":{"type":"number","nullable":true,"description":"Cost reported by muapi; 0 for failed jobs"}},"required":["currency","estimated_usd","actual_usd"],"additionalProperties":false},"created_at":{"type":"string"},"updated_at":{"type":"string"},"completed_at":{"type":"string","nullable":true}},"required":["id","jobId","kind","status","brand_id","provider","model","provider_job_id","outputs","result","error","cost","created_at","updated_at","completed_at"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/generate/video/{jobId}":{"get":{"summary":"Get a video job (alias of GET /generate/jobs/{jobId})","tags":["Generation"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"jobId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/jobs":{"get":{"summary":"List a brand's generation jobs","tags":["Generation"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":false,"description":"Brand to generate for. Alternative to the x-brand-id header."},{"schema":{"type":"string","enum":["queued","processing","completed","failed"]},"in":"query","name":"status","required":false},{"schema":{"type":"number","minimum":1,"maximum":200},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand to generate for (required unless brand_id is given). Must be a brand you own."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"jobId":{"type":"string","format":"uuid","description":"Same as id (kept for older clients)"},"kind":{"type":"string","enum":["image","video","video_edit"]},"status":{"type":"string","enum":["queued","processing","completed","failed"]},"brand_id":{"type":"string","format":"uuid"},"provider":{"type":"string"},"model":{"type":"string"},"provider_job_id":{"type":"string","nullable":true},"outputs":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"mimeType":{"type":"string"}},"required":["url","mimeType"],"additionalProperties":false}},"result":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false,"nullable":true,"description":"First output, for convenience"},"error":{"type":"string","nullable":true},"error_details":{"nullable":true},"cost":{"type":"object","properties":{"currency":{"type":"string","enum":["USD"]},"estimated_usd":{"type":"number","nullable":true},"actual_usd":{"type":"number","nullable":true,"description":"Cost reported by muapi; 0 for failed jobs"}},"required":["currency","estimated_usd","actual_usd"],"additionalProperties":false},"created_at":{"type":"string"},"updated_at":{"type":"string"},"completed_at":{"type":"string","nullable":true}},"required":["id","jobId","kind","status","brand_id","provider","model","provider_job_id","outputs","result","error","cost","created_at","updated_at","completed_at"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/generate/spend":{"get":{"summary":"Brand generation spend for a month","tags":["Generation"],"description":"Actual muapi spend (completed jobs), estimated spend still in flight, and the brand's monthly cap if set.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":false,"description":"Brand to generate for. Alternative to the x-brand-id header."},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$"},"in":"query","name":"month","required":false,"description":"YYYY-MM (UTC). Defaults to the current month."},{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand to generate for (required unless brand_id is given). Must be a brand you own."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"month":{"type":"string"},"actual_usd":{"type":"number"},"pending_estimated_usd":{"type":"number"},"jobs_completed":{"type":"number"},"jobs_failed":{"type":"number"},"jobs_in_progress":{"type":"number"},"monthly_cap_usd":{"type":"number","nullable":true},"remaining_usd":{"type":"number","nullable":true}},"required":["brand_id","month","actual_usd","pending_estimated_usd","jobs_completed","jobs_failed","jobs_in_progress","monthly_cap_usd","remaining_usd"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/generate/budget":{"put":{"summary":"Set or clear a brand's monthly generation cap","tags":["Generation"],"description":"Jobs that would push this month's actual + in-flight spend past the cap are rejected with 402 brand_budget_exceeded. Pass null to remove the cap.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid","description":"Brand to generate for. Alternative to the x-brand-id header."},"monthly_cap_usd":{"type":"number","minimum":0,"nullable":true}},"required":["monthly_cap_usd"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand to generate for (required unless brand_id is given). Must be a brand you own."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"month":{"type":"string"},"actual_usd":{"type":"number"},"pending_estimated_usd":{"type":"number"},"jobs_completed":{"type":"number"},"jobs_failed":{"type":"number"},"jobs_in_progress":{"type":"number"},"monthly_cap_usd":{"type":"number","nullable":true},"remaining_usd":{"type":"number","nullable":true}},"required":["brand_id","month","actual_usd","pending_estimated_usd","jobs_completed","jobs_failed","jobs_in_progress","monthly_cap_usd","remaining_usd"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"e.g. brand_required, brand_not_found, brand_budget_exceeded, provider_insufficient_credits, invalid_generation_params, provider_rate_limited, provider_auth_error, model_not_found, provider_upstream_error"},"message":{"type":"string"},"provider":{"type":"string"},"upstream_status":{"type":"number","description":"HTTP status muapi returned"},"upstream_error":{"description":"muapi's error body, verbatim"},"spend":{},"job":{}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/generate/models":{"get":{"tags":["Generation"],"description":"List all available generation models (from muapi catalog + Gemini)","responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/models/{category}":{"get":{"tags":["Generation"],"description":"List models by category (text-to-image, text-to-video, image-to-video, etc.)","parameters":[{"schema":{"type":"string"},"in":"path","name":"category","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/estimate-cost":{"post":{"tags":["Generation"],"description":"Estimate the cost of a generation before running it","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"string","minLength":1},"provider":{"type":"string","enum":["muapi","gemini"]},"params":{"type":"object","additionalProperties":{}}},"required":["model"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/recommendations":{"get":{"tags":["Generation"],"description":"Get salon-optimized model recommendations by use case","responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/status":{"get":{"tags":["Generation"],"description":"Check generation service health and provider status","responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/character":{"post":{"tags":["Generation"],"description":"Create a reusable character (Gemini Omni). Upload a reference photo, get a character_id for consistent video generation.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string","minLength":1,"maxLength":20000},"imageUrl":{"type":"string","format":"uri"},"characterName":{"type":"string","maxLength":200},"audioIds":{"type":"array","items":{"type":"string"},"maxItems":3}},"required":["description","imageUrl"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/voice-profile":{"post":{"tags":["Generation"],"description":"Create a voice profile (Gemini Omni Audio). Returns an audio_id usable with characters and video generation.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":210},"presetVoice":{"type":"string","minLength":1},"voiceDescription":{"type":"string","maxLength":20000},"exampleDialogue":{"type":"string","maxLength":120}},"required":["name","presetVoice"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/character-video":{"post":{"tags":["Generation"],"description":"Generate video with reusable characters (Gemini Omni). Pass character_ids and optional audio_ids for consistent talking-head content.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":8000},"characterIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":3},"audioIds":{"type":"array","items":{"type":"string"},"maxItems":3},"imageUrl":{"type":"string","format":"uri"},"model":{"type":"string"},"duration":{"type":"number","minimum":1,"maximum":60},"resolution":{"type":"string","enum":["720p","1080p","4K"]},"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1","4:5"]}},"required":["prompt","characterIds"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/image-from-caption":{"post":{"tags":["Generation"],"description":"Generate an image from a caption, store it in Cloudinary, and return the public URL.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"caption":{"type":"string","minLength":1,"maxLength":2000},"aspectRatio":{"type":"string","enum":["1:1","3:4","4:3","9:16","16:9"]},"model":{"type":"string"}},"required":["caption"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/video-from-caption":{"post":{"tags":["Generation"],"description":"Generate a video from a caption and optional reference image. Async — returns jobId.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"caption":{"type":"string","minLength":1,"maxLength":4000},"imageUrl":{"type":"string","format":"uri","nullable":true},"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1","4:5"]},"model":{"type":"string"}},"required":["caption"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/video-from-caption/{jobId}":{"get":{"tags":["Generation"],"description":"Poll the status of a video-from-caption job. Returns video URL when complete.","parameters":[{"schema":{"type":"string"},"in":"path","name":"jobId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/generate/related-posts":{"post":{"tags":["Generation"],"description":"Given an existing post, generate platform-tailored variations with hashtags.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"postId":{"type":"string","format":"uuid"},"targetPlatforms":{"type":"array","items":{"type":"string","enum":["twitter","linkedin","facebook","instagram","tiktok"]},"minItems":1,"maxItems":5}},"required":["postId","targetPlatforms"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/business/{slug}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/rate":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/feedback":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/campaigns":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/campaigns/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/dashboard/{brandId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/removal/flag":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/removal/cases":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/removal/cases/{id}/evidence":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/removal/cases/{id}/escalate":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/campaigns/{id}/send":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/sms/webhook":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/campaigns/{id}/schedule":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/campaigns/{id}/appointment":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/templates":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/templates/{id}/preview":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/opt-out/{phone}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"phone","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"phone","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/feedback/{brandId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/feedback/{id}/status":{"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/review-sentry/feedback/{id}/reply":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/check":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string"},"email":{"type":"string"},"brandId":{"type":"string","format":"uuid"},"serviceAmountCents":{"type":"number"}},"required":["brandId"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/clients/{identifier}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"identifier","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/clients":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string"},"email":{"type":"string"},"fullName":{"type":"string"},"flagType":{"type":"string","enum":["no_show","late_cancel","negative_review","review_extortion","chargeback","refund_abuse","product_return_fraud","free_service_extraction","other"]},"description":{"type":"string"},"evidence":{"type":"object","additionalProperties":{}},"appointmentId":{"type":"string","format":"uuid"}},"required":["flagType"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}},"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/clients/{id}/flag":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"flagType":{"type":"string","enum":["no_show","late_cancel","negative_review","review_extortion","chargeback","refund_abuse","product_return_fraud","free_service_extraction","other"]},"description":{"type":"string"},"evidence":{"type":"object","additionalProperties":{}},"appointmentId":{"type":"string","format":"uuid"}},"required":["flagType"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/clients/{id}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/deposits/{brandId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandId","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"low":{"type":"object","properties":{"depositPercent":{"type":"number","minimum":0,"maximum":100},"requirePrepayment":{"type":"boolean","default":false},"allowBooking":{"type":"boolean","default":true},"creditOnly":{"type":"boolean","default":false},"noProductSales":{"type":"boolean","default":false}},"required":["depositPercent"],"additionalProperties":false},"medium":{"type":"object","properties":{"depositPercent":{"type":"number","minimum":0,"maximum":100},"requirePrepayment":{"type":"boolean","default":false},"allowBooking":{"type":"boolean","default":true},"creditOnly":{"type":"boolean","default":false},"noProductSales":{"type":"boolean","default":false}},"required":["depositPercent"],"additionalProperties":false},"high":{"type":"object","properties":{"depositPercent":{"type":"number","minimum":0,"maximum":100},"requirePrepayment":{"type":"boolean","default":true},"allowBooking":{"type":"boolean","default":true},"creditOnly":{"type":"boolean","default":false},"noProductSales":{"type":"boolean","default":false}},"required":["depositPercent"],"additionalProperties":false},"fraud":{"type":"object","properties":{"depositPercent":{"type":"number","minimum":0,"maximum":100},"requirePrepayment":{"type":"boolean","default":true},"allowBooking":{"type":"boolean","default":false},"creditOnly":{"type":"boolean","default":true},"noProductSales":{"type":"boolean","default":true}},"required":["depositPercent"],"additionalProperties":false}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/clients/{id}/notes":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"string","minLength":1}},"required":["note"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/deposits/create":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/deposits/{paymentId}/status":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"paymentId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/deposits/{paymentId}/convert":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"paymentId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/deposits/{paymentId}/forfeit":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"paymentId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/clientvet/deposits/webhook":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ad-management/tiers":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ad-management/service":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}},"put":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ad-management/service/activate":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ad-management/service/cancel":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ad-management/metrics":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ad-management/report":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/ad-management/setup-checklist":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/webhooks/crm/{provider}":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"provider","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/providers":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"crm_provider_id","required":false},{"schema":{"type":"number","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"number","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"responses":{"200":{"description":"Default Response"}}},"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"provider":{"type":"string","enum":["gohighlevel","square"]},"sync_direction":{"type":"string","enum":["bidirectional","push_only","pull_only"]},"sync_enabled":{"type":"boolean"},"webhook_enabled":{"type":"boolean"}},"required":["brand_id","provider"],"additionalProperties":false}}},"required":true},"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/providers/{id}":{"put":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"sync_direction":{"type":"string","enum":["bidirectional","push_only","pull_only"]},"sync_enabled":{"type":"boolean"},"webhook_enabled":{"type":"boolean"},"webhook_url":{"type":"string","format":"uri","nullable":true},"external_account_id":{"type":"string","nullable":true},"external_company_id":{"type":"string","nullable":true}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/providers/{id}/oauth/callback":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"state":{"type":"string"}},"required":["code"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/providers/{id}/sync":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"direction":{"type":"string","enum":["bidirectional","push_only","pull_only"]}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/providers/{id}/sync/status":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/mappings":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"crm_provider_id","required":false},{"schema":{"type":"number","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"number","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/logs":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":false},{"schema":{"type":"string","format":"uuid"},"in":"query","name":"crm_provider_id","required":false},{"schema":{"type":"number","minimum":1,"maximum":200,"default":50},"in":"query","name":"limit","required":false},{"schema":{"type":"number","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/contacts":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true},{"schema":{"type":"string","maxLength":100},"in":"query","name":"stage","required":false},{"schema":{"type":"string","maxLength":100},"in":"query","name":"tag","required":false},{"schema":{"type":"string","enum":["apollo","hunter","manual","referral","import","crm_sync","webhook"]},"in":"query","name":"source","required":false},{"schema":{"type":"string","maxLength":200},"in":"query","name":"q","required":false},{"schema":{"type":"number","minimum":1,"maximum":200,"default":20},"in":"query","name":"limit","required":false},{"schema":{"type":"number","minimum":0,"default":0},"in":"query","name":"offset","required":false}],"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/contacts/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/contacts/{id}/stage":{"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/contacts/import":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/crm/pipeline/stages":{"get":{"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/messaging/sms":{"post":{"summary":"Send or schedule an SMS","tags":["Messaging"],"description":"Sends a text from the brand's number. Refused if the recipient replied STOP; deferred during quiet hours; capped per recipient per day. Delivery is tracked (GET /messaging/messages/{id}, message.delivered / message.failed webhooks).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid","description":"Alternative to the x-brand-id header"},"to":{"type":"string","minLength":7,"description":"Recipient phone, E.164 preferred (+16145551234); 10-digit US numbers accepted"},"body":{"type":"string","minLength":1,"maxLength":1600},"purpose":{"type":"string","enum":["reminder","follow_up","transactional"],"description":"What the message is for. Marketing messages are not supported here."},"send_at":{"type":"string","format":"date-time","description":"ISO time to send; omit to send now. Sends inside quiet hours are deferred to the next allowed time."},"metadata":{"type":"object","additionalProperties":{},"description":"Your own reference data (e.g. appointment_id), returned as-is"}},"required":["to","body"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand sending the message (or pass brand_id)"}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"brand_id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["sms","call"]},"purpose":{"type":"string"},"to":{"type":"string"},"from":{"type":"string"},"body":{"type":"string","description":"SMS text, or the call script"},"voice":{"type":"string","nullable":true},"status":{"type":"string","description":"scheduled, sending, queued, sent, delivered, failed, canceled; calls: ringing, in_progress, completed, busy, no_answer"},"scheduled_at":{"type":"string"},"deferred_reason":{"type":"string","nullable":true},"sent_at":{"type":"string","nullable":true},"completed_at":{"type":"string","nullable":true},"provider_sid":{"type":"string","nullable":true},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false,"nullable":true},"metadata":{"type":"object","additionalProperties":{}},"created_at":{"type":"string"}},"required":["id","brand_id","kind","purpose","to","from","body","voice","status","scheduled_at","deferred_reason","sent_at","completed_at","provider_sid","error","metadata","created_at"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/messaging/calls":{"post":{"summary":"Place or schedule an outbound call","tags":["Messaging"],"description":"Calls the recipient from the brand's number and speaks the script (text-to-speech). Same opt-out, quiet-hours and daily-cap rules as SMS. Completion is tracked (call.completed webhook, duration in metadata).","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid","description":"Alternative to the x-brand-id header"},"to":{"type":"string","minLength":7},"script":{"type":"string","minLength":1,"maxLength":3000,"description":"What the call says when answered (text-to-speech)"},"voice":{"type":"string","maxLength":40,"description":"Twilio TTS voice, default Polly.Joanna"},"purpose":{"type":"string","enum":["reminder","follow_up","transactional"],"description":"What the message is for. Marketing messages are not supported here."},"send_at":{"type":"string","format":"date-time","description":"ISO time to send; omit to send now. Sends inside quiet hours are deferred to the next allowed time."},"metadata":{"type":"object","additionalProperties":{}}},"required":["to","script"],"additionalProperties":false}}},"required":true},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand sending the message (or pass brand_id)"}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"brand_id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["sms","call"]},"purpose":{"type":"string"},"to":{"type":"string"},"from":{"type":"string"},"body":{"type":"string","description":"SMS text, or the call script"},"voice":{"type":"string","nullable":true},"status":{"type":"string","description":"scheduled, sending, queued, sent, delivered, failed, canceled; calls: ringing, in_progress, completed, busy, no_answer"},"scheduled_at":{"type":"string"},"deferred_reason":{"type":"string","nullable":true},"sent_at":{"type":"string","nullable":true},"completed_at":{"type":"string","nullable":true},"provider_sid":{"type":"string","nullable":true},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false,"nullable":true},"metadata":{"type":"object","additionalProperties":{}},"created_at":{"type":"string"}},"required":["id","brand_id","kind","purpose","to","from","body","voice","status","scheduled_at","deferred_reason","sent_at","completed_at","provider_sid","error","metadata","created_at"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/messaging/messages":{"get":{"summary":"List outbound messages","tags":["Messaging"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":false,"description":"Alternative to the x-brand-id header"},{"schema":{"type":"string","enum":["sms","call"]},"in":"query","name":"kind","required":false},{"schema":{"type":"string"},"in":"query","name":"status","required":false},{"schema":{"type":"number","minimum":1,"maximum":200},"in":"query","name":"limit","required":false},{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand sending the message (or pass brand_id)"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"brand_id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["sms","call"]},"purpose":{"type":"string"},"to":{"type":"string"},"from":{"type":"string"},"body":{"type":"string","description":"SMS text, or the call script"},"voice":{"type":"string","nullable":true},"status":{"type":"string","description":"scheduled, sending, queued, sent, delivered, failed, canceled; calls: ringing, in_progress, completed, busy, no_answer"},"scheduled_at":{"type":"string"},"deferred_reason":{"type":"string","nullable":true},"sent_at":{"type":"string","nullable":true},"completed_at":{"type":"string","nullable":true},"provider_sid":{"type":"string","nullable":true},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false,"nullable":true},"metadata":{"type":"object","additionalProperties":{}},"created_at":{"type":"string"}},"required":["id","brand_id","kind","purpose","to","from","body","voice","status","scheduled_at","deferred_reason","sent_at","completed_at","provider_sid","error","metadata","created_at"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/messaging/messages/{id}":{"get":{"summary":"Get an outbound message","tags":["Messaging"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"brand_id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["sms","call"]},"purpose":{"type":"string"},"to":{"type":"string"},"from":{"type":"string"},"body":{"type":"string","description":"SMS text, or the call script"},"voice":{"type":"string","nullable":true},"status":{"type":"string","description":"scheduled, sending, queued, sent, delivered, failed, canceled; calls: ringing, in_progress, completed, busy, no_answer"},"scheduled_at":{"type":"string"},"deferred_reason":{"type":"string","nullable":true},"sent_at":{"type":"string","nullable":true},"completed_at":{"type":"string","nullable":true},"provider_sid":{"type":"string","nullable":true},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false,"nullable":true},"metadata":{"type":"object","additionalProperties":{}},"created_at":{"type":"string"}},"required":["id","brand_id","kind","purpose","to","from","body","voice","status","scheduled_at","deferred_reason","sent_at","completed_at","provider_sid","error","metadata","created_at"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Cancel a scheduled message","tags":["Messaging"],"description":"Only messages still in status scheduled can be canceled.","parameters":[{"schema":{"type":"string","format":"uuid"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"brand_id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["sms","call"]},"purpose":{"type":"string"},"to":{"type":"string"},"from":{"type":"string"},"body":{"type":"string","description":"SMS text, or the call script"},"voice":{"type":"string","nullable":true},"status":{"type":"string","description":"scheduled, sending, queued, sent, delivered, failed, canceled; calls: ringing, in_progress, completed, busy, no_answer"},"scheduled_at":{"type":"string"},"deferred_reason":{"type":"string","nullable":true},"sent_at":{"type":"string","nullable":true},"completed_at":{"type":"string","nullable":true},"provider_sid":{"type":"string","nullable":true},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false,"nullable":true},"metadata":{"type":"object","additionalProperties":{}},"created_at":{"type":"string"}},"required":["id","brand_id","kind","purpose","to","from","body","voice","status","scheduled_at","deferred_reason","sent_at","completed_at","provider_sid","error","metadata","created_at"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/messaging/settings":{"get":{"summary":"Get a brand's messaging settings","tags":["Messaging"],"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"query","name":"brand_id","required":false,"description":"Alternative to the x-brand-id header"},{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand sending the message (or pass brand_id)"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"from_number":{"type":"string","nullable":true},"quiet_hours_start":{"type":"number"},"quiet_hours_end":{"type":"number"},"daily_limit_per_recipient":{"type":"number"},"timezone":{"type":"string"}},"required":["brand_id","from_number","quiet_hours_start","quiet_hours_end","daily_limit_per_recipient","timezone"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}},"put":{"summary":"Update a brand's messaging settings","tags":["Messaging"],"description":"from_number must be a number on the AgentSocial Twilio account; a brand can't send until it has one (null removes it). Quiet hours are local hours in the brand's timezone.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid","description":"Alternative to the x-brand-id header"},"from_number":{"type":"string","nullable":true},"quiet_hours_start":{"type":"integer","minimum":0,"maximum":23},"quiet_hours_end":{"type":"integer","minimum":0,"maximum":23},"daily_limit_per_recipient":{"type":"integer","minimum":1,"maximum":20}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid"},"in":"header","name":"x-brand-id","required":false,"description":"Brand sending the message (or pass brand_id)"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"brand_id":{"type":"string","format":"uuid"},"from_number":{"type":"string","nullable":true},"quiet_hours_start":{"type":"number"},"quiet_hours_end":{"type":"number"},"daily_limit_per_recipient":{"type":"number"},"timezone":{"type":"string"}},"required":["brand_id","from_number","quiet_hours_start","quiet_hours_end","daily_limit_per_recipient","timezone"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"brand_required, invalid_phone, recipient_opted_out, no_sending_number, number_not_owned, twilio_not_configured, not_found, not_cancelable"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":true}},"required":["error"],"additionalProperties":false}}}}}}}},"servers":[{"url":"/","description":"API v1"}],"security":[{"apiKey":[]},{"bearerAuth":[]}],"tags":[{"name":"Auth","description":"Authentication endpoints"},{"name":"Brands","description":"Brand management"},{"name":"Channels","description":"Channel management"},{"name":"Posts","description":"Post management"},{"name":"Comments","description":"Comment inbox"},{"name":"Media","description":"Media uploads"},{"name":"Analytics","description":"Analytics"},{"name":"Webhooks","description":"Webhook management"},{"name":"Clipify","description":"Short-form video repurposing"},{"name":"Gemini","description":"Multimodal AI generation (text, image, video)"},{"name":"Messaging","description":"Proactive SMS and voice calls (reminders, follow-ups) with opt-out, quiet-hours and daily-cap safeguards."},{"name":"Generation","description":"muapi image/video generation: async jobs, spend tracking and per-brand budgets. Brand via x-brand-id header or brand_id."}]}