{"openapi":"3.1.0","info":{"title":"Marketing Dashboard","version":"0.1.0"},"paths":{"/api/health":{"get":{"tags":["health"],"summary":"Health Check","description":"System health check endpoint.\n\nReturns the health status of all system components:\ndatabase, Redis, Celery workers, and Celery Beat.\n\nNo authentication required — also used by Cloud Run health probes.","operationId":"health_check_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"Register a new user.\n\nArgs:\n    data: User registration data.\n    session: Database session.\n\nReturns:\n    User: The created user.","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Login and receive a JWT token.\n\nArgs:\n    data: Login credentials.\n    session: Database session.\n\nReturns:\n    dict: JWT token, user info, and org memberships.","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google":{"post":{"tags":["auth"],"summary":"Google Login","description":"Exchange a verified Google id_token for a backend access token.\n\nThe Next.js NextAuth layer completes the Google OAuth flow and forwards the\nGoogle ``id_token``. We verify it with Google (signature + audience +\nemail_verified), upsert the user by email, and return a JWT — mirroring\n``/login``. A brand-new Google user starts with no org membership (same as\n``/register``); an admin grants org access afterwards.\n\nArgs:\n    data: The Google id_token to verify.\n    session: Database session.\n\nReturns:\n    dict: JWT token + user info, identical in shape to ``/login``.","operationId":"google_login_api_auth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAuthRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"Get the current authenticated user with org memberships.\n\nArgs:\n    current_user: The authenticated user from JWT.\n    session: Database session.\n\nReturns:\n    dict: Current user info with organizations.","operationId":"get_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Me Api Auth Me Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/password/me":{"put":{"tags":["password"],"summary":"Change My Password","operationId":"change_my_password_api_password_me_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/password/forgot":{"post":{"tags":["password"],"summary":"Forgot Password","description":"Issue a reset token + email it. Returns 202 whether or not the\nemail exists — we don't want this endpoint to be a way to enumerate\naccounts.","operationId":"forgot_password_api_password_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Forgot Password Api Password Forgot Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/password/reset":{"post":{"tags":["password"],"summary":"Reset Password","description":"Consume a reset token and set a new password. Single-use: we\nmark used_at the moment we accept it.","operationId":"reset_password_api_password_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-tokens/scopes":{"get":{"tags":["api-tokens"],"summary":"List Scopes","description":"Enumerate every known scope so the frontend can build the\ncreate-token checkbox UI without hard-coding the list.","operationId":"list_scopes_api_api_tokens_scopes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ScopeOut"},"type":"array","title":"Response List Scopes Api Api Tokens Scopes Get"}}}}}}},"/api/api-tokens":{"get":{"tags":["api-tokens"],"summary":"List Tokens","description":"List the caller's active tokens within the current org. Revoked\ntokens are hidden — once-revoked-stays-revoked, no recovery.","operationId":"list_tokens_api_api_tokens_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TokenRead"},"title":"Response List Tokens Api Api Tokens Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-tokens"],"summary":"Create Token","description":"Mint a new token. Returns the plaintext ONCE — the user has to\ncopy it now; we don't store it and there is no recovery path.","operationId":"create_token_api_api_tokens_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-tokens/{token_id}/revoke":{"post":{"tags":["api-tokens"],"summary":"Revoke Token","description":"Soft-revoke a token. Idempotent — re-revoking a revoked token\nis a noop. Other users' tokens are 404 (no enumeration leak).","operationId":"revoke_token_api_api_tokens__token_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"integer","title":"Token Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me":{"get":{"tags":["me"],"summary":"Whoami","description":"The 'who am I' endpoint MCP clients hit first to verify their\ntoken + discover the active org + see what scopes they have.\n\nSame shape regardless of auth method (JWT vs API token) — the\nonly difference is whether ``api_token`` is populated.","operationId":"whoami_api_me_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts":{"get":{"tags":["posts"],"summary":"List Posts","description":"List posts with optional filters.","operationId":"list_posts_api_posts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PostStatus"},{"type":"null"}],"title":"Status"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Platform"},{"type":"null"}],"title":"Platform"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PostRead"},"title":"Response List Posts Api Posts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["posts"],"summary":"Create Post","description":"Create a new draft post.","operationId":"create_post_api_posts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/all":{"get":{"tags":["posts"],"summary":"List All Posts","description":"Unified view across every channel: the generic Post table plus the\ndedicated InstagramPost / FacebookPost tables. Read-only overview — each\nrow is edited on its own surface.","operationId":"list_all_posts_api_posts_all_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AggregatePostRead"},"title":"Response List All Posts Api Posts All Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/{post_id}":{"get":{"tags":["posts"],"summary":"Get Post","description":"Get a single post by ID.","operationId":"get_post_api_posts__post_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["posts"],"summary":"Update Post","description":"Update a draft post.","operationId":"update_post_api_posts__post_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["posts"],"summary":"Delete Post","description":"Delete a draft post.","operationId":"delete_post_api_posts__post_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/{post_id}/submit":{"post":{"tags":["posts"],"summary":"Submit For Approval","description":"Submit a draft for approval.","operationId":"submit_for_approval_api_posts__post_id__submit_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/{post_id}/approve":{"post":{"tags":["posts"],"summary":"Approve Post","description":"Approve a pending post.","operationId":"approve_post_api_posts__post_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/{post_id}/reject":{"post":{"tags":["posts"],"summary":"Reject Post","description":"Reject a draft or pending post.\n\nDrafts (the AI-generated state) are the common reject target for\na single-reviewer workflow, so we accept both DRAFT and\nPENDING_APPROVAL here. The row stays in the DB with\n``status='rejected'`` plus the reason, which is useful for\nauditing the LLM drafter's hit rate over time.","operationId":"reject_post_api_posts__post_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostReject"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/{post_id}/accept-schedule":{"post":{"tags":["posts"],"summary":"Accept And Schedule","description":"One-shot endpoint: edit + accept + schedule an AI draft.\n\nCollapses the 4-step ``PUT → submit → approve → schedule`` chain\ninto a single call for the single-reviewer use case where the\nsame person reviewing the AI draft is also the approver. Takes\noptional ``content`` / ``title`` edits and a required\n``scheduled_at``. Records the caller as both creator-of-record\n(already set at draft time) and approver.","operationId":"accept_and_schedule_api_posts__post_id__accept_schedule_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostAcceptSchedule"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/{post_id}/schedule":{"post":{"tags":["posts"],"summary":"Schedule Post","description":"Schedule an approved post for publishing.","operationId":"schedule_post_api_posts__post_id__schedule_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostSchedule"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/{post_id}/publish":{"post":{"tags":["posts"],"summary":"Publish Post","description":"Publish a post immediately.","operationId":"publish_post_api_posts__post_id__publish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/posts/{post_id}/generate-image":{"post":{"tags":["posts"],"summary":"Generate Image For Post","description":"Generate one image for a draft via OpenAI gpt-image-1 + GCS.\n\nLazy-imports the generator + a sync session because the underlying\n``CredentialService.get_sync`` and ``upload_media`` both want a\nblocking SQLModel session, not the async session FastAPI hands us.\nThe generation itself blocks too (network + decode + upload), so we\nrun the whole thing in a worker thread to avoid stalling the event\nloop on concurrent requests.","operationId":"generate_image_for_post_api_posts__post_id__generate_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateImageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateImageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns":{"post":{"tags":["campaigns"],"summary":"Create Campaign","description":"Create a campaign, optionally seeding empty variants for channels.","operationId":"create_campaign_api_campaigns_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["campaigns"],"summary":"List Campaigns","operationId":"list_campaigns_api_campaigns_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CampaignRead"},"title":"Response List Campaigns Api Campaigns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/plan":{"post":{"tags":["campaigns"],"summary":"Plan Campaigns","description":"Generate a multi-week series of campaigns from a product brief.\n\nThe LLM drafts N campaign ideas; we create them as drafts with seeded\nchannel variants, spreading planned dates across a calendar. Each can then\nbe refined in the composer and pushed/scheduled.","operationId":"plan_campaigns_api_campaigns_plan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignPlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CampaignRead"},"title":"Response Plan Campaigns Api Campaigns Plan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}":{"get":{"tags":["campaigns"],"summary":"Get Campaign","operationId":"get_campaign_api_campaigns__campaign_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["campaigns"],"summary":"Update Campaign","operationId":"update_campaign_api_campaigns__campaign_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["campaigns"],"summary":"Delete Campaign","operationId":"delete_campaign_api_campaigns__campaign_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/media":{"post":{"tags":["campaigns"],"summary":"Add Media","operationId":"add_media_api_campaigns__campaign_id__media_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignMediaAssetCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/media/generate":{"post":{"tags":["campaigns"],"summary":"Generate Media","description":"Generate an image into the shared library with OpenAI (sync).","operationId":"generate_media_api_campaigns__campaign_id__media_generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignMediaGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/media/{asset_id}":{"delete":{"tags":["campaigns"],"summary":"Delete Media","operationId":"delete_media_api_campaigns__campaign_id__media__asset_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/variants":{"post":{"tags":["campaigns"],"summary":"Create Variant","operationId":"create_variant_api_campaigns__campaign_id__variants_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignVariantCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/variants/{variant_id}":{"patch":{"tags":["campaigns"],"summary":"Update Variant","operationId":"update_variant_api_campaigns__campaign_id__variants__variant_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"variant_id","in":"path","required":true,"schema":{"type":"integer","title":"Variant Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignVariantUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["campaigns"],"summary":"Delete Variant","operationId":"delete_variant_api_campaigns__campaign_id__variants__variant_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"variant_id","in":"path","required":true,"schema":{"type":"integer","title":"Variant Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/adapt":{"post":{"tags":["campaigns"],"summary":"Adapt Campaign","description":"LLM-adapt the core message into each variant's text (per channel).\n\nSkips variants the user has hand-edited (``overrides=True``) so manual\nwork is never clobbered.","operationId":"adapt_campaign_api_campaigns__campaign_id__adapt_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/fan-out":{"post":{"tags":["campaigns"],"summary":"Fan Out Campaign","description":"Render every variant into its platform store (create/update the\nper-platform draft). The existing publishers handle them from there.","operationId":"fan_out_campaign_api_campaigns__campaign_id__fan_out_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/status":{"get":{"tags":["billing"],"summary":"Billing Status","description":"Current plan, credit balance, referral link, and the plan/pack catalog.","operationId":"billing_status_api_billing_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Billing Status Api Billing Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/checkout":{"post":{"tags":["billing"],"summary":"Create Checkout","description":"Start a subscription Checkout for the chosen plan. Returns a redirect URL.","operationId":"create_checkout_api_billing_checkout_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Checkout Api Billing Checkout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/credits/checkout":{"post":{"tags":["billing"],"summary":"Create Topup","description":"Start a one-time Checkout for a credit pack. Returns a redirect URL.","operationId":"create_topup_api_billing_credits_checkout_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Topup Api Billing Credits Checkout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/portal":{"post":{"tags":["billing"],"summary":"Create Portal","description":"Open the Stripe Billing Portal to manage/cancel the subscription.","operationId":"create_portal_api_billing_portal_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Portal Api Billing Portal Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/webhook":{"post":{"tags":["billing"],"summary":"Stripe Webhook","description":"Stripe webhook receiver (signature-verified, no auth).","operationId":"stripe_webhook_api_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stripe Webhook Api Billing Webhook Post"}}}}}}},"/api/reddit/monitors":{"get":{"tags":["reddit"],"summary":"List Monitors","description":"List all monitored subreddits.","operationId":"list_monitors_api_reddit_monitors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SubredditRead"},"title":"Response List Monitors Api Reddit Monitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["reddit"],"summary":"Add Monitor","description":"Add a subreddit to monitor.","operationId":"add_monitor_api_reddit_monitors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubredditCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubredditRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reddit/monitors/{monitor_id}":{"delete":{"tags":["reddit"],"summary":"Remove Monitor","description":"Remove a monitored subreddit.","operationId":"remove_monitor_api_reddit_monitors__monitor_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reddit/scan":{"post":{"tags":["reddit"],"summary":"Trigger Scan","description":"Trigger an immediate scan of all monitored subreddits.","operationId":"trigger_scan_api_reddit_scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Scan Api Reddit Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reddit/findings":{"get":{"tags":["reddit"],"summary":"List Findings","description":"List Reddit findings with optional filters.","operationId":"list_findings_api_reddit_findings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subreddit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit"}},{"name":"dismissed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dismissed"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RedditFindingRead"},"title":"Response List Findings Api Reddit Findings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reddit/findings/{finding_id}/dismiss":{"post":{"tags":["reddit"],"summary":"Dismiss Finding","description":"Dismiss a finding.","operationId":"dismiss_finding_api_reddit_findings__finding_id__dismiss_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","title":"Finding Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dismiss Finding Api Reddit Findings  Finding Id  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reddit/findings/{finding_id}/create-draft":{"post":{"tags":["reddit"],"summary":"Create Draft From Finding","description":"Create a draft post/comment from a finding.","operationId":"create_draft_from_finding_api_reddit_findings__finding_id__create_draft_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","title":"Finding Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Draft From Finding Api Reddit Findings  Finding Id  Create Draft Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/generate-drafts":{"post":{"tags":["twitter"],"summary":"Generate Drafts","description":"Trigger LLM generation of tweet drafts.","operationId":"generate_drafts_api_twitter_generate_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Drafts Api Twitter Generate Drafts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/search":{"post":{"tags":["twitter"],"summary":"Search Tweets","description":"Run an ad-hoc Twitter search and return matching tweets.\n\nArgs:\n    data: JSON body with ``query`` (str, required), ``count`` (int, optional),\n          ``min_followers`` and ``max_followers`` (int, optional).","operationId":"search_tweets_api_twitter_search_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Tweets Api Twitter Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/history":{"get":{"tags":["twitter"],"summary":"Get Account History","description":"Return the authenticated Twitter account's own tweets.\n\nArgs:\n    months: Lookback window (default 6).\n    max_results: Cap across paginated pages.\n    exclude_retweets: Drop retweets if True.","operationId":"get_account_history_api_twitter_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":6,"title":"Months"}},{"name":"max_results","in":"query","required":false,"schema":{"type":"integer","maximum":3200,"minimum":1,"default":500,"title":"Max Results"}},{"name":"exclude_retweets","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Exclude Retweets"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Account History Api Twitter History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/monitors":{"get":{"tags":["twitter"],"summary":"List Monitors","description":"List all Twitter search monitors.","operationId":"list_monitors_api_twitter_monitors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TwitterMonitorRead"},"title":"Response List Monitors Api Twitter Monitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["twitter"],"summary":"Create Monitor","description":"Create a new Twitter search monitor.","operationId":"create_monitor_api_twitter_monitors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterMonitorCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/monitors/{monitor_id}":{"put":{"tags":["twitter"],"summary":"Update Monitor","description":"Update a Twitter search monitor.","operationId":"update_monitor_api_twitter_monitors__monitor_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterMonitorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["twitter"],"summary":"Delete Monitor","description":"Delete a Twitter search monitor and its findings.","operationId":"delete_monitor_api_twitter_monitors__monitor_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/scan":{"post":{"tags":["twitter"],"summary":"Trigger Scan","description":"Trigger an immediate scan of all active Twitter monitors.","operationId":"trigger_scan_api_twitter_scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Scan Api Twitter Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/monitors/{monitor_id}/scan":{"post":{"tags":["twitter"],"summary":"Trigger Monitor Scan","description":"Trigger an immediate scan for a specific Twitter monitor.","operationId":"trigger_monitor_scan_api_twitter_monitors__monitor_id__scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Monitor Scan Api Twitter Monitors  Monitor Id  Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/monitors/{monitor_id}/test-discovery":{"post":{"tags":["twitter"],"summary":"Test Discovery","description":"Test the Twitter search API for a monitor and return raw results.\n\nUseful for debugging — shows the exact query and response received.\n\nArgs:\n    monitor_id: ID of the monitor to test.","operationId":"test_discovery_api_twitter_monitors__monitor_id__test_discovery_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Discovery Api Twitter Monitors  Monitor Id  Test Discovery Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/findings":{"get":{"tags":["twitter"],"summary":"List Findings","description":"List Twitter findings with filters.","operationId":"list_findings_api_twitter_findings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dismissed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dismissed"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.0,"title":"Min Score"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TwitterFindingRead"},"title":"Response List Findings Api Twitter Findings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/findings/{finding_id}/dismiss":{"post":{"tags":["twitter"],"summary":"Dismiss Finding","description":"Dismiss a Twitter finding.","operationId":"dismiss_finding_api_twitter_findings__finding_id__dismiss_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","title":"Finding Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dismiss Finding Api Twitter Findings  Finding Id  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/findings/{finding_id}/create-draft":{"post":{"tags":["twitter"],"summary":"Create Draft From Finding","description":"Create a draft tweet reply from a finding.\n\nIf the finding has no draft_response, generates one via LLM on-demand.","operationId":"create_draft_from_finding_api_twitter_findings__finding_id__create_draft_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","title":"Finding Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Draft From Finding Api Twitter Findings  Finding Id  Create Draft Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/findings/bulk-action":{"post":{"tags":["twitter"],"summary":"Bulk Action Findings","description":"Apply a bulk action to multiple Twitter findings.\n\nArgs:\n    data: {\"finding_ids\": [int], \"action\": \"dismiss\" | \"create_draft\"}","operationId":"bulk_action_findings_api_twitter_findings_bulk_action_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bulk Action Findings Api Twitter Findings Bulk Action Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/scans":{"get":{"tags":["twitter"],"summary":"List Scans","description":"List all Twitter scan executions.","operationId":"list_scans_api_twitter_scans_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TwitterScanRead"},"title":"Response List Scans Api Twitter Scans Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/scans/{scan_id}/results":{"get":{"tags":["twitter"],"summary":"List Scan Results","description":"List findings from a specific scan.","operationId":"list_scan_results_api_twitter_scans__scan_id__results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"integer","title":"Scan Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TwitterFindingRead"},"title":"Response List Scan Results Api Twitter Scans  Scan Id  Results Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/lists":{"post":{"tags":["twitter"],"summary":"Create Twitter List","description":"Create a tweet list from selected finding IDs.","operationId":"create_twitter_list_api_twitter_lists_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterListCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterListDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["twitter"],"summary":"List Twitter Lists","description":"List all saved tweet lists.","operationId":"list_twitter_lists_api_twitter_lists_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TwitterListRead"},"title":"Response List Twitter Lists Api Twitter Lists Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/lists/{list_id}":{"get":{"tags":["twitter"],"summary":"Get Twitter List","description":"Get a tweet list with all its finding entries.","operationId":"get_twitter_list_api_twitter_lists__list_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterListDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["twitter"],"summary":"Delete Twitter List","description":"Delete a tweet list.","operationId":"delete_twitter_list_api_twitter_lists__list_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tiktok/status":{"get":{"tags":["tiktok"],"summary":"Tiktok Status","description":"Get TikTok integration status.","operationId":"tiktok_status_api_tiktok_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tiktok Status Api Tiktok Status Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/tiktok/generate-drafts":{"post":{"tags":["tiktok"],"summary":"Generate Drafts","description":"Trigger LLM generation of TikTok post drafts.","operationId":"generate_drafts_api_tiktok_generate_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Drafts Api Tiktok Generate Drafts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tiktok/{post_id}/generate-video":{"post":{"tags":["tiktok"],"summary":"Generate Video","description":"Queue video generation for a TikTok draft.\n\nArgs:\n    post_id: ID of the TikTok post to generate a video for.","operationId":"generate_video_api_tiktok__post_id__generate_video_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Video Api Tiktok  Post Id  Generate Video Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tiktok/{post_id}/video-status":{"get":{"tags":["tiktok"],"summary":"Get Video Status","description":"Get video generation status for a TikTok post.\n\nArgs:\n    post_id: ID of the TikTok post.","operationId":"get_video_status_api_tiktok__post_id__video_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Video Status Api Tiktok  Post Id  Video Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications":{"get":{"tags":["notifications"],"summary":"List Notifications","description":"List notifications for the current user.","operationId":"list_notifications_api_notifications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"is_read","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Read"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NotificationRead"},"title":"Response List Notifications Api Notifications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications/unread-count":{"get":{"tags":["notifications"],"summary":"Unread Count","description":"Get count of unread notifications for the current org.\n\nMust mirror ``list_notifications``'s WHERE clause exactly —\nwithout the ``organization_id`` filter, a notification on another\norg the user belongs to would inflate the bell badge while the\n``/notifications`` page (which IS org-scoped) shows nothing,\nleaving the user with a ghost badge they can't clear.","operationId":"unread_count_api_notifications_unread_count_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications/{notification_id}/read":{"patch":{"tags":["notifications"],"summary":"Mark Read","description":"Mark a notification as read.","operationId":"mark_read_api_notifications__notification_id__read_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"integer","title":"Notification Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mark Read Api Notifications  Notification Id  Read Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications/mark-all-read":{"post":{"tags":["notifications"],"summary":"Mark All Read","description":"Mark all notifications as read for the current user + org.\n\nScoped to the active org for the same reason as ``unread_count``\nabove — bulk-clearing notifications from orgs the user isn't\ncurrently viewing would surprise them.","operationId":"mark_all_read_api_notifications_mark_all_read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mark All Read Api Notifications Mark All Read Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings":{"get":{"tags":["settings"],"summary":"List Settings","description":"Every setting visible to this caller: the active org's rows\nplus any platform-wide (NULL-org) rows.\n\nNULL-org rows act as defaults; org-scoped rows override them. When\nboth exist for the same key (because the seeder writes a NULL-org\ndefault and the first PUT creates an org-scoped row), we return\nonly the org-scoped one. Without this, the frontend's ``find()``\ncan pick the empty seeded default and the user sees their save\n\"disappear\" on refresh.","operationId":"list_settings_api_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SettingRead"},"title":"Response List Settings Api Settings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/{key}":{"put":{"tags":["settings"],"summary":"Update Setting","description":"Update or create a setting.\n\nPlatform-wide keys are forced to ``organization_id IS NULL`` and\nrequire a global admin (org_admin alone isn't enough). Everyone\nelse writes to their own org's row as before.","operationId":"update_setting_api_settings__key__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/suggest/{key}":{"post":{"tags":["settings"],"summary":"Suggest Setting","description":"LLM-generate a suggested value for one free-text setting.\n\nWhitelisted to ``target_audience`` and ``draft_topic_mix`` —\nother settings either have structural meaning (provider names,\nschedule hours) or are sensitive enough that auto-suggestion\nisn't appropriate.\n\nReturns the suggestion without saving. The frontend drops it\ninto the field and the user reviews + clicks Save to commit.","operationId":"suggest_setting_api_settings_suggest__key__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingSuggestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/scrape-company-context":{"post":{"tags":["settings"],"summary":"Scrape Company Context","description":"Fetch a company's website, strip HTML, summarize into Company Context.\n\nOrg-admin only. The URL is fetched server-side with a short\ntimeout and a 1 MB cap; the visible text is sent to the LLM which\nreturns a Company Context paragraph. The result is returned for\nthe user to review + save — we don't auto-persist it.\n\nWhy server-side fetch instead of browser-side: avoids CORS,\navoids leaking the user's IP to the target site, and lets us cap\nthe request size centrally.","operationId":"scrape_company_context_api_settings_scrape_company_context_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapeCompanyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapeCompanyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content-sources":{"get":{"tags":["content-sources"],"summary":"List Sources","description":"Every content source for the active org, ordered by kind then label.\n\nJoined with a per-source item count so the UI can show \"12 items\ncached\" next to each feed without N+1 round-trips.","operationId":"list_sources_api_content_sources_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentSourceRead"},"title":"Response List Sources Api Content Sources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["content-sources"],"summary":"Create Source","operationId":"create_source_api_content_sources_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSourceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSourceRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content-sources/{source_id}":{"patch":{"tags":["content-sources"],"summary":"Update Source","operationId":"update_source_api_content_sources__source_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSourceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSourceRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["content-sources"],"summary":"Delete Source","operationId":"delete_source_api_content_sources__source_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content-sources/suggest":{"post":{"tags":["content-sources"],"summary":"Suggest Sources","description":"Recommend RSS feeds + keyword/hashtag seeds for this org.\n\nUses the org's saved ``company_context``, ``target_audience``, and\n``draft_topic_mix`` as input. Each LLM-suggested RSS URL is\nfetched and parsed before being returned — hallucinated feeds get\ndropped so the admin only sees URLs that actually resolve. Both\nlists are deduped against the org's existing content sources so\nwe never offer to add something the org already has.\n\nReturns 503 if no LLM credentials are configured. The frontend\nsurfaces that as an \"Add an LLM key in Connectors first\" hint.","operationId":"suggest_sources_api_content_sources_suggest_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentSourceSuggestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content-sources/items":{"get":{"tags":["content-sources"],"summary":"List Content Items","description":"Recent cached RSS items for the active org.\n\nSurfaced as an inspector so admins can spot-check that a feed is\nactually returning content (vs. silently producing 0 items every\npoll) and see exactly what the drafter will pull from on the\nnext Generate Drafts run. ``source_id`` scopes to one feed when\nset; otherwise returns recent items across every feed in the org.\n\nOrdered newest-first by ``published_at`` (falling back to\n``fetched_at`` for feeds that omit dates) so the most recent\nitems always lead.","operationId":"list_content_items_api_content_sources_items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentItemRead"},"title":"Response List Content Items Api Content Sources Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content-sources/poll-now":{"post":{"tags":["content-sources"],"summary":"Poll Now","description":"Poll every enabled RSS feed in this org *right now*.\n\nRuns the same fetch + upsert path the scheduled poller uses, but\ninline in the request handler so the response carries the result\ncounts the admin can show in the UI. Scoped to the active org —\nother orgs' feeds aren't touched.\n\nPer-feed failures are isolated: one bad feed's parse error logs\n+ stamps ``last_error`` on the source row, but doesn't stall the\nrest of the run. Same contract as the Celery task.","operationId":"poll_now_api_content_sources_poll_now_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollNowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/credentials":{"get":{"tags":["credentials"],"summary":"List Credentials","description":"List all credentials with masked values for the current org PLUS\nany platform-wide credentials (NULL org). The frontend filters by\nservice to decide which page (Org vs Platform) to render each on.","operationId":"list_credentials_api_credentials_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CredentialRead"},"title":"Response List Credentials Api Credentials Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/credentials/{service}":{"get":{"tags":["credentials"],"summary":"List Service Credentials","description":"List credentials for a specific service.\n\nArgs:\n    service: The service group to filter by.","operationId":"list_service_credentials_api_credentials__service__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"service","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ServiceGroup"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CredentialRead"},"title":"Response List Service Credentials Api Credentials  Service  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/credentials/{service}/{key_name}":{"put":{"tags":["credentials"],"summary":"Update Credential","description":"Create or update a credential (encrypts value before storage).\n\nPlatform services (LLM, Video, Influencer) write to the NULL-org\nrow shared across the whole deployment — only super admins can do\nthis. Org services write to the caller's active org as before.","operationId":"update_credential_api_credentials__service___key_name__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"service","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ServiceGroup"}},{"name":"key_name","in":"path","required":true,"schema":{"type":"string","title":"Key Name"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["credentials"],"summary":"Delete Credential","description":"Delete a credential (reverts to env var fallback). Platform\nservices require super-admin; org services use the active org.","operationId":"delete_credential_api_credentials__service___key_name__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"service","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ServiceGroup"}},{"name":"key_name","in":"path","required":true,"schema":{"type":"string","title":"Key Name"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Credential Api Credentials  Service   Key Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/credentials/{service}/test":{"post":{"tags":["credentials"],"summary":"Test Service Connection","description":"Test connectivity for a service using stored credentials.\n\nArgs:\n    service: The service group to test.","operationId":"test_service_connection_api_credentials__service__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"service","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ServiceGroup"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialTestResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me":{"get":{"tags":["users"],"summary":"Get Me","description":"Get the current authenticated user with org memberships.\n\nArgs:\n    current_user: The authenticated user from JWT.\n    session: Database session.\n\nReturns:\n    dict: Current user info with organizations.","operationId":"get_me_api_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Me Api Users Me Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/users":{"get":{"tags":["users"],"summary":"List Users","description":"List all users (admin-only).\n\nArgs:\n    session: Database session.\n    current_user: The authenticated admin user.\n\nReturns:\n    list[User]: All users.","operationId":"list_users_api_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserRead"},"type":"array","title":"Response List Users Api Users Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["users"],"summary":"Create User","description":"Create a new user (admin-only).\n\nArgs:\n    data: New user data (email, password, full_name, role).\n    session: Database session.\n    current_user: The authenticated admin user.\n\nReturns:\n    User: The created user.","operationId":"create_user_api_users_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/users/{user_id}":{"put":{"tags":["users"],"summary":"Update User","description":"Update a user's role or active status (admin-only).\n\nArgs:\n    user_id: The ID of the user to update.\n    data: Fields to update (role, is_active).\n    session: Database session.\n    current_user: The authenticated admin user.\n\nReturns:\n    User: The updated user.","operationId":"update_user_api_users__user_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/search":{"post":{"tags":["influencer"],"summary":"Search Influencers","description":"Run an ad-hoc influencer discovery search and return matching creators.\n\nArgs:\n    data: JSON body with ``platform`` (str, required), ``ai_search`` (str),\n          ``number_of_followers`` (dict with min/max), ``engagement_percent``\n          (dict with min), ``page`` (int), ``limit`` (int).","operationId":"search_influencers_api_influencer_search_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Influencers Api Influencer Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/monitors":{"get":{"tags":["influencer"],"summary":"List Monitors","description":"List all influencer search monitors.","operationId":"list_monitors_api_influencer_monitors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InfluencerMonitorRead"},"title":"Response List Monitors Api Influencer Monitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["influencer"],"summary":"Create Monitor","description":"Create a new influencer search monitor.","operationId":"create_monitor_api_influencer_monitors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluencerMonitorCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluencerMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/monitors/{monitor_id}":{"put":{"tags":["influencer"],"summary":"Update Monitor","description":"Update an influencer search monitor.","operationId":"update_monitor_api_influencer_monitors__monitor_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluencerMonitorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluencerMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["influencer"],"summary":"Delete Monitor","description":"Delete an influencer search monitor and nullify related references.","operationId":"delete_monitor_api_influencer_monitors__monitor_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/scan":{"post":{"tags":["influencer"],"summary":"Trigger Scan","description":"Trigger an immediate scan of all active influencer monitors.","operationId":"trigger_scan_api_influencer_scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Scan Api Influencer Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/monitors/{monitor_id}/scan":{"post":{"tags":["influencer"],"summary":"Trigger Monitor Scan","description":"Trigger an immediate scan for a specific influencer monitor.\n\nArgs:\n    monitor_id: ID of the monitor to scan.","operationId":"trigger_monitor_scan_api_influencer_monitors__monitor_id__scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Monitor Scan Api Influencer Monitors  Monitor Id  Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/profiles":{"get":{"tags":["influencer"],"summary":"List Profiles","description":"List discovered influencer profiles with filters.","operationId":"list_profiles_api_influencer_profiles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.0,"title":"Min Score"}},{"name":"monitor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InfluencerProfileRead"},"title":"Response List Profiles Api Influencer Profiles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/profiles/{profile_id}":{"patch":{"tags":["influencer"],"summary":"Update Profile","description":"Update an influencer profile status.","operationId":"update_profile_api_influencer_profiles__profile_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"integer","title":"Profile Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluencerProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluencerProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/quick-enrich":{"post":{"tags":["influencer"],"summary":"Quick Enrich","description":"Quick-enrich a creator by handle to get contact info (0.03 credits).\n\nUseful for ad-hoc search results that haven't been saved as profiles.\n\nArgs:\n    data: JSON body with ``handle`` (str) and ``platform`` (str).\n\nReturns:\n    dict: Enriched creator data including email and profile details.","operationId":"quick_enrich_api_influencer_quick_enrich_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Quick Enrich Api Influencer Quick Enrich Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/profiles/{profile_id}/enrich":{"post":{"tags":["influencer"],"summary":"Enrich Profile","description":"Trigger full enrichment for a profile (costs 1 API credit).","operationId":"enrich_profile_api_influencer_profiles__profile_id__enrich_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"integer","title":"Profile Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Enrich Profile Api Influencer Profiles  Profile Id  Enrich Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/profiles/bulk-action":{"post":{"tags":["influencer"],"summary":"Bulk Action","description":"Apply an action to multiple influencer profiles at once.\n\nSupported actions: shortlist, dismiss, enrich.\n\nArgs:\n    data: Profile IDs and action to apply.","operationId":"bulk_action_api_influencer_profiles_bulk_action_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/monitors/{monitor_id}/test-discovery":{"post":{"tags":["influencer"],"summary":"Test Discovery","description":"Test the discovery API call for a monitor and return the raw response.\n\nUseful for debugging — shows the exact API payload sent and response received.\n\nArgs:\n    monitor_id: ID of the monitor to test.","operationId":"test_discovery_api_influencer_monitors__monitor_id__test_discovery_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Discovery Api Influencer Monitors  Monitor Id  Test Discovery Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/influencer/credits":{"get":{"tags":["influencer"],"summary":"Check Credits","description":"Check remaining Influencers.club API credits.","operationId":"check_credits_api_influencer_credits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/search":{"post":{"tags":["prospects"],"summary":"Search Prospects","description":"Run an ad-hoc Apollo People Search and return matching prospects.\n\nArgs:\n    data: JSON body with optional filters: ``person_titles``, ``person_seniorities``,\n          ``person_locations``, ``q_organization_keyword_tags``,\n          ``organization_num_employees_ranges``, ``q_keywords``,\n          ``page`` (int), ``per_page`` (int).","operationId":"search_prospects_api_prospects_search_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Prospects Api Prospects Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/monitors":{"get":{"tags":["prospects"],"summary":"List Monitors","description":"List all prospect search monitors.","operationId":"list_monitors_api_prospects_monitors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProspectMonitorRead"},"title":"Response List Monitors Api Prospects Monitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["prospects"],"summary":"Create Monitor","description":"Create a new prospect search monitor.","operationId":"create_monitor_api_prospects_monitors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectMonitorCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/monitors/{monitor_id}":{"put":{"tags":["prospects"],"summary":"Update Monitor","description":"Update a prospect search monitor.","operationId":"update_monitor_api_prospects_monitors__monitor_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectMonitorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["prospects"],"summary":"Delete Monitor","description":"Delete a prospect search monitor and nullify related references.","operationId":"delete_monitor_api_prospects_monitors__monitor_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/scan":{"post":{"tags":["prospects"],"summary":"Trigger Scan","description":"Trigger an immediate scan of all active prospect monitors.","operationId":"trigger_scan_api_prospects_scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Scan Api Prospects Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/monitors/{monitor_id}/scan":{"post":{"tags":["prospects"],"summary":"Trigger Monitor Scan","description":"Trigger an immediate scan for a specific prospect monitor.\n\nArgs:\n    monitor_id: ID of the monitor to scan.","operationId":"trigger_monitor_scan_api_prospects_monitors__monitor_id__scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Monitor Scan Api Prospects Monitors  Monitor Id  Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/monitors/{monitor_id}/test-discovery":{"post":{"tags":["prospects"],"summary":"Test Discovery","description":"Test the Apollo API for a monitor and return raw results.\n\nUseful for debugging — shows the exact filters and response received.\n\nArgs:\n    monitor_id: ID of the monitor to test.","operationId":"test_discovery_api_prospects_monitors__monitor_id__test_discovery_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Discovery Api Prospects Monitors  Monitor Id  Test Discovery Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/profiles":{"get":{"tags":["prospects"],"summary":"List Profiles","description":"List discovered prospect profiles with filters.","operationId":"list_profiles_api_prospects_profiles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.0,"title":"Min Score"}},{"name":"monitor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProspectProfileRead"},"title":"Response List Profiles Api Prospects Profiles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/profiles/{profile_id}":{"patch":{"tags":["prospects"],"summary":"Update Profile","description":"Update a prospect profile status.","operationId":"update_profile_api_prospects_profiles__profile_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"integer","title":"Profile Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/profiles/{profile_id}/enrich":{"post":{"tags":["prospects"],"summary":"Enrich Profile","description":"Trigger enrichment for a prospect (costs API credits).","operationId":"enrich_profile_api_prospects_profiles__profile_id__enrich_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"integer","title":"Profile Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Enrich Profile Api Prospects Profiles  Profile Id  Enrich Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/profiles/bulk-action":{"post":{"tags":["prospects"],"summary":"Bulk Action","description":"Apply an action to multiple prospect profiles at once.\n\nSupported actions: shortlist, dismiss, enrich, delete.\n\nArgs:\n    data: Profile IDs and action to apply.","operationId":"bulk_action_api_prospects_profiles_bulk_action_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectBulkActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectBulkActionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/usage":{"get":{"tags":["prospects"],"summary":"Check Usage","description":"Check Apollo.io API usage and rate limits.","operationId":"check_usage_api_prospects_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Check Usage Api Prospects Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/scans":{"get":{"tags":["prospects"],"summary":"List Scans","description":"List all prospect scan executions.","operationId":"list_scans_api_prospects_scans_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProspectScanRead"},"title":"Response List Scans Api Prospects Scans Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/scans/{scan_id}/results":{"get":{"tags":["prospects"],"summary":"List Scan Results","description":"List profiles discovered in a specific scan.","operationId":"list_scan_results_api_prospects_scans__scan_id__results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"integer","title":"Scan Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProspectProfileRead"},"title":"Response List Scan Results Api Prospects Scans  Scan Id  Results Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/lists":{"post":{"tags":["prospects"],"summary":"Create Prospect List","description":"Create a prospect list from selected profile IDs.","operationId":"create_prospect_list_api_prospects_lists_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectListCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectListDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["prospects"],"summary":"List Prospect Lists","description":"List all saved prospect lists.","operationId":"list_prospect_lists_api_prospects_lists_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProspectListRead"},"title":"Response List Prospect Lists Api Prospects Lists Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prospects/lists/{list_id}":{"get":{"tags":["prospects"],"summary":"Get Prospect List","description":"Get a prospect list with all its profile entries.","operationId":"get_prospect_list_api_prospects_lists__list_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProspectListDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["prospects"],"summary":"Delete Prospect List","description":"Delete a prospect list.","operationId":"delete_prospect_list_api_prospects_lists__list_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/webhook":{"post":{"tags":["linkedin"],"summary":"Receive Webhook","description":"Receive a webhook event from MeetAlfred.\n\nVerifies the request using a shared secret header, then stores the\nevent and optionally queues LLM analysis.\n\nArgs:\n    payload: MeetAlfred webhook event data.\n    x_webhook_secret: Shared secret for authentication.","operationId":"receive_webhook_api_linkedin_webhook_post","parameters":[{"name":"X-Webhook-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Webhook-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetAlfredWebhookPayload"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Receive Webhook Api Linkedin Webhook Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/oauth/start":{"get":{"tags":["linkedin"],"summary":"Oauth Start","description":"Return the URL the user should be redirected to so they can\nauthorise mktops on their LinkedIn account.","operationId":"oauth_start_api_linkedin_oauth_start_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Start Api Linkedin Oauth Start Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/oauth/callback":{"get":{"tags":["linkedin"],"summary":"Oauth Callback","description":"LinkedIn redirects the user here with an authorisation ``code``.\n\nWe open our own DB session because this endpoint isn't auth-guarded\n— it's a browser redirect, not a bearer-token API call. The signed\n``state`` JWT carries the org_id we should attach the tokens to.","operationId":"oauth_callback_api_linkedin_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/oauth/status":{"get":{"tags":["linkedin"],"summary":"Oauth Status","description":"Return whether this org has a working LinkedIn OAuth connection.","operationId":"oauth_status_api_linkedin_oauth_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Status Api Linkedin Oauth Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/oauth/disconnect":{"post":{"tags":["linkedin"],"summary":"Oauth Disconnect","description":"Clear the stored OAuth tokens for this org.","operationId":"oauth_disconnect_api_linkedin_oauth_disconnect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Disconnect Api Linkedin Oauth Disconnect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/publish-now":{"post":{"tags":["linkedin"],"summary":"Publish Now","description":"Publish a text post immediately — skips the draft/approval flow.\n\nBody: ``{\"text\": str, \"visibility\": \"PUBLIC\" | \"CONNECTIONS\"}``.","operationId":"publish_now_api_linkedin_publish_now_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Publish Now Api Linkedin Publish Now Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/generate-drafts":{"post":{"tags":["linkedin"],"summary":"Generate Drafts","description":"Queue LLM generation of LinkedIn post drafts.","operationId":"generate_drafts_api_linkedin_generate_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Drafts Api Linkedin Generate Drafts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/posts/import":{"post":{"tags":["linkedin"],"summary":"Import Linkedin Posts","description":"Ingest a LinkedIn data export (ZIP or Shares.csv).\n\nUses ``share_url`` as the dedup key — re-uploading the same export\nupdates existing rows rather than duplicating them.","operationId":"import_linkedin_posts_api_linkedin_posts_import_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_linkedin_posts_api_linkedin_posts_import_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/posts":{"get":{"tags":["linkedin"],"summary":"List Linkedin Posts","description":"List imported LinkedIn posts, newest first.","operationId":"list_linkedin_posts_api_linkedin_posts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LinkedInPostRead"},"title":"Response List Linkedin Posts Api Linkedin Posts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/posts/{post_id}":{"delete":{"tags":["linkedin"],"summary":"Delete Linkedin Post","description":"Delete a single imported LinkedIn post.","operationId":"delete_linkedin_post_api_linkedin_posts__post_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/events":{"get":{"tags":["linkedin"],"summary":"List Events","description":"List LinkedIn events with optional filters.\n\nArgs:\n    event_type: Filter by event type (new_lead, new_reply, new_connection).\n    dismissed: Show dismissed events (default: False).\n    min_score: Minimum relevance score filter.\n    limit: Maximum number of results.\n    offset: Pagination offset.","operationId":"list_events_api_linkedin_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"dismissed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dismissed"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.0,"title":"Min Score"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LinkedInEventRead"},"title":"Response List Events Api Linkedin Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/events/{event_id}/dismiss":{"post":{"tags":["linkedin"],"summary":"Dismiss Event","description":"Dismiss a LinkedIn event.\n\nArgs:\n    event_id: ID of the event to dismiss.","operationId":"dismiss_event_api_linkedin_events__event_id__dismiss_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dismiss Event Api Linkedin Events  Event Id  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/events/{event_id}/create-draft":{"post":{"tags":["linkedin"],"summary":"Create Draft From Event","description":"Create a draft LinkedIn reply from an event.\n\nIf the event has no draft_response, generates one via LLM on-demand.\n\nArgs:\n    event_id: ID of the event to create a draft from.","operationId":"create_draft_from_event_api_linkedin_events__event_id__create_draft_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Draft From Event Api Linkedin Events  Event Id  Create Draft Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/events/bulk-action":{"post":{"tags":["linkedin"],"summary":"Bulk Action Events","description":"Apply a bulk action to multiple LinkedIn events.\n\nArgs:\n    data: {\"event_ids\": [int], \"action\": \"dismiss\" | \"create_draft\"}","operationId":"bulk_action_events_api_linkedin_events_bulk_action_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bulk Action Events Api Linkedin Events Bulk Action Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/campaigns":{"get":{"tags":["linkedin"],"summary":"List Campaigns","description":"List available MeetAlfred campaigns.\n\nFetches campaigns from MeetAlfred's API so users can select\nwhich campaign to push leads to.","operationId":"list_campaigns_api_linkedin_campaigns_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Campaigns Api Linkedin Campaigns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/events/{event_id}/push-to-campaign":{"post":{"tags":["linkedin"],"summary":"Push Event To Campaign","description":"Push a LinkedIn event's lead to a MeetAlfred campaign.\n\nArgs:\n    event_id: ID of the LinkedInEvent.\n    data: {\"campaign_key\": str} — the MeetAlfred campaign to add the lead to.","operationId":"push_event_to_campaign_api_linkedin_events__event_id__push_to_campaign_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Push Event To Campaign Api Linkedin Events  Event Id  Push To Campaign Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/push-to-campaign":{"post":{"tags":["linkedin"],"summary":"Push Leads To Campaign","description":"Push multiple LinkedIn event leads to a MeetAlfred campaign.\n\nArgs:\n    data: {\"event_ids\": [int], \"campaign_key\": str}","operationId":"push_leads_to_campaign_api_linkedin_push_to_campaign_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Push Leads To Campaign Api Linkedin Push To Campaign Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/scan":{"post":{"tags":["linkedin"],"summary":"Trigger Meetalfred Scan","description":"Trigger an on-demand poll of MeetAlfred for new events.\n\nQueues the polling task in Celery and returns the task ID.","operationId":"trigger_meetalfred_scan_api_linkedin_scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Meetalfred Scan Api Linkedin Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/search":{"get":{"tags":["openalex"],"summary":"Search Works","description":"Search OpenAlex for academic works/papers.","operationId":"search_works_api_openalex_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"From date (YYYY-MM-DD)","title":"From Date"},"description":"From date (YYYY-MM-DD)"},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"To date (YYYY-MM-DD)","title":"To Date"},"description":"To date (YYYY-MM-DD)"},{"name":"relative_days","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Rolling window in days (overrides from_date)","title":"Relative Days"},"description":"Rolling window in days (overrides from_date)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":25,"title":"Per Page"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/lists":{"post":{"tags":["openalex"],"summary":"Create Author List","description":"Generate an author list from selected OpenAlex paper IDs.\n\nFetches full paper data, extracts all authorships, deduplicates\nby author OpenAlex ID, and persists the list.","operationId":"create_author_list_api_openalex_lists_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorListCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorListDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["openalex"],"summary":"List Author Lists","description":"Return all saved author lists (without entries).","operationId":"list_author_lists_api_openalex_lists_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuthorListRead"},"title":"Response List Author Lists Api Openalex Lists Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/lists/{list_id}":{"get":{"tags":["openalex"],"summary":"Get Author List","description":"Return a single author list with all entries.","operationId":"get_author_list_api_openalex_lists__list_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorListDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["openalex"],"summary":"Delete Author List","description":"Delete an author list and all its entries.","operationId":"delete_author_list_api_openalex_lists__list_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/scans":{"get":{"tags":["openalex"],"summary":"List Scans","description":"List all scan executions for the current organization.","operationId":"list_scans_api_openalex_scans_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScanRead"},"title":"Response List Scans Api Openalex Scans Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/scans/{scan_id}/results":{"get":{"tags":["openalex"],"summary":"List Scan Results","description":"List results for a specific scan.","operationId":"list_scan_results_api_openalex_scans__scan_id__results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"integer","title":"Scan Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonitorResultRead"},"title":"Response List Scan Results Api Openalex Scans  Scan Id  Results Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/monitors":{"get":{"tags":["openalex"],"summary":"List Monitors","description":"List all OpenAlex search monitors.","operationId":"list_monitors_api_openalex_monitors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SearchMonitorRead"},"title":"Response List Monitors Api Openalex Monitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["openalex"],"summary":"Create Monitor","description":"Create a new OpenAlex search monitor.","operationId":"create_monitor_api_openalex_monitors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchMonitorCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/monitors/{monitor_id}":{"put":{"tags":["openalex"],"summary":"Update Monitor","description":"Update an OpenAlex search monitor.","operationId":"update_monitor_api_openalex_monitors__monitor_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchMonitorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["openalex"],"summary":"Delete Monitor","description":"Delete an OpenAlex search monitor and all its results.","operationId":"delete_monitor_api_openalex_monitors__monitor_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/monitors/{monitor_id}/scan":{"post":{"tags":["openalex"],"summary":"Trigger Monitor Scan","description":"Trigger an immediate scan for a specific OpenAlex monitor.","operationId":"trigger_monitor_scan_api_openalex_monitors__monitor_id__scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Monitor Scan Api Openalex Monitors  Monitor Id  Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/monitors/{monitor_id}/test-discovery":{"post":{"tags":["openalex"],"summary":"Test Discovery","description":"Test the OpenAlex API for a monitor and return raw results.\n\nUseful for debugging — shows the exact query and response received.\n\nArgs:\n    monitor_id: ID of the monitor to test.","operationId":"test_discovery_api_openalex_monitors__monitor_id__test_discovery_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Discovery Api Openalex Monitors  Monitor Id  Test Discovery Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/monitors/{monitor_id}/results":{"get":{"tags":["openalex"],"summary":"List Monitor Results","description":"List results for a specific OpenAlex search monitor.","operationId":"list_monitor_results_api_openalex_monitors__monitor_id__results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"dismissed","in":"query","required":false,"schema":{"type":"boolean","description":"Show dismissed results","default":false,"title":"Dismissed"},"description":"Show dismissed results"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonitorResultRead"},"title":"Response List Monitor Results Api Openalex Monitors  Monitor Id  Results Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/openalex/monitors/results/{result_id}/dismiss":{"post":{"tags":["openalex"],"summary":"Dismiss Result","description":"Dismiss a monitor result.","operationId":"dismiss_result_api_openalex_monitors_results__result_id__dismiss_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"result_id","in":"path","required":true,"schema":{"type":"integer","title":"Result Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dismiss Result Api Openalex Monitors Results  Result Id  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/monitoring":{"get":{"tags":["tasks"],"summary":"Get Task Monitoring","description":"Get combined task monitoring data: summary stats, queue status, and recent tasks.","operationId":"get_task_monitoring_api_tasks_monitoring_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskMonitoringResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/tasks/history":{"get":{"tags":["tasks"],"summary":"Get Task History","description":"Get paginated task execution history with filters.","operationId":"get_task_history_api_tasks_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Name"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"queue","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Queue"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaskLogRead"},"title":"Response Get Task History Api Tasks History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/{task_id}":{"get":{"tags":["tasks"],"summary":"Get Task Detail","description":"Get detailed info for a single task execution.","operationId":"get_task_detail_api_tasks__task_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskLogRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/videos/voices":{"get":{"tags":["videos"],"summary":"List Voices","description":"List available Creatify voices for video generation.","operationId":"list_voices_api_videos_voices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VoiceRead"},"title":"Response List Voices Api Videos Voices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/videos/url-to-video":{"post":{"tags":["videos"],"summary":"Create Url To Video","description":"Start a URL-to-Video generation job via Creatify.\n\nCreates a VideoJob record and queues a Celery task for processing.","operationId":"create_url_to_video_api_videos_url_to_video_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/URLToVideoCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJobRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/videos/avatar":{"post":{"tags":["videos"],"summary":"Create Avatar Video","description":"Start an AI Avatar video generation job via Creatify.\n\nCreates a VideoJob record and queues a Celery task for processing.","operationId":"create_avatar_video_api_videos_avatar_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarVideoCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJobRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/videos":{"get":{"tags":["videos"],"summary":"List Video Jobs","description":"List all video generation jobs, most recent first.","operationId":"list_video_jobs_api_videos_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"job_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by job type","title":"Job Type"},"description":"Filter by job type"},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VideoJobRead"},"title":"Response List Video Jobs Api Videos Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/videos/{job_id}":{"get":{"tags":["videos"],"summary":"Get Video Job","description":"Get a single video job by ID.","operationId":"get_video_job_api_videos__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJobRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["videos"],"summary":"Delete Video Job","description":"Delete a video job record.","operationId":"delete_video_job_api_videos__job_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations":{"get":{"tags":["organizations"],"summary":"List Organizations","description":"List all organizations (admin only).\n\nArgs:\n    _admin: Verified admin user.\n    session: Database session.\n\nReturns:\n    list: All organizations with member counts.","operationId":"list_organizations_api_organizations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OrganizationRead"},"type":"array","title":"Response List Organizations Api Organizations Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["organizations"],"summary":"Create Organization","description":"Create a new organization (admin only).\n\nAutomatically adds the creating user as an org_admin member.\n\nArgs:\n    data: Organization creation data.\n    admin: Verified admin user.\n    session: Database session.\n\nReturns:\n    dict: The created organization.","operationId":"create_organization_api_organizations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/organizations/self":{"post":{"tags":["organizations"],"summary":"Create My Workspace","description":"Self-serve: the current user creates their own workspace.\n\nUnlike the admin-only ``POST \"\"``, any authenticated user may create a\nworkspace here and becomes its admin — this is how a new user sets up their\nfirst workspace from the onboarding gate. The slug is auto-generated from\nthe name unless one is supplied.\n\nArgs:\n    data: Workspace name, personal/team flag, optional slug.\n    user: The authenticated user (becomes the workspace admin).\n    session: Database session.\n\nReturns:\n    dict: The created workspace.","operationId":"create_my_workspace_api_organizations_self_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/organizations/{org_id}":{"patch":{"tags":["organizations"],"summary":"Update Organization","description":"Update an organization (admin only).\n\nArgs:\n    org_id: Organization ID.\n    data: Fields to update.\n    _admin: Verified admin user.\n    session: Database session.\n\nReturns:\n    dict: Updated organization.","operationId":"update_organization_api_organizations__org_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organizations"],"summary":"Delete Organization","description":"Delete an organization (admin only).\n\nArgs:\n    org_id: Organization ID.\n    _admin: Verified admin user.\n    session: Database session.","operationId":"delete_organization_api_organizations__org_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/members":{"get":{"tags":["organizations"],"summary":"List Members","description":"List members of an organization. Visible to global admins and to\norg_admins of the same organization (org-admin of org A can see A\nbut not B).\n\nArgs:\n    org_id: Organization ID.\n    _admin: Verified admin user.\n    session: Database session.\n\nReturns:\n    list: Organization members with user info.","operationId":"list_members_api_organizations__org_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MembershipRead"},"title":"Response List Members Api Organizations  Org Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["organizations"],"summary":"Add Member","description":"Add a user to an organization by email (admin only).\n\nArgs:\n    org_id: Organization ID.\n    data: Member creation data (email + role).\n    _admin: Verified admin user.\n    session: Database session.\n\nReturns:\n    dict: The created membership.","operationId":"add_member_api_organizations__org_id__members_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/members/{member_id}":{"patch":{"tags":["organizations"],"summary":"Update Member Role","description":"Update a member's role within an organization. Permitted for the\norg's own admins (and for global admins).","operationId":"update_member_role_api_organizations__org_id__members__member_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organizations"],"summary":"Remove Member","description":"Remove a member from an organization. Org admins can do this for\ntheir own org; global admins can do it for any org.","operationId":"remove_member_api_organizations__org_id__members__member_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{organization_id}/invites":{"post":{"tags":["invitations"],"summary":"Create Invite","description":"Create + email an invitation. Revokes any prior pending invite\nfor the same (org, email) so a single accept link is always the\nlive one.","operationId":"create_invite_api_organizations__organization_id__invites_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"integer","title":"Organization Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["invitations"],"summary":"List Invites","operationId":"list_invites_api_organizations__organization_id__invites_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"integer","title":"Organization Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InviteRead"},"title":"Response List Invites Api Organizations  Organization Id  Invites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{organization_id}/invites/{invite_id}/revoke":{"post":{"tags":["invitations"],"summary":"Revoke Invite","operationId":"revoke_invite_api_organizations__organization_id__invites__invite_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"integer","title":"Organization Id"}},{"name":"invite_id","in":"path","required":true,"schema":{"type":"integer","title":"Invite Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/invites/{token}":{"get":{"tags":["invitations"],"summary":"Preview Invite","operationId":"preview_invite_api_invites__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitePreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/invites/{token}/accept":{"post":{"tags":["invitations"],"summary":"Accept Invite","description":"Create the user (if they don't exist) + the membership, mark\nthe invite accepted, all in one transaction.","operationId":"accept_invite_api_invites__token__accept_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/stats":{"get":{"tags":["dashboard"],"summary":"Get Dashboard Stats","description":"Return quick aggregate counts for the current organization.\n\nArgs:\n    auth: Authenticated user + org context.\n    session: Async database session.\n\nReturns:\n    DashboardStatsResponse: Aggregate counts by entity type.","operationId":"get_dashboard_stats_api_dashboard_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/generate-drafts":{"post":{"tags":["bluesky"],"summary":"Generate Drafts","description":"Trigger LLM generation of BlueSky post drafts.","operationId":"generate_drafts_api_bluesky_generate_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Drafts Api Bluesky Generate Drafts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/search":{"post":{"tags":["bluesky"],"summary":"Search Posts","description":"Run an ad-hoc BlueSky search and return matching posts.","operationId":"search_posts_api_bluesky_search_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkySearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Posts Api Bluesky Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/history":{"get":{"tags":["bluesky"],"summary":"Get Account History","description":"Return the authenticated BlueSky account's own posts.\n\nArgs:\n    months: Lookback window (default 6).\n    max_results: Cap across paginated pages.\n    exclude_reposts: Drop posts reposted by the account.","operationId":"get_account_history_api_bluesky_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":6,"title":"Months"}},{"name":"max_results","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Max Results"}},{"name":"exclude_reposts","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Exclude Reposts"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Account History Api Bluesky History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/monitors":{"get":{"tags":["bluesky"],"summary":"List Monitors","description":"List all BlueSky search monitors.","operationId":"list_monitors_api_bluesky_monitors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlueSkyMonitorRead"},"title":"Response List Monitors Api Bluesky Monitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["bluesky"],"summary":"Create Monitor","description":"Create a new BlueSky search monitor.","operationId":"create_monitor_api_bluesky_monitors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyMonitorCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/monitors/{monitor_id}":{"put":{"tags":["bluesky"],"summary":"Update Monitor","description":"Update a BlueSky search monitor.","operationId":"update_monitor_api_bluesky_monitors__monitor_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyMonitorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyMonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["bluesky"],"summary":"Delete Monitor","description":"Delete a BlueSky search monitor and its findings.","operationId":"delete_monitor_api_bluesky_monitors__monitor_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/scan":{"post":{"tags":["bluesky"],"summary":"Trigger Scan","description":"Trigger an immediate scan of all active BlueSky monitors.","operationId":"trigger_scan_api_bluesky_scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Scan Api Bluesky Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/monitors/{monitor_id}/scan":{"post":{"tags":["bluesky"],"summary":"Trigger Monitor Scan","description":"Trigger an immediate scan for a specific BlueSky monitor.","operationId":"trigger_monitor_scan_api_bluesky_monitors__monitor_id__scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Monitor Scan Api Bluesky Monitors  Monitor Id  Scan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/findings":{"get":{"tags":["bluesky"],"summary":"List Findings","description":"List BlueSky findings with filters.","operationId":"list_findings_api_bluesky_findings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dismissed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dismissed"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.0,"title":"Min Score"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlueSkyFindingRead"},"title":"Response List Findings Api Bluesky Findings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/findings/{finding_id}/dismiss":{"post":{"tags":["bluesky"],"summary":"Dismiss Finding","description":"Dismiss a BlueSky finding.","operationId":"dismiss_finding_api_bluesky_findings__finding_id__dismiss_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","title":"Finding Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dismiss Finding Api Bluesky Findings  Finding Id  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/findings/{finding_id}/create-draft":{"post":{"tags":["bluesky"],"summary":"Create Draft From Finding","description":"Create a draft reply Post from a BlueSky finding.\n\nPersists the parent ``cid`` in the post's metadata_json so the\npublisher can construct a valid AT Protocol reply ref.","operationId":"create_draft_from_finding_api_bluesky_findings__finding_id__create_draft_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"integer","title":"Finding Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Draft From Finding Api Bluesky Findings  Finding Id  Create Draft Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/findings/like":{"post":{"tags":["bluesky"],"summary":"Like Finding","description":"Like a finding's underlying BlueSky post from the authenticated account.","operationId":"like_finding_api_bluesky_findings_like_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyEngagementRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Like Finding Api Bluesky Findings Like Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/findings/repost":{"post":{"tags":["bluesky"],"summary":"Repost Finding","description":"Repost a finding's underlying BlueSky post.","operationId":"repost_finding_api_bluesky_findings_repost_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyEngagementRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Repost Finding Api Bluesky Findings Repost Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/findings/follow":{"post":{"tags":["bluesky"],"summary":"Follow Finding Author","description":"Follow the author of a finding.","operationId":"follow_finding_author_api_bluesky_findings_follow_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyEngagementRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Follow Finding Author Api Bluesky Findings Follow Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/findings/reply":{"post":{"tags":["bluesky"],"summary":"Reply To Finding","description":"Publish a reply to a finding's post immediately (bypasses scheduling).","operationId":"reply_to_finding_api_bluesky_findings_reply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyReplyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reply To Finding Api Bluesky Findings Reply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/scans":{"get":{"tags":["bluesky"],"summary":"List Scans","description":"List BlueSky scan executions.","operationId":"list_scans_api_bluesky_scans_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlueSkyScanRead"},"title":"Response List Scans Api Bluesky Scans Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/scans/{scan_id}/results":{"get":{"tags":["bluesky"],"summary":"List Scan Results","description":"List findings from a specific scan.","operationId":"list_scan_results_api_bluesky_scans__scan_id__results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"integer","title":"Scan Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlueSkyFindingRead"},"title":"Response List Scan Results Api Bluesky Scans  Scan Id  Results Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/lists":{"post":{"tags":["bluesky"],"summary":"Create Bluesky List","description":"Create a list from selected finding IDs.","operationId":"create_bluesky_list_api_bluesky_lists_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyListCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyListDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["bluesky"],"summary":"List Bluesky Lists","description":"List all saved BlueSky lists.","operationId":"list_bluesky_lists_api_bluesky_lists_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlueSkyListRead"},"title":"Response List Bluesky Lists Api Bluesky Lists Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bluesky/lists/{list_id}":{"get":{"tags":["bluesky"],"summary":"Get Bluesky List","description":"Get a list with all its finding entries.","operationId":"get_bluesky_list_api_bluesky_lists__list_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueSkyListDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["bluesky"],"summary":"Delete Bluesky List","description":"Delete a BlueSky list.","operationId":"delete_bluesky_list_api_bluesky_lists__list_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/oauth/start":{"get":{"tags":["youtube"],"summary":"Oauth Start","description":"Return the Google authorize URL the user should be redirected to.","operationId":"oauth_start_api_youtube_oauth_start_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Start Api Youtube Oauth Start Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/oauth/callback":{"get":{"tags":["youtube"],"summary":"Oauth Callback","description":"Google redirects the user here with an authorisation code.","operationId":"oauth_callback_api_youtube_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/oauth/status":{"get":{"tags":["youtube"],"summary":"Oauth Status","description":"Return the OAuth connection status for the active org.","operationId":"oauth_status_api_youtube_oauth_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YouTubeOAuthStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/oauth/disconnect":{"post":{"tags":["youtube"],"summary":"Oauth Disconnect","description":"Clear all YouTube OAuth credentials for the active org.","operationId":"oauth_disconnect_api_youtube_oauth_disconnect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Disconnect Api Youtube Oauth Disconnect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/drafts":{"get":{"tags":["youtube"],"summary":"List Drafts","description":"List drafts + scheduled videos for the active org.","operationId":"list_drafts_api_youtube_drafts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/YouTubeVideoRead"},"title":"Response List Drafts Api Youtube Drafts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["youtube"],"summary":"Create Draft","description":"Create a new draft video (metadata only — file upload comes later).\n\nBody:\n    ``{\"title\": str, \"description\"?: str, \"tags\"?: [str],\n    \"category_id\"?: str, \"privacy\"?: \"public|unlisted|private\",\n    \"made_for_kids\"?: bool, \"scheduled_at\"?: ISO datetime}``.","operationId":"create_draft_api_youtube_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YouTubeVideoRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/published":{"get":{"tags":["youtube"],"summary":"List Published","description":"List published videos for the active org, with engagement metrics.","operationId":"list_published_api_youtube_published_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/YouTubeVideoRead"},"title":"Response List Published Api Youtube Published Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/drafts/{video_id}":{"patch":{"tags":["youtube"],"summary":"Update Draft","description":"Edit a draft's metadata. If the video is already uploaded to\nYouTube (status SCHEDULED/PUBLISHED), the matching ``videos.update``\ncall is fired so changes propagate.","operationId":"update_draft_api_youtube_drafts__video_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YouTubeDraftUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YouTubeVideoRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["youtube"],"summary":"Delete Draft","description":"Delete a draft. If it's already on YouTube, also delete it there.","operationId":"delete_draft_api_youtube_drafts__video_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/drafts/{video_id}/generate":{"post":{"tags":["youtube"],"summary":"Generate Metadata","description":"LLM-generate title/description/tags for an existing draft.\n\nWrites the values back onto the draft so the user can refine them\nbefore scheduling. Returns the generated values for the UI to show\nimmediately.","operationId":"generate_metadata_api_youtube_drafts__video_id__generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YouTubeGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YouTubeGenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/drafts/{video_id}/upload":{"post":{"tags":["youtube"],"summary":"Upload Draft File","description":"Upload the video bytes to YouTube and (optionally) schedule the publish.\n\nStreams the file straight through to the YouTube resumable-upload\nendpoint — we do not persist the bytes. The draft transitions to\nSCHEDULED (if ``publish_at`` is set) or PUBLISHED (if not).","operationId":"upload_draft_file_api_youtube_drafts__video_id__upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_draft_file_api_youtube_drafts__video_id__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/YouTubeVideoRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/youtube/refresh-metrics":{"post":{"tags":["youtube"],"summary":"Refresh Metrics","description":"Kick off an on-demand metrics refresh for this org.","operationId":"refresh_metrics_api_youtube_refresh_metrics_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Refresh Metrics Api Youtube Refresh Metrics Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/oauth/start":{"get":{"tags":["instagram"],"summary":"Oauth Start","description":"Return the Meta authorize URL the user should be redirected to.","operationId":"oauth_start_api_instagram_oauth_start_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Start Api Instagram Oauth Start Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/oauth/callback":{"get":{"tags":["instagram"],"summary":"Oauth Callback","description":"Meta redirects the user here with an authorisation code.","operationId":"oauth_callback_api_instagram_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/oauth/status":{"get":{"tags":["instagram"],"summary":"Oauth Status","description":"Return the OAuth connection status for the active org.","operationId":"oauth_status_api_instagram_oauth_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramOAuthStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/oauth/disconnect":{"post":{"tags":["instagram"],"summary":"Oauth Disconnect","description":"Clear all Instagram OAuth credentials for the active org.","operationId":"oauth_disconnect_api_instagram_oauth_disconnect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Disconnect Api Instagram Oauth Disconnect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/generate-drafts":{"post":{"tags":["instagram"],"summary":"Generate Drafts","description":"Queue LLM generation of Instagram caption drafts.\n\nMirrors the trigger endpoints on the other platform routers so\nthe Settings → Scheduling page has a \"Run now\" button per\nchannel. Returns immediately with the Celery task ID; the\ndrafter writes ``InstagramPost`` rows with ``status=draft`` (no\nmedia attached — the reviewer adds media before publishing).","operationId":"generate_drafts_api_instagram_generate_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Drafts Api Instagram Generate Drafts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts":{"get":{"tags":["instagram"],"summary":"List Drafts","description":"List drafts + scheduled posts for the active org.","operationId":"list_drafts_api_instagram_drafts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InstagramPostRead"},"title":"Response List Drafts Api Instagram Drafts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["instagram"],"summary":"Create Draft","description":"Create a new draft (metadata only — upload media in a follow-up call).\n\nBody:\n    ``{\"caption\"?: str, \"hashtags\"?: [str], \"media_type\"?:\n    \"image|video|reels\", \"scheduled_at\"?: ISO datetime}``.","operationId":"create_draft_api_instagram_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/published":{"get":{"tags":["instagram"],"summary":"List Published","description":"List published Instagram posts with insights.","operationId":"list_published_api_instagram_published_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InstagramPostRead"},"title":"Response List Published Api Instagram Published Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}":{"patch":{"tags":["instagram"],"summary":"Update Draft","description":"Edit a draft's metadata. No-op for already-published posts —\nInstagram doesn't expose a generic edit endpoint.","operationId":"update_draft_api_instagram_drafts__post_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramDraftUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["instagram"],"summary":"Delete Draft","description":"Delete a draft + all its candidate assets and their GCS blobs.","operationId":"delete_draft_api_instagram_drafts__post_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}/upload":{"post":{"tags":["instagram"],"summary":"Upload Draft Media","description":"Upload an image / video / reel into GCS and link it to the draft.\n\nThe bytes never touch Instagram directly — Meta fetches them from\nthe GCS public URL when we create the media container at publish\ntime. Replacing media on an existing draft deletes the prior blob.","operationId":"upload_draft_media_api_instagram_drafts__post_id__upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_draft_media_api_instagram_drafts__post_id__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}/generate-image":{"post":{"tags":["instagram"],"summary":"Generate Draft Image","description":"Generate an image with gpt-image-1 and attach it to this draft.\n\nOne-shot: each call generates a new image, uploads to GCS, deletes\nthe prior blob (if any), and sets ``media_url`` + ``gcs_object`` on\nthe row. Regenerating is just another call — no separate attach\nstep like the Twitter dialog has, because IG/FB only carry a single\nimage slot per post.","operationId":"generate_draft_image_api_instagram_drafts__post_id__generate_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__instagram___GenerateImageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}/generate-video":{"post":{"tags":["instagram"],"summary":"Generate Draft Video","description":"Kick off a Creatify URL-to-video job for this draft.\n\nAsync: Creatify renders take minutes. We submit the job, store its id with\n``media_generating=True``, return immediately, and a Celery worker polls +\nattaches the finished video (as a Reel) to the draft. The UI shows a\ngenerating state until ``media_generating`` clears.","operationId":"generate_draft_video_api_instagram_drafts__post_id__generate_video_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_GenerateVideoBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}/generate-creatify-image":{"post":{"tags":["instagram"],"summary":"Generate Draft Creatify Image","description":"Kick off a Creatify Asset-Generator (text-to-image) job for this draft.\n\nAsync, mirroring generate-video: submit the job, store it with\n``media_generating=True``, and a worker polls Creatify + attaches the\nfinished image to the draft.","operationId":"generate_draft_creatify_image_api_instagram_drafts__post_id__generate_creatify_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_GenerateCreatifyImageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}/assets/{asset_id}/select":{"post":{"tags":["instagram"],"summary":"Select Draft Asset","description":"Make a ready candidate the draft's active media (used at publish).","operationId":"select_draft_asset_api_instagram_drafts__post_id__assets__asset_id__select_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}/assets/{asset_id}":{"delete":{"tags":["instagram"],"summary":"Delete Draft Asset","description":"Discard one candidate. If it was selected, fall back to another ready one.","operationId":"delete_draft_asset_api_instagram_drafts__post_id__assets__asset_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}/schedule":{"post":{"tags":["instagram"],"summary":"Schedule Draft","description":"Mark a draft as SCHEDULED. The publisher Celery task picks it up.","operationId":"schedule_draft_api_instagram_drafts__post_id__schedule_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_schedule_draft_api_instagram_drafts__post_id__schedule_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}/publish-now":{"post":{"tags":["instagram"],"summary":"Publish Now","description":"Queue an immediate publish. Returns the row (status=publishing).","operationId":"publish_now_api_instagram_drafts__post_id__publish_now_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/drafts/{post_id}/generate":{"post":{"tags":["instagram"],"summary":"Generate Caption","description":"LLM-generate caption + hashtags for an existing draft.","operationId":"generate_caption_api_instagram_drafts__post_id__generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramGenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instagram/refresh-metrics":{"post":{"tags":["instagram"],"summary":"Refresh Metrics","description":"Queue an on-demand insights refresh for this org.","operationId":"refresh_metrics_api_instagram_refresh_metrics_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Refresh Metrics Api Instagram Refresh Metrics Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/oauth/start":{"get":{"tags":["facebook"],"summary":"Oauth Start","description":"Return the Meta authorize URL the frontend should redirect to.\n\nMirrors the Instagram OAuth flow shape: JSON response with the\npre-built URL (state-token included), so the frontend can show\n\"Connecting…\" between click and redirect.","operationId":"oauth_start_api_facebook_oauth_start_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Start Api Facebook Oauth Start Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/oauth/callback":{"get":{"tags":["facebook"],"summary":"Oauth Callback","description":"Meta calls us back here. Exchange the code, pick the first\nPage the user manages as the active publishing target, persist\ntokens.\n\nThe admin can call ``/oauth/pages`` afterwards to swap targets\nwithout re-running consent.","operationId":"oauth_callback_api_facebook_oauth_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/oauth/status":{"get":{"tags":["facebook"],"summary":"Oauth Status","description":"Connection status for the connector tab + page header chip.","operationId":"oauth_status_api_facebook_oauth_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookOAuthStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/oauth/disconnect":{"post":{"tags":["facebook"],"summary":"Oauth Disconnect","description":"Wipe stored tokens. Doesn't revoke on Meta's side — the admin\ncan do that from their FB account settings.","operationId":"oauth_disconnect_api_facebook_oauth_disconnect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Disconnect Api Facebook Oauth Disconnect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/oauth/deauthorize":{"post":{"tags":["facebook"],"summary":"Oauth Deauthorize","description":"Meta's deauthorize callback.\n\nFires when a user removes the mktops app from their Meta account\n(Facebook *or* Instagram — they share the app). The request body\nis form-encoded with a single ``signed_request`` field. We verify\nits HMAC against the app secret, decode the ASID (Meta's\napp-scoped user ID), look up which org that ASID is bound to, and\nwipe BOTH Facebook and Instagram credentials for that org.\n\nPer Meta's spec we must respond 200 regardless of internal state\n(a non-200 makes Meta retry indefinitely). Unknown / unmappable\nASIDs are logged at INFO and silently acknowledged — replay\nattempts and pre-ASID-recording grants both end up here.","operationId":"oauth_deauthorize_api_facebook_oauth_deauthorize_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_oauth_deauthorize_api_facebook_oauth_deauthorize_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Oauth Deauthorize Api Facebook Oauth Deauthorize Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/oauth/pages":{"get":{"tags":["facebook"],"summary":"List User Pages","description":"Return Pages the connected user manages — for the swap-page UI.\n\nUses the stored ``user_access_token`` (from the most recent OAuth)\nrather than re-running consent.","operationId":"list_user_pages_api_facebook_oauth_pages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List User Pages Api Facebook Oauth Pages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/oauth/select-page":{"post":{"tags":["facebook"],"summary":"Select Page","description":"Swap the active publishing Page without re-running OAuth.","operationId":"select_page_api_facebook_oauth_select_page_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"query","required":true,"schema":{"type":"string","title":"Page Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Select Page Api Facebook Oauth Select Page Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/generate-drafts":{"post":{"tags":["facebook"],"summary":"Generate Drafts","description":"Queue LLM generation of Facebook Page post drafts.","operationId":"generate_drafts_api_facebook_generate_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookGenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/drafts":{"get":{"tags":["facebook"],"summary":"List Drafts","description":"All non-published posts (draft / scheduled / publishing /\nfailed) for the org, newest first.","operationId":"list_drafts_api_facebook_drafts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FacebookPostRead"},"title":"Response List Drafts Api Facebook Drafts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["facebook"],"summary":"Create Draft","description":"Manual draft creation (the editor's 'New post' button).","operationId":"create_draft_api_facebook_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookDraftCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/published":{"get":{"tags":["facebook"],"summary":"List Published","description":"Published Page posts (the History tab) — most recent first.","operationId":"list_published_api_facebook_published_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FacebookPostRead"},"title":"Response List Published Api Facebook Published Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/drafts/{post_id}":{"patch":{"tags":["facebook"],"summary":"Update Draft","description":"Edit a non-published post in place.","operationId":"update_draft_api_facebook_drafts__post_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookDraftUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["facebook"],"summary":"Delete Draft","description":"Delete a non-published post + all its candidate assets and GCS blobs.","operationId":"delete_draft_api_facebook_drafts__post_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/drafts/{post_id}/generate-image":{"post":{"tags":["facebook"],"summary":"Generate Draft Image","description":"Generate an image with gpt-image-1 and attach it to this draft.\n\nOne-shot: each call generates a new image, uploads to GCS, deletes\nthe prior blob (if any), and sets ``media_url`` + ``gcs_object`` on\nthe row. Regenerating is just another call — FB posts carry a\nsingle attached photo, so no preview-then-attach split.","operationId":"generate_draft_image_api_facebook_drafts__post_id__generate_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__facebook___GenerateImageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/drafts/{post_id}/assets/{asset_id}/select":{"post":{"tags":["facebook"],"summary":"Select Draft Asset","description":"Make a candidate the draft's active media (used at publish).","operationId":"select_draft_asset_api_facebook_drafts__post_id__assets__asset_id__select_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/drafts/{post_id}/assets/{asset_id}":{"delete":{"tags":["facebook"],"summary":"Delete Draft Asset","description":"Discard one candidate; if it was selected, fall back to another.","operationId":"delete_draft_asset_api_facebook_drafts__post_id__assets__asset_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/drafts/{post_id}/schedule":{"post":{"tags":["facebook"],"summary":"Schedule Draft","description":"Lock in a publish time. Moves the row from DRAFT → SCHEDULED.","operationId":"schedule_draft_api_facebook_drafts__post_id__schedule_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookScheduleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/drafts/{post_id}/unschedule":{"post":{"tags":["facebook"],"summary":"Unschedule Draft","description":"Move a SCHEDULED row back to DRAFT (clears scheduled_at).","operationId":"unschedule_draft_api_facebook_drafts__post_id__unschedule_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPostRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/refresh-metrics":{"post":{"tags":["facebook"],"summary":"Refresh Metrics","description":"On-demand insights refresh for this org's published posts.\n\nMirrors the IG endpoint. Queues the per-org poller task; the\nHistory tab invalidates after ~5s on the client side to surface\nthe new values.","operationId":"refresh_metrics_api_facebook_refresh_metrics_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Refresh Metrics Api Facebook Refresh Metrics Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/facebook/drafts/{post_id}/publish-now":{"post":{"tags":["facebook"],"summary":"Publish Now","description":"Queue an immediate publish for one draft. Same Celery task the\nbeat scheduler uses; this lets the reviewer skip the wait.","operationId":"publish_now_api_facebook_drafts__post_id__publish_now_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Publish Now Api Facebook Drafts  Post Id  Publish Now Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-autopilot/briefs":{"post":{"tags":["ad-autopilot"],"summary":"Create Brief","description":"Generate a new brief from customer inputs via LLM.\n\nSynchronous on purpose — the LLM call typically resolves in\nunder 10s and the customer is watching a loading spinner. If\nlatency becomes a problem we'll move to a Celery task that the\nUI polls.","operationId":"create_brief_api_ad_autopilot_briefs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBriefCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBriefRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["ad-autopilot"],"summary":"List Briefs","description":"List briefs in the active org, newest first, capped at 50.","operationId":"list_briefs_api_ad_autopilot_briefs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CampaignBriefStatus"},{"type":"null"}],"description":"Optional filter by lifecycle status.","title":"Status"},"description":"Optional filter by lifecycle status."},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CampaignBriefSummary"},"title":"Response List Briefs Api Ad Autopilot Briefs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-autopilot/briefs/{brief_id}":{"get":{"tags":["ad-autopilot"],"summary":"Get Brief","description":"Single-brief detail. 404 if the id doesn't belong to the org.","operationId":"get_brief_api_ad_autopilot_briefs__brief_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"brief_id","in":"path","required":true,"schema":{"type":"integer","title":"Brief Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBriefRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-autopilot/briefs/{brief_id}/approve":{"post":{"tags":["ad-autopilot"],"summary":"Approve Brief","description":"Mark brief approved. Phase A: unlocks the copy/paste flow.\nPhase B: enables the launch-on-Meta button.","operationId":"approve_brief_api_ad_autopilot_briefs__brief_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"brief_id","in":"path","required":true,"schema":{"type":"integer","title":"Brief Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBriefRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-autopilot/briefs/{brief_id}/reject":{"post":{"tags":["ad-autopilot"],"summary":"Reject Brief","description":"Mark brief rejected. Idempotent — re-rejecting is a no-op\ntransition (handled by the service's allowed-transitions table).","operationId":"reject_brief_api_ad_autopilot_briefs__brief_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"brief_id","in":"path","required":true,"schema":{"type":"integer","title":"Brief Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBriefRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-autopilot/ad-accounts/available":{"get":{"tags":["ad-autopilot"],"summary":"List Available Ad Accounts","description":"Live fetch of the org's accessible Meta ad accounts via Graph API.\n\nReturns 400 if the org hasn't connected Facebook yet — the UI\nsurfaces that as a \"Connect Facebook first\" CTA.","operationId":"list_available_ad_accounts_api_ad_autopilot_ad_accounts_available_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdAccountAvailable"},"title":"Response List Available Ad Accounts Api Ad Autopilot Ad Accounts Available Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-autopilot/ad-accounts/current":{"get":{"tags":["ad-autopilot"],"summary":"Get Current Ad Account","description":"The org's currently-selected ad account, or ``null`` if none.\n\nDrives the \"Connected: act_…\" indicator in the UI + gates the\nPhase B launch flow (lands later).","operationId":"get_current_ad_account_api_ad_autopilot_ad_accounts_current_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AdAccountRead"},{"type":"null"}],"title":"Response Get Current Ad Account Api Ad Autopilot Ad Accounts Current Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ad-autopilot"],"summary":"Disconnect Ad Account","description":"Mark the active ad account disconnected. Token stays\n(Facebook Page may still need it) — only the ad-account-id\npointer is cleared.","operationId":"disconnect_ad_account_api_ad_autopilot_ad_accounts_current_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ad-autopilot/ad-accounts/select":{"post":{"tags":["ad-autopilot"],"summary":"Select Ad Account","description":"Persist the chosen ad account. Verifies the user has access\nvia Graph API before writing — guards against forged ids.","operationId":"select_ad_account_api_ad_autopilot_ad_accounts_select_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectAdAccount"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdAccountRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcceptResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"organization_id":{"type":"integer","title":"Organization Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["user_id","organization_id","status"],"title":"AcceptResponse"},"AdAccountAvailable":{"properties":{"meta_ad_account_id":{"type":"string","title":"Meta Ad Account Id"},"name":{"type":"string","title":"Name"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id"},"business_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Name"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["meta_ad_account_id","name","currency","timezone","business_id","business_name","is_active"],"title":"AdAccountAvailable","description":"One row returned by ``GET /ad-accounts/available`` — what the\npicker UI renders. Not persisted; comes straight from Meta."},"AdAccountRead":{"properties":{"id":{"type":"integer","title":"Id"},"meta_ad_account_id":{"type":"string","title":"Meta Ad Account Id"},"meta_business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Business Id"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"status":{"$ref":"#/components/schemas/AdAccountStatus"},"connected_at":{"type":"string","format":"date-time","title":"Connected At"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"}},"type":"object","required":["id","meta_ad_account_id","meta_business_id","currency","timezone","status","connected_at","last_synced_at"],"title":"AdAccountRead","description":"Public-facing view of a connected ad account."},"AdAccountStatus":{"type":"string","enum":["connected","disconnected","expired"],"title":"AdAccountStatus","description":"Lifecycle of a per-org Meta Ad Account binding."},"AdminUserCreate":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"full_name":{"type":"string","title":"Full Name"},"role":{"type":"string","title":"Role","default":"member"}},"type":"object","required":["email","password","full_name"],"title":"AdminUserCreate","description":"Schema for admin creating a new user."},"AggregatePostRead":{"properties":{"source":{"type":"string","title":"Source"},"id":{"type":"integer","title":"Id"},"platform":{"type":"string","title":"Platform"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"status":{"type":"string","title":"Status"},"media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Url"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["source","id","platform","content","status","created_at"],"title":"AggregatePostRead","description":"Unified row across the generic Post table + the dedicated\nInstagramPost / FacebookPost tables, for the \"All Posts\" overview."},"AuthorEntryRead":{"properties":{"id":{"type":"integer","title":"Id"},"author_name":{"type":"string","title":"Author Name"},"author_openalex_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Openalex Id"},"orcid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orcid"},"institution_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution Name"},"institution_openalex_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution Openalex Id"},"institution_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution Country"},"institution_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution Type"},"paper_titles":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paper Titles"},"paper_count":{"type":"integer","title":"Paper Count","default":1}},"type":"object","required":["id","author_name"],"title":"AuthorEntryRead","description":"A single author row in a list."},"AuthorListCreate":{"properties":{"name":{"type":"string","title":"Name"},"openalex_work_ids":{"items":{"type":"string"},"type":"array","title":"Openalex Work Ids"}},"type":"object","required":["name","openalex_work_ids"],"title":"AuthorListCreate","description":"Payload for creating a new author list from selected papers."},"AuthorListDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"paper_count":{"type":"integer","title":"Paper Count"},"author_count":{"type":"integer","title":"Author Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"entries":{"items":{"$ref":"#/components/schemas/AuthorEntryRead"},"type":"array","title":"Entries","default":[]}},"type":"object","required":["id","name","paper_count","author_count","created_at"],"title":"AuthorListDetail","description":"Author list with full entries included."},"AuthorListRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"paper_count":{"type":"integer","title":"Paper Count"},"author_count":{"type":"integer","title":"Author Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","paper_count","author_count","created_at"],"title":"AuthorListRead","description":"An author list with its entries."},"AvatarVideoCreate":{"properties":{"text":{"type":"string","title":"Text"},"avatar_id":{"type":"string","title":"Avatar Id"},"voice_id":{"type":"string","title":"Voice Id"},"aspect_ratio":{"type":"string","title":"Aspect Ratio","default":"9:16"}},"type":"object","required":["text","avatar_id","voice_id"],"title":"AvatarVideoCreate","description":"Payload for creating an AI Avatar video job."},"BlueSkyEngagementRequest":{"properties":{"finding_id":{"type":"integer","title":"Finding Id"}},"type":"object","required":["finding_id"],"title":"BlueSkyEngagementRequest","description":"Payload for like / repost / follow actions on a finding."},"BlueSkyFindingRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id"},"post_uri":{"type":"string","title":"Post Uri"},"cid":{"type":"string","title":"Cid"},"post_url":{"type":"string","title":"Post Url"},"post_text":{"type":"string","title":"Post Text"},"author_did":{"type":"string","title":"Author Did"},"author_handle":{"type":"string","title":"Author Handle"},"author_display_name":{"type":"string","title":"Author Display Name"},"author_followers":{"type":"integer","title":"Author Followers"},"reply_count":{"type":"integer","title":"Reply Count"},"repost_count":{"type":"integer","title":"Repost Count"},"like_count":{"type":"integer","title":"Like Count"},"relevance_score":{"type":"number","title":"Relevance Score"},"llm_analysis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Analysis"},"suggested_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Action"},"draft_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Response"},"scan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Id"},"is_dismissed":{"type":"boolean","title":"Is Dismissed"},"draft_post_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Draft Post Id"},"posted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Posted At"},"found_at":{"type":"string","format":"date-time","title":"Found At"}},"type":"object","required":["id","monitor_id","post_uri","cid","post_url","post_text","author_did","author_handle","author_display_name","author_followers","reply_count","repost_count","like_count","relevance_score","llm_analysis","suggested_action","draft_response","is_dismissed","draft_post_id","posted_at","found_at"],"title":"BlueSkyFindingRead","description":"Schema for BlueSky finding response."},"BlueSkyListCreate":{"properties":{"name":{"type":"string","title":"Name"},"finding_ids":{"items":{"type":"integer"},"type":"array","title":"Finding Ids"}},"type":"object","required":["name","finding_ids"],"title":"BlueSkyListCreate","description":"Payload for creating a BlueSky list from selected findings."},"BlueSkyListDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"finding_count":{"type":"integer","title":"Finding Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"findings":{"items":{"$ref":"#/components/schemas/BlueSkyFindingRead"},"type":"array","title":"Findings","default":[]}},"type":"object","required":["id","name","finding_count","created_at"],"title":"BlueSkyListDetail","description":"BlueSky list with full finding entries."},"BlueSkyListRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"finding_count":{"type":"integer","title":"Finding Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","finding_count","created_at"],"title":"BlueSkyListRead","description":"Read schema for a BlueSky list."},"BlueSkyMonitorCreate":{"properties":{"name":{"type":"string","title":"Name"},"search_query":{"type":"string","title":"Search Query"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours","default":4},"min_followers":{"type":"integer","title":"Min Followers","default":0},"max_followers":{"type":"integer","title":"Max Followers","default":0}},"type":"object","required":["name","search_query"],"title":"BlueSkyMonitorCreate","description":"Schema for creating a BlueSky search monitor."},"BlueSkyMonitorRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"search_query":{"type":"string","title":"Search Query"},"is_active":{"type":"boolean","title":"Is Active"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours"},"min_followers":{"type":"integer","title":"Min Followers"},"max_followers":{"type":"integer","title":"Max Followers"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"last_indexed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Indexed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","search_query","is_active","scan_frequency_hours","min_followers","max_followers","last_scanned_at","last_indexed_at","created_at"],"title":"BlueSkyMonitorRead","description":"Schema for BlueSky monitor response."},"BlueSkyMonitorUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"search_query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Query"},"scan_frequency_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Frequency Hours"},"min_followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Followers"},"max_followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Followers"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"BlueSkyMonitorUpdate","description":"Schema for updating a BlueSky search monitor."},"BlueSkyReplyRequest":{"properties":{"finding_id":{"type":"integer","title":"Finding Id"},"text":{"type":"string","title":"Text"}},"type":"object","required":["finding_id","text"],"title":"BlueSkyReplyRequest","description":"Payload for posting a reply directly from a finding."},"BlueSkyScanRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"type":"integer","title":"Monitor Id"},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id"},"monitor_name":{"type":"string","title":"Monitor Name"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"results_count":{"type":"integer","title":"Results Count","default":0},"status":{"type":"string","title":"Status","default":"running"}},"type":"object","required":["id","monitor_id","monitor_name","started_at"],"title":"BlueSkyScanRead","description":"Read schema for a BlueSky scan execution."},"BlueSkySearchRequest":{"properties":{"query":{"type":"string","title":"Query"},"limit":{"type":"integer","title":"Limit","default":25},"min_followers":{"type":"integer","title":"Min Followers","default":0},"max_followers":{"type":"integer","title":"Max Followers","default":0}},"type":"object","required":["query"],"title":"BlueSkySearchRequest","description":"Ad-hoc BlueSky search request."},"Body_import_linkedin_posts_api_linkedin_posts_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_import_linkedin_posts_api_linkedin_posts_import_post"},"Body_oauth_deauthorize_api_facebook_oauth_deauthorize_post":{"properties":{"signed_request":{"type":"string","title":"Signed Request"}},"type":"object","required":["signed_request"],"title":"Body_oauth_deauthorize_api_facebook_oauth_deauthorize_post"},"Body_schedule_draft_api_instagram_drafts__post_id__schedule_post":{"properties":{"publish_at":{"type":"string","title":"Publish At"}},"type":"object","required":["publish_at"],"title":"Body_schedule_draft_api_instagram_drafts__post_id__schedule_post"},"Body_upload_draft_file_api_youtube_drafts__video_id__upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"publish_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publish At"}},"type":"object","required":["file"],"title":"Body_upload_draft_file_api_youtube_drafts__video_id__upload_post"},"Body_upload_draft_media_api_instagram_drafts__post_id__upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_draft_media_api_instagram_drafts__post_id__upload_post"},"BulkActionRequest":{"properties":{"profile_ids":{"items":{"type":"integer"},"type":"array","title":"Profile Ids"},"action":{"type":"string","title":"Action"}},"type":"object","required":["profile_ids","action"],"title":"BulkActionRequest","description":"Schema for bulk actions on influencer profiles."},"BulkActionResponse":{"properties":{"action":{"type":"string","title":"Action"},"affected":{"type":"integer","title":"Affected"},"enrich_queued":{"type":"integer","title":"Enrich Queued","default":0}},"type":"object","required":["action","affected"],"title":"BulkActionResponse","description":"Schema for bulk action result."},"CampaignBriefCreate":{"properties":{"vertical":{"type":"string","maxLength":40,"minLength":2,"title":"Vertical"},"geography":{"additionalProperties":true,"type":"object","title":"Geography","description":"Targeting geography. Shape matches Meta's targeting spec, e.g. ``{countries: ['MX'], cities: [{name, radius_km}]}``. Empty dict accepted; the LLM will default to country=org."},"locale":{"type":"string","maxLength":10,"minLength":2,"title":"Locale"},"budget_daily_cents":{"type":"integer","maximum":1000000.0,"exclusiveMinimum":0.0,"title":"Budget Daily Cents"},"goal":{"$ref":"#/components/schemas/CampaignGoal"},"notes":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Notes"}},"type":"object","required":["vertical","locale","budget_daily_cents","goal"],"title":"CampaignBriefCreate","description":"Customer-supplied inputs for brief generation.\n\nThe LLM fills in audience spec, copy variants, creative brief,\nand compliance flags from these."},"CampaignBriefRead":{"properties":{"id":{"type":"integer","title":"Id"},"organization_id":{"type":"integer","title":"Organization Id"},"created_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Id"},"vertical":{"type":"string","title":"Vertical"},"geography_json":{"additionalProperties":true,"type":"object","title":"Geography Json"},"locale":{"type":"string","title":"Locale"},"budget_daily_cents":{"type":"integer","title":"Budget Daily Cents"},"goal":{"$ref":"#/components/schemas/CampaignGoal"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"audience_spec_json":{"additionalProperties":true,"type":"object","title":"Audience Spec Json"},"estimated_reach":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Reach"},"estimated_cpl_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Cpl Cents"},"copy_variants_json":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Copy Variants Json"},"creative_brief":{"type":"string","title":"Creative Brief"},"compliance_flags":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Compliance Flags"},"status":{"$ref":"#/components/schemas/CampaignBriefStatus"},"approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Approved At"},"approved_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Approved By Id"},"llm_model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model Used"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","organization_id","created_by_id","vertical","geography_json","locale","budget_daily_cents","goal","notes","audience_spec_json","estimated_reach","estimated_cpl_cents","copy_variants_json","creative_brief","compliance_flags","status","approved_at","approved_by_id","llm_model_used","created_at","updated_at"],"title":"CampaignBriefRead","description":"Full brief — what /briefs/:id returns."},"CampaignBriefStatus":{"type":"string","enum":["draft","approved","rejected","launched"],"title":"CampaignBriefStatus","description":"Lifecycle of a campaign brief.\n\n``draft`` — created by LLM, awaiting human review.\n``approved`` — org admin signed off; ready to launch (Phase B will\n               add the actual Meta API launch). In Phase A\n               approving just unlocks the copy/paste flow for the\n               customer's manual launch.\n``rejected`` — admin discarded the brief; kept around for audit.\n``launched`` — Phase B: campaign created on Meta Ad Manager."},"CampaignBriefSummary":{"properties":{"id":{"type":"integer","title":"Id"},"vertical":{"type":"string","title":"Vertical"},"locale":{"type":"string","title":"Locale"},"budget_daily_cents":{"type":"integer","title":"Budget Daily Cents"},"goal":{"$ref":"#/components/schemas/CampaignGoal"},"status":{"$ref":"#/components/schemas/CampaignBriefStatus"},"estimated_cpl_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Cpl Cents"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","vertical","locale","budget_daily_cents","goal","status","estimated_cpl_cents","created_at"],"title":"CampaignBriefSummary","description":"Lightweight row for /briefs list view."},"CampaignCreate":{"properties":{"name":{"type":"string","title":"Name"},"core_message":{"type":"string","title":"Core Message","default":""},"channels":{"items":{"type":"string"},"type":"array","title":"Channels"}},"type":"object","required":["name"],"title":"CampaignCreate"},"CampaignGoal":{"type":"string","enum":["lead_gen","appointments","sales","awareness","app_installs"],"title":"CampaignGoal","description":"Primary objective the customer wants out of the campaign.\n\nMaps loosely onto Meta's campaign objectives, but kept as a\ncustomer-facing vocabulary; the brief generator translates these\nto Meta objective constants at launch time (Phase B)."},"CampaignMediaAssetCreate":{"properties":{"url":{"type":"string","title":"Url"},"media_type":{"type":"string","title":"Media Type","default":"image"},"source":{"type":"string","title":"Source","default":"upload"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"}},"type":"object","required":["url"],"title":"CampaignMediaAssetCreate"},"CampaignMediaAssetRead":{"properties":{"id":{"type":"integer","title":"Id"},"campaign_id":{"type":"integer","title":"Campaign Id"},"media_type":{"type":"string","title":"Media Type"},"source":{"type":"string","title":"Source"},"status":{"type":"string","title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","campaign_id","media_type","source","status","created_at"],"title":"CampaignMediaAssetRead"},"CampaignMediaGenerate":{"properties":{"prompt":{"type":"string","title":"Prompt"},"aspect":{"type":"string","title":"Aspect","default":"square"}},"type":"object","required":["prompt"],"title":"CampaignMediaGenerate","description":"Generate an image into the campaign's shared library (OpenAI)."},"CampaignPlanRequest":{"properties":{"product_context":{"type":"string","title":"Product Context"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"weeks":{"type":"integer","title":"Weeks","default":4},"per_week":{"type":"integer","title":"Per Week","default":3},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"include_image_prompts":{"type":"boolean","title":"Include Image Prompts","default":false},"generate_images":{"type":"boolean","title":"Generate Images","default":false},"image_model":{"type":"string","title":"Image Model","default":"openai"},"image_aspect":{"type":"string","title":"Image Aspect","default":"square"}},"type":"object","required":["product_context"],"title":"CampaignPlanRequest","description":"Generate a multi-week series of campaigns from a product brief."},"CampaignRead":{"properties":{"id":{"type":"integer","title":"Id"},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id"},"name":{"type":"string","title":"Name"},"core_message":{"type":"string","title":"Core Message"},"status":{"type":"string","title":"Status"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"image_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Prompt"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"media":{"items":{"$ref":"#/components/schemas/CampaignMediaAssetRead"},"type":"array","title":"Media"},"variants":{"items":{"$ref":"#/components/schemas/CampaignVariantRead"},"type":"array","title":"Variants"}},"type":"object","required":["id","organization_id","name","core_message","status","created_at","updated_at"],"title":"CampaignRead"},"CampaignUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"core_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Core Message"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"CampaignUpdate"},"CampaignVariantCreate":{"properties":{"channel":{"type":"string","title":"Channel"},"adapted_text":{"type":"string","title":"Adapted Text","default":""},"hashtags":{"items":{"type":"string"},"type":"array","title":"Hashtags"},"media_asset_ids":{"items":{"type":"integer"},"type":"array","title":"Media Asset Ids"},"aspect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"}},"type":"object","required":["channel"],"title":"CampaignVariantCreate"},"CampaignVariantRead":{"properties":{"id":{"type":"integer","title":"Id"},"campaign_id":{"type":"integer","title":"Campaign Id"},"channel":{"type":"string","title":"Channel"},"adapted_text":{"type":"string","title":"Adapted Text"},"hashtags":{"items":{"type":"string"},"type":"array","title":"Hashtags"},"media_asset_ids":{"items":{"type":"integer"},"type":"array","title":"Media Asset Ids"},"aspect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"target_post_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Post Id"},"target_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Status"},"target_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Url"},"status":{"type":"string","title":"Status"},"overrides":{"type":"boolean","title":"Overrides","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","campaign_id","channel","adapted_text","status","created_at","updated_at"],"title":"CampaignVariantRead"},"CampaignVariantUpdate":{"properties":{"adapted_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adapted Text"},"hashtags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Hashtags"},"media_asset_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Media Asset Ids"},"aspect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"overrides":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Overrides"}},"type":"object","title":"CampaignVariantUpdate"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","maxLength":128,"minLength":1,"title":"Current Password"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"CheckoutRequest":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"CheckoutRequest"},"ComponentHealth":{"properties":{"name":{"type":"string","title":"Name"},"status":{"$ref":"#/components/schemas/ComponentStatus"},"latency_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latency Ms"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["name","status"],"title":"ComponentHealth","description":"Health status of a single system component.\n\nAttributes:\n    name: Component identifier (e.g. 'database', 'redis').\n    status: Current health status.\n    latency_ms: Response time in milliseconds, if applicable.\n    detail: Additional context (error message or info)."},"ComponentStatus":{"type":"string","enum":["healthy","degraded","unhealthy"],"title":"ComponentStatus","description":"Health status for a single component."},"ContentItemRead":{"properties":{"id":{"type":"integer","title":"Id"},"source_id":{"type":"integer","title":"Source Id"},"source_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Label"},"title":{"type":"string","title":"Title"},"link":{"type":"string","title":"Link"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"fetched_at":{"type":"string","format":"date-time","title":"Fetched At"}},"type":"object","required":["id","source_id","source_label","title","link","summary","image_url","published_at","fetched_at"],"title":"ContentItemRead","description":"One cached RSS item, surfaced for the in-app inspector."},"ContentSourceCreate":{"properties":{"kind":{"$ref":"#/components/schemas/ContentSourceKind"},"value":{"type":"string","title":"Value"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","required":["kind","value"],"title":"ContentSourceCreate"},"ContentSourceKind":{"type":"string","enum":["rss","keyword"],"title":"ContentSourceKind"},"ContentSourceRead":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"$ref":"#/components/schemas/ContentSourceKind"},"value":{"type":"string","title":"Value"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"enabled":{"type":"boolean","title":"Enabled"},"last_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Polled At"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"item_count":{"type":"integer","title":"Item Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","kind","value","label","enabled","last_polled_at","last_error","created_at","updated_at"],"title":"ContentSourceRead"},"ContentSourceSuggestResponse":{"properties":{"rss_feeds":{"items":{"$ref":"#/components/schemas/RssSuggestion"},"type":"array","title":"Rss Feeds"},"keywords":{"items":{"$ref":"#/components/schemas/KeywordSuggestion"},"type":"array","title":"Keywords"},"rss_dropped_count":{"type":"integer","title":"Rss Dropped Count","default":0}},"type":"object","required":["rss_feeds","keywords"],"title":"ContentSourceSuggestResponse","description":"Output of ``POST /content-sources/suggest``.\n\nAlready deduped against the org's current rows: suggestions whose\nURL/value the org has already saved are filtered out server-side."},"ContentSourceUpdate":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"ContentSourceUpdate"},"CredentialRead":{"properties":{"id":{"type":"integer","title":"Id"},"service":{"type":"string","title":"Service"},"key_name":{"type":"string","title":"Key Name"},"masked_value":{"type":"string","title":"Masked Value"},"has_value":{"type":"boolean","title":"Has Value"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"is_required":{"type":"boolean","title":"Is Required"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warning"}},"type":"object","required":["id","service","key_name","masked_value","has_value","label","is_required","updated_at"],"title":"CredentialRead","description":"Response schema — credential with masked value."},"CredentialTestResult":{"properties":{"service":{"type":"string","title":"Service"},"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["service","success","message"],"title":"CredentialTestResult","description":"Response schema — connection test result."},"CredentialWrite":{"properties":{"value":{"type":"string","title":"Value"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","required":["value"],"title":"CredentialWrite","description":"Request schema — set a credential value (plaintext, encrypted before storage)."},"CreditsResponse":{"properties":{"available_credits":{"type":"number","title":"Available Credits"},"used_credits":{"type":"number","title":"Used Credits"},"total_credits":{"type":"number","title":"Total Credits"}},"type":"object","required":["available_credits","used_credits","total_credits"],"title":"CreditsResponse","description":"Schema for Influencers.club credit balance."},"DashboardStatsResponse":{"properties":{"reddit_monitors":{"type":"integer","title":"Reddit Monitors","default":0},"twitter_monitors":{"type":"integer","title":"Twitter Monitors","default":0},"total_posts":{"type":"integer","title":"Total Posts","default":0},"influencer_profiles":{"type":"integer","title":"Influencer Profiles","default":0},"prospect_profiles":{"type":"integer","title":"Prospect Profiles","default":0}},"type":"object","title":"DashboardStatsResponse","description":"Quick counts for the dashboard overview.\n\nAttributes:\n    reddit_monitors: Number of active Reddit monitors.\n    twitter_monitors: Number of active Twitter monitors.\n    total_posts: Total posts created.\n    influencer_profiles: Total influencer profiles.\n    prospect_profiles: Total prospect profiles."},"FacebookDraftCreate":{"properties":{"message":{"type":"string","minLength":1,"title":"Message"},"link_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Url"},"kind":{"$ref":"#/components/schemas/FacebookPostKind","default":"status"}},"type":"object","required":["message"],"title":"FacebookDraftCreate","description":"Body for ``POST /facebook/drafts`` — manual draft creation."},"FacebookDraftUpdate":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"link_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Url"},"kind":{"anyOf":[{"$ref":"#/components/schemas/FacebookPostKind"},{"type":"null"}]},"media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Url"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"}},"type":"object","title":"FacebookDraftUpdate","description":"Body for ``PATCH /facebook/drafts/{id}``. All fields optional."},"FacebookGenerateResponse":{"properties":{"status":{"type":"string","title":"Status"},"task_id":{"type":"string","title":"Task Id"}},"type":"object","required":["status","task_id"],"title":"FacebookGenerateResponse","description":"Response from ``POST /facebook/generate-drafts``."},"FacebookMediaAssetRead":{"properties":{"id":{"type":"integer","title":"Id"},"post_id":{"type":"integer","title":"Post Id"},"kind":{"type":"string","title":"Kind"},"source":{"type":"string","title":"Source"},"status":{"type":"string","title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","post_id","kind","source","status","created_at"],"title":"FacebookMediaAssetRead","description":"One candidate media asset of a Facebook draft."},"FacebookOAuthStatus":{"properties":{"connected":{"type":"boolean","title":"Connected"},"page_id":{"type":"string","title":"Page Id"},"page_name":{"type":"string","title":"Page Name"},"scope":{"type":"string","title":"Scope"},"connected_at":{"type":"string","title":"Connected At"}},"type":"object","required":["connected","page_id","page_name","scope","connected_at"],"title":"FacebookOAuthStatus","description":"Response from ``GET /facebook/oauth/status``."},"FacebookPostKind":{"type":"string","enum":["status","link","photo","video"],"title":"FacebookPostKind","description":"What kind of post the user is composing.\n\n- ``status`` — plain text post on the Page's feed.\n- ``link`` — text + a shared URL preview.\n- ``photo`` — single image + caption.\n- ``video`` — video upload + caption (Reels share the video path).\n\nMulti-photo / carousel handling is deferred — Graph API needs a\ndifferent orchestration there."},"FacebookPostRead":{"properties":{"id":{"type":"integer","title":"Id"},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id"},"message":{"type":"string","title":"Message"},"link_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Url"},"kind":{"$ref":"#/components/schemas/FacebookPostKind"},"media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Url"},"gcs_object":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gcs Object"},"source_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Filename"},"source_mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Mime"},"source_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Bytes"},"selected_media_asset_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Media Asset Id"},"assets":{"items":{"$ref":"#/components/schemas/FacebookMediaAssetRead"},"type":"array","title":"Assets"},"status":{"$ref":"#/components/schemas/FacebookPostStatus"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"fb_post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fb Post Id"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"impressions":{"type":"integer","title":"Impressions"},"reach":{"type":"integer","title":"Reach"},"like_count":{"type":"integer","title":"Like Count"},"comment_count":{"type":"integer","title":"Comment Count"},"share_count":{"type":"integer","title":"Share Count"},"video_views":{"type":"integer","title":"Video Views"},"insights_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Insights Polled At"},"llm_model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model Used"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","organization_id","message","link_url","kind","media_url","gcs_object","source_filename","source_mime","source_bytes","status","scheduled_at","published_at","fb_post_id","permalink","error_message","impressions","reach","like_count","comment_count","share_count","video_views","insights_polled_at","llm_model_used","created_at","updated_at"],"title":"FacebookPostRead","description":"One Facebook Page post as returned by list / detail endpoints."},"FacebookPostStatus":{"type":"string","enum":["draft","scheduled","publishing","published","failed"],"title":"FacebookPostStatus","description":"Lifecycle states for a FacebookPost row."},"FacebookScheduleRequest":{"properties":{"scheduled_at":{"type":"string","format":"date-time","title":"Scheduled At"}},"type":"object","required":["scheduled_at"],"title":"FacebookScheduleRequest","description":"Body for ``POST /facebook/drafts/{id}/schedule``."},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"GenerateImageBody":{"properties":{"prompt":{"type":"string","maxLength":4000,"minLength":10,"title":"Prompt"},"aspect":{"type":"string","title":"Aspect","default":"square"},"attach":{"type":"boolean","title":"Attach","description":"If true, append the generated image's URL to ``post.media_urls`` before returning. The dialog uses ``attach=False`` for preview-then-attach UX; one-shot callers can pass ``attach=True`` to skip the extra round-trip.","default":false}},"type":"object","required":["prompt"],"title":"GenerateImageBody","description":"Request body for the on-demand image generation endpoint."},"GenerateImageResponse":{"properties":{"url":{"type":"string","title":"Url"},"gcs_object":{"type":"string","title":"Gcs Object"},"size":{"type":"string","title":"Size"},"attached":{"type":"boolean","title":"Attached"}},"type":"object","required":["url","gcs_object","size","attached"],"title":"GenerateImageResponse","description":"Response from the on-demand image generation endpoint."},"GoogleAuthRequest":{"properties":{"id_token":{"type":"string","title":"Id Token"}},"type":"object","required":["id_token"],"title":"GoogleAuthRequest","description":"Schema for the Google SSO token exchange.\n\nThe Next.js NextAuth layer completes the Google OAuth dance and forwards\nthe Google-issued ``id_token`` here; the backend verifies it with Google,\nupserts the user, and returns its own access token."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"$ref":"#/components/schemas/ComponentStatus"},"components":{"items":{"$ref":"#/components/schemas/ComponentHealth"},"type":"array","title":"Components"}},"type":"object","required":["status","components"],"title":"HealthResponse","description":"Aggregated health check response.\n\nAttributes:\n    status: Overall system status (worst of all components).\n    components: Individual component health results."},"InfluencerMonitorCreate":{"properties":{"name":{"type":"string","title":"Name"},"platform":{"type":"string","title":"Platform"},"search_filters":{"additionalProperties":true,"type":"object","title":"Search Filters","default":{}},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours","default":24}},"type":"object","required":["name","platform"],"title":"InfluencerMonitorCreate","description":"Schema for creating an influencer search monitor."},"InfluencerMonitorRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"platform":{"type":"string","title":"Platform"},"search_filters_json":{"type":"string","title":"Search Filters Json"},"is_active":{"type":"boolean","title":"Is Active"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","platform","search_filters_json","is_active","scan_frequency_hours","last_scanned_at","created_at"],"title":"InfluencerMonitorRead","description":"Schema for influencer monitor response."},"InfluencerMonitorUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"search_filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Search Filters"},"scan_frequency_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Frequency Hours"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"InfluencerMonitorUpdate","description":"Schema for updating an influencer search monitor."},"InfluencerProfileRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id"},"platform":{"type":"string","title":"Platform"},"handle":{"type":"string","title":"Handle"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"profile_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Url"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"follower_count":{"type":"integer","title":"Follower Count"},"engagement_rate":{"type":"number","title":"Engagement Rate"},"avg_likes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Likes"},"avg_comments":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Comments"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"enrichment_level":{"type":"string","title":"Enrichment Level"},"relevance_score":{"type":"number","title":"Relevance Score"},"llm_analysis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Analysis"},"metadata_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata Json"},"status":{"type":"string","title":"Status"},"found_at":{"type":"string","format":"date-time","title":"Found At"},"enriched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Enriched At"}},"type":"object","required":["id","monitor_id","platform","handle","display_name","bio","profile_url","avatar_url","follower_count","engagement_rate","avg_likes","avg_comments","email","enrichment_level","relevance_score","llm_analysis","metadata_json","status","found_at","enriched_at"],"title":"InfluencerProfileRead","description":"Schema for influencer profile response."},"InfluencerProfileUpdate":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"InfluencerProfileUpdate","description":"Schema for updating influencer profile status."},"InstagramDraftUpdate":{"properties":{"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"hashtags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Hashtags"},"media_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Type"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"}},"type":"object","title":"InstagramDraftUpdate","description":"Partial-update schema for editing a draft."},"InstagramGenerateRequest":{"properties":{"topic":{"type":"string","title":"Topic"},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["topic"],"title":"InstagramGenerateRequest","description":"Payload for the AI caption generator."},"InstagramGenerateResponse":{"properties":{"caption":{"type":"string","title":"Caption"},"hashtags":{"items":{"type":"string"},"type":"array","title":"Hashtags"}},"type":"object","required":["caption","hashtags"],"title":"InstagramGenerateResponse","description":"LLM-generated caption + hashtags."},"InstagramMediaAssetRead":{"properties":{"id":{"type":"integer","title":"Id"},"post_id":{"type":"integer","title":"Post Id"},"media_type":{"type":"string","title":"Media Type"},"source":{"type":"string","title":"Source"},"status":{"type":"string","title":"Status"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"creatify_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creatify Job Id"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","post_id","media_type","source","status","created_at"],"title":"InstagramMediaAssetRead","description":"Read schema for one candidate media asset of a draft."},"InstagramOAuthStatus":{"properties":{"connected":{"type":"boolean","title":"Connected"},"ig_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ig User Id"},"ig_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ig Username"},"page_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Name"},"connected_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connected At"}},"type":"object","required":["connected"],"title":"InstagramOAuthStatus","description":"Connection status response."},"InstagramPostRead":{"properties":{"id":{"type":"integer","title":"Id"},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id"},"created_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Id"},"caption":{"type":"string","title":"Caption"},"hashtags":{"items":{"type":"string"},"type":"array","title":"Hashtags"},"media_type":{"type":"string","title":"Media Type"},"media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Url"},"cover_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Url"},"source_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Filename"},"source_mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Mime"},"source_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Bytes"},"media_generating":{"type":"boolean","title":"Media Generating","default":false},"media_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Error"},"selected_media_asset_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Media Asset Id"},"assets":{"items":{"$ref":"#/components/schemas/InstagramMediaAssetRead"},"type":"array","title":"Assets"},"status":{"type":"string","title":"Status"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"container_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Container Id"},"ig_media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ig Media Id"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"impressions":{"type":"integer","title":"Impressions"},"reach":{"type":"integer","title":"Reach"},"like_count":{"type":"integer","title":"Like Count"},"comment_count":{"type":"integer","title":"Comment Count"},"saves":{"type":"integer","title":"Saves"},"shares":{"type":"integer","title":"Shares"},"video_views":{"type":"integer","title":"Video Views"},"insights_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Insights Polled At"},"llm_model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model Used"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","organization_id","created_by_id","caption","media_type","status","impressions","reach","like_count","comment_count","saves","shares","video_views","created_at","updated_at"],"title":"InstagramPostRead","description":"Read schema for an InstagramPost row."},"InviteAccept":{"properties":{"full_name":{"type":"string","maxLength":255,"minLength":1,"title":"Full Name"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["full_name","password"],"title":"InviteAccept"},"InviteCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"role":{"type":"string","title":"Role","default":"member"}},"type":"object","required":["email"],"title":"InviteCreate"},"InvitePreview":{"properties":{"email":{"type":"string","title":"Email"},"organization_name":{"type":"string","title":"Organization Name"},"invited_by_name":{"type":"string","title":"Invited By Name"},"role":{"type":"string","title":"Role"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["email","organization_name","invited_by_name","role","expires_at"],"title":"InvitePreview","description":"Public read for the accept page — minimum info to show\n'You've been invited to X by Y' without leaking anything else."},"InviteRead":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"invited_by_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invited By Email"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"}},"type":"object","required":["id","email","role","status","invited_by_email","created_at","expires_at","accepted_at"],"title":"InviteRead","description":"Admin-facing read of one invitation row."},"KeywordSuggestion":{"properties":{"value":{"type":"string","title":"Value"},"rationale":{"type":"string","title":"Rationale"}},"type":"object","required":["value","rationale"],"title":"KeywordSuggestion","description":"One LLM-recommended keyword / hashtag seed."},"LinkedInEventRead":{"properties":{"id":{"type":"integer","title":"Id"},"event_type":{"type":"string","title":"Event Type"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"campaign_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Id"},"campaign_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Name"},"sender_name":{"type":"string","title":"Sender Name"},"sender_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Title"},"sender_company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Company"},"sender_linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Linkedin Url"},"sender_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Email"},"message_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Text"},"relevance_score":{"type":"number","title":"Relevance Score"},"llm_analysis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Analysis"},"suggested_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Action"},"draft_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Response"},"is_dismissed":{"type":"boolean","title":"Is Dismissed"},"draft_post_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Draft Post Id"},"received_at":{"type":"string","format":"date-time","title":"Received At"}},"type":"object","required":["id","event_type","external_id","campaign_id","campaign_name","sender_name","sender_title","sender_company","sender_linkedin_url","sender_email","message_text","relevance_score","llm_analysis","suggested_action","draft_response","is_dismissed","draft_post_id","received_at"],"title":"LinkedInEventRead","description":"Schema for LinkedIn event response."},"LinkedInImportResponse":{"properties":{"filename":{"type":"string","title":"Filename"},"rows_seen":{"type":"integer","title":"Rows Seen"},"created":{"type":"integer","title":"Created"},"updated":{"type":"integer","title":"Updated"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","default":[]}},"type":"object","required":["filename","rows_seen","created","updated","skipped"],"title":"LinkedInImportResponse","description":"Summary returned after a successful import.\n\nCounts are deduplicated per organization — re-uploading the same\nexport yields zero new rows, lots of updated ones."},"LinkedInPostRead":{"properties":{"id":{"type":"integer","title":"Id"},"share_url":{"type":"string","title":"Share Url"},"posted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Posted At"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Url"},"media_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Type"},"shared_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shared Url"},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visibility"},"imported_at":{"type":"string","format":"date-time","title":"Imported At"}},"type":"object","required":["id","share_url","posted_at","content","media_url","media_type","shared_url","visibility","imported_at"],"title":"LinkedInPostRead","description":"Schema for an imported LinkedIn historical post."},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"Schema for login request."},"MeResponse":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"role":{"type":"string","title":"Role"},"is_active":{"type":"boolean","title":"Is Active"},"organization":{"$ref":"#/components/schemas/OrgSummary"},"organizations":{"items":{"$ref":"#/components/schemas/OrgSummary"},"type":"array","title":"Organizations"},"api_token":{"anyOf":[{"$ref":"#/components/schemas/TokenInfo"},{"type":"null"}]}},"type":"object","required":["id","email","full_name","role","is_active","organization","organizations"],"title":"MeResponse"},"MeetAlfredWebhookPayload":{"properties":{"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"},"lead_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Id"},"campaign_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Id"},"campaign_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Name"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"reply_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Text"}},"type":"object","title":"MeetAlfredWebhookPayload","description":"Schema for incoming MeetAlfred webhook events.\n\nMeetAlfred sends different payloads depending on the trigger.\nWe accept a flexible schema and extract fields as available."},"MembershipCreate":{"properties":{"user_email":{"type":"string","title":"User Email"},"role":{"type":"string","title":"Role","default":"member"}},"type":"object","required":["user_email"],"title":"MembershipCreate","description":"Schema for adding a member to an organization."},"MembershipRead":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"organization_id":{"type":"integer","title":"Organization Id"},"role":{"type":"string","title":"Role"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"user_email":{"type":"string","title":"User Email","default":""},"user_full_name":{"type":"string","title":"User Full Name","default":""}},"type":"object","required":["id","user_id","organization_id","role","created_at"],"title":"MembershipRead","description":"Schema for membership response."},"MembershipUpdate":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"MembershipUpdate","description":"Schema for updating a membership role."},"MonitorResultRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"type":"integer","title":"Monitor Id"},"openalex_work_id":{"type":"string","title":"Openalex Work Id"},"title":{"type":"string","title":"Title"},"doi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doi"},"publication_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Date"},"authors_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authors Summary"},"authors_count":{"type":"integer","title":"Authors Count","default":0},"cited_by_count":{"type":"integer","title":"Cited By Count","default":0},"is_oa":{"type":"boolean","title":"Is Oa","default":false},"scan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Id"},"found_at":{"type":"string","format":"date-time","title":"Found At"},"is_dismissed":{"type":"boolean","title":"Is Dismissed","default":false}},"type":"object","required":["id","monitor_id","openalex_work_id","title","found_at"],"title":"MonitorResultRead","description":"Read schema for a single monitor result (paper)."},"NotificationRead":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"$ref":"#/components/schemas/NotificationType"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"is_read":{"type":"boolean","title":"Is Read"},"link_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Url"},"related_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Related Id"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","type","title","message","is_read","link_url","related_id","user_id","created_at"],"title":"NotificationRead","description":"Schema for notification response."},"NotificationType":{"type":"string","enum":["reddit_finding","approval_needed","post_published","post_failed","system","influencer_discovery","prospect_discovery","twitter_finding","linkedin_event"],"title":"NotificationType","description":"Notification categories."},"OrgSummary":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"role":{"type":"string","title":"Role"}},"type":"object","required":["id","name","slug","role"],"title":"OrgSummary"},"OrganizationCreate":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["name","slug"],"title":"OrganizationCreate","description":"Schema for creating an organization."},"OrganizationRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"is_active":{"type":"boolean","title":"Is Active"},"is_personal":{"type":"boolean","title":"Is Personal","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"member_count":{"type":"integer","title":"Member Count","default":0}},"type":"object","required":["id","name","slug","is_active","created_at","updated_at"],"title":"OrganizationRead","description":"Schema for organization response."},"OrganizationUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"OrganizationUpdate","description":"Schema for updating an organization."},"Platform":{"type":"string","enum":["reddit","twitter","tiktok","linkedin","bluesky","youtube","instagram","facebook"],"title":"Platform","description":"Supported social media platforms."},"PollNowResponse":{"properties":{"feeds_ok":{"type":"integer","title":"Feeds Ok"},"feeds_failed":{"type":"integer","title":"Feeds Failed"},"items_inserted":{"type":"integer","title":"Items Inserted"}},"type":"object","required":["feeds_ok","feeds_failed","items_inserted"],"title":"PollNowResponse","description":"Outcome of an on-demand poll across the org's enabled feeds.\n\nMirrors the dict the Celery task returns so the on-demand path and\nthe scheduled path look identical in logs."},"PostAcceptSchedule":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"scheduled_at":{"type":"string","format":"date-time","title":"Scheduled At"}},"type":"object","required":["scheduled_at"],"title":"PostAcceptSchedule","description":"Schema for accepting + scheduling a draft in one call.\n\nLets the reviewer optionally tweak the content/title before\nlocking the post into the publish queue — saves the 4-call\n``submit → approve → schedule`` round-trip chain."},"PostCreate":{"properties":{"platform":{"$ref":"#/components/schemas/Platform"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"subreddit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit"},"parent_post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Post Id"}},"type":"object","required":["platform","content"],"title":"PostCreate","description":"Schema for creating a new post."},"PostRead":{"properties":{"id":{"type":"integer","title":"Id"},"platform":{"$ref":"#/components/schemas/Platform"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"type":"string","title":"Content"},"status":{"$ref":"#/components/schemas/PostStatus"},"subreddit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit"},"parent_post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Post Id"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"platform_post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Post Id"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"llm_model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model Used"},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls"},"created_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Id"},"approved_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Approved By Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","platform","title","content","status","subreddit","parent_post_id","scheduled_at","published_at","platform_post_id","rejection_reason","error_message","llm_model_used","created_by_id","approved_by_id","created_at","updated_at"],"title":"PostRead","description":"Schema for post response."},"PostReject":{"properties":{"reason":{"type":"string","title":"Reason"}},"type":"object","required":["reason"],"title":"PostReject","description":"Schema for rejecting a post."},"PostSchedule":{"properties":{"scheduled_at":{"type":"string","format":"date-time","title":"Scheduled At"}},"type":"object","required":["scheduled_at"],"title":"PostSchedule","description":"Schema for scheduling a post."},"PostStatus":{"type":"string","enum":["draft","pending_approval","approved","scheduled","published","rejected","failed"],"title":"PostStatus","description":"Post lifecycle states."},"PostUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"subreddit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit"},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls"}},"type":"object","title":"PostUpdate","description":"Schema for updating a draft post."},"ProspectBulkActionRequest":{"properties":{"profile_ids":{"items":{"type":"integer"},"type":"array","title":"Profile Ids"},"action":{"type":"string","title":"Action"}},"type":"object","required":["profile_ids","action"],"title":"ProspectBulkActionRequest","description":"Schema for bulk actions on prospect profiles."},"ProspectBulkActionResponse":{"properties":{"action":{"type":"string","title":"Action"},"affected":{"type":"integer","title":"Affected"},"enrich_queued":{"type":"integer","title":"Enrich Queued","default":0}},"type":"object","required":["action","affected"],"title":"ProspectBulkActionResponse","description":"Schema for bulk action result."},"ProspectListCreate":{"properties":{"name":{"type":"string","title":"Name"},"profile_ids":{"items":{"type":"integer"},"type":"array","title":"Profile Ids"}},"type":"object","required":["name","profile_ids"],"title":"ProspectListCreate","description":"Payload for creating a prospect list from selected profiles."},"ProspectListDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"profile_count":{"type":"integer","title":"Profile Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"profiles":{"items":{"$ref":"#/components/schemas/ProspectProfileRead"},"type":"array","title":"Profiles","default":[]}},"type":"object","required":["id","name","profile_count","created_at"],"title":"ProspectListDetail","description":"Prospect list with full profile entries."},"ProspectListRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"profile_count":{"type":"integer","title":"Profile Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","profile_count","created_at"],"title":"ProspectListRead","description":"Read schema for a prospect list."},"ProspectMonitorCreate":{"properties":{"name":{"type":"string","title":"Name"},"search_filters":{"additionalProperties":true,"type":"object","title":"Search Filters","default":{}},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours","default":24}},"type":"object","required":["name"],"title":"ProspectMonitorCreate","description":"Schema for creating a prospect search monitor."},"ProspectMonitorRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"search_filters_json":{"type":"string","title":"Search Filters Json"},"is_active":{"type":"boolean","title":"Is Active"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","search_filters_json","is_active","scan_frequency_hours","last_scanned_at","created_at"],"title":"ProspectMonitorRead","description":"Schema for prospect monitor response."},"ProspectMonitorUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"search_filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Search Filters"},"scan_frequency_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Frequency Hours"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"ProspectMonitorUpdate","description":"Schema for updating a prospect search monitor."},"ProspectProfileRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id"},"apollo_id":{"type":"string","title":"Apollo Id"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"seniority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seniority"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"email_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Status"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name"},"apollo_organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apollo Organization Id"},"organization_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Domain"},"organization_industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Industry"},"organization_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Size"},"enrichment_level":{"type":"string","title":"Enrichment Level"},"relevance_score":{"type":"number","title":"Relevance Score"},"llm_analysis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Analysis"},"metadata_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata Json"},"scan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Id"},"status":{"type":"string","title":"Status"},"found_at":{"type":"string","format":"date-time","title":"Found At"},"enriched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Enriched At"}},"type":"object","required":["id","monitor_id","apollo_id","first_name","last_name","title","headline","seniority","email","email_status","phone","linkedin_url","photo_url","organization_name","apollo_organization_id","organization_domain","organization_industry","organization_size","enrichment_level","relevance_score","llm_analysis","metadata_json","status","found_at","enriched_at"],"title":"ProspectProfileRead","description":"Schema for prospect profile response."},"ProspectProfileUpdate":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"ProspectProfileUpdate","description":"Schema for updating prospect profile status."},"ProspectScanRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"type":"integer","title":"Monitor Id"},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id"},"monitor_name":{"type":"string","title":"Monitor Name"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"results_count":{"type":"integer","title":"Results Count","default":0},"status":{"type":"string","title":"Status","default":"running"}},"type":"object","required":["id","monitor_id","monitor_name","started_at"],"title":"ProspectScanRead","description":"Read schema for a prospect scan execution."},"QueueStatus":{"properties":{"name":{"type":"string","title":"Name"},"active":{"type":"integer","title":"Active"},"reserved":{"type":"integer","title":"Reserved"},"scheduled":{"type":"integer","title":"Scheduled"}},"type":"object","required":["name","active","reserved","scheduled"],"title":"QueueStatus","description":"Real-time status of a single task queue."},"RedditFindingRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id"},"reddit_post_id":{"type":"string","title":"Reddit Post Id"},"reddit_url":{"type":"string","title":"Reddit Url"},"subreddit":{"type":"string","title":"Subreddit"},"post_title":{"type":"string","title":"Post Title"},"post_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Body"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"relevance_score":{"type":"number","title":"Relevance Score"},"llm_analysis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Analysis"},"suggested_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Action"},"draft_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Response"},"is_dismissed":{"type":"boolean","title":"Is Dismissed"},"draft_post_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Draft Post Id"},"found_at":{"type":"string","format":"date-time","title":"Found At"}},"type":"object","required":["id","monitor_id","reddit_post_id","reddit_url","subreddit","post_title","post_body","author","relevance_score","llm_analysis","suggested_action","draft_response","is_dismissed","draft_post_id","found_at"],"title":"RedditFindingRead","description":"Schema for reddit finding response."},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"RssSuggestion":{"properties":{"url":{"type":"string","title":"Url"},"label":{"type":"string","title":"Label"},"rationale":{"type":"string","title":"Rationale"}},"type":"object","required":["url","label","rationale"],"title":"RssSuggestion","description":"One LLM-recommended RSS feed that survived URL validation."},"ScanRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"type":"integer","title":"Monitor Id"},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id"},"monitor_name":{"type":"string","title":"Monitor Name"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"results_count":{"type":"integer","title":"Results Count","default":0},"status":{"type":"string","title":"Status","default":"running"}},"type":"object","required":["id","monitor_id","monitor_name","started_at"],"title":"ScanRead","description":"Read schema for a scan execution."},"ScopeOut":{"properties":{"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"}},"type":"object","required":["name","label","description"],"title":"ScopeOut","description":"Discovery payload for the frontend's checkbox UI."},"ScrapeCompanyRequest":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"ScrapeCompanyRequest","description":"Request body for ``POST /settings/scrape-company-context``."},"ScrapeCompanyResponse":{"properties":{"value":{"type":"string","title":"Value"},"source_url":{"type":"string","title":"Source Url"}},"type":"object","required":["value","source_url"],"title":"ScrapeCompanyResponse","description":"Response from ``POST /settings/scrape-company-context``."},"SearchMonitorCreate":{"properties":{"name":{"type":"string","title":"Name"},"search_query":{"type":"string","title":"Search Query"},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Date"},"relative_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relative Days"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours","default":24}},"type":"object","required":["name","search_query"],"title":"SearchMonitorCreate","description":"Payload for creating a new OpenAlex search monitor."},"SearchMonitorRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"search_query":{"type":"string","title":"Search Query"},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Date"},"relative_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relative Days"},"is_active":{"type":"boolean","title":"Is Active"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","search_query","is_active","scan_frequency_hours","created_at"],"title":"SearchMonitorRead","description":"Read schema for an OpenAlex search monitor."},"SearchMonitorUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"search_query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Query"},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Date"},"relative_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relative Days"},"scan_frequency_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Frequency Hours"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"SearchMonitorUpdate","description":"Payload for updating an OpenAlex search monitor."},"SearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/WorkResult"},"type":"array","title":"Results"},"total_count":{"type":"integer","title":"Total Count"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"}},"type":"object","required":["results","total_count","page","per_page"],"title":"SearchResponse","description":"Paginated search result wrapper."},"SelectAdAccount":{"properties":{"meta_ad_account_id":{"type":"string","maxLength":40,"minLength":4,"pattern":"^act_[0-9]+$","title":"Meta Ad Account Id","description":"Meta ad account id, e.g. ``act_1234567890``."}},"type":"object","required":["meta_ad_account_id"],"title":"SelectAdAccount","description":"Body for ``POST /ad-accounts/select``."},"ServiceGroup":{"type":"string","enum":["reddit","twitter","tiktok","bluesky","linkedin","youtube","instagram","facebook","llm","video","influencer","apollo","meetalfred"],"title":"ServiceGroup","description":"Supported external service groups."},"SettingRead":{"properties":{"id":{"type":"integer","title":"Id"},"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","key","value","description","updated_at"],"title":"SettingRead","description":"Schema for a single setting."},"SettingSuggestResponse":{"properties":{"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"}},"type":"object","required":["key","value"],"title":"SettingSuggestResponse","description":"Response from ``POST /settings/suggest/{key}``."},"SettingUpdate":{"properties":{"value":{"type":"string","title":"Value"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["value"],"title":"SettingUpdate","description":"Schema for updating a setting value."},"SubredditCreate":{"properties":{"subreddit_name":{"type":"string","title":"Subreddit Name"},"keywords":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keywords"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours","default":2}},"type":"object","required":["subreddit_name"],"title":"SubredditCreate","description":"Schema for adding a subreddit to monitor."},"SubredditRead":{"properties":{"id":{"type":"integer","title":"Id"},"subreddit_name":{"type":"string","title":"Subreddit Name"},"is_active":{"type":"boolean","title":"Is Active"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours"},"keywords":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keywords"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","subreddit_name","is_active","scan_frequency_hours","keywords","last_scanned_at","created_at"],"title":"SubredditRead","description":"Schema for subreddit monitor response."},"TaskLogRead":{"properties":{"id":{"type":"integer","title":"Id"},"task_id":{"type":"string","title":"Task Id"},"task_name":{"type":"string","title":"Task Name"},"queue":{"type":"string","title":"Queue"},"status":{"type":"string","title":"Status"},"args_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Args Json"},"kwargs_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kwargs Json"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"result_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Json"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"traceback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Traceback"},"retry_count":{"type":"integer","title":"Retry Count"},"max_retries":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Retries"},"queued_at":{"type":"string","format":"date-time","title":"Queued At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"runtime_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Runtime Seconds"}},"type":"object","required":["id","task_id","task_name","queue","status","args_json","kwargs_json","summary","result_json","error_message","traceback","retry_count","max_retries","queued_at","started_at","completed_at","runtime_seconds"],"title":"TaskLogRead","description":"Schema for task log response."},"TaskLogSummary":{"properties":{"total_24h":{"type":"integer","title":"Total 24H"},"success_24h":{"type":"integer","title":"Success 24H"},"failed_24h":{"type":"integer","title":"Failed 24H"},"running_now":{"type":"integer","title":"Running Now"},"avg_runtime_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Runtime Seconds"}},"type":"object","required":["total_24h","success_24h","failed_24h","running_now","avg_runtime_seconds"],"title":"TaskLogSummary","description":"Aggregated task stats for the dashboard cards."},"TaskMonitoringResponse":{"properties":{"summary":{"$ref":"#/components/schemas/TaskLogSummary"},"queues":{"items":{"$ref":"#/components/schemas/QueueStatus"},"type":"array","title":"Queues"},"recent_tasks":{"items":{"$ref":"#/components/schemas/TaskLogRead"},"type":"array","title":"Recent Tasks"}},"type":"object","required":["summary","queues","recent_tasks"],"title":"TaskMonitoringResponse","description":"Combined response for the task monitoring page."},"TokenCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"}},"type":"object","required":["name"],"title":"TokenCreateRequest"},"TokenCreated":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"token_prefix":{"type":"string","title":"Token Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"plaintext_token":{"type":"string","title":"Plaintext Token"}},"type":"object","required":["id","name","token_prefix","scopes","created_at","last_used_at","plaintext_token"],"title":"TokenCreated","description":"One-time create response — includes the plaintext."},"TokenInfo":{"properties":{"id":{"type":"integer","title":"Id"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"}},"type":"object","required":["id","scopes"],"title":"TokenInfo","description":"Surface what the API token can do, in case the MCP client wants\nto introspect its own permissions before issuing a call."},"TokenRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"token_prefix":{"type":"string","title":"Token Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","name","token_prefix","scopes","created_at","last_used_at"],"title":"TokenRead","description":"Listing shape — no plaintext, prefix only."},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/UserRead"}},"type":"object","required":["access_token","user"],"title":"TokenResponse","description":"Schema for login response with JWT."},"TopupRequest":{"properties":{"pack":{"type":"string","title":"Pack"}},"type":"object","required":["pack"],"title":"TopupRequest"},"TwitterFindingRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id"},"tweet_id":{"type":"string","title":"Tweet Id"},"tweet_url":{"type":"string","title":"Tweet Url"},"tweet_text":{"type":"string","title":"Tweet Text"},"author_handle":{"type":"string","title":"Author Handle"},"author_name":{"type":"string","title":"Author Name"},"author_followers":{"type":"integer","title":"Author Followers"},"retweet_count":{"type":"integer","title":"Retweet Count"},"favorite_count":{"type":"integer","title":"Favorite Count"},"relevance_score":{"type":"number","title":"Relevance Score"},"llm_analysis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Analysis"},"suggested_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Action"},"draft_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Response"},"scan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Id"},"is_dismissed":{"type":"boolean","title":"Is Dismissed"},"draft_post_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Draft Post Id"},"found_at":{"type":"string","format":"date-time","title":"Found At"}},"type":"object","required":["id","monitor_id","tweet_id","tweet_url","tweet_text","author_handle","author_name","author_followers","retweet_count","favorite_count","relevance_score","llm_analysis","suggested_action","draft_response","is_dismissed","draft_post_id","found_at"],"title":"TwitterFindingRead","description":"Schema for Twitter finding response."},"TwitterListCreate":{"properties":{"name":{"type":"string","title":"Name"},"finding_ids":{"items":{"type":"integer"},"type":"array","title":"Finding Ids"}},"type":"object","required":["name","finding_ids"],"title":"TwitterListCreate","description":"Payload for creating a tweet list from selected findings."},"TwitterListDetail":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"finding_count":{"type":"integer","title":"Finding Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"findings":{"items":{"$ref":"#/components/schemas/TwitterFindingRead"},"type":"array","title":"Findings","default":[]}},"type":"object","required":["id","name","finding_count","created_at"],"title":"TwitterListDetail","description":"Tweet list with full finding entries."},"TwitterListRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"finding_count":{"type":"integer","title":"Finding Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","finding_count","created_at"],"title":"TwitterListRead","description":"Read schema for a tweet list."},"TwitterMonitorCreate":{"properties":{"name":{"type":"string","title":"Name"},"search_query":{"type":"string","title":"Search Query"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours","default":4},"min_followers":{"type":"integer","title":"Min Followers","default":0},"max_followers":{"type":"integer","title":"Max Followers","default":0}},"type":"object","required":["name","search_query"],"title":"TwitterMonitorCreate","description":"Schema for creating a Twitter search monitor."},"TwitterMonitorRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"search_query":{"type":"string","title":"Search Query"},"is_active":{"type":"boolean","title":"Is Active"},"scan_frequency_hours":{"type":"integer","title":"Scan Frequency Hours"},"min_followers":{"type":"integer","title":"Min Followers"},"max_followers":{"type":"integer","title":"Max Followers"},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scanned At"},"last_tweet_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Tweet Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","search_query","is_active","scan_frequency_hours","min_followers","max_followers","last_scanned_at","last_tweet_id","created_at"],"title":"TwitterMonitorRead","description":"Schema for Twitter monitor response."},"TwitterMonitorUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"search_query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Query"},"scan_frequency_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scan Frequency Hours"},"min_followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Followers"},"max_followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Followers"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"TwitterMonitorUpdate","description":"Schema for updating a Twitter search monitor."},"TwitterScanRead":{"properties":{"id":{"type":"integer","title":"Id"},"monitor_id":{"type":"integer","title":"Monitor Id"},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id"},"monitor_name":{"type":"string","title":"Monitor Name"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"results_count":{"type":"integer","title":"Results Count","default":0},"status":{"type":"string","title":"Status","default":"running"}},"type":"object","required":["id","monitor_id","monitor_name","started_at"],"title":"TwitterScanRead","description":"Read schema for a Twitter scan execution."},"URLToVideoCreate":{"properties":{"url":{"type":"string","title":"Url"},"aspect_ratio":{"type":"string","title":"Aspect Ratio","default":"9:16"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id"},"visual_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visual Style"}},"type":"object","required":["url"],"title":"URLToVideoCreate","description":"Payload for creating a URL-to-Video job."},"UnreadCountResponse":{"properties":{"count":{"type":"integer","title":"Count"}},"type":"object","required":["count"],"title":"UnreadCountResponse","description":"Schema for unread notification count."},"UserCreate":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"full_name":{"type":"string","title":"Full Name"}},"type":"object","required":["email","password","full_name"],"title":"UserCreate","description":"Schema for user registration."},"UserRead":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"role":{"type":"string","title":"Role"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["id","email","full_name","role","is_active"],"title":"UserRead","description":"Schema for user response."},"UserUpdate":{"properties":{"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UserUpdate","description":"Schema for admin-updating a user's role or active status."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VideoJobRead":{"properties":{"id":{"type":"integer","title":"Id"},"job_type":{"type":"string","title":"Job Type"},"creatify_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creatify Job Id"},"status":{"type":"string","title":"Status"},"input_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Url"},"input_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Text"},"aspect_ratio":{"type":"string","title":"Aspect Ratio","default":"9:16"},"voice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Id"},"avatar_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Id"},"visual_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visual Style"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","job_type","status","created_at"],"title":"VideoJobRead","description":"Read schema for a video generation job."},"VoiceRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender"},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url"}},"type":"object","required":["id","name"],"title":"VoiceRead","description":"A Creatify voice option."},"WorkAuthorBrief":{"properties":{"name":{"type":"string","title":"Name"},"institution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Institution"}},"type":"object","required":["name"],"title":"WorkAuthorBrief","description":"Minimal author info shown in search results."},"WorkResult":{"properties":{"openalex_id":{"type":"string","title":"Openalex Id"},"title":{"type":"string","title":"Title"},"doi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Doi"},"publication_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publication Date"},"authors_count":{"type":"integer","title":"Authors Count","default":0},"authors":{"items":{"$ref":"#/components/schemas/WorkAuthorBrief"},"type":"array","title":"Authors","default":[]},"cited_by_count":{"type":"integer","title":"Cited By Count","default":0},"is_oa":{"type":"boolean","title":"Is Oa","default":false},"openalex_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openalex Url"}},"type":"object","required":["openalex_id","title"],"title":"WorkResult","description":"A single paper returned from an OpenAlex search."},"WorkspaceCreate":{"properties":{"name":{"type":"string","title":"Name"},"is_personal":{"type":"boolean","title":"Is Personal","default":false},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"}},"type":"object","required":["name"],"title":"WorkspaceCreate","description":"Schema for a user self-creating their own workspace (onboarding).\n\nSlug is optional — auto-generated from the name when omitted, since the\ncreate-workspace UI only asks for a name + a personal/team choice."},"YouTubeDraftUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"privacy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Privacy"},"made_for_kids":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Made For Kids"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"}},"type":"object","title":"YouTubeDraftUpdate","description":"Partial-update schema for editing a draft's metadata."},"YouTubeGenerateRequest":{"properties":{"topic":{"type":"string","title":"Topic"},"script_or_summary":{"type":"string","title":"Script Or Summary","default":""}},"type":"object","required":["topic"],"title":"YouTubeGenerateRequest","description":"Payload for the AI title/description/tags generator."},"YouTubeGenerateResponse":{"properties":{"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"category_id":{"type":"string","title":"Category Id","default":""}},"type":"object","required":["title","description","tags"],"title":"YouTubeGenerateResponse","description":"LLM-generated metadata fields."},"YouTubeOAuthStatus":{"properties":{"connected":{"type":"boolean","title":"Connected"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"channel_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Title"},"access_token_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token Expires At"},"connected_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connected At"}},"type":"object","required":["connected"],"title":"YouTubeOAuthStatus","description":"Connection status response."},"YouTubeVideoRead":{"properties":{"id":{"type":"integer","title":"Id"},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id"},"created_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Id"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"privacy":{"type":"string","title":"Privacy"},"made_for_kids":{"type":"boolean","title":"Made For Kids"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"source_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Filename"},"source_mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Mime"},"source_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Bytes"},"status":{"type":"string","title":"Status"},"scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled At"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"youtube_video_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Video Id"},"youtube_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"view_count":{"type":"integer","title":"View Count"},"like_count":{"type":"integer","title":"Like Count"},"comment_count":{"type":"integer","title":"Comment Count"},"favorite_count":{"type":"integer","title":"Favorite Count"},"stats_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Stats Polled At"},"watch_time_minutes":{"type":"number","title":"Watch Time Minutes"},"average_view_duration_seconds":{"type":"number","title":"Average View Duration Seconds"},"average_view_percentage":{"type":"number","title":"Average View Percentage"},"subscribers_gained":{"type":"integer","title":"Subscribers Gained"},"analytics_polled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Analytics Polled At"},"llm_model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model Used"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","organization_id","created_by_id","title","description","privacy","made_for_kids","status","view_count","like_count","comment_count","favorite_count","watch_time_minutes","average_view_duration_seconds","average_view_percentage","subscribers_gained","created_at","updated_at"],"title":"YouTubeVideoRead","description":"Read schema for a YouTubeVideo row."},"_GenerateCreatifyImageBody":{"properties":{"prompt":{"type":"string","maxLength":4000,"minLength":4,"title":"Prompt"},"model_name":{"type":"string","maxLength":120,"title":"Model Name","default":"flux-2-pro"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","default":"1:1"}},"type":"object","required":["prompt"],"title":"_GenerateCreatifyImageBody","description":"Body for the per-draft Creatify Asset-Generator image endpoint."},"_GenerateVideoBody":{"properties":{"source_url":{"type":"string","maxLength":2000,"minLength":4,"title":"Source Url","description":"Product / landing-page URL Creatify turns into a video."},"aspect_ratio":{"type":"string","title":"Aspect Ratio","default":"9:16"}},"type":"object","required":["source_url"],"title":"_GenerateVideoBody","description":"Body for the per-draft Creatify URL-to-video generation endpoint."},"app__routers__facebook___GenerateImageBody":{"properties":{"prompt":{"type":"string","maxLength":4000,"minLength":10,"title":"Prompt"},"aspect":{"type":"string","title":"Aspect","default":"landscape"}},"type":"object","required":["prompt"],"title":"_GenerateImageBody","description":"Body for the per-draft AI image-generation endpoint."},"app__routers__instagram___GenerateImageBody":{"properties":{"prompt":{"type":"string","maxLength":4000,"minLength":10,"title":"Prompt"},"aspect":{"type":"string","title":"Aspect","default":"portrait"}},"type":"object","required":["prompt"],"title":"_GenerateImageBody","description":"Body for the per-draft AI image-generation endpoint."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}