{"openapi":"3.1.0","info":{"title":"Favente API","description":"Backend API for Favente — creator marketing from your own users","version":"1.0.0"},"paths":{"/":{"get":{"summary":"Root","description":"Root endpoint for health check.\n\nReturns:\n    dict: Simple status message indicating the bot is running\n\nExample:\n    GET /\n    Response: {\"message\": \"Slack Bot is running\"}","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/capabilities":{"get":{"summary":"Health Capabilities","description":"Ops probe: which env-dependent integrations are LIVE right now, as presence-only\nbooleans (NO secret values ever). Mirrors /admin/support/readiness but callable\nwithout an admin session, gated by a shared OPS_PROBE_SECRET so it isn't public.\n\nFail-closed: if OPS_PROBE_SECRET is unset, or the caller's token doesn't match,\nreturn 404 (don't even reveal the probe exists). Pass the token via the\n`X-Ops-Probe` header or `?token=`.","operationId":"health_capabilities_health_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/telnyx-verification":{"get":{"summary":"Health Telnyx Verification","description":"Ops probe: is our Telnyx toll-free sender number VERIFIED (i.e. will carriers\nactually deliver our SMS)? Live query against Telnyx. Same OPS_PROBE_SECRET gate,\nfail-closed. Returns masked numbers + status only — never the API key.","operationId":"health_telnyx_verification_health_telnyx_verification_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/api-checks":{"get":{"summary":"Health Api Checks","description":"Ops probe: LIVE auth round-trips against every external API (Stripe, Anthropic,\nResend, Telnyx, ScrapeCreators, favente-ai) — proves the keys actually WORK, not\njust that the env var exists. Same OPS_PROBE_SECRET gate, fail-closed. Returns\nok/status/note per service; never a secret. (ScrapeCreators spends ~1 credit.)","operationId":"health_api_checks_health_api_checks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ready":{"get":{"summary":"Readiness Check","description":"Readiness probe: unlike /health (a static liveness check), this actually\nround-trips Mongo with a lightweight `ping`. Returns 200 only when the DB is\nreachable, 503 otherwise — so a load balancer / orchestrator can stop routing\ntraffic to an instance whose database connection is down.","operationId":"readiness_check_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/agent/capabilities":{"get":{"summary":"Agent Capabilities","description":"Machine-readable capability map for autonomous agents evaluating Deo.","operationId":"agent_capabilities_agent_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/deo-agent.json":{"get":{"summary":"Deo Agent Manifest","operationId":"deo_agent_manifest__well_known_deo_agent_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/debug-config":{"get":{"summary":"Debug Config","operationId":"debug_config_debug_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/feedback":{"post":{"summary":"Submit Feedback","operationId":"submit_feedback_feedback_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_feedback_feedback_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/send-message":{"post":{"summary":"Send Message","description":"Send a message to a Slack channel using the Slack API.\n\nThis endpoint accepts a Slack bot token, channel ID, and message text,\nthen posts the message to the specified channel using Slack's chat.postMessage API.\n\nArgs:\n    request (SendMessageRequest): Request body containing:\n        - token (str): Slack bot token (xoxb-...)\n        - channel (str): Slack channel ID (C1234567890)\n        - message (str): Message text to send\n\nReturns:\n    dict: Response containing:\n        - success (bool): Whether the message was sent successfully\n        - channel (str): Channel ID where message was sent\n        - timestamp (str): Slack timestamp of the message\n        - message (str): The message that was sent\n\nRaises:\n    HTTPException: 400 error if Slack API returns an error\n\nExample:\n    POST /send-message\n    Body: {\n        \"token\": \"xoxb-1234567890-...\",\n        \"channel\": \"C1234567890\",\n        \"message\": \"Hello World\"\n    }","operationId":"send_message_send_message_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/endpoints__models__SendMessageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/get-channels":{"post":{"summary":"Get Channels","description":"Retrieve all available channels from a Slack workspace.\n\nThis endpoint uses the Slack API's conversations.list method to fetch\nall public and private channels that the bot has access to. It returns\na simplified list containing channel IDs and names.\n\nArgs:\n    request (GetChannelsRequest): Request body containing:\n        - token (str): Slack bot token for authentication\n\nReturns:\n    dict: Response containing:\n        - success (bool): Whether the request was successful\n        - channels (list): List of channel objects\n        - count (int): Total number of channels returned\n\nRaises:\n    HTTPException: 400 error if Slack API returns an error","operationId":"get_channels_get_channels_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetChannelsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/get-users":{"post":{"summary":"Get Users","description":"Retrieve all users from a Slack workspace.\n\nThis endpoint uses the Slack API's users.list method to fetch\nall users in the workspace, including both active and deactivated users.\n\nArgs:\n    request (GetUsersRequest): Request body containing:\n        - token (str): Slack bot token for authentication\n\nReturns:\n    dict: Response containing:\n        - success (bool): Whether the request was successful\n        - users (list): List of user objects\n        - count (int): Total number of users returned\n\nRaises:\n    HTTPException: 400 error if Slack API returns an error","operationId":"get_users_get_users_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUsersRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/events":{"post":{"summary":"Slack Events","description":"Handle Slack Events API requests (signature-verified).","operationId":"slack_events_slack_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/delete-all":{"delete":{"tags":["account"],"summary":"Delete Account And All Data","description":"Delete account and ALL associated data from every collection.\nCascades through workspaces, company, marketer, and all related data.","operationId":"delete_account_and_all_data_account_delete_all_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/tokens":{"get":{"tags":["account"],"summary":"Get Saved Tokens","description":"Get user's saved Slack tokens from tokens collection.","operationId":"get_saved_tokens_account_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["account"],"summary":"Save Token","description":"Save a new token (Slack Bot or other) to tokens collection.","operationId":"save_token_account_tokens_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/tokens/{token_id}":{"delete":{"tags":["account"],"summary":"Delete Token","description":"Delete a saved Slack token by ID.","operationId":"delete_token_account_tokens__token_id__delete","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/erase-for-dev":{"delete":{"tags":["account"],"summary":"Erase Account For Dev","description":"DEV ONLY: Wipes onboarding state, role, company and marketer profile so the\nuser is forced through onboarding again on next login. Does NOT delete the\nauth account so they can log back in immediately.","operationId":"erase_account_for_dev_account_erase_for_dev_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/avatar":{"post":{"tags":["account"],"summary":"Update Membership Avatar","description":"Update the caller's avatar.\n\nStored per-membership (company_slug + role) so an owner and a marketer\nidentity keep independent avatars; falls back to the account-level\n``picture`` when there's no membership context or no match.","operationId":"update_membership_avatar_account_avatar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/profile":{"post":{"tags":["account"],"summary":"Update Profile","description":"Let a user edit their own display name and public handle. The handle is the\nURL of their public creator page, so it's format-checked and uniqueness-checked\n(case-insensitive) against every other account before it's taken.","operationId":"update_profile_account_profile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/export":{"get":{"tags":["account"],"summary":"Export My Data","description":"Creator self-service data export (GDPR/CCPA-style data-subject access).\n\nReturns the AUTHENTICATED caller's OWN data as JSON: profile(s), their claims,\na payout summary (honest creator-facing status + amounts/dates), training\nprogress, and badges/passport. Strictly self-scoped — every read is keyed on\nthe caller's account_id / marketer_id, so no other user's data can be returned.","operationId":"export_my_data_account_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/ai-preferences":{"post":{"tags":["account"],"summary":"Set Ai Preferences","description":"Set the caller's AI-learning preference. When `ai_learning_opt_out` is True,\nthe creator's resolved content is EXCLUDED from the privacy-safe learning\ndataset (orchestra/learning_dataset). Written to EVERY marketer_profile for\nthis account (a creator can join multiple companies with one account) plus the\naccount doc, all self-scoped by the caller's account_id. Human-First: the\ncreator controls whether their work trains the platform's models.","operationId":"set_ai_preferences_account_ai_preferences_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIPreferencesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/notification-preferences":{"get":{"tags":["account"],"summary":"Get Notification Preferences","description":"Return the AUTHENTICATED caller's per-category ENGAGEMENT notification\npreferences (self-scoped by the caller's own email). Transactional\nnotifications are always-on and have no toggle, so they are reported\nseparately as an always-true, non-editable class for the settings UI.\n\nResponse shape:\n  {\n    \"engagement\": {                      # editable, per-category booleans\n      \"nudges\": true, \"digests\": true, \"coaching\": true,\n      \"community\": true, \"streaks\": true\n    },\n    \"categories\": [                      # UI metadata: labels + class + urgency\n      {\"key\": \"nudges\", \"label\": \"Inactivity & money-waiting nudges\",\n       \"enabled\": true, \"class\": \"engagement\"}, ...\n    ],\n    \"transactional_always_on\": true,     # payout/claim/billing/security\n    \"frequency_cap_per_day\": 2           # engagement daily budget (N)\n  }","operationId":"get_notification_preferences_account_notification_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["account"],"summary":"Set Notification Preferences","description":"Set the caller's per-category ENGAGEMENT toggles (self-scoped by email).\nOnly known engagement categories are stored; transactional notifications\ncan never be toggled off. Returns the resolved effective prefs.","operationId":"set_notification_preferences_account_notification_preferences_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPrefsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/ad-consent":{"get":{"tags":["account"],"summary":"Get Ad Consent","description":"The caller's current paid-ad-reuse consent (self-scoped).","operationId":"get_ad_consent_account_ad_consent_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["account"],"summary":"Set Ad Consent","description":"Human-First: a creator's face/voice is NEVER run in a brand's paid ad\nwithout a recorded yes. This is the explicit, revocable consent toggle (default\noff — fail-closed; the ad-launch path blocks a creator's video until it's on).\nSelf-scoped to the caller; stamped with a consent timestamp for the audit trail.","operationId":"set_ad_consent_account_ad_consent_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdReuseConsentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/phone/verify/start":{"post":{"tags":["account"],"summary":"Phone Verify Start","description":"Begin phone verification for the AUTHENTICATED account: normalize to E.164,\nrate-limit, mint + hash a 6-digit OTP, and send it via the comms.send_sms STUB\n(which is a no-op until an SMS provider is configured, so this returns\n``sent=false, pending=true`` today). Never returns the code.","operationId":"phone_verify_start_account_phone_verify_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneVerifyStartRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/phone/verify/confirm":{"post":{"tags":["account"],"summary":"Phone Verify Confirm","description":"Confirm the OTP for the AUTHENTICATED account. On success sets\nphone_verified + phone_e164 on the account (and the top-level `verified_phone`\nmirror the comms layer reads). Verification alone does NOT enable SMS — the\ncreator must still opt in via /account/phone/consent (double opt-in).","operationId":"phone_verify_confirm_account_phone_verify_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneVerifyConfirmRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account/phone/consent":{"post":{"tags":["account"],"summary":"Phone Consent","description":"Set the AUTHENTICATED account's SMS consent. Opting IN records sms_opt_in +\ntimestamp and clears any prior STOP suppression; opting OUT clears the flag and\nwrites an `sms_optouts` record (TCPA STOP). Self-scoped to the caller.","operationId":"phone_consent_account_phone_consent_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneConsentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"get":{"tags":["auth"],"summary":"Login","operationId":"login_auth_login_get","parameters":[{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}},{"name":"redirectTo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirectto"}},{"name":"external_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External User Id"}},{"name":"acq_source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acq Source"}},{"name":"acq_medium","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acq Medium"}},{"name":"acq_campaign","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acq Campaign"}},{"name":"acq_content","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acq Content"}},{"name":"acq_term","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acq Term"}},{"name":"acq_cta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acq Cta"}},{"name":"acq_landing_path","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acq Landing Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/callback":{"get":{"tags":["auth"],"summary":"Auth Callback","operationId":"auth_callback_auth_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Get Current User","operationId":"get_current_user_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Destroy ONLY the session identified by the caller's token.\nDoes not affect other tabs/sessions for the same user.\nReturns JSON (not a redirect) so the frontend controls navigation.\n\nPOST (not GET): logout mutates state, so a GET made it CSRF-triggerable via a\npassive `<img src=.../auth/logout>` on any page. POST + SameSite closes that.","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/sessions/active":{"get":{"tags":["auth"],"summary":"Get Active Sessions","operationId":"get_active_sessions_auth_sessions_active_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/sessions/me":{"get":{"tags":["auth"],"summary":"Get My Session","operationId":"get_my_session_auth_sessions_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/sessions/get-by-email":{"post":{"tags":["auth"],"summary":"Get Session By Email","operationId":"get_session_by_email_auth_sessions_get_by_email_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/applications/create":{"post":{"tags":["applications"],"summary":"Create Application Form","description":"Create a new job application form.\n\nThis endpoint:\n1. Creates an application form template\n2. Generates a unique public URL\n3. Returns the URL to share with candidates\n\nReturns:\n    dict: Created form with URL","operationId":"create_application_form_applications_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplicationFormRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/{form_id}/info":{"get":{"tags":["applications"],"summary":"Get Application Form Info","description":"Get public info about an application form (no auth required).\nUsed by the public application page.","operationId":"get_application_form_info_applications__form_id__info_get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/{form_id}/submit":{"post":{"tags":["applications"],"summary":"Submit Application","description":"Submit a job application with resume.\n\nThis endpoint:\n1. Validates the application form exists and is active\n2. Saves the application data\n3. Uploads resume to Slack and sends notification\n\nReturns:\n    dict: Submission confirmation","operationId":"submit_application_applications__form_id__submit_post","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_application_applications__form_id__submit_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/list":{"get":{"tags":["applications"],"summary":"List Application Forms","description":"List all application forms owned by the authenticated user.","operationId":"list_application_forms_applications_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/applications/mine":{"get":{"tags":["applications"],"summary":"Get My Applications","description":"List applications submitted by the authenticated user.","operationId":"get_my_applications_applications_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/applications/{form_id}":{"delete":{"tags":["applications"],"summary":"Delete Application Form","description":"Delete an application form.","operationId":"delete_application_form_applications__form_id__delete","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["applications"],"summary":"Edit Application Form","description":"Update an application form's editable fields.","operationId":"edit_application_form_applications__form_id__put","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/{form_id}/toggle":{"put":{"tags":["applications"],"summary":"Toggle Application Form","description":"Toggle application form active status.","operationId":"toggle_application_form_applications__form_id__toggle_put","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/{form_id}/submissions":{"get":{"tags":["applications"],"summary":"List Form Submissions","operationId":"list_form_submissions_applications__form_id__submissions_get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"stage","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/{form_id}/pipeline":{"get":{"tags":["applications"],"summary":"Get Form Pipeline Summary","operationId":"get_form_pipeline_summary_applications__form_id__pipeline_get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/submission/{submission_id}":{"get":{"tags":["applications"],"summary":"Get Submission Detail","operationId":"get_submission_detail_applications_submission__submission_id__get","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/submission/{submission_id}/note":{"post":{"tags":["applications"],"summary":"Add Submission Note","operationId":"add_submission_note_applications_submission__submission_id__note_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddSubmissionNoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/submission/{submission_id}/scorecard":{"post":{"tags":["applications"],"summary":"Add Submission Scorecard","operationId":"add_submission_scorecard_applications_submission__submission_id__scorecard_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddSubmissionScorecardRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/applications/submission/{submission_id}/status":{"put":{"tags":["applications"],"summary":"Update Application Status","description":"Update application status.\nIf status is 'hired', sends a notification to Slack.","operationId":"update_application_status_applications_submission__submission_id__status_put","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApplicationStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contracts":{"post":{"tags":["contracts"],"summary":"Create Contract","description":"Create a new contract (authenticated).","operationId":"create_contract_contracts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContractRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contracts/list":{"get":{"tags":["contracts"],"summary":"List Contracts","description":"List contracts for the authenticated user, with signing status.","operationId":"list_contracts_contracts_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/contracts/{contract_id}":{"delete":{"tags":["contracts"],"summary":"Delete Contract","description":"Delete a contract and its signing requests (authenticated, owner only).","operationId":"delete_contract_contracts__contract_id__delete","parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"string","title":"Contract Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["contracts"],"summary":"Update Contract","description":"Update contract (title, body, email template). Owner only.","operationId":"update_contract_contracts__contract_id__put","parameters":[{"name":"contract_id","in":"path","required":true,"schema":{"type":"string","title":"Contract Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContractRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contracts/send":{"post":{"tags":["contracts"],"summary":"Send Contract","description":"Create a signing link for a contract and optionally send to email. Returns sign_link.","operationId":"send_contract_contracts_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendContractRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contracts/company/{slug}/contract":{"get":{"tags":["contracts"],"summary":"Get Company Contract","operationId":"get_company_contract_contracts_company__slug__contract_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contracts/company/{slug}/creator-agreements":{"get":{"tags":["contracts"],"summary":"Get Creator Agreements","description":"Return the two built-in creator agreements (Consultant Engagement + PIIA),\nfilled with the brand as the \"Company\" party and the requesting creator's name,\nplus the not-legal-advice disclaimer. This is what the creator reviews + signs.","operationId":"get_creator_agreements_contracts_company__slug__creator_agreements_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sign/contract/{token}":{"get":{"tags":["sign"],"summary":"Get Contract By Token","description":"Return contract content for a signing token (public, no auth).","operationId":"get_contract_by_token_sign_contract__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sign/contract/{token}/sign":{"post":{"tags":["sign"],"summary":"Sign Contract","description":"Record signature for a token (public, no auth).","operationId":"sign_contract_sign_contract__token__sign_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignContractRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/marketer/{slug}/previous-accounts":{"get":{"tags":["onboarding"],"summary":"Previous Marketer Accounts","description":"The social/posting accounts this creator has ALREADY linked on OTHER brands,\nso they can REUSE one here instead of retyping it — the Creator Passport as a\nportable identity (\"show me the accounts I've used before\").\n\nMulti-tenant safety: scoped to the creator's OWN identity (marketer_id resolved\nfrom their session), so it only ever returns THEIR handles — never another\ncreator's. Excludes the current company (already on this profile) and the\ncreator's private self-owned influencer workspace. Deduped by (platform, url),\nmost-recently-used first. Read-only.","operationId":"previous_marketer_accounts_onboarding_marketer__slug__previous_accounts_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/owner/slug-available":{"get":{"tags":["onboarding"],"summary":"Owner Slug Available","description":"Live availability of a proposed brand handle during onboarding, so the owner\nsees whether \"acme\" is free BEFORE submitting (instead of silently getting\n\"acme-1\" on collision). Applies the SAME slugify + reserved + uniqueness rules\nonboard_owner uses, so the answer matches the slug they'll actually get.\nSigned-in only (the onboarding user has a session).","operationId":"owner_slug_available_onboarding_owner_slug_available_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/onboarding/owner":{"post":{"tags":["onboarding"],"summary":"Onboard Owner","description":"Onboard a new Owner (App Creator).\n\n1. Update User (role='owner', company info).\n2. Create Workspace (if needed).\n3. Create default Team (\"Core Marketing\").\n4. Create default Contract.\n5. Create default Campaign (Template).","operationId":"onboard_owner_onboarding_owner_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerOnboardingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/influencer":{"post":{"tags":["onboarding"],"summary":"Onboard Influencer","description":"Onboard a solo/individual creator (\"Influencer\").\n\nCreates a PERSONAL company the account owns + a single marketer membership\ninto it, so all creator tools work unchanged. The personal company is\n`kind:\"personal\"`, `visibility:\"private\"`, and on the `free` plan (its own AI\ncredit pool via the existing company-keyed metering — no new billing path, so\nthe reserve→commit→void money-safety machinery applies verbatim). Idempotent:\na repeat call returns the existing personal workspace instead of a duplicate.","operationId":"onboard_influencer_onboarding_influencer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluencerOnboardingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/marketer":{"post":{"tags":["onboarding"],"summary":"Onboard Marketer","description":"Onboard a new Marketer.\n\n1. Associate with Team (if team_id provided).\n2. Update User (role='marketer', signed_audit if any).","operationId":"onboard_marketer_onboarding_marketer_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/onboarding/marketer/{slug}/accounts":{"post":{"tags":["onboarding"],"summary":"Save Marketer Account Links","description":"Saves marketer social account URLs early in onboarding.","operationId":"save_marketer_account_links_onboarding_marketer__slug__accounts_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountLinksRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/marketer/{slug}/connect/{platform}":{"post":{"tags":["onboarding"],"summary":"Start Platform Connect","description":"Mint an OAuth connect URL so the logged-in creator can LINK their\nTikTok/Instagram/YouTube account (not just paste a handle). We don't run the OAuth\nhandshake here — favente-supportive owns it (encrypted token storage + the poller).\nWe authenticate the creator, resolve their (marketer_id, company_id) for this slug,\nthen ask favente-supportive to start the flow and return its authorize_url. Once the\ncreator consents, favente-supportive stores the connection and its poller begins\npulling OFFICIAL platform view stats for that account — the higher-trust source\nplatform_views prefers over the scrapers.","operationId":"start_platform_connect_onboarding_marketer__slug__connect__platform__post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["onboarding"],"summary":"Disconnect Platform","description":"Let the logged-in CREATOR disconnect their OWN linked TikTok/Instagram/YouTube\naccount. Authenticated as the creator (their session), tenant-scoped to THEIR\nmarketer membership for ``slug`` — only the owning creator can revoke their own\nconnection. Proxies to favente-supportive's service-authed DELETE /api/connections\nto revoke the token + stop the poller, then reflects the disconnect locally.\n\nBest-effort on the upstream call: if favente-supportive is briefly down we return a\nclear ``service_available: false`` rather than 500ing — the creator sees the\ndisconnect took locally and can retry the upstream revoke.","operationId":"disconnect_platform_onboarding_marketer__slug__connect__platform__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/marketer/{slug}/connect/status":{"get":{"tags":["onboarding"],"summary":"Platform Connect Status","description":"Expose real OAuth readiness before the creator clicks Connect.\n\nThis remains marketer-authenticated and proxies only creator-safe booleans from\nfavente-supportive. If the scheduler is unavailable or misconfigured, fail closed\nso the product never advertises a connection flow it cannot complete.","operationId":"platform_connect_status_onboarding_marketer__slug__connect_status_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/marketer/{slug}/config":{"post":{"tags":["onboarding"],"summary":"Update Marketer Config","operationId":"update_marketer_config_onboarding_marketer__slug__config_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketerConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["onboarding"],"summary":"Get Marketer Onboarding Config","description":"Returns company-specific config for the marketer onboarding wizard.","operationId":"get_marketer_onboarding_config_onboarding_marketer__slug__config_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/marketer/{slug}/product-guide/generate":{"post":{"tags":["onboarding"],"summary":"Generate Product Guide Endpoint","description":"Owner-only: draft the Product Guide from the brand's own site + info and\nsave it to marketer_config. Returns {product_description, selling_angles}.\n\nIdempotent-safe to call repeatedly (it overwrites the two guide fields). Used\nby the owner editor's 'Auto-fill from my website' action and auto-invoked\nright after onboarding so a new brand starts with a working guide.","operationId":"generate_product_guide_endpoint_onboarding_marketer__slug__product_guide_generate_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/marketer/{slug}/complete":{"post":{"tags":["onboarding"],"summary":"Complete Marketer Onboarding","description":"Marks marketer onboarding as complete and creates/updates MarketerProfile.","operationId":"complete_marketer_onboarding_onboarding_marketer__slug__complete_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketerCompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/marketer/slug-request":{"post":{"tags":["onboarding"],"summary":"Request Custom Slug","description":"Creates a slug-change request ticket for the owner to approve.","operationId":"request_custom_slug_onboarding_marketer_slug_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlugRequestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/reset":{"post":{"tags":["onboarding"],"summary":"Reset Onboarding","description":"Reset onboarding so a user can run it again from scratch.\n- Marketer: clears onboarding completion + optionally wipes profile setup fields.\n- Owner: clears onboarding status and routes back to owner onboarding wizard.","operationId":"reset_onboarding_onboarding_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetOnboardingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/marketer/{slug}/sign":{"post":{"tags":["onboarding"],"summary":"Save Signature","operationId":"save_signature_onboarding_marketer__slug__sign_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/membership/add/{slug}":{"post":{"tags":["onboarding"],"summary":"Add Marketer Membership","description":"Add a marketer membership AND provision every downstream artifact the\ndashboard expects on first load. This is the single source of truth for\n\"someone just joined via the invite flow\" — the dashboard then doesn't\nhave to lazy-create anything.\n\nOn success this creates / upserts:\n  - membership entry on the account doc\n  - marketer_profiles doc with status=active (counts in owner stats immediately)\n  - unique assigned_slug for the link-in-bio URL\n  - personal referral code (so they can invite others)\n  - AI credit account (if the company's policy auto_grant_on_join_credits > 0)\n  - marketer_referrals attribution entry (if ?ref=... was passed)\n\nAll downstream steps are idempotent — re-calling this on an existing\nmarketer is safe and will fill in any missing artifacts.","operationId":"add_marketer_membership_onboarding_membership_add__slug__post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/membership/{slug}":{"delete":{"tags":["onboarding"],"summary":"Remove Membership","operationId":"remove_membership_onboarding_membership__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/{company_slug}/marketers":{"get":{"tags":["onboarding"],"summary":"Get Company Marketers","operationId":"get_company_marketers_onboarding__company_slug__marketers_get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/signatures":{"get":{"tags":["onboarding"],"summary":"Get Marketer Signature","description":"Retrieves the signature image for a specific marketer by email.","operationId":"get_marketer_signature_onboarding_signatures_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"slug","in":"query","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed/{company_slug}/creator-status":{"get":{"tags":["embed"],"summary":"Get Creator Status","description":"Returns creator progress for a given email + company slug.\nUsed by the embed widget to personalize the CTA for existing creators.","operationId":"get_creator_status_embed__company_slug__creator_status_get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"email","in":"query","required":false,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/embed/{company_slug}/init.js":{"get":{"tags":["embed"],"summary":"Get Snippet","description":"Returns a production-ready embeddable script for the given company.\nThe script renders a \"Join the Team\" CTA and links to /c/{slug}.","operationId":"get_snippet_embed__company_slug__init_js_get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/members":{"get":{"tags":["chat"],"summary":"Get Company Members","description":"Return all members (owners + marketers) of the caller's company.\n\nA messages page with no resolvable company context, or where the caller has\nno roster yet, is an EMPTY state — not an error. So instead of 400/403 we\nreturn an empty member list and let the UI show \"no one to message yet\".\n(Auth itself still 401s via _get_authed_user — that's a real error.)","operationId":"get_company_members_chat_members_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/chat/dm/{other_email}":{"get":{"tags":["chat"],"summary":"Get Dm Messages","description":"Fetch DM history between the caller and other_email (members only).","operationId":"get_dm_messages_chat_dm__other_email__get","parameters":[{"name":"other_email","in":"path","required":true,"schema":{"type":"string","title":"Other Email"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["chat"],"summary":"Send Dm","description":"Send a private DM to other_email (both must be members of the same company).","operationId":"send_dm_chat_dm__other_email__post","parameters":[{"name":"other_email","in":"path","required":true,"schema":{"type":"string","title":"Other Email"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/orchestra__chat__SendMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/dm/{other_email}/read":{"post":{"tags":["chat"],"summary":"Mark Dm Read","description":"Mark the caller's thread with other_email as read: stamps read_at on\nevery message in that thread sent TO the caller (i.e. by other_email) that\ndoesn't have one yet. Idempotent — re-calling marks nothing new.\n\nNOTE: this route is registered BEFORE the greedy POST /dm/{other_email:path}\nsend route below, so \".../read\" resolves here and never sends a message.\n\nScoping: the participants pair includes the caller's own email, so a user\ncan only ever mark threads they participate in — company + membership are\nstill checked like every other chat route.","operationId":"mark_dm_read_chat_dm__other_email__read_post","parameters":[{"name":"other_email","in":"path","required":true,"schema":{"type":"string","title":"Other Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/chat/messages":{"get":{"tags":["chat"],"summary":"Get Messages","description":"Fetch the latest messages for the caller's company (members only).","operationId":"get_messages_chat_messages_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["chat"],"summary":"Send Message","description":"Post a new chat message. Forwards to Slack if integration is enabled.","operationId":"send_message_chat_messages_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/orchestra__chat__SendMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/watch/queue":{"get":{"tags":["community-legacy"],"summary":"Get Verification Queue","operationId":"get_verification_queue_watch_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/watch/{item_id}/verify":{"post":{"tags":["community-legacy"],"summary":"Verify Item","operationId":"verify_item_watch__item_id__verify_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community/queue":{"get":{"tags":["community-watch"],"summary":"Marketer Community Queue","description":"Returns unreviewed CommunityWatchItems for this marketer to vote on.","operationId":"marketer_community_queue_community_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/community/my-votes":{"get":{"tags":["community-watch"],"summary":"Marketer My Votes","description":"The caller's peer-review history in this company: what they voted on,\nwhich verdict they cast, and where each item stands now. Reviewing is part\nof a creator's track record — voting into a void undersells the work.","operationId":"marketer_my_votes_community_my_votes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/community/review":{"post":{"tags":["community-watch"],"summary":"Marketer Community Review","description":"Records a marketer's vote on a community watch item.","operationId":"marketer_community_review_community_review_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/community/queue":{"get":{"tags":["owner-community"],"summary":"Owner Community Queue","description":"Returns escalated community watch items for owner review.","operationId":"owner_community_queue_owner_community_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/community/action":{"post":{"tags":["owner-community"],"summary":"Owner Community Action","description":"Owner resolves a community watch item.","operationId":"owner_community_action_owner_community_action_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerActionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/hooks":{"post":{"tags":["ai"],"summary":"Generate Hooks","description":"Calls Claude to generate 4 punchy UGC video hooks about the given topic.\nRate limited to 20 requests/hour per user.","operationId":"generate_hooks_ai_hooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HooksTopicRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/captions":{"post":{"tags":["ai"],"summary":"Generate Captions","operationId":"generate_captions_ai_captions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/polish":{"post":{"tags":["ai"],"summary":"Polish Video Script","operationId":"polish_video_script_ai_polish_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolishRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/media/enhance":{"post":{"tags":["ai"],"summary":"Enhance Media","description":"Applies practical creator-side enhancements to an image/video frame:\n- auto lighting correction (brightness/contrast/color)\n- burned-in caption overlay\nReturns a processed JPEG as base64 data URL.","operationId":"enhance_media_ai_media_enhance_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaEnhanceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/manage/contract":{"put":{"tags":["manage"],"summary":"Update Contract Terms","description":"Update the default affiliate contract terms for the workspace.","operationId":"update_contract_terms_manage_contract_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContractTermsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/manage/hiring":{"put":{"tags":["manage"],"summary":"Update Hiring Info","description":"Update public page content (headline, FAQs).","operationId":"update_hiring_info_manage_hiring_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHiringInfoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/manage/rewards":{"post":{"tags":["manage"],"summary":"Add Reward","description":"Add a new bounty/reward to the workspace.","operationId":"add_reward_manage_rewards_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddRewardRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/manage/rewards/distribute":{"post":{"tags":["manage"],"summary":"Distribute Reward","description":"record a reward distribution and notify Slack.","operationId":"distribute_reward_manage_rewards_distribute_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributeRewardRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/benchmarks":{"get":{"tags":["public"],"summary":"Get Public Benchmarks","operationId":"get_public_benchmarks_public_benchmarks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/public/company/{slug}":{"get":{"tags":["public"],"summary":"Get Company Public Page","description":"Get public information for a company page.\nIncludes: Company Name, Description, Branding (Logo), Hiring Info, Rewards.","operationId":"get_company_public_page_public_company__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/companies":{"get":{"tags":["public"],"summary":"List All Companies","description":"List all companies with public-facing info for the marketer discovery page.\nReturns name, slug, domain, and destination_url from marketer_config.","operationId":"list_all_companies_public_companies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/public/brands":{"get":{"tags":["public"],"summary":"Discover Public Brands","description":"PUBLIC brand-discovery directory — 'brands hiring on Favente'.\n\nLists companies that are (a) PUBLIC-visible and (b) have an OPEN creator hiring\npage, so a creator who arrived without a specific hiring link has a real, honest\nnext step: browse → open a brand's /c/{slug} page → apply. Unauthenticated.\n\nReturns ONLY the public-field allowlist per brand (name, slug, logo_url,\naccent_color, tagline, reward_highlight). NEVER exposes a private/unlisted brand\nand NEVER leaks owner/financial/internal fields.","operationId":"discover_public_brands_public_brands_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/public/companies/{slug}/forms":{"get":{"tags":["public"],"summary":"Get Company Application Forms","description":"Get active application forms (job listings) for a specific company.\nPublic — no auth required.","operationId":"get_company_application_forms_public_companies__slug__forms_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/company/{slug}/track":{"post":{"tags":["public"],"summary":"Track Public Company Event","description":"Public analytics tracker for company page interactions.\nEvent tracking is opt-in and controlled by marketer_config.link_bio_tracking_enabled.","operationId":"track_public_company_event_public_company__slug__track_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTrackEventRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/company/{slug}/apply":{"post":{"tags":["public"],"summary":"Apply To Company","description":"Allow a logged-in user to join a company as a marketer.","operationId":"apply_to_company_public_company__slug__apply_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PublicApplyRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/jobs":{"get":{"tags":["public"],"summary":"Public Jobs Board","description":"List all active jobs published on the Deo Jobs board.\nNo authentication required.","operationId":"public_jobs_board_public_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/email/unsubscribe":{"post":{"tags":["email"],"summary":"Unsubscribe","operationId":"unsubscribe_email_unsubscribe_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["email"],"summary":"Unsubscribe","operationId":"unsubscribe_email_unsubscribe_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/email/inbound":{"post":{"tags":["email"],"summary":"Receive Inbound Email","operationId":"receive_inbound_email_email_inbound_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/push/vapid-public-key":{"get":{"tags":["push"],"summary":"Vapid Public Key","description":"The application server key browsers need to subscribe. Public by design.","operationId":"vapid_public_key_push_vapid_public_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/push/status":{"get":{"tags":["push"],"summary":"Push Status","operationId":"push_status_marketer_push_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/push/subscribe":{"post":{"tags":["push"],"summary":"Push Subscribe","operationId":"push_subscribe_marketer_push_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/push/unsubscribe":{"post":{"tags":["push"],"summary":"Push Unsubscribe","operationId":"push_unsubscribe_marketer_push_unsubscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/install":{"get":{"tags":["slack"],"summary":"Slack Install","description":"Initiates the Slack OAuth flow.\nRedirects the user to Slack's authorization page.\n\nThis endpoint is NAVIGATED to (full-page), so every error exit must\nredirect back to the app instead of stranding the browser on raw JSON.","operationId":"slack_install_slack_install_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/slack/oauth_callback":{"get":{"tags":["slack"],"summary":"Slack Oauth Callback","description":"Handles the callback from Slack after user authorizes the app.\nExchanges the temporary code for an access token.\n\nFull-page navigation: every exit (cancel, bad state, Slack error) must\nredirect back to /app/slack, never strand the browser on raw JSON/422.","operationId":"slack_oauth_callback_slack_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/interactivity":{"post":{"tags":["slack"],"summary":"Slack Interactivity","description":"Slack Interactivity endpoint — handles button clicks in the agent's messages\n(e.g. \"Approve & launch\"). Verified by the Slack signature (no Deo session).","operationId":"slack_interactivity_slack_interactivity_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/slack/channels":{"get":{"tags":["slack"],"summary":"Get Slack Channels","description":"Fetches public channels from Slack using the token stored in the company document.","operationId":"get_slack_channels_slack_channels_get","parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/config/status":{"get":{"tags":["slack"],"summary":"Slack Config Status","description":"Whether Slack OAuth app credentials exist for this company — lets the\nConnect page re-enable the Connect button for returning owners whose\ncredentials were saved in a past session. Returns a boolean flag ONLY,\nnever the credentials themselves. Authorized the same way POST /slack/config is.","operationId":"slack_config_status_slack_config_status_get","parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/config":{"post":{"tags":["slack"],"summary":"Save Slack Config","description":"Saves the Slack Client ID and Secret to the company's integration settings.\nThis must happen BEFORE the user clicks 'Install'.","operationId":"save_slack_config_slack_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/test":{"post":{"tags":["slack"],"summary":"Test Slack Connection","operationId":"test_slack_connection_slack_test_post","parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/profile":{"get":{"tags":["marketer"],"summary":"Get Marketer Profile","description":"Returns the current marketer's profile, including onboarding_complete_at.","operationId":"get_marketer_profile_marketer_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/account-ties":{"get":{"tags":["marketer"],"summary":"Marketer Account Ties","description":"Shared-account collaboration ties this creator is part of. When two\ncreators connect the same social account, Favente ties them so that account's\nrewards are split fairly; this lets the creator see (and end) that tie.","operationId":"marketer_account_ties_marketer_account_ties_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/account-ties/{tie_id}/break":{"post":{"tags":["marketer"],"summary":"Marketer Break Account Tie","description":"A creator ends a shared-account collaboration they're part of. Only a\nMEMBER of the tie can break it, and only within their own company. Notifies\nthe other collaborator(s) and the brand owner.","operationId":"marketer_break_account_tie_marketer_account_ties__tie_id__break_post","parameters":[{"name":"tie_id","in":"path","required":true,"schema":{"type":"string","title":"Tie Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/stats/pull":{"post":{"tags":["marketer"],"summary":"Marketer Pull Stats","description":"Pull this creator's account stats from ScrapeCreators right now.\n\nPowers the \"pull stats\" button — fetches every connected account's recent\nvideos + follower count and upserts today's snapshot. Rate-limited to 6/hour\nper marketer so it can't hammer ScrapeCreators; tenant-scoped to the caller's\nown accounts for the active company.","operationId":"marketer_pull_stats_marketer_stats_pull_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/stats/trends":{"get":{"tags":["marketer"],"summary":"Marketer Stats Trends","description":"This creator's per-account view/follower trend (last ~30 days). Tenant-scoped.","operationId":"marketer_stats_trends_marketer_stats_trends_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/reach/aggregate":{"get":{"tags":["marketer"],"summary":"Marketer Reach Aggregate","description":"Cross-platform performance roll-up + automated-view (bot) flags for the caller.\n\nReads the centralized engine's roll-up from STORED account snapshots (cheap,\nalways populated once stats have been pulled): total measurable views, each\nplatform's read method, and any bot-view flags carried from the last pull. To\nrefresh the underlying numbers, call POST /marketer/stats/pull (rate-limited).\nTenant-scoped to the caller.","operationId":"marketer_reach_aggregate_marketer_reach_aggregate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/analytics/sync":{"post":{"tags":["marketer"],"summary":"Marketer Analytics Sync","description":"Sync this creator's per-account stats from a screenshot / screen-share of\ntheir OWN analytics page — no platform API. Vision-extracts the numbers, checks\nthe handle matches their linked account (authenticity/ownership), stores the\nscreenshot as proof, and upserts today's snapshot as source=creator_screenshot.\n\nCreator-OWNED data: it powers the analytics dashboard/trends, and it beats the\nAPI pull for the day (so their first-party numbers stick). It does NOT\nauthorize payouts — reward claims keep their own platform verification.","operationId":"marketer_analytics_sync_marketer_analytics_sync_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/link":{"get":{"tags":["marketer"],"summary":"Get Marketer Link","description":"Returns the marketer's assigned tracking link and 7-day click/download stats.","operationId":"get_marketer_link_marketer_link_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/stats":{"get":{"tags":["marketer"],"summary":"Marketer Performance Stats","description":"Returns aggregate performance stats for the marketer.\n\nMirrors the owner-side /owner/stats pattern: same underlying events\ncollection (`company_public_events`), same fields, same time windows.\nThe only difference is that every query is additionally filtered by\n`metadata.ref == <marketer referral code>`, so a marketer sees their\nown slice of what the owner sees in aggregate.","operationId":"marketer_performance_stats_marketer_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/value-summary":{"get":{"tags":["marketer"],"summary":"Marketer Value Summary","description":"The creator's side of the atomic value swap, made legible.\n\nFrameworks: a creator swaps time/energy for money + skills + a portable\ntrack record (cash is the PROOF, not the whole return). This \"what you got\nback\" receipt surfaces all three so the perceived value of the swap stays\nvisible — the durable, non-cash value (skills + reputation) is exactly what\nmakes Deo supply-as-unique rather than a commodity gig. Composes existing\ndata; never 403s a real creator (returns zeros when a source is empty).","operationId":"marketer_value_summary_marketer_value_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/goal":{"put":{"tags":["marketer"],"summary":"Set Marketer Goal","description":"Set (or clear) the creator's personal goal for this company. Progress is\ncomputed live in value-summary against their verified views / paid earnings —\nself-directed motivation, the creator owns their own target.","operationId":"set_marketer_goal_marketer_goal_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetGoalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/celebrate-ack":{"put":{"tags":["marketer"],"summary":"Ack Marketer Celebration","description":"Mark a milestone celebration as seen so value-summary won't re-fire it.","operationId":"ack_marketer_celebration_marketer_celebrate_ack_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CelebrateAckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/whats-working":{"get":{"tags":["marketer"],"summary":"Marketer Whats Working","description":"\"Reverse-engineer the hits\" for the person who actually posts.\n\nOwners get proven formats in the Brand Brain; the creator facing a blank page\nis exactly who should see them. Returns the creator-safe slice of the brand's\nmemory — winning posts to study, recurring talking points, best platform —\nscoped to the creator's company. No money/earnings/emails (that stays owner-\nonly). Never 403s a real creator: returns empty signal (sample_size 0) when\nthe brand has no verified reach yet, and the UI stays silent until then.","operationId":"marketer_whats_working_marketer_whats_working_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/leaderboard":{"get":{"tags":["marketer"],"summary":"Get Marketer Leaderboard","description":"Returns a company leaderboard ranked by approved claim views.\nSupports optional company_slug query param for multi-company marketers.","operationId":"get_marketer_leaderboard_marketer_leaderboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/referrals":{"get":{"tags":["marketer"],"summary":"List Marketer Referrals","description":"Return the marketer's referral link + attribution stats for a company.","operationId":"list_marketer_referrals_marketer_referrals_get","parameters":[{"name":"company_slug","in":"query","required":false,"schema":{"type":"string","title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/r/{code}":{"get":{"tags":["marketer"],"summary":"Track Referral Click","description":"1. Records the click in MongoDB\n2. Redirects to the actual landing page","operationId":"track_referral_click_marketer_r__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"slug","in":"query","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/referrals/code":{"put":{"tags":["marketer"],"summary":"Update Marketer Referral Code","description":"Allows marketer to set a custom referral code per company.","operationId":"update_marketer_referral_code_marketer_referrals_code_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReferralCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/referrals/claim":{"post":{"tags":["marketer"],"summary":"Submit Referral Reward Claim","description":"Lets a marketer claim a referral reward for a person they referred.\nValidates that:\n  1. The referred person's account exists\n  2. They have a marketer membership for this company\n  3. They completed onboarding (profile status = active or onboarding_complete_at set)\nIf all checks pass, creates a reward claim doc for the owner to review.","operationId":"submit_referral_reward_claim_marketer_referrals_claim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralClaimRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/ai-credits":{"get":{"tags":["marketer"],"summary":"Get Marketer Ai Credits","description":"Returns marketer AI credit balance + monthly usage for active company context.","operationId":"get_marketer_ai_credits_marketer_ai_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/ai-credits/consume":{"post":{"tags":["marketer"],"summary":"Consume Marketer Ai Credits","description":"Consume AI credits for a marketer tool run.\nEnforces marketer/company monthly quotas and balance.","operationId":"consume_marketer_ai_credits_marketer_ai_credits_consume_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsumeAiCreditsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/company/{slug}/rewards":{"get":{"tags":["marketer"],"summary":"List Company Rewards","operationId":"list_company_rewards_marketer_company__slug__rewards_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/accountURLs":{"get":{"tags":["marketer"],"summary":"Get Account Urls","operationId":"get_account_urls_marketer_accountURLs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/xp-status":{"get":{"tags":["marketer"],"summary":"Get Marketer Xp Status","description":"Returns the marketer's XP tier status, progress to next tier, and tier benefits.","operationId":"get_marketer_xp_status_marketer_xp_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/examples":{"get":{"tags":["marketer"],"summary":"Get Marketer Examples","description":"Returns top-performing, approved, featured claims for the marketer's company (anonymized).","operationId":"get_marketer_examples_marketer_examples_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/coaching":{"get":{"tags":["marketer"],"summary":"Get Coaching Digest","description":"Returns the latest coaching digest notification for the current marketer.","operationId":"get_coaching_digest_marketer_coaching_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/campaign":{"get":{"tags":["marketer"],"summary":"Get Marketer Campaigns","description":"Lists all campaigns for this company.","operationId":"get_marketer_campaigns_marketer_campaign_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/ai-credits/studio-spend":{"post":{"tags":["marketer"],"summary":"Studio Spend Credits","description":"Deduct AI credits for Deo Studio renders (10 credits per render).\nReturns 402 with balance info if insufficient credits.","operationId":"studio_spend_credits_marketer_ai_credits_studio_spend_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudioSpendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/notifications":{"get":{"tags":["marketer"],"summary":"Get Marketer Notifications","description":"Returns recent unread notifications for this marketer.","operationId":"get_marketer_notifications_marketer_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/notifications/mark-read":{"post":{"tags":["marketer"],"summary":"Mark Notifications Read","description":"Mark all notifications as read.","operationId":"mark_notifications_read_marketer_notifications_mark_read_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/renders":{"get":{"tags":["marketer"],"summary":"Get Marketer Renders Library","description":"Returns the marketer's Deo Studio render library.","operationId":"get_marketer_renders_library_marketer_renders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/featured":{"get":{"tags":["marketer"],"summary":"Get Featured Links","description":"Returns the caller's own featured-work links (max 3, account-level).","operationId":"get_featured_links_marketer_featured_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["marketer"],"summary":"Update Featured Links","description":"Replaces the caller's featured-work links (validated; 422 on bad input).","operationId":"update_featured_links_marketer_featured_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeaturedLinksRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rewards/upload-original":{"post":{"tags":["rewards"],"summary":"Upload Original Reward Video","description":"Step 1 of a claim: upload a copy of the posted video as ownership proof.\n\nStores the file to blob storage and returns a server-computed SHA-256\nfingerprint the /claim endpoint requires and dedups on. Kept separate so\n/claim stays a clean JSON call while the upload remains a hard requirement\n(the claim is rejected unless these fields come back and resolve to a real\nstored file).","operationId":"upload_original_reward_video_rewards_upload_original_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_original_reward_video_rewards_upload_original_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rewards/claim":{"post":{"tags":["rewards"],"summary":"Submit Reward Claim","operationId":"submit_reward_claim_rewards_claim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rewards/claims":{"get":{"tags":["rewards"],"summary":"List My Claims","operationId":"list_my_claims_rewards_claims_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/rewards/claims/{claim_id}/reply":{"patch":{"tags":["rewards"],"summary":"Reply To Claim Request","operationId":"reply_to_claim_request_rewards_claims__claim_id__reply_patch","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rewards/claims/{claim_id}/appeal":{"post":{"tags":["rewards"],"summary":"Appeal Claim","description":"A creator contests a *denied* claim. Deo's rule is that no automated check\never cold-fails someone with no recourse: filing an appeal routes the claim\nback to the owner for a human decision and records the creator's case. Owners\nresolve it via the existing overrideApprove / deny controls.","operationId":"appeal_claim_rewards_claims__claim_id__appeal_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rewards/xp":{"get":{"tags":["rewards"],"summary":"List Xp Rewards Marketer","description":"Marketer: list XP climb rewards with per-reward progress since published_at.","operationId":"list_xp_rewards_marketer_rewards_xp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/rewards/xp/{reward_id}/claim":{"post":{"tags":["rewards"],"summary":"Claim Xp Reward","description":"Marketer: claim an XP-threshold reward (requires eligible XP).","operationId":"claim_xp_reward_rewards_xp__reward_id__claim_post","parameters":[{"name":"reward_id","in":"path","required":true,"schema":{"type":"string","title":"Reward Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/rewards/claims":{"get":{"tags":["owner-rewards"],"summary":"Owner List Claims","operationId":"owner_list_claims_owner_rewards_claims_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"all","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/rewards/claims/{claim_id}":{"patch":{"tags":["owner-rewards"],"summary":"Review Claim","operationId":"review_claim_owner_rewards_claims__claim_id__patch","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewClaimRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/rewards/overrideApprove/{claim_id}":{"patch":{"tags":["owner-rewards"],"summary":"Override Approve","operationId":"override_approve_owner_rewards_overrideApprove__claim_id__patch","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/rewards/claims/{claim_id}/approve-split":{"post":{"tags":["owner-rewards"],"summary":"Approve And Split","description":"Approve a SHARED-ACCOUNT (co-run) claim and split its reward evenly among\nthe tied collaborators — the Phase-2 completion of the collaboration-tie flow.\n\nDeliberately ISOLATED from the single-payout auto-approve path (approve_claim_as)\nso it can't perturb the hot money path or the manual pay queue. Money-safety:\n  * Gated on SHARED_ACCOUNT_AUTOSPLIT (dormant → 409, never moves money).\n  * Owner + tenant scoped (only this company's claim).\n  * Splits the SETTLED amount (net→total→base) so it never pays more than the\n    single payout would; reserve→execute per member; idempotent (a completed\n    member is skipped, Stripe idempotency_key makes a re-fire a no-op).\n  * NO-DOUBLE-PAY: on full success the claim is marked split_paid + its main\n    payout_record is set completed_payment(paid_via_split), so neither the\n    auto path nor the owner's manual \"pay from list\" can ever pay it again.\n  * Partial failure leaves the claim HELD + reports which members failed\n    (retry is safe — paid members are skipped).","operationId":"approve_and_split_owner_rewards_claims__claim_id__approve_split_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/rewards":{"get":{"tags":["owner-rewards"],"summary":"Get Reward Tiers","operationId":"get_reward_tiers_owner_rewards_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["owner-rewards"],"summary":"Update Reward Tiers","operationId":"update_reward_tiers_owner_rewards_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRewardTiersRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/rewards/recommendation":{"get":{"tags":["owner-rewards"],"summary":"Reward Tier Recommendation","description":"Fair, data-informed reward recommendation for the owner's roster. READ-ONLY —\nthe ladder stays fixed and transparent; this only suggests which rungs to switch\non and projects monthly spend/CPM from the roster's verified track record. The\nrecommendation never lowers a creator's reward (see reward_recommender.py). It\nalso previews the on-brand variable-reward direction (an optional conversion\nbonus). Tenant-scoped via _require_owner_company.","operationId":"reward_tier_recommendation_owner_rewards_recommendation_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/rewards/tier/{label}":{"delete":{"tags":["owner-rewards"],"summary":"Delete Reward Tier","operationId":"delete_reward_tier_owner_rewards_tier__label__delete","parameters":[{"name":"label","in":"path","required":true,"schema":{"type":"string","title":"Label"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/cron/cleanup-expired":{"get":{"tags":["owner-rewards"],"summary":"Cron Handler","operationId":"cron_handler_owner_cron_cleanup_expired_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/rewards/xp":{"get":{"tags":["owner-rewards"],"summary":"List Xp Rewards Owner","description":"Owner: list all active XP-threshold rewards.","operationId":"list_xp_rewards_owner_owner_rewards_xp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["owner-rewards"],"summary":"Create Xp Reward","description":"Owner: create a reward unlocked at a specific XP threshold.","operationId":"create_xp_reward_owner_rewards_xp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/XpRewardRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/rewards/xp/{reward_id}":{"delete":{"tags":["owner-rewards"],"summary":"Delete Xp Reward","description":"Owner: soft-delete an XP reward.","operationId":"delete_xp_reward_owner_rewards_xp__reward_id__delete","parameters":[{"name":"reward_id","in":"path","required":true,"schema":{"type":"string","title":"Reward Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/my-companies":{"get":{"tags":["owner"],"summary":"List Owned Companies","description":"Return the companies owned by the authenticated user.","operationId":"list_owned_companies_owner_my_companies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/bridge-plan":{"get":{"tags":["owner"],"summary":"Get Bridge Plan","description":"The tailored cold-start bridge plan for this brand — leans on the levers\nthat don't need a big existing user base (marketplace, public hiring page,\nMeta Ads, referrals). Computed live so it always reflects current traction.","operationId":"get_bridge_plan_owner_bridge_plan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["owner"],"summary":"Update Traction","description":"Owner revises their audience size (they grow past the inflection point).\nRe-classifies and returns the refreshed plan; never gates any feature.","operationId":"update_traction_owner_bridge_plan_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TractionUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/account-ties":{"get":{"tags":["owner"],"summary":"Owner Account Ties","description":"Shared-account collaboration ties in this company — pairs (or groups) of\ncreators who connected the SAME social account, so their rewards on it are\nsplit fairly. Lets the owner see and, if needed, end a tie. Tenant-scoped.","operationId":"owner_account_ties_owner_account_ties_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/account-ties/{tie_id}/break":{"post":{"tags":["owner"],"summary":"Owner Break Account Tie","description":"The brand owner ends a shared-account collaboration in their company (e.g.\nafter resolving a dispute). Notifies the affected creators. Tenant-scoped.","operationId":"owner_break_account_tie_owner_account_ties__tie_id__break_post","parameters":[{"name":"tie_id","in":"path","required":true,"schema":{"type":"string","title":"Tie Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/fraud/coordinated":{"get":{"tags":["owner"],"summary":"Get Coordinated Fraud","description":"Surface suspected engagement pods — clusters of DISTINCT creators posting\nnear-identical engagement ratios (a bought-engagement fingerprint). A FLAG\nfor the owner to review; the platform never auto-bans on suspicion.","operationId":"get_coordinated_fraud_owner_fraud_coordinated_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/fraud/bot-views":{"get":{"tags":["owner"],"summary":"Get Bot View Flags","description":"Surface accounts the aggregation engine flagged for automated/bot views —\nthe LATEST snapshot per (creator, platform) whose bot_screen tripped (a\nfollower-relative velocity spike, an anomalous jump with near-zero engagement,\nor engagement below the platform floor). A FLAG for the owner to review, never\nan auto-ban. Tenant-scoped to this company.","operationId":"get_bot_view_flags_owner_fraud_bot_views_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/stats/pull":{"post":{"tags":["owner"],"summary":"Owner Pull Stats","description":"Pull account stats for ALL of this company's creators from ScrapeCreators now.\n\nOwner-triggered refresh: snapshots every creator's connected accounts (recent\nvideos + follower count) for the active company. Rate-limited to 3/hour per\ncompany (heavier than the marketer button since it fans out over the roster);\ntenant-scoped — an owner can only pull their own company's creators.","operationId":"owner_pull_stats_owner_stats_pull_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/stats/trends":{"get":{"tags":["owner"],"summary":"Owner Stats Trends","description":"Per-creator-account view/follower trends for the company (last ~30 days).","operationId":"owner_stats_trends_owner_stats_trends_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/analytics/channels":{"get":{"tags":["owner"],"summary":"Owner Channel Analytics","description":"Per-CHANNEL (platform) analytics for the company — verified views, engagement,\ncreators, and reward efficiency broken out by TikTok / Instagram / YouTube. Views\n+ engagement come from stored account snapshots (cheap, no live calls); reward\nspend + cost-per-1k are layered on from approved reward_claims. Tenant-scoped.","operationId":"owner_channel_analytics_owner_analytics_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/analytics/reach-series":{"get":{"tags":["owner"],"summary":"Owner Reach Series","description":"Company-wide DAILY reach time-series from ScrapeCreators account snapshots —\npowers the Analytics hero graph (tracked views from public counts, NOT reward\nclaims). Snapshot-based (no live provider calls), tenant-scoped.","operationId":"owner_reach_series_owner_analytics_reach_series_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/replenishment/status":{"get":{"tags":["owner"],"summary":"Owner Replenishment Status","description":"Creative-fatigue signal for the company's active hooks over the trailing\n~2 weeks, with a recommendation to launch the next wave when new-view\nproduction is trending down. Tenant-scoped. This is an ESTIMATE — the response\ncarries the day series it measured and a confidence, never a bare verdict.","operationId":"owner_replenishment_status_owner_replenishment_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/stats":{"get":{"tags":["owner"],"summary":"Get Owner Stats","description":"Returns aggregate stats for the owner's company.","operationId":"get_owner_stats_owner_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/early-stats":{"get":{"tags":["owner"],"summary":"Get Owner Early Stats","description":"Early-stage momentum metrics for a brand-new program.\n\nBefore a program has verified views or payouts, the normal KPI strip is a wall\nof zeros — demoralizing and inaccurate (the program IS moving; just not on the\nview/payout axis yet). These metrics surface what's genuinely happening in the\nearly period: creators finishing onboarding, working through the training\ncurriculum, linking their socials, checking in, and submitting their first\nposts. Every number is computed from real data and tenant-scoped by company_id.\nBest-effort: individual reads are guarded so a missing collection never 500s.","operationId":"get_owner_early_stats_owner_early_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/onboarding/funnel":{"get":{"tags":["owner"],"summary":"Get Owner Onboarding Funnel","description":"The end-to-end creator onboarding funnel for the whole roster.\n\nReturns ordered stages with per-stage counts, drop-off from the prior stage,\nand a capped list of the named creators stuck at each stage (reached the prior\nstage but not this one) — the owner's activation worklist. Also returns the\nFirst-Week Setup sub-funnel (per-step completion across the roster). Every read\nis scoped by company_id; individual reads are guarded so nothing 500s the view.","operationId":"get_owner_onboarding_funnel_owner_onboarding_funnel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/onboarding/funnel/trend":{"get":{"tags":["owner"],"summary":"Get Owner Onboarding Funnel Trend","description":"The onboarding *activation trend* — up to the last ~12 weekly snapshots of\nthis company's funnel (roster_total, activation_rate, and per-stage counts),\nso an owner can see whether activation is climbing week over week rather than\nonly a single live cross-section.\n\nRows are written by the weekly cron snapshot job\n(orchestra.onboarding_snapshot.compound_onboarding_snapshots). Tenant-scoped\nby company_id; best-effort — returns an empty series (available: False) when\nno snapshots have been persisted yet, and never 500s.","operationId":"get_owner_onboarding_funnel_trend_owner_onboarding_funnel_trend_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/creators/{marketer_id}/onboarding":{"get":{"tags":["owner"],"summary":"Get Owner Creator Onboarding","description":"One creator's onboarding drill-down for the owner to coach from: module-by-\nmodule training status, First-Week Setup steps, the current gate/next step,\ncertification + payout progress, and their AI coaching status (Hook/Proof/CTA\nskill profile) — rendered as encouraging coaching, never a pass/fail verdict.\n\nHARD multi-tenant gate: the creator must belong to the caller's company or we\n404 (never leak another brand's creator, and never another brand's numbers —\nevery stat below is scoped to THIS company_id).","operationId":"get_owner_creator_onboarding_owner_creators__marketer_id__onboarding_get","parameters":[{"name":"marketer_id","in":"path","required":true,"schema":{"type":"string","title":"Marketer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/onboarding/setup-steps":{"get":{"tags":["owner"],"summary":"Get Owner Setup Steps","description":"Return this company's configured first-week setup steps (or the hardcoded\ndefaults when none are configured), plus the catalog of the built-in step keys\nso the owner UI can offer them. Tenant-scoped.","operationId":"get_owner_setup_steps_owner_onboarding_setup_steps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["owner"],"summary":"Save Owner Setup Steps","description":"Save this company's first-week setup steps (reorder / reword / toggle\nrequired / add brand-specific steps). Step keys are validated + de-duped;\nlink_in_bio is forced verify-only. Stored on companies.onboarding_setup_steps as\nan OVERRIDE — creators fall back to the hardcoded defaults when it's absent.\nTenant-scoped: writes only the owner's own company.","operationId":"save_owner_setup_steps_owner_onboarding_setup_steps_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerSetupStepsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/link-bio/stats":{"get":{"tags":["owner"],"summary":"Get Owner Link Bio Stats","description":"Returns detailed link-in-bio analytics for the owner's company page.","operationId":"get_owner_link_bio_stats_owner_link_bio_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/hiring-link/event":{"post":{"tags":["owner"],"summary":"Record Owner Hiring Link Event","description":"Best-effort owner-authed event sink for the onboarding celebration screen.\n\nRecords first-run milestones (program launched, link shared, creators invited)\ninto `company_public_events`, tenant-scoped by the owner's own company so the\nhiring-link analytics surface can show first-recruit activity immediately. Only\na small, fixed set of owner event_types is accepted; metadata is sanitized\n(scalars only, no Mongo-operator keys) exactly like the public tracker. Never\nraises for a client-mistake payload — the caller treats this as fire-and-forget.","operationId":"record_owner_hiring_link_event_owner_hiring_link_event_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerHiringEventRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/hiring-link/analytics":{"get":{"tags":["owner"],"summary":"Get Owner Hiring Link Analytics","description":"Rich, tenant-scoped analytics for the owner's public HIRING LINK\n({slug}.favente.so / /c/{slug} + /go/{slug} short links + embed pixel).\n\nEverything here is scoped by company_id (hard multi-tenant rule). Aggregates\nthe existing `company_public_events` pipeline (page_visit → started_apply →\njoin_click → signup, plus embed_* beacons) and the `link_clicks` short-link\nlog into ONE surface: a daily visit/join/signup time-series, unique visitors,\ndevice split, coarse geo, top sources, top referring creators (by ref code),\nthe visit→apply→join funnel with conversion %, a recent-access feed, and a\npixel-installed status. Best-effort sub-panels never fail the whole call.","operationId":"get_owner_hiring_link_analytics_owner_hiring_link_analytics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/team/nudge":{"post":{"tags":["owner"],"summary":"Nudge Team Cohort","description":"Re-engage a whole cohort of quiet / not-started creators in one action,\ninstead of messaging them one at a time. IN-APP only (a notification each — no\nemail, so there's no opt-out/CAN-SPAM surface), tenant-scoped, and rate-limited\nto once per (company, segment) per 3 days so it can't be used to spam. Idempotent\nwithin a day: a creator already nudged for this segment today is skipped.","operationId":"nudge_team_cohort_owner_team_nudge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamNudgeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/team/coach":{"post":{"tags":["owner"],"summary":"Coach Creator","description":"Push a targeted AI coaching brief to ONE creator — the software version of a\n\"Head of Creators\" doing weekly 1:1 coaching (what agencies staff a full-time\nperson for). Reuses the weekly-digest classifier + templates (free for the\ncommon cases), but on-demand and owner-triggered instead of on a cron. In-app\nonly, tenant-scoped, and rate-limited to once per creator per 3 days so it can't\nbe used to spam. Human-first: always a specific, encouraging brief, never a\nverdict.","operationId":"coach_creator_owner_team_coach_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamCoachRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/value-trend":{"get":{"tags":["owner"],"summary":"Owner Value Trend","description":"Weekly verified-views series (last 8 ISO-weeks, zero-filled) so the dashboard\ncan render the COMPOUNDING curve — a rising trend is the most persuasive\ncontinue/upgrade artifact, far stronger than a lone week-over-week %.","operationId":"owner_value_trend_owner_value_trend_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/team":{"get":{"tags":["owner"],"summary":"Get Owner Team","description":"Returns all marketers in this company with weekly metrics.","operationId":"get_owner_team_owner_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/integrations":{"get":{"tags":["owner"],"summary":"Get Owner Integrations","description":"Return private integration config for this owner's company (secrets redacted).","operationId":"get_owner_integrations_owner_integrations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["owner"],"summary":"Update Owner Integrations","description":"Create/update owner integration config for AI tools, Slack, and webhooks.","operationId":"update_owner_integrations_owner_integrations_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerIntegrationsUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/referrals":{"get":{"tags":["owner"],"summary":"Get Owner Referrals","description":"Returns referral program stats and marketer leaderboard for the owner's company.","operationId":"get_owner_referrals_owner_referrals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/referrals/config":{"put":{"tags":["owner"],"summary":"Update Owner Referral Config","description":"Updates referral program configuration for marketers in this company.","operationId":"update_owner_referral_config_owner_referrals_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerReferralConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ai-credits":{"get":{"tags":["owner"],"summary":"Get Owner Ai Credits","description":"Returns AI credit policy, balances, and recent usage for this company.","operationId":"get_owner_ai_credits_owner_ai_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/ai-credits/policy":{"put":{"tags":["owner"],"summary":"Update Owner Ai Credits Policy","description":"Updates company-wide AI credit policy.","operationId":"update_owner_ai_credits_policy_owner_ai_credits_policy_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerAiCreditsPolicyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ai-credits/grant":{"post":{"tags":["owner"],"summary":"Grant Owner Ai Credits","description":"Grant AI credits to a marketer in this company.","operationId":"grant_owner_ai_credits_owner_ai_credits_grant_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerAiCreditsGrantRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/contract":{"get":{"tags":["owner"],"summary":"Get Owner Contract","description":"Returns the owner's current creator contract terms.","operationId":"get_owner_contract_owner_contract_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["owner"],"summary":"Update Owner Contract","description":"Saves/updates the owner's creator contract terms.","operationId":"update_owner_contract_owner_contract_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/email-selftest":{"get":{"tags":["owner"],"summary":"Email Selftest","description":"Ops diagnostic: send a test email to the SIGNED-IN owner's own address via\nthe exact same Resend path all transactional email uses — but surface the\nprovider's real response instead of swallowing it. Answers 'do our emails\nactually send?' in one click (the runtime mailer is deliberately silent).","operationId":"email_selftest_owner_email_selftest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/verification-selftest":{"get":{"tags":["owner"],"summary":"Verification Selftest","description":"Ops diagnostic: is platform view verification actually ON?\n\nReports which providers are configured (YouTube Data API for YouTube;\nScrapeCreators for TikTok+IG). With ?live=1, also does a REAL fetch —\nYouTube against a stable public video, TikTok/IG against ?url= if given —\nso 'configured' is proven, not assumed. Without keys, claims fall back to\nself-reported counts (the amber badge on your claims page).","operationId":"verification_selftest_owner_verification_selftest_get","parameters":[{"name":"live","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Live"}},{"name":"url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/creator-agreements":{"get":{"tags":["owner"],"summary":"Get Creator Agreement Config","description":"Owner's structured config for the built-in creator agreements + a live\npreview of both filled documents (brand as Company) and the disclaimer.","operationId":"get_creator_agreement_config_owner_creator_agreements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["owner"],"summary":"Update Creator Agreement Config","description":"Persist the owner's creator-agreement config. Entity/signatory/governing-law\nlive at the top level of the company doc; compensation/scope/term live under\n`creator_agreement_config` (both read by legal_templates.build_agreement_config).","operationId":"update_creator_agreement_config_owner_creator_agreements_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorAgreementConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/roi":{"get":{"tags":["owner"],"summary":"Get Owner Roi","description":"The owner's ROI story in one aggregate: spend → verified views →\nlink clicks → conversions/signups, all-time and last 30 days, with\ncost-per metrics precomputed. Backs the Analytics ROI funnel.","operationId":"get_owner_roi_owner_roi_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/campaigns":{"get":{"tags":["owner"],"summary":"Get Owner Campaigns","description":"Lists all campaigns for this company.","operationId":"get_owner_campaigns_owner_campaigns_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["owner"],"summary":"Create Owner Campaign","description":"Creates and immediately sends a campaign message to the target creator group.","operationId":"create_owner_campaign_owner_campaigns_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/campaigns/{campaign_id}":{"delete":{"tags":["owner"],"summary":"Delete Owner Campaign","description":"Deletes a campaign.","operationId":"delete_owner_campaign_owner_campaigns__campaign_id__delete","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/campaigns/{campaign_id}/wave-stats":{"post":{"tags":["owner"],"summary":"Get Wave Stats","description":"Returns participation stats for a wave campaign.","operationId":"get_wave_stats_owner_campaigns__campaign_id__wave_stats_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/marketers":{"get":{"tags":["owner"],"summary":"Get Owner Marketers","description":"Returns all marketers with their social account data for analytics.","operationId":"get_owner_marketers_owner_marketers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/team-accounts":{"get":{"tags":["owner"],"summary":"Get Owner Team Accounts","description":"Creator UGC accounts GROUPED by the actual social account, not by creator.\n\nWhen two creators link the SAME account (a team co-running one handle), the\nbrand should see that account ONCE — with the team of creators on it — not the\nsame @handle listed twice. Groups every creator's linked accounts by\n(platform, normalized handle); each unique account carries its ScrapeCreators\nstats (followers/30-day views — the SAME account, so taken once, never summed)\nand the list of creators who work on it. Deduped program totals let the brand\nsee real views generated even before any reward claim is approved. Tenant-scoped.\n(Teams are formed by CREATORS sharing an account — the owner only views them.)","operationId":"get_owner_team_accounts_owner_team_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/marketers/{marketer_id}/request-update":{"post":{"tags":["owner"],"summary":"Request Marketer Update","description":"Sends a notification to a marketer requesting fresh social stats.","operationId":"request_marketer_update_owner_marketers__marketer_id__request_update_post","parameters":[{"name":"marketer_id","in":"path","required":true,"schema":{"type":"string","title":"Marketer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/company/{slug}":{"delete":{"tags":["owner"],"summary":"Delete Company By Slug","operationId":"delete_company_by_slug_owner_company__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/company/rename/{old_slug}":{"post":{"tags":["owner"],"summary":"Swap Company Slug","operationId":"swap_company_slug_owner_company_rename__old_slug__post","parameters":[{"name":"old_slug","in":"path","required":true,"schema":{"type":"string","title":"Old Slug"}},{"name":"new_slug","in":"query","required":true,"schema":{"type":"string","title":"New Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/fire-marketer":{"delete":{"tags":["owner"],"summary":"Fire Marketer","operationId":"fire_marketer_owner_fire_marketer_delete","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/link":{"get":{"tags":["owner"],"summary":"Get Marketer Link","description":"Returns the marketer's assigned tracking link and 7-day click/download stats.","operationId":"get_marketer_link_owner_link_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/leaderboard":{"get":{"tags":["owner"],"summary":"Get Owner Leaderboard","description":"Return a ranked leaderboard for the owner's company.\n\nmetric    : views | likes | comments | payouts | trust\nplatform  : tiktok | instagram | youtube | all   (views/likes/comments only)\ntime_range: 7d | 30d | 90d | all                 (views/likes/comments/payouts only)","operationId":"get_owner_leaderboard_owner_leaderboard_get","parameters":[{"name":"metric","in":"query","required":false,"schema":{"type":"string","default":"views","title":"Metric"}},{"name":"platform","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Platform"}},{"name":"time_range","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Time Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/invite":{"post":{"tags":["owner"],"summary":"Invite Creator","description":"Send a personal email invitation to a creator.","operationId":"invite_creator_owner_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreatorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/roster/invite":{"post":{"tags":["owner"],"summary":"Roster Invite","description":"Invite a BATCH of the brand's existing users to become creators. Records a\ncompany-scoped pending invite per email (so a private program lets them in),\nemails each the invite, and flags which already CREATE on Favente — a warm lead,\nrevealed only as a boolean (never which other brands they work with). Bounded to\n50/request and rate-limited so it can't blast Favente's sender reputation.\n\nWorks today for the cold-invite half; the 'already on Favente' match lights up as\nFavente adoption grows (more of a brand's users will already be creators).","operationId":"roster_invite_owner_roster_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RosterInviteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/roster/invites":{"get":{"tags":["owner"],"summary":"Roster Invites","description":"This brand's invites (newest first) with status + the warm-lead flag, for the\nroster tool's status list. status is 'pending' or 'accepted' (joined).","operationId":"roster_invites_owner_roster_invites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/notifications":{"get":{"tags":["owner"],"summary":"Get Owner Notifications","description":"Return a feed of recent events for the owner: creator joins, claim submissions.","operationId":"get_owner_notifications_owner_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/send-digest":{"post":{"tags":["owner"],"summary":"Send Owner Digest","description":"Send the owner a weekly snapshot email of their program stats.","operationId":"send_owner_digest_owner_send_digest_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/activation/intelligence":{"get":{"tags":["owner-insights-extra"],"summary":"Activation Intelligence","description":"Tenant-scoped evidence for improving customer-to-creator activation.","operationId":"activation_intelligence_owner_activation_intelligence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/program-export":{"get":{"tags":["owner-insights-extra"],"summary":"Program Export","description":"Portable owner-owned program history, scrubbed of infrastructure secrets.","operationId":"program_export_owner_program_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/verification/confidence":{"get":{"tags":["owner-insights-extra"],"summary":"Owner Verification Confidence","description":"ITEM 7 — the program-level trust-rail readout for the brand: of the claims\nthis company has PAID (approved with a positive verified view count), what\nshare had their view count come from an OFFICIAL first-party source vs a\nscraper / self-report.\n\nReuses ``official_source_coverage_pct`` — the single canonical measure of the\nverified/self-reported split — so the owner UI reconciles with the payout\ngate's own definition of \"official\". Tenant-scoped by ``company_id`` (the hard\nmulti-tenant rule): only THIS company's approved claims are read. None-safe:\nwhen there are no sourced claims yet, ``official_pct`` is null and\n``enough_data`` is false so the UI shows an honest \"not enough data yet\"\ninstead of a misleading 0%/100%.","operationId":"owner_verification_confidence_owner_verification_confidence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Owner Verification Confidence Owner Verification Confidence Get"}}}}}}},"/owner/coaching/summary":{"get":{"tags":["owner-insights-extra"],"summary":"Owner Coaching Summary","description":"Cohort coaching narrative for the owner's roster.\n\nAggregates EXISTING per-clip signals — never a new AI call:\n  * verdict mix from ``payout_records.gate_verdict`` (pass / hold / block),\n  * average Hook / Proof / CTA across the roster from\n    ``marketer_skill_scores``,\n  * the single most-common weak skill (the roster's lowest craft average),\n  * content_format distribution from submitted ``reward_claims`` when the AI\n    observed one.\n\nReturns a \"push this training module\" recommendation deep-linked to the\ncurriculum lesson that teaches the weakest skill. Scoped by company_id; an\nempty/new program returns a friendly zero-state, not a 500.","operationId":"owner_coaching_summary_owner_coaching_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Owner Coaching Summary Owner Coaching Summary Get"}}}}}}},"/owner/insights/overview":{"get":{"tags":["owner-insights-extra"],"summary":"Owner Insights Overview","description":"Bundled owner-Insights read for the Insights hub — ONE request instead of\nthe ~9 the page used to fan out, and the Product-Love Index is computed ONCE\nhere instead of ~4× across the separate ``/owner/love/*`` endpoints (index,\ntrend, advocates, and playbook each recomputed it). Each sub-read is\nfailure-isolated: a section that errors comes back ``null`` (mirroring the\npage's old per-call ``.catch(() => null)``), never 500-ing the whole hub.\nAdditive — every granular endpoint stays for the deep-dive sub-pages.\nTenant-scoped to the owner's active company.","operationId":"owner_insights_overview_owner_insights_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Owner Insights Overview Owner Insights Overview Get"}}}}}}},"/owner/onboarding/thresholds":{"get":{"tags":["owner-insights-extra"],"summary":"Owner Onboarding Thresholds","description":"The gating constants an owner's creators are actually held to — surfaced\nread-only so the bars aren't invisible.\n\nValues are pulled live from the source-of-truth modules (not re-typed), so\nthis can never drift from what the platform enforces:\n  * certification bar (certification.py),\n  * warm-up minimum days (curriculum._WARMUP_MIN_DAYS / creator_setup),\n  * payout minimums (payout_eligibility.PAYOUT_MIN_VIDEOS / _VIEWS),\n  * skill-tier qualification (skill_tiers.*),\n  * love-digest alert thresholds (love_digest.*).\n\nEach \"trained\" bar is defined by a DIFFERENT module for a different purpose;\n``trained_bars_note`` reconciles them in plain English so an owner isn't\nconfused by the several definitions. Owner-config OVERRIDES are layered where\na company has stored them (skill-tier economics), falling back to the\nmodule-level defaults otherwise so in-flight creators never regress.","operationId":"owner_onboarding_thresholds_owner_onboarding_thresholds_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Owner Onboarding Thresholds Owner Onboarding Thresholds Get"}}}}}},"post":{"tags":["owner-insights-extra"],"summary":"Set Onboarding Thresholds","description":"Owner-tune a SAFE, BOUNDED subset of onboarding thresholds for THIS company.\n\nAccepts any subset of ``warm_up_days`` (1..14), ``payout_min_videos`` (1..20),\nand ``payout_min_views`` (1,000..1,000,000). Each supplied value is validated +\nrange-checked — an out-of-range value is a 422, never a silent clamp. Values are\nstored as an OVERRIDE on ``companies.onboarding_thresholds``; the enforce paths\n(warm-up gate in rewards.py + creator_setup, payout bar in payout_eligibility)\nread the override and fall back to the hardcoded constant for any UNSET key, so\nabsent config == today's exact behavior.\n\nTenant-scoped: resolves the owner's company via the standard\nrequire_account → _get_owner_company path (a foreign slug 403s), and the write\nis keyed by that company's own _id — an owner can only tune their own funnel.","operationId":"set_onboarding_thresholds_owner_onboarding_thresholds_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingThresholdsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Onboarding Thresholds Owner Onboarding Thresholds Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/onboarding/nudge":{"post":{"tags":["owner-insights-extra"],"summary":"Nudge Stuck Creators","description":"Owner action: message every creator stuck at ``stage`` of the onboarding\nfunnel, over the EXISTING channels (owner→creator DM + best-effort web push).\n\nBody: ``{ stage: str, message?: str }``. The server RECOMPUTES who is stuck\nat that stage from this company's own data (a client-supplied id list is never\ntrusted), caps the batch at ``_NUDGE_MAX``, and for each recipient writes a DM\ninto ``dm_messages`` (same shape chat.send_dm uses) and fires a web push. When\nno message is supplied we send a warm, Human-First default.\n\nTenant-scoped: the company is resolved via require_account → _get_owner_company\n(a foreign slug 403s) and every recipient is re-verified to be a marketer member\nof THIS company before we message them. Best-effort: a single send failure is\ncaught and counted under ``skipped`` so it can't abort the batch. Returns\n``{ nudged, stage, skipped }``.","operationId":"nudge_stuck_creators_owner_onboarding_nudge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NudgeStuckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Nudge Stuck Creators Owner Onboarding Nudge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/go/convert":{"post":{"tags":["go"],"summary":"Track Conversion","description":"Tracks a conversion attributed to a /go/{slug} click.\nPreferred key is click_id from query param `deo_click_id`.\nFallback uses the most recent unconverted click for `slug` + IP hash.","operationId":"track_conversion_go_convert_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionTrackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/go/convert.gif":{"get":{"tags":["go"],"summary":"Track Conversion Pixel","description":"Pixel-style conversion tracker.\nCan be embedded as:\n  <img src=\"https://api.favente.so/go/convert.gif?click_id=...&conversion_type=signup\" />","operationId":"track_conversion_pixel_go_convert_gif_get","parameters":[{"name":"click_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Click Id"}},{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},{"name":"conversion_type","in":"query","required":false,"schema":{"type":"string","default":"signup","title":"Conversion Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/go/{slug}":{"get":{"tags":["go"],"summary":"Follow Link","description":"Logs a click (hashed IP, user-agent, referrer, timestamp) and redirects\nto the destination URL configured for this slug.\nAssociates the click with the marketer who owns the slug.","operationId":"follow_link_go__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"cid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/save-slug":{"post":{"tags":["go"],"summary":"Save Marketer Slug","operationId":"save_marketer_slug_marketer_save_slug_post","parameters":[{"name":"marketer_id","in":"query","required":true,"schema":{"type":"string","title":"Marketer Id"}},{"name":"company_id","in":"query","required":true,"schema":{"type":"string","title":"Company Id"}},{"name":"slug","in":"query","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/challenges":{"get":{"tags":["owner-challenges"],"summary":"Owner List Challenges","operationId":"owner_list_challenges_owner_challenges_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["owner-challenges"],"summary":"Create Challenge","operationId":"create_challenge_owner_challenges_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChallengeCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/challenges/{challenge_id}":{"delete":{"tags":["owner-challenges"],"summary":"Delete Challenge","description":"Delete a challenge you made. Tenant-scoped — only the owning company can\ndelete it. Removes the challenge and its submissions + notifications. Does NOT\nreverse any payouts already released by a finalize (those are real transfers).","operationId":"delete_challenge_owner_challenges__challenge_id__delete","parameters":[{"name":"challenge_id","in":"path","required":true,"schema":{"type":"string","title":"Challenge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/challenges/{challenge_id}/finalize":{"post":{"tags":["owner-challenges"],"summary":"Finalize Challenge","operationId":"finalize_challenge_owner_challenges__challenge_id__finalize_post","parameters":[{"name":"challenge_id","in":"path","required":true,"schema":{"type":"string","title":"Challenge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/challenges/{challenge_id}/leaderboard":{"get":{"tags":["owner-challenges"],"summary":"Get Challenge Leaderboard","description":"Returns ranked submissions for a specific challenge (owner view).","operationId":"get_challenge_leaderboard_owner_challenges__challenge_id__leaderboard_get","parameters":[{"name":"challenge_id","in":"path","required":true,"schema":{"type":"string","title":"Challenge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/challenges/{challenge_id}/rank":{"get":{"tags":["marketer-challenges"],"summary":"Get My Challenge Rank","description":"Returns the current marketer's rank in a challenge.","operationId":"get_my_challenge_rank_marketer_challenges__challenge_id__rank_get","parameters":[{"name":"challenge_id","in":"path","required":true,"schema":{"type":"string","title":"Challenge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/challenges":{"get":{"tags":["marketer-challenges"],"summary":"Marketer List Challenges","operationId":"marketer_list_challenges_marketer_challenges_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/challenges/{challenge_id}/submit":{"post":{"tags":["marketer-challenges"],"summary":"Submit Challenge Metrics","operationId":"submit_challenge_metrics_marketer_challenges__challenge_id__submit_post","parameters":[{"name":"challenge_id","in":"path","required":true,"schema":{"type":"string","title":"Challenge Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChallengeSubmissionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/reward-system/templates":{"get":{"tags":["owner-reward-system"],"summary":"Get Reward System Templates","operationId":"get_reward_system_templates_owner_reward_system_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/reward-system":{"get":{"tags":["owner-reward-system"],"summary":"Get Owner Reward System","operationId":"get_owner_reward_system_owner_reward_system_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["owner-reward-system"],"summary":"Update Owner Reward System","operationId":"update_owner_reward_system_owner_reward_system_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewardSystemUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/tax/compliance":{"get":{"tags":["owner-reward-system"],"summary":"Get Owner Tax Compliance","description":"Per-creator tax-compliance status for the owner: which form applies\n(W-9 US / W-8BEN non-US), YTD paid, 1099 threshold status, whether Stripe\nhas the tax form on file, and any payouts held pending tax info.\n\nThis makes the 'we handle the 1099/W-8 headache' claim inspectable: Stripe\nConnect collects the forms and issues 1099s; Deo tracks readiness + gates.","operationId":"get_owner_tax_compliance_owner_tax_compliance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/creator-analytics":{"get":{"tags":["owner-reward-system"],"summary":"Get Owner Creator Analytics","description":"Deep per-creator usage analytics for the brand: how each creator uses\nDeo's AI Studio (which tools, how much), how active they are (posts, views,\ntraining), and when they were last active — plus company-wide rollups and an\nAI-usage trend. Composes data Deo already records (ai_credit_ledger, claims,\ncurriculum progress, profiles). Founder-scale in-memory aggregation; move to\nMongo pipelines at true scale.","operationId":"get_owner_creator_analytics_owner_creator_analytics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/pro-signals":{"get":{"tags":["owner-reward-system"],"summary":"Get Owner Pro Signals","description":"The evidence-based case for THIS company going Pro right now — only ever\nthe reasons that are actually true for them (scale, held claims, AI usage,\nhigh-potential creators, ROI). Powers the contextual upgrade prompts.","operationId":"get_owner_pro_signals_owner_pro_signals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/pricing/optimize":{"post":{"tags":["owner-reward-system"],"summary":"Owner Optimize Pricing","description":"Turn a fixed budget into tailored per-creator offers that maximize projected\nreach/ROAS — instead of one flat retainer for everyone. Ingests each creator's\nhistorical reach, competency (potential), and reliability from their real Deo\ntrack record, then allocates the budget: more to proven reach, a fair floor for\neveryone, mild diminishing returns so it spreads instead of dumping on one. This\nis the dynamic pricing that's a manual nightmare to do by hand across a roster.","operationId":"owner_optimize_pricing_owner_pricing_optimize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetOptimizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/experiments":{"get":{"tags":["owner-reward-system"],"summary":"Get Owner Experiments","description":"Experiments Deo can run with this brand's creators, whether they're on\n(off by default), and per-variant results. Deo may A/B what it does with\ncreators only when the brand opts in — this endpoint is how they see and\ncontrol it.","operationId":"get_owner_experiments_owner_experiments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["owner-reward-system"],"summary":"Update Owner Experiments","description":"Turn experiments on or off for this brand (off by default). When off, every\ncreator gets each experiment's control variant, so nothing changes.","operationId":"update_owner_experiments_owner_experiments_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperimentsToggle"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/payout-recommendation":{"post":{"tags":["owner-reward-system"],"summary":"Owner Payout Recommendation","description":"AI-assisted: recommend the best payout structure for this brand's goal.","operationId":"owner_payout_recommendation_owner_payout_recommendation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutAdviceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/pay-creator":{"post":{"tags":["owner-reward-system"],"summary":"Owner Pay Creator","description":"Pay a creator directly under a chosen model — flat fee, commission (a % of\na reported sale), or retainer. Creates a payout record and fires the same\nStripe transfer + tax-compliance path as a milestone payout, so the creator\nis really paid and sees it in their income. (Performance is automatic on\nverified view milestones — not issued here.)","operationId":"owner_pay_creator_owner_pay_creator_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayCreatorRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/reward-system/retainers":{"get":{"tags":["owner-reward-system"],"summary":"List Retainers","operationId":"list_retainers_owner_reward_system_retainers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["owner-reward-system"],"summary":"Create Retainer","description":"Start a recurring retainer: pays the first installment NOW, then repeats\nevery cadence_days automatically until cancelled.","operationId":"create_retainer_owner_reward_system_retainers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetainerCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/reward-system/retainers/{retainer_id}/cancel":{"post":{"tags":["owner-reward-system"],"summary":"Cancel Retainer","operationId":"cancel_retainer_owner_reward_system_retainers__retainer_id__cancel_post","parameters":[{"name":"retainer_id","in":"path","required":true,"schema":{"type":"string","title":"Retainer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/rewards/brief":{"get":{"tags":["marketer-reward-system"],"summary":"Get Marketer Rewards Brief","operationId":"get_marketer_rewards_brief_marketer_rewards_brief_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/posting-kit":{"get":{"tags":["marketer-reward-system"],"summary":"Get Marketer Posting Kit","description":"Everything a creator needs at the moment they hit Publish: the brand's\nrequired hashtags, best posting times, disclosures, active platforms, and\ntheir own tracking link. Backs the Posting Kit panel on the Rewards page\nand the P1 'Publish Like a Pro' training module.","operationId":"get_marketer_posting_kit_marketer_posting_kit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/content":{"get":{"tags":["content-library"],"summary":"Owner List Content","operationId":"owner_list_content_owner_content_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["content-library"],"summary":"Owner Add Content","operationId":"owner_add_content_owner_content_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItemIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/content/lifecycle":{"get":{"tags":["content-library"],"summary":"Owner Content Lifecycle","description":"Read-only, owner-scoped view of every creator's content moving through the\npipeline (needs_review / needs_changes / held_for_review / approved / denied /\nexpired), one row per content item (reward claim). Multi-tenant: hard-scoped by\ncompany_id. Bounded via ?limit (default 200, max 500) + ?offset paging, and\nfilterable by ?state and ?creator (marketer_id). Newest content first.","operationId":"owner_content_lifecycle_owner_content_lifecycle_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/content/{item_id}":{"delete":{"tags":["content-library"],"summary":"Owner Delete Content","operationId":"owner_delete_content_owner_content__item_id__delete","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/content":{"get":{"tags":["content-library"],"summary":"Marketer List Content","operationId":"marketer_list_content_marketer_content_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["content-library"],"summary":"Marketer Add Content","operationId":"marketer_add_content_marketer_content_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItemIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/content/{item_id}":{"delete":{"tags":["content-library"],"summary":"Marketer Delete Content","description":"A creator can remove only their OWN contribution.","operationId":"marketer_delete_content_marketer_content__item_id__delete","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/brand-assets":{"get":{"tags":["brand-assets"],"summary":"Owner List Assets","operationId":"owner_list_assets_owner_brand_assets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["brand-assets"],"summary":"Owner Create Asset","operationId":"owner_create_asset_owner_brand_assets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/brand-assets/{item_id}":{"patch":{"tags":["brand-assets"],"summary":"Owner Update Asset","operationId":"owner_update_asset_owner_brand_assets__item_id__patch","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["brand-assets"],"summary":"Owner Delete Asset","operationId":"owner_delete_asset_owner_brand_assets__item_id__delete","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/brand-assets":{"get":{"tags":["brand-assets"],"summary":"Marketer List Assets","operationId":"marketer_list_assets_marketer_brand_assets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/team-call":{"get":{"tags":["team-call"],"summary":"Owner Get Team Call","operationId":"owner_get_team_call_owner_team_call_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["team-call"],"summary":"Owner Set Team Call","operationId":"owner_set_team_call_owner_team_call_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamCallConfig"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/team-call":{"get":{"tags":["team-call"],"summary":"Marketer Get Team Call","operationId":"marketer_get_team_call_marketer_team_call_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/connections":{"get":{"tags":["connections"],"summary":"List Connections","operationId":"list_connections_marketer_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/connections/request":{"post":{"tags":["connections"],"summary":"Request Connection","operationId":"request_connection_marketer_connections_request_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/connections/{conn_id}/accept":{"post":{"tags":["connections"],"summary":"Accept Connection","operationId":"accept_connection_marketer_connections__conn_id__accept_post","parameters":[{"name":"conn_id","in":"path","required":true,"schema":{"type":"string","title":"Conn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/connections/{conn_id}/remove":{"post":{"tags":["connections"],"summary":"Remove Connection","description":"Decline a pending request or remove an existing connection — either party.","operationId":"remove_connection_marketer_connections__conn_id__remove_post","parameters":[{"name":"conn_id","in":"path","required":true,"schema":{"type":"string","title":"Conn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/activity":{"get":{"tags":["activity"],"summary":"Owner Activity","operationId":"owner_activity_owner_activity_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/setup-progress":{"get":{"tags":["setup"],"summary":"Get Setup Progress","operationId":"get_setup_progress_marketer_setup_progress_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["setup"],"summary":"Set Setup Progress","operationId":"set_setup_progress_marketer_setup_progress_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/payout-eligibility":{"get":{"tags":["setup"],"summary":"Get Payout Eligibility","description":"The creator's progress toward the payout threshold (5 videos at 10k+ verified\nviews). Drives the \"path to payouts\" UI: below the bar → show progress; at the\nbar → the frontend surfaces sign-agreement + connect-Stripe. Read-only.","operationId":"get_payout_eligibility_marketer_payout_eligibility_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/script-profile":{"get":{"tags":["daily-script"],"summary":"Get Script Profile","operationId":"get_script_profile_marketer_script_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["daily-script"],"summary":"Put Script Profile","operationId":"put_script_profile_marketer_script_profile_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptProfileUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/daily-script":{"get":{"tags":["daily-script"],"summary":"Get Daily Script","description":"Today's script for the active company. If the daily cron already drafted\nit, that's returned (from_daily=True); otherwise it's generated on demand\nright now (the button-click path) and persisted.","operationId":"get_daily_script_marketer_daily_script_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/daily-script/regenerate":{"post":{"tags":["daily-script"],"summary":"Regenerate Daily Script","description":"Force a fresh draft of today's script. Light rate limit (5/day per\ncreator per company) bounds model spend from button-mashing.","operationId":"regenerate_daily_script_marketer_daily_script_regenerate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/daily-script/from-idea":{"post":{"tags":["daily-script"],"summary":"Daily Script From Idea","description":"Turn a chosen Idea Lab hook into a full, film-ready Hook·Proof·CTA script —\nthe bridge from 'I picked an idea' to 'I have something to film'. Seeds the same\ngenerator with the creator's hook, grounded on their profile + the brand brief.\nShares the daily-script regen budget so it can't be button-mashed for AI spend.","operationId":"daily_script_from_idea_marketer_daily_script_from_idea_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_FromIdea"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/hook-library":{"get":{"tags":["daily-script"],"summary":"Get Hook Library","description":"The full Favente Hook Library — proven short-form templates by category, for\na creator to browse. Any signed-in creator; no active program required.","operationId":"get_hook_library_marketer_hook_library_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/idea-lab":{"get":{"tags":["daily-script"],"summary":"Get Idea Lab","description":"Brand-specific starter ideas (proven templates filled with the brand's\nscraped selling points) + the browsable library. Ideas generate once per brand\non first view and cache; they lean into the styles that win for this brand.","operationId":"get_idea_lab_marketer_idea_lab_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/idea-lab/regenerate":{"post":{"tags":["daily-script"],"summary":"Regenerate Idea Lab","description":"Fresh batch of brand ideas (rate-limited per brand). Re-reads the learned\nwinning styles so the new set reflects what's working now.","operationId":"regenerate_idea_lab_marketer_idea_lab_regenerate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/idea-lab/pick":{"post":{"tags":["daily-script"],"summary":"Pick Idea","description":"Record that a creator chose an Idea Lab idea to film. Their NEXT claim gets\ntied to this idea's style (a clean attribution signal, not a keyword guess of\nthe transcript) and flagged from_idea_lab — so Brand Brain learns which\nsuggested styles actually drove posts + payouts, and we can prove Idea Lab's ROI.\nThe claim submit consumes (deletes) the pick, so one pick attributes one post.","operationId":"pick_idea_marketer_idea_lab_pick_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_IdeaPick"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/idea-lab/current-pick":{"get":{"tags":["daily-script"],"summary":"Current Idea Pick","description":"The idea the creator most recently committed to film (\"I'm making this\") and\nhasn't posted yet — so the app can follow through (surface it on their home,\nnudge them to film + submit) instead of letting the pick fall into a void. The\npick is consumed when they submit a claim, so a returned pick means \"still on the\nhook for this one\". Only picks from the last 14 days count (stale intent decays).","operationId":"current_idea_pick_marketer_idea_lab_current_pick_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/playbook":{"get":{"tags":["daily-script"],"summary":"Creator Playbook","description":"The creator's PERSONAL, portable playbook: the transferable rules they've\nearned from real coaching on their own videos (the coaching brief's `lesson`),\naccumulated across every brand — the training-ground payoff that makes each\nreview compound. Cross-brand (keyed on marketer_id), newest first, deduped.","operationId":"creator_playbook_marketer_playbook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/ideation/options":{"get":{"tags":["ideation"],"summary":"Ideation Options","description":"The capture form's vocabulary — the leadable features + plannable formats.\nTenant-scoped only to confirm the creator has an active program.\n\nITEM 3: also surfaces the owner's confirmed emphasis (if any) as a gentle\ndefault/nudge — `recommended_feature` names the one feature the brand has asked\ncreators to lean into this week. Tenant-scoped; None (clean degrade) when the\nowner hasn't set one, so the plan form never depends on it.","operationId":"ideation_options_marketer_ideation_options_get","parameters":[{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/ideation":{"post":{"tags":["ideation"],"summary":"Submit Ideation","description":"A creator declares what they PLAN to make, before they film. Tenant-scoped,\nrate-limited, sanitized. Validates feature_key against the canonical vocabulary\nand format against CONTENT_FORMATS — an off-vocab value is dropped, never\nstored, so the aggregate can't be poisoned.","operationId":"submit_ideation_marketer_ideation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdeationCapture"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/ideation/mine":{"get":{"tags":["ideation"],"summary":"My Ideations","description":"The creator's OWN recent plans (their raw text is theirs to see — only the\nbrand-side aggregate strips it). Tenant-scoped by (company_id, marketer_id).","operationId":"my_ideations_marketer_ideation_mine_get","parameters":[{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/ideation/my-performance":{"get":{"tags":["ideation"],"summary":"My Performance","description":"\"What's working for YOU\" — join the creator's OWN filmed plans to their\nverified-view outcomes and surface (1) their single best post + the angle behind\nit (valid at n=1, always motivating), and (2) once they have enough posts, the\nangle that actually earns them the most reach vs their own median — so a creator\nlearns their personal winning pattern, not just the brand's.\n\nHuman-First: this is a training-ground readout, never a scoreboard against peers.\nIt compares a creator only to THEIR OWN history. Tenant + creator scoped (reuses\nmy_ideations' exact join); honest nulls when the data is too thin to claim a\npattern. Read-only; no AI, no spend.","operationId":"my_performance_marketer_ideation_my_performance_get","parameters":[{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/ideation/concept-coach":{"post":{"tags":["ideation"],"summary":"Concept Coach","description":"Deep-coach a creator's PLANNED script BEFORE they film. Runs the pasted\nconcept through the SAME Brand-Brain-grounded prompt the Creative Director uses\n(director_client transcript-mode — no video yet), returning Hook/Proof/CTA\nscores + the ONE fix + brand-brief alignment.\n\nHuman-First: NEVER a cold score. Always leads with what's strong, then the one\nconcrete fix, then encouragement — coaching happens BEFORE they film, which is\nthe whole promise. Degrades gracefully (a warm, honest brief) when the AI\nservice isn't configured, so a creator is never blocked from planning.","operationId":"concept_coach_marketer_ideation_concept_coach_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConceptCoachRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ideation/signal":{"get":{"tags":["ideation"],"summary":"Owner Ideation Signal","description":"The Ideation Signal card — what your creators independently PLAN to lead with,\nbefore they film. Aggregate-only, sample-gated, tenant-scoped to the owner's\nactive company. Raw creator angle/hook/why text is NEVER exposed here.","operationId":"owner_ideation_signal_owner_ideation_signal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/ideation/recommend-feature":{"post":{"tags":["ideation"],"summary":"Owner Recommend Feature","description":"ITEM 3 — the owner explicitly leans the brief into one feature (mirrors\nformat_lab's owner_broadcast_format). Upserts a tenant-scoped, one-active-at-a-\ntime `ideation_recommendations` doc; supersedes any prior active recommendation\nso there's a single clear emphasis. This is a persisted OWNER PREFERENCE, not an\nAI call and not fabricated data — it just amplifies a feature from the SAME\nFEATURE_KEYS vocabulary the Ideation Signal is built on.\n\nDownstream: `ideation_options` surfaces it as a gentle default in the creator's\nplan-your-video flow, and `brand_brain_learned_context` folds it into the brief\nevery AI agent (daily-script / concept-coach / Creative Director) runs on — so\nthe owner's read flows straight back into what creators plan next. Empty\nfeature_key clears the emphasis (owner can stop steering).","operationId":"owner_recommend_feature_owner_ideation_recommend_feature_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendFeatureRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ideation/dropoff":{"get":{"tags":["ideation"],"summary":"Owner Ideation Dropoff","description":"ITEM 10 — the planned-but-not-filmed backlog. Aggregate-only, tenant-scoped to\nthe owner's active company, sample-gated per feature. Surfaces the paid, on-brief\ncontent the brand almost had so the owner can nudge a creator to finish it. No\nsingle creator's raw plan text is ever exposed — only feature labels, counts, and\nthe marketer_ids the owner already manages.","operationId":"owner_ideation_dropoff_owner_ideation_dropoff_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/ideation/nudge-unfilmed":{"post":{"tags":["ideation"],"summary":"Owner Nudge Unfilmed","description":"ITEM 10 — one-tap warm nudge to a single creator sitting on an aging unfilmed\nplan. Reuses the existing owner→creator DM channel (same `dm_messages` shape\nchat.send_dm / the funnel nudge write) + a best-effort web push. Tenant-scoped:\nthe target is RE-VERIFIED server-side to be a marketer in THIS company AND to\nactually have an aging unfilmed plan (a client can't inject an arbitrary id), and\nthe DM is keyed by the owner→creator pair. Best-effort; never fabricates data.","operationId":"owner_nudge_unfilmed_owner_ideation_nudge_unfilmed_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NudgeUnfilmedRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ideation/brief-check":{"post":{"tags":["ideation"],"summary":"Owner Brief Check","description":"Owner-side 'Test your brief before you send it'. Before a brand pushes a\nbrief/example angle to its whole creator roster, the owner runs their own words\nthrough the SAME Brand-Brain-grounded concept coach the CREATORS get (identical\n`_run_concept_coach` → director transcript path), and sees how it will land +\nthe one concrete thing to sharpen — so they ship a stronger brief.\n\nOwner-gated (_require_owner) + company-scoped: the grounding + coaching is only\never for the company this account owns. AI spend is metered the SAME way the\ncreator coach is protected — hourly rate-limit AND the shared credit pool\n(reserve → run → record-on-success → release), so an owner can't drive unbounded\nmodel spend and a free workspace's coach usage is honestly billed against its\nmonthly credits. Degrades to the warm fallback (ran=false) when the AI service\nis unconfigured — the owner is never blocked, never charged for a non-run.","operationId":"owner_brief_check_owner_ideation_brief_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BriefCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/bio-link-status":{"get":{"tags":["bio-link"],"summary":"Get Bio Link Status","description":"Is the creator's Favente tracking link actually live in their bio?\n\nDrives the verified `link_in_bio` setup step and the persistent dashboard\nnudge. Never raises on a provider failure — reports what it could/couldn't\ncheck so the UI can coach rather than falsely block.","operationId":"get_bio_link_status_marketer_bio_link_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/link/regenerate":{"post":{"tags":["bio-link"],"summary":"Regenerate Tracking Slug","description":"Issue a fresh OPAQUE tracking slug for this creator in this company.\n\nFor creators whose original slug was minted under the old scheme (derived\nfrom their username/email — identity leaking into the public link), this\nis the lazy migration path: the new slug carries zero identity, and the\nOLD slug is preserved in `slug_aliases` so every link already placed in a\nbio keeps redirecting and attributing to them forever. Nothing breaks;\nthe creator loses no credit.","operationId":"regenerate_tracking_slug_marketer_link_regenerate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/bio-link-attest":{"post":{"tags":["bio-link"],"summary":"Attest Bio Link","description":"Creator manually attests their tracking link is live in their bio.\n\nThe pragmatic fallback for TikTok (aggregator-only) and for when the profile\nscraper can't read a bio. It's an honest, spot-checkable declaration — the\nattestation is stamped on the tenant-scoped profile and the fraud/community\nlayer can still catch a false one; it never bypasses the view-milestone path.","operationId":"attest_bio_link_marketer_bio_link_attest_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/virality/videos":{"get":{"tags":["virality"],"summary":"Virality Videos","description":"List the creator's own recently posted videos (from their claims) so they\ncan pick one to break down instead of retyping numbers. Tenant + creator\nscoped; prefers platform-verified views, and platform-verified likes/comments/\nshares when the tracking pipeline has mirrored them (TikTok exposes shares; IG\ndoesn't). Retention/watch-through has no public source, so it stays manual.","operationId":"virality_videos_marketer_virality_videos_get","parameters":[{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/virality/breakdown":{"post":{"tags":["virality"],"summary":"Virality Breakdown","description":"Rate one posted video by decomposing its funnel ratios (watch-through,\nlike/comment/share rate), score each vs real short-form benchmarks, surface\nthe weakest link, and return an encouraging coaching brief. Tenant-scoped,\nrate-limited, AI budget-gated (deterministic fallback). Creator-facing.","operationId":"virality_breakdown_marketer_virality_breakdown_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViralityBreakdownRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ad-agent":{"get":{"tags":["ad-agent"],"summary":"Ad Agent Status","description":"The agent's dashboard: winners it's drawing from, the latest drop, whether\nMeta is connected, and its performance-watch state.","operationId":"ad_agent_status_owner_ad_agent_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/ad-agent/run":{"post":{"tags":["ad-agent"],"summary":"Ad Agent Run","description":"Analyze + create: build this week's creative drop from the winners.","operationId":"ad_agent_run_owner_ad_agent_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ad-agent/approve":{"post":{"tags":["ad-agent"],"summary":"Ad Agent Approve","description":"Act: on approval, launch the drop. Meta always creates PAUSED ads (you spend\nnothing until you flip them live in Meta); without Meta connected the drop is\nheld ready. Reports to Slack either way.","operationId":"ad_agent_approve_owner_ad_agent_approve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ad-agent/watch":{"get":{"tags":["ad-agent"],"summary":"Ad Agent Watch","description":"Watch: read LIVE Meta insights for this company's ads, compare each to the\ntarget CPA, and flag over-target waste (with a one-click pause on the frontend).\nReal data — pulls spend/CPA/ROAS from the Marketing API per ad.","operationId":"ad_agent_watch_owner_ad_agent_watch_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/ad-agent/pause":{"post":{"tags":["ad-agent"],"summary":"Ad Agent Pause","description":"Act on a watch alert: pause an over-target ad in Meta (one click from the UI).","operationId":"ad_agent_pause_owner_ad_agent_pause_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PauseAdRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/revenue":{"get":{"tags":["revenue-attribution"],"summary":"Revenue Summary","description":"Per-creator attribution: revenue driven, payouts (cost), ROI, and the\nreal verified reach (refreshed from the platforms) that produced it.","operationId":"revenue_summary_owner_revenue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["revenue-attribution"],"summary":"Record Revenue","description":"Attribute a sale/conversion to a creator.","operationId":"record_revenue_owner_revenue_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/revenue/posts":{"get":{"tags":["revenue-attribution"],"summary":"Tracked Posts","description":"The creator posts Deo is tracking, with their latest verified view counts.","operationId":"tracked_posts_owner_revenue_posts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/revenue/posts/refresh":{"post":{"tags":["revenue-attribution"],"summary":"Refresh Posts","description":"Owner-triggered: enroll this brand's approved posts and re-fetch their live\nview counts now (the cron also does this hourly). Bounded per call.","operationId":"refresh_posts_owner_revenue_posts_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/revenue/by-video":{"get":{"tags":["revenue-attribution"],"summary":"Owner Revenue By Video","description":"PRO: how much revenue each VIDEO drove for the brand (per-video ROI). Requires\na paid plan — the per-creator summary is free; the per-video slice is the upgrade.\nOnly events whose tracking link carried a video id are attributed here.","operationId":"owner_revenue_by_video_owner_revenue_by_video_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/revenue/by-video":{"get":{"tags":["revenue-attribution"],"summary":"My Revenue By Video","description":"A creator's OWN per-video revenue for the active brand — the money each of\ntheir videos drove. Scoped to (company_id, marketer_id); read-only.","operationId":"my_revenue_by_video_marketer_revenue_by_video_get","parameters":[{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/integrations/store":{"get":{"tags":["store-integration"],"summary":"Get Store","operationId":"get_store_owner_integrations_store_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["store-integration"],"summary":"Connect Store","description":"Save the brand's store connection + return the attribution setup.","operationId":"connect_store_owner_integrations_store_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreConnectIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["store-integration"],"summary":"Disconnect Store","operationId":"disconnect_store_owner_integrations_store_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/integrations/store/attribution":{"get":{"tags":["store-integration"],"summary":"Store Attribution Summary","description":"Store sales attributed to creators (orders + attributed total).","operationId":"store_attribution_summary_owner_integrations_store_attribution_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/store/{company_slug}/conversion":{"get":{"tags":["store-integration"],"summary":"Conversion Beacon","description":"Image-beacon endpoint the store snippet hits on the confirmation page.\nReturns a 1x1 GIF so it works cross-origin with no preflight. Client-side, so\nit can't sign — these sales are recorded unverified (see the POST variant).\n`post` is the video id (per-video ROI) the shopper's link carried, if any.","operationId":"conversion_beacon_store__company_slug__conversion_get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"order_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Order Id"}},{"name":"amount","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Amount"}},{"name":"ref","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ref"}},{"name":"email","in":"query","required":false,"schema":{"type":"string","default":"","title":"Email"}},{"name":"product","in":"query","required":false,"schema":{"type":"string","default":"","title":"Product"}},{"name":"currency","in":"query","required":false,"schema":{"type":"string","default":"USD","title":"Currency"}},{"name":"post","in":"query","required":false,"schema":{"type":"string","default":"","title":"Post"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["store-integration"],"summary":"Conversion Webhook","description":"Server-to-server variant for custom backends. A valid HMAC `sig` marks the\nsale verified; a present-but-wrong `sig` is rejected as tampering; a missing\n`sig` is still recorded but flagged unverified.","operationId":"conversion_webhook_store__company_slug__conversion_post","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/store/{company_slug}/refund":{"post":{"tags":["store-integration"],"summary":"Refund Webhook","description":"Signed refund/chargeback for a previously-recorded order: reverses the\ncreator's attributed revenue and claws back the commission watermark, so\nrefunded sales don't permanently inflate revenue/ROI or pay commission the\nbrand never actually earned.","operationId":"refund_webhook_store__company_slug__refund_post","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/conversion-earnings":{"get":{"tags":["conversion-bonus"],"summary":"My Conversion Earnings","description":"The creator's OWN conversion bonuses for the active brand — what's clearing\n(in escrow), what needs the brand's review, and what has paid. Read-only, scoped\nto (marketer_id, company_id) so a creator only ever sees their own.","operationId":"my_conversion_earnings_marketer_conversion_earnings_get","parameters":[{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/conversion-bonuses":{"get":{"tags":["conversion-bonus"],"summary":"Owner Conversion Bonuses","description":"Owner review queue: conversion bonuses FLAGGED for review (a soft attribution-\nfraud signal) + creators whose bonuses are HALTED by the velocity circuit-breaker.\nTenant-scoped to the owner's company. Read-only.","operationId":"owner_conversion_bonuses_owner_conversion_bonuses_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/conversion-bonuses/approve":{"post":{"tags":["conversion-bonus"],"summary":"Owner Approve Conversion Bonus","description":"Approve a flagged conversion bonus → move it back into normal escrow so the\nreaper releases it after the window. Tenant-scoped + CAS-guarded (only a record of\nTHIS company still in escrow_review flips), so it can never touch another tenant's\nrecord, or a voided/paid one, and is idempotent.","operationId":"owner_approve_conversion_bonus_owner_conversion_bonuses_approve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_OrderRef"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/conversion-bonuses/reject":{"post":{"tags":["conversion-bonus"],"summary":"Owner Reject Conversion Bonus","description":"Reject a flagged conversion bonus → void it (never pays). Tenant-scoped + CAS.","operationId":"owner_reject_conversion_bonus_owner_conversion_bonuses_reject_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_OrderRef"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/conversion-bonuses/unhalt":{"post":{"tags":["conversion-bonus"],"summary":"Owner Unhalt Creator","description":"Clear a creator's conversion-bonus velocity halt after the owner reviews them,\nso their future conversions can escrow again. Tenant-scoped.","operationId":"owner_unhalt_creator_owner_conversion_bonuses_unhalt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_MarketerRef"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/integrations/shopify/authorize":{"post":{"tags":["shopify-sync"],"summary":"Shopify Authorize","description":"Owner starts the Shopify install: returns the authorize URL to redirect to.\nTenant-scoped (only an owner of the workspace) + a state nonce bound to the\ncompany so the callback can't be replayed onto another tenant.","operationId":"shopify_authorize_owner_integrations_shopify_authorize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopifyAuthorizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/shopify/callback":{"get":{"tags":["shopify-sync"],"summary":"Shopify Callback","description":"Shopify redirects here after the merchant approves. Authenticated by the OAuth\n`hmac` (not a session). Verifies hmac + shop + the state nonce we issued, exchanges\nthe code for a token, stores it, then registers native webhooks + imports products.","operationId":"shopify_callback_integrations_shopify_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/integrations/shopify/import-products":{"post":{"tags":["shopify-sync"],"summary":"Owner Import Products","description":"Owner re-imports products on demand. Tenant-scoped.","operationId":"owner_import_products_owner_integrations_shopify_import_products_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/integrations/shopify/products":{"get":{"tags":["shopify-sync"],"summary":"Owner List Products","description":"Owner lists the imported products (what creators can be pointed at).","operationId":"owner_list_products_owner_integrations_shopify_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhooks/shopify/orders":{"post":{"tags":["shopify-sync"],"summary":"Shopify Order Webhook","description":"Native Shopify orders/create webhook. Authenticated ONLY by the HMAC over the\nraw body (base64 HMAC-SHA256 with the app secret) — a forged POST is dropped 401.\nA verified order is booked as a TRUSTED conversion (pre_verified) → revenue\nattribution + the conversion-bonus tier, reusing store_integration._ingest_conversion\n(idempotent by order id).","operationId":"shopify_order_webhook_webhooks_shopify_orders_post","parameters":[{"name":"x-shopify-hmac-sha256","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Shopify-Hmac-Sha256"}},{"name":"x-shopify-shop-domain","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Shopify-Shop-Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/shopify/refunds":{"post":{"tags":["shopify-sync"],"summary":"Shopify Refund Webhook","description":"Native Shopify refunds/create webhook — HMAC-authenticated. Reverses the\ncreator's attributed revenue AND nullifies a still-escrowed conversion bonus\n(the \"refund & run\" guard), reusing store_integration._ingest_refund.","operationId":"shopify_refund_webhook_webhooks_shopify_refunds_post","parameters":[{"name":"x-shopify-hmac-sha256","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Shopify-Hmac-Sha256"}},{"name":"x-shopify-shop-domain","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Shopify-Shop-Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/revenuecat":{"post":{"tags":["creator-revenue-sync"],"summary":"Revenuecat Webhook","description":"RevenueCat webhook. Authenticated by the shared Authorization header value you\nset in the RC dashboard (REVENUECAT_WEBHOOK_AUTH). Books INITIAL_PURCHASE / RENEWAL\n/ NON_RENEWING_PURCHASE attributed via the subscriber_attributes deo_company/\ndeo_ref/deo_post. Dormant (503) until the secret is set.","operationId":"revenuecat_webhook_webhooks_revenuecat_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/superwall":{"post":{"tags":["creator-revenue-sync"],"summary":"Superwall Webhook","description":"Superwall webhook. Authenticated by a shared secret header (SUPERWALL_WEBHOOK_SECRET).\nBooks a transaction/subscription-start attributed via params deo_company/deo_ref/\ndeo_post. Dormant (503) until the secret is set.","operationId":"superwall_webhook_webhooks_superwall_post","parameters":[{"name":"x-superwall-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Superwall-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/stripe-creator":{"post":{"tags":["creator-revenue-sync"],"summary":"Stripe Creator Webhook","description":"Stripe webhook for CREATOR-attributed customer purchases (a SEPARATE endpoint +\nsecret from the brand-billing webhook in billing.py). Verified via\nstripe.Webhook.construct_event with STRIPE_CREATOR_WEBHOOK_SECRET. Books\ncheckout.session.completed / invoice.paid whose metadata carries deo_company/\ndeo_ref/deo_post. Dormant (503) until the secret is set.","operationId":"stripe_creator_webhook_webhooks_stripe_creator_post","parameters":[{"name":"stripe-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/feature-status":{"get":{"tags":["feature-status"],"summary":"Owner Feature Status","description":"Per-feature state for the active brand so the UI can indicate what's live vs\nwhat needs setup vs what isn't available yet. Read-only, tenant-scoped.","operationId":"owner_feature_status_owner_feature_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/vetting/comment-test":{"post":{"tags":["influencer-vetting"],"summary":"Comment Section Test","description":"Run the 3-layer comment-section test on an influencer before you sign them.\nInfluencer vetting is a Pro feature.","operationId":"comment_section_test_owner_vetting_comment_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentTestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/influencers":{"get":{"tags":["influencer-crm"],"summary":"List Influencers","operationId":"list_influencers_owner_influencers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["influencer-crm"],"summary":"Add Influencer","operationId":"add_influencer_owner_influencers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluencerIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/influencers/{influencer_id}":{"patch":{"tags":["influencer-crm"],"summary":"Update Influencer","operationId":"update_influencer_owner_influencers__influencer_id__patch","parameters":[{"name":"influencer_id","in":"path","required":true,"schema":{"type":"string","title":"Influencer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfluencerPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["influencer-crm"],"summary":"Delete Influencer","operationId":"delete_influencer_owner_influencers__influencer_id__delete","parameters":[{"name":"influencer_id","in":"path","required":true,"schema":{"type":"string","title":"Influencer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/influencers/{influencer_id}/note":{"post":{"tags":["influencer-crm"],"summary":"Add Note","operationId":"add_note_owner_influencers__influencer_id__note_post","parameters":[{"name":"influencer_id","in":"path","required":true,"schema":{"type":"string","title":"Influencer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/influencers/{influencer_id}/payment":{"post":{"tags":["influencer-crm"],"summary":"Record Payment","operationId":"record_payment_owner_influencers__influencer_id__payment_post","parameters":[{"name":"influencer_id","in":"path","required":true,"schema":{"type":"string","title":"Influencer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/influencers/{influencer_id}/vet":{"post":{"tags":["influencer-crm"],"summary":"Run Vet","description":"Run the 3-layer comment-section test and attach the score to this influencer\n(auto-advancing a raw prospect into 'vetting'). Seamless — the result lives on\nthe record, not on a separate page.","operationId":"run_vet_owner_influencers__influencer_id__vet_post","parameters":[{"name":"influencer_id","in":"path","required":true,"schema":{"type":"string","title":"Influencer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VetRunIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/influencers/{influencer_id}/contract":{"get":{"tags":["influencer-crm"],"summary":"Get Contract","description":"Generate a ready-to-send influencer agreement from the negotiated deal terms.","operationId":"get_contract_owner_influencers__influencer_id__contract_get","parameters":[{"name":"influencer_id","in":"path","required":true,"schema":{"type":"string","title":"Influencer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/brand-brain/insights":{"get":{"tags":["brand-brain"],"summary":"List Brand Brain Insights","description":"Structured, confidence-aware insights for this brand — tenant-scoped.\n\nOptional filters: category, kind (provenance class), and min_confidence\n(low|medium|high) which keeps only rows at or above that confidence.","operationId":"list_brand_brain_insights_owner_brand_brain_insights_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"min_confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Min Confidence"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/brand-brain/insights/{insight_id}/feedback":{"post":{"tags":["brand-brain"],"summary":"Brand Brain Insight Feedback","description":"Owner acts on (or dismisses) a recommendation — closes the feedback loop.\n\nRecords the action + a timestamp so future ranking can learn which insights\nowners actually act on. Tenant-scoped; 404 if the insight isn't the caller's.","operationId":"brand_brain_insight_feedback_owner_brand_brain_insights__insight_id__feedback_post","parameters":[{"name":"insight_id","in":"path","required":true,"schema":{"type":"string","title":"Insight Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/brand-brain":{"get":{"tags":["brand-brain"],"summary":"Get Brand Brain","operationId":"get_brand_brain_owner_brand_brain_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/brand-love":{"post":{"tags":["brand-love"],"summary":"Post Brand Love","operationId":"post_brand_love_marketer_brand_love_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandLoveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/brand-love/prompt":{"get":{"tags":["brand-love"],"summary":"Get Brand Love Prompt","operationId":"get_brand_love_prompt_marketer_brand_love_prompt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/brand-love":{"get":{"tags":["brand-love"],"summary":"Get Brand Love","operationId":"get_brand_love_owner_brand_love_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/compliance":{"get":{"tags":["compliance"],"summary":"Compliance Overview","operationId":"compliance_overview_owner_compliance_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/certification":{"get":{"tags":["certification"],"summary":"Get Certification","description":"The creator's certification status, craft track, and resources.","operationId":"get_certification_marketer_certification_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/certified-creators":{"get":{"tags":["certification"],"summary":"Owner Certified","description":"Which of the brand's creators are Deo Certified — a trust signal on the roster.","operationId":"owner_certified_owner_certified_creators_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/creator-community":{"get":{"tags":["creator-community"],"summary":"Creator Community","description":"The creator's community hub: leaderboard, spotlight, wins feed, challenges.","operationId":"creator_community_marketer_creator_community_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/community/feed":{"get":{"tags":["creator-community"],"summary":"List Feed","description":"Recent posts in the creator's own program feed (newest first).","operationId":"list_feed_marketer_community_feed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["creator-community"],"summary":"Create Feed Post","description":"Create a post in the creator's own program feed.","operationId":"create_feed_post_marketer_community_feed_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedPostBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/community/feed/{post_id}/cheer":{"post":{"tags":["creator-community"],"summary":"Toggle Cheer","description":"Toggle a cheer (support) on a post. Returns the new count + state.","operationId":"toggle_cheer_marketer_community_feed__post_id__cheer_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/community/feed/{post_id}/comment":{"post":{"tags":["creator-community"],"summary":"Add Comment","description":"Add a comment to a post in the caller's program feed.","operationId":"add_comment_marketer_community_feed__post_id__comment_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedCommentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/community/feed/{post_id}/comments":{"get":{"tags":["creator-community"],"summary":"List Comments","description":"Comments on a post (oldest first), scoped to the caller's company.","operationId":"list_comments_marketer_community_feed__post_id__comments_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/community/feed/{post_id}/comments/{comment_id}":{"delete":{"tags":["creator-community"],"summary":"Delete Own Comment","description":"A creator deletes only their own comment in their own program feed.","operationId":"delete_own_comment_marketer_community_feed__post_id__comments__comment_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","title":"Comment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/community/feed/{post_id}":{"delete":{"tags":["creator-community"],"summary":"Delete Own Post","description":"A creator deletes their OWN post (+ its comments).","operationId":"delete_own_post_marketer_community_feed__post_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/community/feed/{post_id}/comments/{comment_id}":{"delete":{"tags":["creator-community"],"summary":"Owner Delete Comment","description":"Owner moderation: remove any comment in their own company's feed.","operationId":"owner_delete_comment_owner_community_feed__post_id__comments__comment_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","title":"Comment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/community/feed/{post_id}":{"delete":{"tags":["creator-community"],"summary":"Owner Delete Post","description":"Owner moderation: remove ANY post in their own company's feed (+ comments).","operationId":"owner_delete_post_owner_community_feed__post_id__delete","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/display":{"get":{"tags":["owner-rewards"],"summary":"Get Payouts","operationId":"get_payouts_owner_display_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/payouts/export":{"get":{"tags":["owner-rewards"],"summary":"Export Payouts","description":"Owner-facing CSV export of the company's full payout history (all statuses).\n\nRead-only and HARD tenant-scoped to the owner's company_id. Bloss-parity: the\n'payment calculation / generate summaries and reports' story — owners can pull a\nspreadsheet of every payout (creator, views, amount, status, date) for their own\nbooks instead of screenshotting the dashboard.","operationId":"export_payouts_owner_payouts_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/mark_completed/{claim_id}":{"patch":{"tags":["owner-rewards"],"summary":"Complete","operationId":"complete_owner_mark_completed__claim_id__patch","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/display":{"get":{"tags":["rewards"],"summary":"Marketer Display","operationId":"marketer_display_marketer_display_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/stats/views-history":{"get":{"tags":["rewards"],"summary":"Marketer Views History","operationId":"marketer_views_history_marketer_stats_views_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/stats/income-history":{"get":{"tags":["rewards"],"summary":"Marketer Income History","operationId":"marketer_income_history_marketer_stats_income_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/tasks":{"get":{"tags":["owner-tasks"],"summary":"Owner Task List","description":"List all active tasks with their submissions.","operationId":"owner_task_list_owner_tasks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["owner-tasks"],"summary":"Create Owner Task","description":"Publish a new manual task visible to all marketers in the company.","operationId":"create_owner_task_owner_tasks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/tasks/goal":{"put":{"tags":["owner-tasks"],"summary":"Save Goal","description":"Set or update the company-wide reward goal for marketers.","operationId":"save_goal_owner_tasks_goal_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/tasks/goal/codes":{"post":{"tags":["owner-tasks"],"summary":"Add Goal Reward Codes","description":"Add encrypted one-time product/voucher codes to the mission reward pool.","operationId":"add_goal_reward_codes_owner_tasks_goal_codes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewardCodesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/tasks/{submission_id}/verify":{"post":{"tags":["owner-tasks"],"summary":"Verify Submission","description":"Verify a marketer's task submission and award points.","operationId":"verify_submission_owner_tasks__submission_id__verify_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/tasks/{task_id}":{"delete":{"tags":["owner-tasks"],"summary":"Remove Owner Task","description":"Soft-delete a task.","operationId":"remove_owner_task_owner_tasks__task_id__delete","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/tasks":{"get":{"tags":["marketer-tasks"],"summary":"Marketer Task List","description":"Return all active tasks with this marketer's submission state.","operationId":"marketer_task_list_marketer_tasks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/tasks/goal/redeem":{"post":{"tags":["marketer-tasks"],"summary":"Redeem Goal Reward","description":"Claim one encrypted reward code after reaching this period's points goal.","operationId":"redeem_goal_reward_marketer_tasks_goal_redeem_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/tasks/{task_id}/start":{"post":{"tags":["marketer-tasks"],"summary":"Start Task","description":"Mark a task as in-progress for the marketer. Idempotent.","operationId":"start_task_marketer_tasks__task_id__start_post","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/tasks/{task_id}/complete":{"post":{"tags":["marketer-tasks"],"summary":"Complete Task","description":"Submit a video URL for a task. Creates submission if not already started.","operationId":"complete_task_marketer_tasks__task_id__complete_post","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteTaskRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/company/settings":{"put":{"tags":["company"],"summary":"Update Company Settings","description":"Update company details (name, slug, domain, description, hiring info).\nChecks slug uniqueness if changed.","operationId":"update_company_settings_company_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCompanySettingsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/list":{"get":{"tags":["workspace"],"summary":"List Workspaces","description":"Get all workspaces for the current authenticated user.","operationId":"list_workspaces_workspace_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/workspace/create":{"post":{"tags":["workspace"],"summary":"Create Workspace","description":"Create a new workspace using session authentication.","operationId":"create_workspace_workspace_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceSimple"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/{workspace_id}":{"delete":{"tags":["workspace"],"summary":"Delete Workspace","description":"Delete a workspace by MongoDB _id.","operationId":"delete_workspace_workspace__workspace_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["workspace"],"summary":"Get Workspace","description":"Get a workspace the caller owns by MongoDB _id (bot_token stripped).","operationId":"get_workspace_workspace__workspace_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/make-workspace":{"post":{"tags":["workspace"],"summary":"Make Workspace","description":"Create a new workspace for the authenticated owner.\n\nIdentity (`gmail`/`account_id`/`username`) is taken from the session, not\nthe request body, so a caller can't plant a workspace attributed to another\naccount. Only the workspace name, id, and bot token come from the body.","operationId":"make_workspace_workspace_make_workspace_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/by-id/{workspace_id}":{"get":{"tags":["workspace"],"summary":"Get Workspace By Id","description":"Get a workspace the caller owns by its `workspace_id` (bot_token stripped).","operationId":"get_workspace_by_id_workspace_by_id__workspace_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/by-name/{workspace_name}":{"get":{"tags":["workspace"],"summary":"Get Workspace By Name","description":"Get a workspace the caller owns by name (bot_token stripped).","operationId":"get_workspace_by_name_workspace_by_name__workspace_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/by-account/{account_id}":{"get":{"tags":["workspace"],"summary":"Get Workspaces By Account","description":"Get all workspaces for the caller's own account (by account_id or gmail).","operationId":"get_workspaces_by_account_workspace_by_account__account_id__get","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/{workspace_id}/channels":{"get":{"tags":["workspace"],"summary":"Get Slack Channels","description":"Get all Slack channels for a workspace the caller owns, using its bot token.","operationId":"get_slack_channels_workspace__workspace_id__channels_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/{workspace_id}/users":{"get":{"tags":["workspace"],"summary":"Get Slack Users","description":"Get all Slack users for a workspace the caller owns, using its bot token.","operationId":"get_slack_users_workspace__workspace_id__users_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/stripe/payouts":{"get":{"tags":["stripe"],"summary":"Owner Stripe Payouts","description":"List payout records for the company with Stripe transfer status.\n\nPaginated (skip/limit, newest first) with a total count so a company with\nmore than one page of transfers can reconcile older payouts — the previous\nhard `.to_list(length=200)` silently dropped everything past the 200th record.","operationId":"owner_stripe_payouts_owner_stripe_payouts_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/stripe/onboard":{"post":{"tags":["stripe"],"summary":"Marketer Stripe Onboard","description":"Create a Stripe Connect Express account and return the onboarding link.","operationId":"marketer_stripe_onboard_marketer_stripe_onboard_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/stripe/status":{"get":{"tags":["stripe"],"summary":"Marketer Stripe Status","description":"Check if the marketer has connected Stripe and whether payouts are enabled.","operationId":"marketer_stripe_status_marketer_stripe_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/payouts/{claim_id}/retry":{"post":{"tags":["admin-payouts"],"summary":"Admin Retry Payout","description":"Re-fire a DEFINITIVELY-FAILED auto-payout. Idempotent (Stripe no-op if the\nmoney already moved). Admin-gated, audited, reason required.","operationId":"admin_retry_payout_admin_payouts__claim_id__retry_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/payouts/{claim_id}/reconcile":{"post":{"tags":["admin-payouts"],"summary":"Admin Reconcile Payout","description":"Resolve an AMBIGUOUS (needs_reconcile) payout by QUERYING Stripe for the\nreal transfer state — never re-transfers. Resolves the record to paid (with\nthe real transfer id) or failed. Admin-gated, audited, reason required.","operationId":"admin_reconcile_payout_admin_payouts__claim_id__reconcile_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/verify/youtube":{"get":{"tags":["verification"],"summary":"Verify Youtube","description":"Verify a YouTube video URL and return its statistics.\n\nQuery params:\n  url  – The YouTube video URL (youtube.com/watch?v=..., youtu.be/..., youtube.com/shorts/...)\n\nRequires an authenticated session and is rate-limited per account: this route\nspends the platform's shared YouTube Data API quota, so leaving it anonymous\nlet anyone drain the quota and knock out the ground-truth verification the\nreward path depends on. (The payout path calls verify_youtube_video() directly\nand is unaffected by this gate.)","operationId":"verify_youtube_verify_youtube_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/meta/status":{"get":{"tags":["meta-ads"],"summary":"Meta Status","operationId":"meta_status_owner_meta_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/meta/oauth-url":{"get":{"tags":["meta-ads"],"summary":"Meta Oauth Url","operationId":"meta_oauth_url_owner_meta_oauth_url_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/meta/callback":{"get":{"tags":["meta-ads"],"summary":"Meta Callback","description":"Meta redirects here with ?code&state. Unauthenticated + cross-host, so the\nsigned state carries the company id. We store the token, then bounce the owner\nto the integrations page to pick their ad account + page.","operationId":"meta_callback_owner_meta_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/meta/accounts":{"get":{"tags":["meta-ads"],"summary":"Meta Accounts","description":"List the connected user's ad accounts + pages so they can pick.","operationId":"meta_accounts_owner_meta_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/meta/select":{"post":{"tags":["meta-ads"],"summary":"Meta Select","operationId":"meta_select_owner_meta_select_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaSelectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/meta/disconnect":{"post":{"tags":["meta-ads"],"summary":"Meta Disconnect","operationId":"meta_disconnect_owner_meta_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/meta/eligible-videos":{"get":{"tags":["meta-ads"],"summary":"Meta Eligible Videos","description":"Approved, verified UGC videos for this company — the ad-ready creative.","operationId":"meta_eligible_videos_owner_meta_eligible_videos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/meta/ads":{"get":{"tags":["meta-ads"],"summary":"Meta List Ads","operationId":"meta_list_ads_owner_meta_ads_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["meta-ads"],"summary":"Meta Create Ad","description":"Create a fully PAUSED ad (campaign → ad set → ad) from a UGC video.\n\nNothing spends: every entity is created PAUSED. The owner activates it in\nMeta Ads Manager after review. Money-spending stays a human decision.","operationId":"meta_create_ad_owner_meta_ads_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAdRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/slack-growth/tips":{"get":{"tags":["slack-growth"],"summary":"Slack Growth Tips","description":"Suggested channels + the 'get your creators into Slack' guidance.\n\nPublic-to-owner (no Slack connection required) so the UI can show the plan\nbefore the owner connects Slack.","operationId":"slack_growth_tips_owner_slack_growth_tips_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/slack-growth/setup":{"post":{"tags":["slack-growth"],"summary":"Slack Growth Setup","description":"Create the suggested channels via the company's bot token and post a\nkickoff message to #feature-ideas. Best-effort per channel.","operationId":"slack_growth_setup_owner_slack_growth_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/qa-accuracy":{"get":{"tags":["admin-metrics"],"summary":"Qa Gate Accuracy","description":"Live accuracy of the AI payout gate, measured against human decisions.\n\nGround truth is the owner's final approve/deny on each claim; we report how\noften the gate agreed, the precision of its 'hold' calls, and the (dangerous)\nrate at which it cleared something a human later denied.","operationId":"qa_gate_accuracy_admin_qa_accuracy_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/learning-dataset":{"get":{"tags":["admin-metrics"],"summary":"Learning Dataset","description":"Versioned, privacy-safe resolved-content dataset for offline evaluation.\n\nMedia URLs are excluded by default. They can be requested only through this\nadmin-authenticated endpoint for a controlled human-review/evaluation run.","operationId":"learning_dataset_admin_learning_dataset_get","parameters":[{"name":"include_media","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Media"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/metrics":{"get":{"tags":["admin-metrics"],"summary":"Founder Metrics","operationId":"founder_metrics_admin_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/audit-logs":{"get":{"tags":["admin-audit"],"summary":"List Audit Logs","description":"Most-recent audit rows, newest first. Super-admin only (compliance read).","operationId":"list_audit_logs_admin_audit_logs_get","parameters":[{"name":"action_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type"}},{"name":"company_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/support/account":{"get":{"tags":["admin-support"],"summary":"Support Account","description":"Account summary for support: memberships (slug/id/role), created_at, and\ndeletion/anonymization state. NO password/session material — session tokens\nare never joined and no secret field is returned.","operationId":"support_account_admin_support_account_get","parameters":[{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},{"name":"account_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/support/creator":{"get":{"tags":["admin-support"],"summary":"Support Creator","description":"Creator profile summary across all companies: per-company status,\ntrust_score + trust_confidence, whether Stripe Connect is set up, and claim\ncounts. Cross-tenant by design (support). No raw PII beyond email/username the\noperator needs to resolve a ticket.","operationId":"support_creator_admin_support_creator_get","parameters":[{"name":"marketer_id","in":"query","required":true,"schema":{"type":"string","title":"Marketer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/support/claim":{"get":{"tags":["admin-support"],"summary":"Support Claim","description":"Full money-path state for one claim: the claim (status/views/reward) plus\nits payout_record (status, stripe_status, gate_reasons, milestone_key,\nneeds_reconcile). This is the \"why isn't this claim paid\" view.","operationId":"support_claim_admin_support_claim_get","parameters":[{"name":"claim_id","in":"query","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/support/company":{"get":{"tags":["admin-support"],"summary":"Support Company","description":"Company plan/billing state + creator counts + a program-config summary.\nBilling identifiers (customer/subscription id) are redacted to a suffix.","operationId":"support_company_admin_support_company_get","parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/support/timeline":{"get":{"tags":["admin-support"],"summary":"Support Timeline","description":"Merged, time-ordered event list for one entity, drawn from `audit_logs`\n(filtered by the entity id / metadata) plus cheap status-history joins:\n  * claim   → audit rows w/ metadata.claim_id + the claim's submit/resolve +\n              its payout_record terminal timestamps.\n  * payout  → same as claim (payout is keyed by claim_id).\n  * company → audit rows w/ company_id + the company's created_at.\n  * account → audit rows w/ actor_id == account_id (actions the account took).\nNewest-first, bounded by `limit`.","operationId":"support_timeline_admin_support_timeline_get","parameters":[{"name":"entity","in":"query","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"id","in":"query","required":true,"schema":{"type":"string","title":"Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/support/webhooks":{"get":{"tags":["admin-support"],"summary":"Support Webhooks","description":"Recent `stripe_webhook_events` rows (id, type, status, timestamps) so an\noperator can see webhook processing/backlog without raw DB. Newest-first.","operationId":"support_webhooks_admin_support_webhooks_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/support/health-signals":{"get":{"tags":["admin-support"],"summary":"Support Health Signals","description":"One JSON of the alerting signals observability.md prescribes, computed with\nbounded, time-windowed queries so an external monitor can poll it cheaply:\n\n  * payout failures (24h / 7d)          — stripe_status=\"failed\"\n  * payout needs_reconcile (24h / 7d)   — ambiguous, possible double-pay risk\n  * payouts held_for_review (open count)\n  * webhook backlog                     — status=\"processing\" older than 15m\n  * ai fallbacks (24h)                  — if the counter collection is tracked","operationId":"support_health_signals_admin_support_health_signals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/support/readiness":{"get":{"tags":["admin-support"],"summary":"Support Readiness","description":"Go-live readiness: which money-critical integrations are CONFIGURED in this\nenvironment. Presence-only — reports booleans, NEVER the secret values (so it's\nsafe for an operator to read). Answers \"what do I still need to turn on before a\nreal brand can pay + a creator can get paid?\" without pulling env from Vercel\n(whose `env pull` can't decrypt dashboard-set secrets).\n\nMoney loop: a brand can only PAY when Stripe is set; a creator can only GET PAID\nwhen Stripe + a verification source are set; the AI value props need Anthropic.","operationId":"support_readiness_admin_support_readiness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/claims/{claim_id}/arbitration":{"post":{"tags":["arbitration"],"summary":"Open Arbitration","description":"A creator escalates a DENIED claim they own to Favente arbitration. Only one\nopen arbitration per claim; double-submit is guarded by the unique claim_id\nindex + an atomic claim-flag CAS.","operationId":"open_arbitration_claims__claim_id__arbitration_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["arbitration"],"summary":"Get Arbitration","description":"Creator views their claim's arbitration status + message thread.","operationId":"get_arbitration_claims__claim_id__arbitration_get","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/claims/{claim_id}/arbitration/message":{"post":{"tags":["arbitration"],"summary":"Creator Arbitration Message","description":"Creator adds a message to the thread (only while the arbitration is open).","operationId":"creator_arbitration_message_claims__claim_id__arbitration_message_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/arbitration":{"get":{"tags":["owner-arbitration"],"summary":"Owner List Arbitration","description":"The owner's company arbitrations (for the dashboard), newest first.","operationId":"owner_list_arbitration_owner_arbitration_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/arbitration/{arb_id}/message":{"post":{"tags":["owner-arbitration"],"summary":"Owner Arbitration Message","description":"Owner responds in one of their company's arbitration threads (while open).","operationId":"owner_arbitration_message_owner_arbitration__arb_id__message_post","parameters":[{"name":"arb_id","in":"path","required":true,"schema":{"type":"string","title":"Arb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/arbitration/queue":{"get":{"tags":["admin-arbitration"],"summary":"Admin Arbitration Queue","description":"All disputes for staff triage, newest first, bounded. Admin-gated.","operationId":"admin_arbitration_queue_admin_arbitration_queue_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/arbitration/{arb_id}":{"get":{"tags":["admin-arbitration"],"summary":"Admin Arbitration Detail","description":"FULL arbitration context for an arbiter: the arbitration + the claim\n(tier/views/amount + evidence url) + the owner's denial feedback + payout\ngate reasons/verdict + any director/AI verdict + the message thread.\nAdmin-gated + audited (a cross-tenant read of another company's dispute).","operationId":"admin_arbitration_detail_admin_arbitration__arb_id__get","parameters":[{"name":"arb_id","in":"path","required":true,"schema":{"type":"string","title":"Arb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/arbitration/{arb_id}/message":{"post":{"tags":["admin-arbitration"],"summary":"Admin Arbitration Message","description":"Arbiter posts advice/questions (role `favente`), visible to creator + owner.\nAdmin-gated + audited.","operationId":"admin_arbitration_message_admin_arbitration__arb_id__message_post","parameters":[{"name":"arb_id","in":"path","required":true,"schema":{"type":"string","title":"Arb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/arbitration/{arb_id}/resolve":{"post":{"tags":["admin-arbitration"],"summary":"Admin Arbitration Resolve","description":"Arbiter issues a binding ruling. Admin-gated, audited, notifies both sides.\n\nbody: {ruling: \"upheld\"|\"overturned\"|\"mediated\", note: str, approve?: bool}\n  * upheld     → claim stays denied; mark resolved.\n  * mediated   → record negotiated outcome in `note`; mark resolved.\n  * overturned → Favente rules for the creator:\n      - approve==true  → APPROVE + pay via the SHARED approve_claim_as helper\n                         (the ONLY payout path; idempotent/safe).\n      - approve==false → re-open the claim to `pending` with the binding ruling\n                         attached; owner approves.\nEvery resolve sets claim.arbitration_status:resolved + writes an audit row.","operationId":"admin_arbitration_resolve_admin_arbitration__arb_id__resolve_post","parameters":[{"name":"arb_id","in":"path","required":true,"schema":{"type":"string","title":"Arb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/curriculum":{"get":{"tags":["curriculum"],"summary":"Get Curriculum","description":"Return the full curriculum structure with the marketer's progress for each module.","operationId":"get_curriculum_marketer_curriculum_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/curriculum/complete":{"post":{"tags":["curriculum"],"summary":"Complete Module","description":"Mark a curriculum module as complete.","operationId":"complete_module_marketer_curriculum_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteModuleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/playbook-drafts":{"get":{"tags":["curriculum"],"summary":"List Playbook Drafts","description":"Return all drafts for this marketer grouped by type.","operationId":"list_playbook_drafts_marketer_playbook_drafts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["curriculum"],"summary":"Save Playbook Draft","description":"Save a hook/proof/CTA draft for the marketer.","operationId":"save_playbook_draft_marketer_playbook_drafts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveDraftRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/skill-profile":{"get":{"tags":["curriculum"],"summary":"Get Skill Profile","description":"Diagnostic Hook/Proof/CTA learner profile for the learn page: per-skill\nrolling averages, trend, and the WEAKEST skill mapped to the exact module to\nrevisit. Skill is portable across brands, so it aggregates by marketer_id.","operationId":"get_skill_profile_marketer_skill_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/skill-tiers":{"get":{"tags":["owner-skill-tiers"],"summary":"Get Owner Skill Tiers","operationId":"get_owner_skill_tiers_owner_skill_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["owner-skill-tiers"],"summary":"Update Owner Skill Tiers","operationId":"update_owner_skill_tiers_owner_skill_tiers_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillTiersUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/skill-tier":{"get":{"tags":["marketer-skill-tiers"],"summary":"Get Marketer Skill Tier","description":"The creator's tier, the money it's worth, and exactly how to rank up.","operationId":"get_marketer_skill_tier_marketer_skill_tier_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/loyalty":{"get":{"tags":["owner-loyalty"],"summary":"Get Owner Loyalty","operationId":"get_owner_loyalty_owner_loyalty_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["owner-loyalty"],"summary":"Update Owner Loyalty","operationId":"update_owner_loyalty_owner_loyalty_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoyaltyUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/loyalty":{"get":{"tags":["marketer-loyalty"],"summary":"Get Marketer Loyalty","description":"The creator's posting-streak progress toward the next permanent uplift.","operationId":"get_marketer_loyalty_marketer_loyalty_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/billing/status":{"get":{"tags":["billing"],"summary":"Get Billing Status","operationId":"get_billing_status_owner_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/billing/checkout":{"post":{"tags":["billing"],"summary":"Create Checkout Session","operationId":"create_checkout_session_owner_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/billing/credits/checkout":{"post":{"tags":["billing"],"summary":"Create Credits Checkout Session","description":"One-time purchase of an AI-credit top-up pack (100/1000/5000/10000). Creates\na Stripe Checkout in PAYMENT mode referencing the pack product; the webhook\n(checkout.session.completed, metadata.purchase == 'ai_credits') then credits\ncompany.purchased_ai_credits. These credits never expire and are spent after\nthe monthly pool, before overage.","operationId":"create_credits_checkout_session_owner_billing_credits_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditsCheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/billing/overage":{"put":{"tags":["billing"],"summary":"Set Overage","description":"Turn the flex surcharge (metered overage past the pool) on or off. Only\nStandard/Max can toggle; on other plans overage is fixed by the plan.","operationId":"set_overage_owner_billing_overage_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverageToggleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/billing/portal":{"post":{"tags":["billing"],"summary":"Create Portal Session","operationId":"create_portal_session_owner_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhooks/stripe":{"post":{"tags":["webhooks"],"summary":"Stripe Webhook","operationId":"stripe_webhook_webhooks_stripe_post","parameters":[{"name":"stripe-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/coach/chat":{"post":{"tags":["ai-coach"],"summary":"Coach Chat","operationId":"coach_chat_ai_coach_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/coach/history":{"get":{"tags":["ai-coach"],"summary":"Get Coach History","operationId":"get_coach_history_ai_coach_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ai-coach"],"summary":"Clear Coach History","operationId":"clear_coach_history_ai_coach_history_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ai/coach/suggest":{"post":{"tags":["ai-coach"],"summary":"Coach Suggest","operationId":"coach_suggest_ai_coach_suggest_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ai/coach/score-hook":{"post":{"tags":["ai-coach"],"summary":"Score Hook","operationId":"score_hook_ai_coach_score_hook_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HookScoreRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/coach/hook-history":{"get":{"tags":["ai-coach"],"summary":"Get Hook Score History","operationId":"get_hook_score_history_ai_coach_hook_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/coach/analyze-draft":{"post":{"tags":["ai-coach"],"summary":"Analyze Draft","description":"Free (no Pro gate) inline analysis of hook/proof/cta drafts.\nUsed in the curriculum learn page after a creator writes their hook draft.\nReturns rating, what_works, what_to_fix, rewrite, coaching_note.","operationId":"analyze_draft_ai_coach_analyze_draft_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeDraftRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/gamification/status":{"get":{"tags":["gamification"],"summary":"Get Gamification Status","operationId":"get_gamification_status_marketer_gamification_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/gamification/checkin":{"post":{"tags":["gamification"],"summary":"Daily Checkin","operationId":"daily_checkin_marketer_gamification_checkin_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/gamification/challenge/complete":{"post":{"tags":["gamification"],"summary":"Complete Daily Challenge","operationId":"complete_daily_challenge_marketer_gamification_challenge_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteChallengeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/gamification/badges":{"get":{"tags":["gamification"],"summary":"Get Badges","operationId":"get_badges_marketer_gamification_badges_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/gamification/leaderboard":{"get":{"tags":["gamification"],"summary":"Get Leaderboard","operationId":"get_leaderboard_owner_gamification_leaderboard_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/competitor-briefs/analyze":{"post":{"tags":["competitor-intel"],"summary":"Analyze Competitor Brief","description":"Analyze a competitor UGC ad and generate a Recreate This brief.","operationId":"analyze_competitor_brief_owner_competitor_briefs_analyze_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitorBriefRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/competitor-briefs":{"get":{"tags":["competitor-intel"],"summary":"List Competitor Briefs","description":"Returns the last 50 competitor briefs for this company.","operationId":"list_competitor_briefs_owner_competitor_briefs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/competitor-briefs/{brief_id}/push-task":{"post":{"tags":["competitor-intel"],"summary":"Push Brief As Task","description":"Push a competitor brief as an owner task for creators.","operationId":"push_brief_as_task_owner_competitor_briefs__brief_id__push_task_post","parameters":[{"name":"brief_id","in":"path","required":true,"schema":{"type":"string","title":"Brief Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/competitor-briefs/{brief_id}":{"delete":{"tags":["competitor-intel"],"summary":"Delete Competitor Brief","description":"Delete a competitor brief.","operationId":"delete_competitor_brief_owner_competitor_briefs__brief_id__delete","parameters":[{"name":"brief_id","in":"path","required":true,"schema":{"type":"string","title":"Brief Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/repurpose":{"post":{"tags":["repurpose"],"summary":"Repurpose Content","description":"Generate a repurpose plan from one source video/angle. Creator-facing.","operationId":"repurpose_content_marketer_repurpose_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepurposeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/repurpose/plans":{"get":{"tags":["repurpose"],"summary":"List Repurpose Plans","description":"The creator's saved repurpose plans (most recent first), tenant-scoped.","operationId":"list_repurpose_plans_marketer_repurpose_plans_get","parameters":[{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/weekly-review":{"get":{"tags":["weekly-review"],"summary":"Get Weekly Review","description":"This week's self-review: the creator's wins first, then optional prompts, plus\nwhether they've already done this week's (so the UI never nags).","operationId":"get_weekly_review_marketer_weekly_review_get","parameters":[{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["weekly-review"],"summary":"Submit Weekly Review","description":"Save this week's reflection (once per ISO week) and level the creator up.\nIdempotent per week — re-submitting updates the answers, never double-awards XP.","operationId":"submit_weekly_review_marketer_weekly_review_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeeklyReviewSubmit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/render/complete":{"post":{"tags":["internal"],"summary":"Render Complete","description":"favente-ai calls this when a render job reaches a terminal state. Sends the\ncreator a push exactly once on success.","operationId":"render_complete_internal_render_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderCompleteIngress"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/phone/status":{"get":{"tags":["phone"],"summary":"Phone Status","description":"Current phone/verification/consent state for the signed-in creator.","operationId":"phone_status_marketer_phone_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/phone/verify/start":{"post":{"tags":["phone"],"summary":"Phone Verify Start","description":"Send an OTP to the creator's phone (rate-limited, hashed, never returned).","operationId":"phone_verify_start_marketer_phone_verify_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_PhoneStart"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/phone/verify/confirm":{"post":{"tags":["phone"],"summary":"Phone Verify Confirm","description":"Confirm the OTP; on success record SMS consent per the double-opt-in box.","operationId":"phone_verify_confirm_marketer_phone_verify_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_PhoneConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/curriculum/config":{"get":{"tags":["owner-curriculum"],"summary":"Get Owner Curriculum Config","description":"Return the company's curriculum customization config (TEXT + STRUCTURE).\n\nWhen no structure has been saved yet we return the hardcoded default structure\nas an editable base, so the owner UI always renders the full module list.","operationId":"get_owner_curriculum_config_owner_curriculum_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["owner-curriculum"],"summary":"Save Owner Curriculum Config","description":"Save the company's curriculum customization config (TEXT + STRUCTURE).\n\nSTRUCTURE is validated (known module ids + known gate_types only) and stored as\nan OVERRIDE layered over the hardcoded CURRICULUM — defaults persist for every\nmodule the owner didn't touch, and in-flight creators never regress. When the\nrequest omits `structure`, any previously-stored structure is preserved (a\nTEXT-only save doesn't wipe the structure override).","operationId":"save_owner_curriculum_config_owner_curriculum_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveCurriculumConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/campaigns":{"get":{"tags":["marketer-campaigns"],"summary":"Get Marketer Campaigns","description":"Returns active wave campaigns for the logged-in marketer.","operationId":"get_marketer_campaigns_marketer_campaigns_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/campaigns/{campaign_id}/posted":{"post":{"tags":["marketer-campaigns"],"summary":"Marketer Mark Campaign Posted","description":"Records that this marketer has posted for a campaign.","operationId":"marketer_mark_campaign_posted_marketer_campaigns__campaign_id__posted_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/link/{code}":{"get":{"tags":["hiring"],"summary":"Resolve Hiring Link","description":"Public: resolve a Deo Link to its form + brand info. Records a visit.","operationId":"resolve_hiring_link_hiring_link__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"track","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Track"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/link/{code}/apply":{"post":{"tags":["hiring"],"summary":"Apply Via Link","description":"Public: apply through a Deo Link. Triggers the automation pipeline.","operationId":"apply_via_link_hiring_link__code__apply_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyViaLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/candidate/{token}":{"get":{"tags":["hiring"],"summary":"Candidate Portal","description":"Public: candidate-facing view of their own application.","operationId":"candidate_portal_hiring_candidate__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/candidate/{token}/trial":{"post":{"tags":["hiring"],"summary":"Candidate Submit Trial","operationId":"candidate_submit_trial_hiring_candidate__token__trial_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialSubmitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/candidate/{token}/accept":{"post":{"tags":["hiring"],"summary":"Candidate Accept Offer","operationId":"candidate_accept_offer_hiring_candidate__token__accept_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/candidate/{token}/decline":{"post":{"tags":["hiring"],"summary":"Candidate Decline Offer","operationId":"candidate_decline_offer_hiring_candidate__token__decline_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/candidate/{token}/withdraw":{"post":{"tags":["hiring"],"summary":"Candidate Withdraw","operationId":"candidate_withdraw_hiring_candidate__token__withdraw_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/links":{"post":{"tags":["hiring"],"summary":"Create Hiring Link","description":"Create a Deo Link: a tracked recruiting URL for one traffic source.","operationId":"create_hiring_link_hiring_links_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHiringLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["hiring"],"summary":"List Hiring Links","operationId":"list_hiring_links_hiring_links_get","parameters":[{"name":"form_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/links/{code}":{"delete":{"tags":["hiring"],"summary":"Deactivate Hiring Link","operationId":"deactivate_hiring_link_hiring_links__code__delete","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/links/{code}/reactivate":{"post":{"tags":["hiring"],"summary":"Reactivate Hiring Link","description":"Deactivation used to be one-way, which made a mis-tap permanent — an\nowner could kill a link embedded on their site with no way back.","operationId":"reactivate_hiring_link_hiring_links__code__reactivate_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/automation/{form_id}":{"get":{"tags":["hiring"],"summary":"Get Automation Config","operationId":"get_automation_config_hiring_automation__form_id__get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["hiring"],"summary":"Update Automation Config","operationId":"update_automation_config_hiring_automation__form_id__put","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAutomationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/board/{form_id}":{"get":{"tags":["hiring"],"summary":"Hiring Board","description":"Kanban data: candidates grouped by canonical stage.","operationId":"hiring_board_hiring_board__form_id__get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/funnel/{form_id}":{"get":{"tags":["hiring"],"summary":"Hiring Funnel","description":"Funnel analytics: visits → applies → screened → trial → offer → hired,\nplus per-source breakdown and time-to-hire.","operationId":"hiring_funnel_hiring_funnel__form_id__get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/submission/{submission_id}/advance":{"post":{"tags":["hiring"],"summary":"Manual Advance","description":"Owner advances a candidate in 'review' to the next automated step.","operationId":"manual_advance_hiring_submission__submission_id__advance_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/submission/{submission_id}/reject":{"post":{"tags":["hiring"],"summary":"Manual Reject","operationId":"manual_reject_hiring_submission__submission_id__reject_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"string","title":"Submission Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualDecisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/hiring/overview":{"get":{"tags":["hiring"],"summary":"Hiring Overview","description":"Owner home for hiring: all forms with funnel topline + links.","operationId":"hiring_overview_hiring_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/format-lab/start":{"post":{"tags":["format-lab"],"summary":"Start Experiment","description":"Start a test for the caller. A creator may run a SLATE of up to\n_MAX_ACTIVE_SLATE concurrent tests (#14) — 409-with-coaching only when that\ncap is hit. Each start can carry an open-ended angle_tag in addition to the\nformat enum.","operationId":"start_experiment_marketer_format_lab_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/format-lab":{"get":{"tags":["format-lab"],"summary":"Get Format Lab","description":"Resolve every active experiment lazily, then return the current state:\n{active, slate, history, suggestion, counters}. `active` is the most-recent\nstill-active test (legacy single-variation shape, preserved); `slate` is the\nfull list of up to _MAX_ACTIVE_SLATE active tests (#14). Never 500s.","operationId":"get_format_lab_marketer_format_lab_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/format-lab/cancel":{"post":{"tags":["format-lab"],"summary":"Cancel Experiment","description":"Cancel a test so the creator is never stuck. With an experiment_id, cancels\njust that slate entry; without one, cancels ALL active tests (legacy behaviour\nwhen there was only ever one). Marked cancelled (not deleted) to keep a light\nrecord; excluded from history (only 'resolved' shows).","operationId":"cancel_experiment_marketer_format_lab_cancel_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CancelRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/experiments/summary":{"get":{"tags":["format-lab"],"summary":"Owner Experiments Summary","description":"The 'your creators' winning styles this month' card — which content formats\nbeat baseline across the roster, sample-gated, tenant-scoped to the owner's\nactive company. No single creator's raw test is exposed; only per-format\naggregates.","operationId":"owner_experiments_summary_owner_experiments_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/experiments/broadcast":{"post":{"tags":["format-lab"],"summary":"Owner Broadcast Format","description":"Broadcast a format as the recommended Style Lab test for the whole roster\n(#8). Seeds a tenant-scoped `format_lab_broadcasts` doc that _suggest_format\nprefers, so the owner's roster-wide read flows straight into every creator's\nnext suggested test. Idempotent per (company_id, format): re-broadcasting the\nsame format just refreshes it and supersedes any prior active broadcast.","operationId":"owner_broadcast_format_owner_experiments_broadcast_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/passport":{"get":{"tags":["growth"],"summary":"Get My Passport","description":"The authenticated creator's portable, cross-company Creator Passport plus\ntheir signed Proof-of-Work badges.","operationId":"get_my_passport_marketer_passport_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/waiting-summary":{"get":{"tags":["growth"],"summary":"Get Waiting Summary","description":"#11 — the creator's own CROSS-BRAND 'Waiting for you': every APPROVED, not-held\npayout that hasn't been received yet, aggregated per brand + a grand total.\n\nThis is the in-app twin of the money-waiting email cron (scheduler.py's\nsend_money_waiting_nudges): both read the SAME `payout_records` rows at\nstatus='pending_payment' (approved & releasable but not yet paid out), so a\nreturning creator sees in-app exactly the total the email promised — no\nfabricated numbers, every figure is a real approved payout.\n\nMulti-tenant: STRICTLY self-scoped. Every row is matched on the caller's own\nsession-derived marketer_id (their account _id) — the one legitimate\ncross-company read (a creator's own money spans the brands THEY create for),\nnever another creator's or another tenant's data.","operationId":"get_waiting_summary_marketer_waiting_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/reward-pools/preview":{"post":{"tags":["growth"],"summary":"Preview Reward Pool","description":"Owner-only: validate a payout rule, compute what it would pay at a given view\ncount, and run the tax-compliance check — all without moving money.","operationId":"preview_reward_pool_owner_reward_pools_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewardPoolPreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/badge/verify":{"post":{"tags":["public"],"summary":"Verify Badge Public Post","description":"PUBLIC: confirm a signed Proof-of-Work badge is authentic and unaltered.\nPOST the full signed envelope in the body (badges carry nested dicts that\ndon't round-trip cleanly through a query string). Returns\n{verified, claim} — the claim carries its signature so the caller can\nindependently re-verify. Exposes nothing beyond the badge's own signed claim.","operationId":"verify_badge_public_post_badge_verify_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadgeVerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["public"],"summary":"Verify Badge Public Get","description":"PUBLIC GET variant — verify a badge from URL params alone (a shareable\nverification link). The badge fields are passed flat and reassembled into the\nexact signed envelope. `metric` is a string in the URL; it's coerced to the\nnumeric form the signature was computed over (int when whole, else float),\nsince a badge signs the numeric metric, not its string rendering.","operationId":"verify_badge_public_get_badge_verify_get","parameters":[{"name":"marketer_id","in":"query","required":true,"schema":{"type":"string","title":"Marketer Id"}},{"name":"badge_id","in":"query","required":true,"schema":{"type":"string","title":"Badge Id"}},{"name":"label","in":"query","required":true,"schema":{"type":"string","title":"Label"}},{"name":"metric","in":"query","required":true,"schema":{"type":"string","title":"Metric"}},{"name":"tier","in":"query","required":true,"schema":{"type":"string","title":"Tier"}},{"name":"issued_at","in":"query","required":true,"schema":{"type":"string","title":"Issued At"}},{"name":"signature","in":"query","required":true,"schema":{"type":"string","title":"Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/invites":{"get":{"tags":["invites"],"summary":"List Invites","operationId":"list_invites_owner_invites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["invites"],"summary":"Create Invite","operationId":"create_invite_owner_invites_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/invites/{invite_id}":{"delete":{"tags":["invites"],"summary":"Revoke Invite","operationId":"revoke_invite_owner_invites__invite_id__delete","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/company/{slug}/my-access":{"get":{"tags":["invites"],"summary":"My Access","operationId":"my_access_public_company__slug__my_access_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cron/tick":{"get":{"tags":["cron"],"summary":"Cron Tick","description":"Frequent reconciliation (every ~15 min): timeouts, scans, hiring pipeline.","operationId":"cron_tick_cron_tick_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cron/refresh-views":{"get":{"tags":["cron"],"summary":"Cron Refresh Views","description":"Hourly: enroll newly-approved posts and re-fetch live view counts from the\nplatforms, mirroring the fresh numbers onto claims for every consumer.","operationId":"cron_refresh_views_cron_refresh_views_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cron/daily":{"get":{"tags":["cron"],"summary":"Cron Daily","description":"Daily jobs: trust scores, creator reminders, coaching digests.","operationId":"cron_daily_cron_daily_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cron/stats":{"get":{"tags":["cron"],"summary":"Cron Stats","description":"Nightly (midnight CST = 06:00 UTC): snapshot every creator account's\nview/follower stats via ScrapeCreators so the trend charts stay fresh.\n\nBest-effort — one account's failure never aborts the sweep; the job caps the\nnumber of accounts it pulls per run for serverless safety. No-op-safe when\nScrapeCreators isn't configured (each fetch just returns unavailable).","operationId":"cron_stats_cron_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cron/weekly":{"get":{"tags":["cron"],"summary":"Cron Weekly","description":"Weekly digests for owners + the hiring summary.","operationId":"cron_weekly_cron_weekly_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/official-stats/updated":{"post":{"tags":["internal"],"summary":"Official Stats Updated","description":"Event-driven milestone re-eval: mirror a pushed official view count onto the\nmatching (tenant-scoped) reward_claim and run the SAME auto-finalize seam the\npoller uses, so an opted-in brand's payout fires immediately.\n\nIdempotent + safe by construction (all delegated to the shared helper +\nmaybe_auto_finalize_claim):\n  * a bad/unknown ref returns 200 {\"matched\": false} — NEVER 500.\n  * a non-opted-in brand is a no-op beyond the view mirror (\"skipped\").\n  * an anomaly/hold NEVER pays (\"held\").","operationId":"official_stats_updated_internal_official_stats_updated_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficialStatsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketplace/creators":{"get":{"tags":["marketplace"],"summary":"List Creators","operationId":"list_creators_marketplace_creators_get","parameters":[{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"niche","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche"}},{"name":"min_views","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Min Views"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketplace/creator/{username}":{"get":{"tags":["marketplace"],"summary":"Public Creator Profile","description":"PUBLIC (no auth) verifiable creator resume — the page anyone can view at\ndeo.so/creator/{username}. Returns the marketplace profile PLUS the\ncross-company Creator Passport and signed Proof-of-Work badges.\n\nOnly creators who explicitly opted into the marketplace are exposed. Nothing\nhere is tenant-scoped data — it is the creator's OWN aggregated, portable\ntrack record (the one legitimate cross-company read, keyed by creator\nidentity, same as the self passport).","operationId":"public_creator_profile_marketplace_creator__username__get","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","title":"Username"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketplace/contact":{"post":{"tags":["marketplace"],"summary":"Contact Creator","description":"A brand owner invites a marketplace creator. Records the outreach and\ndrops it in the creator's inbox so it's a real, persisted touch — not a\nfire-and-forget button. (Reaching a creator only requires that they've made\nthemselves visible on the marketplace.)","operationId":"contact_creator_marketplace_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketplaceContactRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/marketplace/visibility":{"get":{"tags":["marketplace"],"summary":"Get Visibility","operationId":"get_visibility_marketer_marketplace_visibility_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["marketplace"],"summary":"Set Visibility","operationId":"set_visibility_marketer_marketplace_visibility_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/studio":{"get":{"tags":["ai-studio"],"summary":"List Tools","operationId":"list_tools_ai_studio_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ai/studio/flow/{path}":{"get":{"tags":["ai-studio"],"summary":"Run Flow","operationId":"run_flow_ai_studio_flow__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ai-studio"],"summary":"Run Flow","operationId":"run_flow_ai_studio_flow__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/studio/upload-file":{"post":{"tags":["ai-studio"],"summary":"Upload Studio File","description":"Multipart passthrough for a real video FILE → deo-ai ingest/upload-file.\n\nrun_flow only forwards JSON; a file needs its own multipart forward. deo-ai\nstores it on S3 and runs the real transcribe→analyze→b-roll pipeline inline,\nreturning a job that's ready for review.","operationId":"upload_studio_file_ai_studio_upload_file_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_studio_file_ai_studio_upload_file_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/studio/{tool}":{"post":{"tags":["ai-studio"],"summary":"Run Tool","operationId":"run_tool_ai_studio__tool__post","parameters":[{"name":"tool","in":"path","required":true,"schema":{"type":"string","title":"Tool"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/developer/keys":{"get":{"tags":["developer"],"summary":"Get Api Keys","description":"Return this brand's public client_id + whether a secret is set (never the\nsecret itself — that's shown only once, at generation).","operationId":"get_api_keys_owner_developer_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/developer/whitelabel":{"get":{"tags":["developer"],"summary":"Get Whitelabel","description":"Whitelabel state for this brand: whether it's enabled + whether the plan\nallows it (it's a paid-plan feature).","operationId":"get_whitelabel_owner_developer_whitelabel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["developer"],"summary":"Set Whitelabel","description":"Turn whitelabel on/off (removes the 'Powered by Favente' mark on the hosted\nUGC page). Paid-plan only — a free brand gets a 402 pointing at billing.","operationId":"set_whitelabel_owner_developer_whitelabel_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhitelabelRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/developer/test-event":{"post":{"tags":["developer"],"summary":"Send Test Event","description":"Fire a sample `ugc.request.verified` to this brand's configured webhooks so\na developer can verify their integration (signature + payload shape) in one\nsitting, without waiting on a real submission. Marked test:true so a handler\ncan no-op it.","operationId":"send_test_event_owner_developer_test_event_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/developer/keys/rotate":{"post":{"tags":["developer"],"summary":"Rotate Api Keys","description":"Generate a fresh client_id + secret key. The secret is returned ONCE — the\nbrand must store it now; we keep only a hash. Rotating invalidates the old key.","operationId":"rotate_api_keys_owner_developer_keys_rotate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/developer/attribution":{"get":{"tags":["developer"],"summary":"Developer Attribution","description":"Brand-facing attribution + funnel dashboard data (owner session).","operationId":"developer_attribution_owner_developer_attribution_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/creators/{external_user_id}":{"get":{"tags":["public-api"],"summary":"Api Get Creator","description":"Look up the Favente creator linked to one of YOUR app users. Returns their\ntier/XP/earnings so you can activate rewards in your software. `linked: false`\nwhen that user hasn't become a creator (yet).","operationId":"api_get_creator_v1_creators__external_user_id__get","parameters":[{"name":"external_user_id","in":"path","required":true,"schema":{"type":"string","title":"External User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/link":{"post":{"tags":["public-api"],"summary":"Api Link User","description":"Server-side link: tie one of your app users (external_user_id) to a Favente\ncreator you already know the email of. Only links a creator who is a member of\nYOUR program. Use this when you can't route them through the embed join flow.","operationId":"api_link_user_v1_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/events":{"post":{"tags":["public-api"],"summary":"Api Ingest Events","description":"Ingest host-app usage events keyed by external_user_id. These power the\ncorrelation between how your users USE your software and how they perform as\nUGC creators. Accepts a batch (max 200). Unknown users are still recorded —\nthey may link later.","operationId":"api_ingest_events_v1_events_post","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UsageEvent"},"type":"array","title":"Events"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pixel":{"post":{"tags":["public-api"],"summary":"Pixel Ingest","description":"Ingest one first-party pixel event (pageview / identify / custom). Called\ncross-origin via sendBeacon (text/plain, no preflight). Fire-and-forget: we\nalways 200 so a client never sees an error. On `identify`, stitch the\nanonymous visitor to the brand's app user id — that's what later ties the\nwhole funnel (anonymous visitor → app user → creator) together.","operationId":"pixel_ingest_v1_pixel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pixel/{client_id}.js":{"get":{"tags":["pixel"],"summary":"Pixel Js","description":"Serve the brand's first-party pixel. 404 for an unknown pixel id.","operationId":"pixel_js_pixel__client_id__js_get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ugc-requests":{"post":{"tags":["ugc-requests"],"summary":"Create Ugc Request","description":"Trigger a UGC request for one of your app users. Returns a short-lived\n`submit_url` to show that user (a hosted page where they submit their video +\nagree to usage rights). You'll get a `ugc.request.verified` webhook when it's\napproved — that's your cue to unlock the reward in your product.","operationId":"create_ugc_request_v1_ugc_requests_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUgcRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["ugc-requests"],"summary":"List Ugc Requests","description":"List your UGC requests (newest first). Filter by ?status=pending|submitted|\nverified|rejected|expired.","operationId":"list_ugc_requests_v1_ugc_requests_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ugc-requests/{request_id}":{"get":{"tags":["ugc-requests"],"summary":"Get Ugc Request","description":"Poll one request's status (an alternative to receiving the webhook).","operationId":"get_ugc_request_v1_ugc_requests__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ugc-requests/{request_id}/approve":{"post":{"tags":["ugc-requests"],"summary":"Approve Ugc Request","description":"Approve a submitted request. Idempotent — approving an already-verified\nrequest re-returns it without re-firing anything. Emits `ugc.request.verified`\nso your webhook can unlock the reward.","operationId":"approve_ugc_request_v1_ugc_requests__request_id__approve_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveBody","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ugc-requests/{request_id}/reject":{"post":{"tags":["ugc-requests"],"summary":"Reject Ugc Request","description":"Reject a submitted request with an encouraging coaching reason (required —\nnever a cold fail). Emits `ugc.request.rejected`.","operationId":"reject_ugc_request_v1_ugc_requests__request_id__reject_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveBody","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ugc/{token}":{"get":{"tags":["ugc-requests"],"summary":"Get Hosted Request","description":"Public, token-scoped context for the hosted submit page (brief, brand,\nreward, the exact usage-rights terms). No API key — the token IS the scope.","operationId":"get_hosted_request_v1_ugc__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ugc/{token}/submit":{"post":{"tags":["ugc-requests"],"summary":"Submit Hosted Request","description":"Submit a video against a request. Requires explicit usage-rights consent;\nrecords an immutable, timestamped rights agreement bound to this exact video\nand user. If the request is `auto_approve` and the deterministic criteria\npass, it resolves (and fires the reward webhook) immediately; otherwise it\nmoves to `submitted` for the brand to approve.","operationId":"submit_hosted_request_v1_ugc__token__submit_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ugc-requests":{"get":{"tags":["ugc-requests-owner"],"summary":"Owner List Ugc Requests","description":"List this brand's UGC requests for the review inbox (newest first),\nwith lightweight status counts so the UI can show a badge on 'Needs review'.","operationId":"owner_list_ugc_requests_owner_ugc_requests_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ugc-requests/{request_id}/approve":{"post":{"tags":["ugc-requests-owner"],"summary":"Owner Approve Ugc Request","description":"Approve a submission from the app UI. Emits ugc.request.verified so the\nbrand's webhook unlocks the reward. Idempotent.","operationId":"owner_approve_ugc_request_owner_ugc_requests__request_id__approve_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveBody","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/ugc-requests/{request_id}/reject":{"post":{"tags":["ugc-requests-owner"],"summary":"Owner Reject Ugc Request","description":"Reject a submission with an encouraging coaching reason (required — never a\ncold fail). Emits ugc.request.rejected.","operationId":"owner_reject_ugc_request_owner_ugc_requests__request_id__reject_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveBody","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/campaign-wallets":{"get":{"tags":["campaign-wallets"],"summary":"List Wallets","operationId":"list_wallets_owner_campaign_wallets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["campaign-wallets"],"summary":"Create Wallet","operationId":"create_wallet_owner_campaign_wallets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWallet"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/campaign-wallets/{wallet_id}":{"patch":{"tags":["campaign-wallets"],"summary":"Adjust Wallet","description":"Top up the budget, raise the cap, or open/close the wallet. Topping up a\ndepleted wallet re-opens it if it now has headroom again.","operationId":"adjust_wallet_owner_campaign_wallets__wallet_id__patch","parameters":[{"name":"wallet_id","in":"path","required":true,"schema":{"type":"string","title":"Wallet Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustWallet"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/campaign-wallets":{"get":{"tags":["campaign-wallets"],"summary":"Api List Wallets","description":"List campaign wallets via the keyed API (so the brand's product can pick a\nwallet to attach when creating a UGC request).","operationId":"api_list_wallets_v1_campaign_wallets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/treasury":{"get":{"tags":["treasury"],"summary":"Get Treasury","description":"The brand's treasury snapshot for the dashboard. Also a catch-all seed point:\nif the program has cleared the gate but the $100 credit wasn't granted yet (e.g.\nan approval that predated this feature), grant it on read. Read-only otherwise.","operationId":"get_treasury_owner_treasury_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/payout-autonomy":{"get":{"tags":["payout-autonomy"],"summary":"Get Payout Autonomy","operationId":"get_payout_autonomy_owner_payout_autonomy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["payout-autonomy"],"summary":"Set Payout Autonomy","description":"Set (or clear) the auto-approve control on the owner's OWN company. Tenant-\nscoped write; sets nothing else. Safe by construction (see module docstring).","operationId":"set_payout_autonomy_owner_payout_autonomy_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPayoutAutonomy"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/onboarding-strategy":{"get":{"tags":["competitor-strategy"],"summary":"Get Onboarding Strategy","description":"Return the brand's cached competitor-informed strategy (or {available:false}).","operationId":"get_onboarding_strategy_owner_onboarding_strategy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/onboarding-strategy/generate":{"post":{"tags":["competitor-strategy"],"summary":"Generate Onboarding Strategy","description":"Generate + cache the strategy once. Idempotent + cost-bounded: if one is already\ncached it's returned as-is (no second AI call). Fail-closed: returns\n{available:false} when the model is unconfigured or nothing could be grounded.","operationId":"generate_onboarding_strategy_owner_onboarding_strategy_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/mcp/keys":{"get":{"tags":["mcp-developer"],"summary":"List Mcp Keys","description":"List this brand's MCP/developer API keys (metadata only; never the secret).\nAlso reports whether the brand is on a paid plan (the UI gates minting on it).","operationId":"list_mcp_keys_owner_mcp_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["mcp-developer"],"summary":"Create Mcp Key","description":"Mint a new MCP/developer API key. Paid-plan gated. The plaintext key is\nreturned ONCE here and never again — only a SHA-256 hash is stored. Tenant-\nscoped to the active company.","operationId":"create_mcp_key_owner_mcp_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/mcp/keys/{key_id}":{"delete":{"tags":["mcp-developer"],"summary":"Revoke Mcp Key","description":"Revoke an MCP/developer API key. Tenant-scoped: the match is bound to the\nactive company, so an owner can never revoke another tenant's key even by id.","operationId":"revoke_mcp_key_owner_mcp_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/mcp/config":{"get":{"tags":["mcp-developer"],"summary":"Mcp Client Config","description":"Return the MCP client config JSON an owner pastes into Claude Code / Codex\nCLI, wired to this brand's Favente MCP server. The URL is the real streaming\nMCP-protocol endpoint (the `favente-mcp` sidecar), which proxies to the keyed\nREST tools here. Owner-authed so it reflects the active company; carries no\nsecret (the key is minted separately and the owner substitutes it).","operationId":"mcp_client_config_owner_mcp_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/mcp":{"get":{"tags":["mcp-api"],"summary":"Mcp Root","description":"Discovery: the tools this key can call and their credit costs. Keyed +\npaid-gated (so an unpaid/invalid key gets 401/402 even here).","operationId":"mcp_root_api_v1_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/mcp/tools/generate_script":{"post":{"tags":["mcp-api"],"summary":"Tool Generate Script","operationId":"tool_generate_script_api_v1_mcp_tools_generate_script_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptToolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/tools/generate_captions":{"post":{"tags":["mcp-api"],"summary":"Tool Generate Captions","operationId":"tool_generate_captions_api_v1_mcp_tools_generate_captions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptionsToolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/tools/generate_ideas":{"post":{"tags":["mcp-api"],"summary":"Tool Generate Ideas","operationId":"tool_generate_ideas_api_v1_mcp_tools_generate_ideas_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdeasToolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/tools/generate_hooks":{"post":{"tags":["mcp-api"],"summary":"Tool Generate Hooks","operationId":"tool_generate_hooks_api_v1_mcp_tools_generate_hooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HooksToolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/tools/brand_safety_check":{"post":{"tags":["mcp-api"],"summary":"Tool Brand Safety","operationId":"tool_brand_safety_api_v1_mcp_tools_brand_safety_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandSafetyToolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/tools/score_hook":{"post":{"tags":["mcp-api"],"summary":"Tool Score Hook","description":"Instant hook scoring (0-100 + coaching). Runs the backend's own Claude\nscorer (orchestra.ai_coach) directly — no deo-ai hop — and meters 1 credit\nthrough the same billing path so a keyed call is billed like an in-app run.","operationId":"tool_score_hook_api_v1_mcp_tools_score_hook_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreHookToolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/tools/generate_video":{"post":{"tags":["mcp-api"],"summary":"Tool Generate Video","description":"Kick off a real AI video render (the expensive deo-ai path). Bills the\n10-credit render fee ONLY when a render actually started — mirroring the\nstudio's run_flow render accounting so a keyed call can't render for 1 credit\nor double-bill a no-op.","operationId":"tool_generate_video_api_v1_mcp_tools_generate_video_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoToolRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/love/note":{"post":{"tags":["product-love"],"summary":"Submit Love Note","description":"A creator writes how they feel about the brand's product. Tenant-scoped,\nrate-limited, sanitized. Fires deterministic love-theme extraction inline.","operationId":"submit_love_note_marketer_love_note_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoveNoteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/love/prompt":{"get":{"tags":["product-love"],"summary":"Love Prompt","description":"Whether/what to show at a capture moment, and if the creator already\nanswered for this source recently (so the UI self-hides).","operationId":"love_prompt_marketer_love_prompt_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"manual","title":"Source"}},{"name":"company_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/love/index":{"get":{"tags":["product-love"],"summary":"Owner Love Index","description":"The brand's Product-Love Index + sub-scores + feature love + virality\ndrivers. Tenant-scoped to the owner's active company.","operationId":"owner_love_index_owner_love_index_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/love/advocates":{"get":{"tags":["product-love"],"summary":"Owner Love Advocates","description":"From the per-creator love profiles: TOP ADVOCATES (spotlight / testimonial\ncandidates — high love + would-recommend) and AT-RISK lovers (they expressed\nlove but their loyalty is decaying — worth a nudge). Tenant-scoped.","operationId":"owner_love_advocates_owner_love_advocates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/love/audience":{"get":{"tags":["product-love"],"summary":"Owner Love Audience","description":"Audience-sentiment corroboration — how the creators' actual audiences respond\nto their posts about the brand (external evidence the expressed love is real).\nEnv-gated + fail-closed. Tenant-scoped.","operationId":"owner_love_audience_owner_love_audience_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/love/roadmap":{"get":{"tags":["product-love"],"summary":"Owner Love Roadmap","description":"Prioritised product roadmap — the loved features that statistically\ncorrelate with virality (verified breakouts), ranked with evidence. FLIC math,\ntenant-scoped, sample-gated + causation caveat.","operationId":"owner_love_roadmap_owner_love_roadmap_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/love/predict/roadmap-correlation":{"get":{"tags":["product-love"],"summary":"Owner Love Roadmap Correlation","description":"Raw FLIC output — per-feature love↔performance correlation (r, p-value, rate\nratio, group means, sample counts). The glass-box behind the roadmap. Also\ncarries the brand-love theme correlation (source-labeled) additively.","operationId":"owner_love_roadmap_correlation_owner_love_predict_roadmap_correlation_get","parameters":[{"name":"metric","in":"query","required":false,"schema":{"type":"string","default":"breakout","title":"Metric"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/love/content-voice":{"get":{"tags":["product-love"],"summary":"Owner Love Content Voice","description":"What creators actually say about the product IN THEIR CONTENT — the\nunfiltered, naturalistic language, from stored claim analysis. Tenant-scoped.","operationId":"owner_love_content_voice_owner_love_content_voice_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/love/trajectories":{"get":{"tags":["product-love"],"summary":"Owner Love Trajectories","description":"Ember predictions — creators to SAVE (high churn risk) and to LEAN INTO\n(high virality potential), each with glass-box per-factor reasons. Tenant-scoped.","operationId":"owner_love_trajectories_owner_love_trajectories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/love/trend":{"get":{"tags":["product-love"],"summary":"Owner Love Trend","description":"Weekly Product-Love Index series (from the product_love_index snapshots) so\nthe owner can see the compounding trend — the persuasive signal. Tenant-scoped.","operationId":"owner_love_trend_owner_love_trend_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/love/playbook":{"get":{"tags":["product-love"],"summary":"Owner Love Playbook","description":"Just the learnings + sequenced playbook (what users love / how to improve /\nhow to make it more viral).","operationId":"owner_love_playbook_owner_love_playbook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/marketer/moments/next":{"get":{"tags":["love-moments"],"summary":"Moments Next","operationId":"moments_next_marketer_moments_next_get","parameters":[{"name":"event","in":"query","required":true,"schema":{"type":"string","title":"Event"}},{"name":"claim_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/moments/respond":{"post":{"tags":["love-moments"],"summary":"Moments Respond","operationId":"moments_respond_marketer_moments_respond_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentResponseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketer/moments/dismiss":{"post":{"tags":["love-moments"],"summary":"Moments Dismiss","operationId":"moments_dismiss_marketer_moments_dismiss_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentDismissRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/moments/config":{"get":{"tags":["love-moments"],"summary":"Get Moments Config","operationId":"get_moments_config_owner_moments_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["love-moments"],"summary":"Upsert Moments Config","operationId":"upsert_moments_config_owner_moments_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentQuestionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/moments/config/{qid}":{"delete":{"tags":["love-moments"],"summary":"Delete Moments Question","operationId":"delete_moments_question_owner_moments_config__qid__delete","parameters":[{"name":"qid","in":"path","required":true,"schema":{"type":"string","title":"Qid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/moments/insights":{"get":{"tags":["love-moments"],"summary":"Get Moments Insights","operationId":"get_moments_insights_owner_moments_insights_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/love/model":{"get":{"tags":["love-model"],"summary":"Owner Love Model","description":"Both learned love equations (advocacy + breakout), refreshed if stale.\nTenant-scoped to the owner's active company.","operationId":"owner_love_model_owner_love_model_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/love/model/elasticity":{"get":{"tags":["love-model"],"summary":"Owner Love Model Elasticity","description":"The actionable levers for one target — 'raise retention by 10 points → +X\nadvocate share'. Tenant-scoped.","operationId":"owner_love_model_elasticity_owner_love_model_elasticity_get","parameters":[{"name":"target","in":"query","required":false,"schema":{"type":"string","default":"advocacy","title":"Target"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/love/model/card":{"get":{"tags":["love-model"],"summary":"Owner Love Model Card","description":"The model cards (both targets) — class balance, features used/dropped/\nexcluded, calibration, limitations, and the narrative. Tenant-scoped.","operationId":"owner_love_model_card_owner_love_model_card_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/sections":{"get":{"tags":["section-scorecard"],"summary":"Get Sections","operationId":"get_sections_owner_sections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["section-scorecard"],"summary":"Replace Sections","operationId":"replace_sections_owner_sections_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionsUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/sections/scorecard":{"get":{"tags":["section-scorecard"],"summary":"Get Scorecard","operationId":"get_scorecard_owner_sections_scorecard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/sections/trend":{"get":{"tags":["section-scorecard"],"summary":"Get Trend","operationId":"get_trend_owner_sections_trend_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/sections/{key}/evidence":{"get":{"tags":["section-scorecard"],"summary":"Get Section Evidence","operationId":"get_section_evidence_owner_sections__key__evidence_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/love/digest/settings":{"get":{"tags":["love-digest"],"summary":"Owner Get Digest Settings","description":"Current digest settings + Slack-connected state + last weekly send. Tenant-scoped.","operationId":"owner_get_digest_settings_owner_love_digest_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["love-digest"],"summary":"Owner Save Digest Settings","description":"Partial settings update. Only provided keys change; `clear_channel_override`\nexplicitly clears the override (None means 'omitted'). Tenant-scoped.","operationId":"owner_save_digest_settings_owner_love_digest_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DigestSettingsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/love/digest/test":{"post":{"tags":["love-digest"],"summary":"Owner Send Test Digest","description":"Send a one-off test digest now (bypasses weekly idempotency AND the enabled\nflag; still honors channel_override). Rate-limited 3/day. Tenant-scoped.","operationId":"owner_send_test_digest_owner_love_digest_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/brand/playbook":{"get":{"tags":["brand-playbook"],"summary":"Get Brand Playbook","description":"Latest playbook version, or a friendly empty-state listing exactly what\ndata unlocks it. Never generates — generation does external work and lives\non POST /generate. Tenant-scoped to the owner's active company.","operationId":"get_brand_playbook_owner_brand_playbook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/brand/playbook/generate":{"post":{"tags":["brand-playbook"],"summary":"Generate Brand Playbook","description":"Regenerate the playbook: assemble all six sections from the reused\ncomputes, allocate version = max+1 (the UNIQUE (company_id, version) index\nbacks the race; one bounded retry on DuplicateKeyError), freeze the diff vs\nthe previous version, insert. Rate-limited per company; a failed unlock gate\nreturns a coached empty-state, never a cold refusal.","operationId":"generate_brand_playbook_owner_brand_playbook_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/brand/playbook/versions":{"get":{"tags":["brand-playbook"],"summary":"List Brand Playbook Versions","description":"Version history, newest first, capped. Light list: sections are excluded\nby projection; sorting happens in Python (FakeDatabase-friendly).","operationId":"list_brand_playbook_versions_owner_brand_playbook_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/brand/playbook/versions/{version}":{"get":{"tags":["brand-playbook"],"summary":"Get Brand Playbook Version","description":"One full stored version, verbatim (frozen sections + diff) — what the\nbrand identity was at that point in time. Path param is typed int by FastAPI\n(no injection surface).","operationId":"get_brand_playbook_version_owner_brand_playbook_versions__version__get","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/improvements":{"get":{"tags":["improvement-engine"],"summary":"Get Improvements","operationId":"get_improvements_owner_improvements_get","parameters":[{"name":"include_dismissed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Dismissed"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/improvements/{item_id}/status":{"post":{"tags":["improvement-engine"],"summary":"Set Improvement Status","operationId":"set_improvement_status_owner_improvements__item_id__status_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImprovementStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/improvements/{item_id}/impact":{"get":{"tags":["improvement-engine"],"summary":"Get Improvement Impact","operationId":"get_improvement_impact_owner_improvements__item_id__impact_get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/virality/genome":{"get":{"tags":["virality-genome"],"summary":"Owner Virality Genome","description":"The ranked Virality Genome: baseline, the strongest reliable trait lifts,\nthe authenticity effect, and the breakout recipe. Tenant-scoped to the\nowner's active company.","operationId":"owner_virality_genome_owner_virality_genome_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/virality/genome/traits":{"get":{"tags":["virality-genome"],"summary":"Owner Virality Genome Traits","description":"The FULL glass-box trait table — every trait value across every dimension,\nincluding the ones that failed gating (marked early_signal, never hidden).\nServed from the same snapshot as /genome so the two views never disagree.\n?dimension= is validated against the Python-side whitelist (static dims +\nthis company's own feature:<key> dims); user input never reaches Mongo.","operationId":"owner_virality_genome_traits_owner_virality_genome_traits_get","parameters":[{"name":"dimension","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimension"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/owner/representation":{"get":{"tags":["creator-representation"],"summary":"Owner Representation","description":"The full Creator Representation Insights readout: the ranked 'what your\ncreators care most about' table (distinct-creator-weighted features/topics\nthey voluntarily represent), the view-weighted lift per aspect, the\ntopic/angle/format tilt, and the resonance gaps. Tenant-scoped to the owner's\nactive company via _require_owner.","operationId":"owner_representation_owner_representation_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/owner/representation/detail":{"get":{"tags":["creator-representation"],"summary":"Owner Representation Detail","description":"The FULL glass-box evidence table — EVERY represented feature/topic/format\naspect, including the ones that failed sample gating (marked early_signal,\nshown, never hidden), each with its distinct-creator count, view-weighted\nlift, CI, per-creator vs per-post frequency split, and the honest gate reason.\nServed from the same snapshot as the summary so the two views never disagree.\n?kind= is validated against a Python-side whitelist — user input never reaches\nMongo.","operationId":"owner_representation_detail_owner_representation_detail_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/creative-projects":{"get":{"tags":["creative-projects"],"summary":"List Projects","description":"List the caller's own projects in the active company, newest-touched first.","operationId":"list_projects_creative_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["creative-projects"],"summary":"Create Project","description":"Create one durable project owned by the caller inside the active company.","operationId":"create_project_creative_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/creative-projects/{project_id}":{"get":{"tags":["creative-projects"],"summary":"Get Project","description":"Resume one project the caller owns.","operationId":"get_project_creative_projects__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["creative-projects"],"summary":"Patch Project","description":"Update bounded project metadata under optimistic concurrency.\n\nThe write is one atomic compare-and-set on ``version``. A stale\n``expected_version`` returns 409 with the current version and changes\nNOTHING — the second tab is told to reload rather than silently winning.","operationId":"patch_project_creative_projects__project_id__patch","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/creative-projects/{project_id}/artifacts":{"post":{"tags":["creative-projects"],"summary":"Append Artifact","description":"Append one typed, versioned artifact with provenance.\n\nAppend-only: a revision is a new artifact that may name\n``supersedes_artifact_id``; the superseded artifact stays readable forever.\nWhen ``idempotency_key`` is supplied, a retry returns the artifact the first\ncall stored instead of appending a second one — the uniqueness is enforced by\na partial unique index, so two concurrent retries cannot both win.","operationId":"append_artifact_creative_projects__project_id__artifacts_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtifactCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["creative-projects"],"summary":"List Artifacts","description":"Read the project's artifact history in deterministic chronological order.","operationId":"list_artifacts_creative_projects__project_id__artifacts_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AIPreferencesRequest":{"properties":{"ai_learning_opt_out":{"type":"boolean","title":"Ai Learning Opt Out"}},"type":"object","required":["ai_learning_opt_out"],"title":"AIPreferencesRequest"},"AccountLinksRequest":{"properties":{"account_urls":{"additionalProperties":{"type":"string"},"type":"object","title":"Account Urls"}},"type":"object","required":["account_urls"],"title":"AccountLinksRequest"},"AdReuseConsentRequest":{"properties":{"ad_reuse_consent":{"type":"boolean","title":"Ad Reuse Consent"}},"type":"object","required":["ad_reuse_consent"],"title":"AdReuseConsentRequest","description":"Explicit creator consent to let a brand boost their content as a PAID ad."},"AddRewardRequest":{"properties":{"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"amount":{"type":"string","title":"Amount"}},"type":"object","required":["title","description","amount"],"title":"AddRewardRequest"},"AddSubmissionNoteRequest":{"properties":{"note":{"type":"string","title":"Note"}},"type":"object","required":["note"],"title":"AddSubmissionNoteRequest"},"AddSubmissionScorecardRequest":{"properties":{"rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating"},"strengths":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Strengths"},"concerns":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Concerns"},"recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendation"}},"type":"object","title":"AddSubmissionScorecardRequest"},"AdjustWallet":{"properties":{"add_budget_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Add Budget Cents"},"set_max_submissions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Set Max Submissions"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"AdjustWallet"},"AnalyzeDraftRequest":{"properties":{"draft_type":{"type":"string","title":"Draft Type"},"content":{"type":"string","title":"Content"},"platform":{"type":"string","title":"Platform","default":"tiktok"}},"type":"object","required":["draft_type","content"],"title":"AnalyzeDraftRequest"},"ApplyViaLinkRequest":{"properties":{"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"portfolio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portfolio"},"cover_letter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Letter"},"availability":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Availability"},"relevant_experience":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Relevant Experience"},"tiktok":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiktok"},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram"},"youtube":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Youtube"},"followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Followers"}},"type":"object","required":["full_name","email"],"title":"ApplyViaLinkRequest"},"ApproveRequest":{"properties":{"drop_id":{"type":"string","title":"Drop Id"}},"type":"object","required":["drop_id"],"title":"ApproveRequest"},"ArtifactCreate":{"properties":{"kind":{"type":"string","title":"Kind"},"schema_name":{"type":"string","title":"Schema Name"},"schema_version":{"type":"integer","minimum":1.0,"title":"Schema Version","default":1},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"basis_artifact_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Basis Artifact Ids"},"supersedes_artifact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supersedes Artifact Id"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"}},"additionalProperties":false,"type":"object","required":["kind","schema_name"],"title":"ArtifactCreate"},"AssetIn":{"properties":{"kind":{"type":"string","title":"Kind"},"title":{"type":"string","title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"category":{"type":"string","title":"Category","default":"other"},"published":{"type":"boolean","title":"Published","default":true}},"type":"object","required":["kind","title"],"title":"AssetIn"},"AssetPatch":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Published"}},"type":"object","title":"AssetPatch"},"AvatarRequest":{"properties":{"image":{"type":"string","title":"Image"},"company_slug":{"type":"string","title":"Company Slug","default":""},"role":{"type":"string","title":"Role","default":""}},"type":"object","required":["image"],"title":"AvatarRequest"},"BadgeVerifyRequest":{"properties":{"marketer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Marketer Id"},"badge":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Badge"},"issued_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issued At"},"signature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signature"}},"type":"object","title":"BadgeVerifyRequest"},"Body_submit_application_applications__form_id__submit_post":{"properties":{"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","title":"Email"},"phone":{"type":"string","title":"Phone"},"linkedin":{"type":"string","title":"Linkedin"},"portfolio":{"type":"string","title":"Portfolio"},"cover_letter":{"type":"string","title":"Cover Letter"},"availability":{"type":"string","title":"Availability"},"relevant_experience":{"type":"string","title":"Relevant Experience"},"company_slug":{"type":"string","title":"Company Slug"},"resume":{"type":"string","contentMediaType":"application/octet-stream","title":"Resume"}},"type":"object","required":["full_name","email","phone"],"title":"Body_submit_application_applications__form_id__submit_post"},"Body_submit_feedback_feedback_post":{"properties":{"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","required":["title","message"],"title":"Body_submit_feedback_feedback_post"},"Body_upload_original_reward_video_rewards_upload_original_post":{"properties":{"video":{"type":"string","contentMediaType":"application/octet-stream","title":"Video"}},"type":"object","required":["video"],"title":"Body_upload_original_reward_video_rewards_upload_original_post"},"Body_upload_studio_file_ai_studio_upload_file_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"duration_seconds":{"type":"number","title":"Duration Seconds","default":60.0},"format":{"type":"string","title":"Format","default":"9:16"}},"type":"object","required":["file"],"title":"Body_upload_studio_file_ai_studio_upload_file_post"},"BrandLoveRequest":{"properties":{"prompt_key":{"type":"string","title":"Prompt Key"},"text":{"type":"string","title":"Text"},"consent_quote":{"type":"boolean","title":"Consent Quote","default":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","default":"prompt"}},"type":"object","required":["prompt_key","text"],"title":"BrandLoveRequest"},"BrandSafetyToolRequest":{"properties":{"content":{"type":"string","title":"Content"}},"type":"object","required":["content"],"title":"BrandSafetyToolRequest"},"BriefCheckRequest":{"properties":{"brief":{"type":"string","title":"Brief"},"platform":{"type":"string","title":"Platform","default":"tiktok"}},"type":"object","required":["brief"],"title":"BriefCheckRequest"},"BroadcastRequest":{"properties":{"format":{"type":"string","title":"Format"}},"type":"object","required":["format"],"title":"BroadcastRequest"},"BudgetOptimizeRequest":{"properties":{"budget_usd":{"type":"number","title":"Budget Usd"},"goal":{"type":"string","title":"Goal","default":"awareness"},"can_track_sales":{"type":"boolean","title":"Can Track Sales","default":false}},"type":"object","required":["budget_usd"],"title":"BudgetOptimizeRequest"},"CampaignCreateRequest":{"properties":{"name":{"type":"string","title":"Name"},"message":{"type":"string","title":"Message"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target","default":"all"},"campaign_type":{"type":"string","title":"Campaign Type","default":"standard"},"wave_deadline_hours":{"type":"integer","title":"Wave Deadline Hours","default":48},"brief_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brief Text"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled At"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"source_signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Signal"}},"type":"object","required":["name","message"],"title":"CampaignCreateRequest"},"CancelRequest":{"properties":{"experiment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Experiment Id"}},"type":"object","title":"CancelRequest"},"CaptionsRequest":{"properties":{"topic":{"type":"string","title":"Topic"},"platform":{"type":"string","title":"Platform","default":"tiktok"},"cta":{"type":"string","title":"Cta","default":"Try it via my link in bio."}},"type":"object","required":["topic"],"title":"CaptionsRequest"},"CaptionsToolRequest":{"properties":{"topic":{"type":"string","title":"Topic"},"platform":{"type":"string","title":"Platform","default":"tiktok"},"cta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta"}},"type":"object","required":["topic"],"title":"CaptionsToolRequest"},"CelebrateAckRequest":{"properties":{"type":{"type":"string","title":"Type"},"value":{"type":"integer","title":"Value"}},"type":"object","required":["type","value"],"title":"CelebrateAckRequest"},"ChallengeCreateRequest":{"properties":{"title":{"type":"string","maxLength":120,"minLength":3,"title":"Title"},"description":{"type":"string","maxLength":1000,"title":"Description","default":""},"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms"},"metric":{"type":"string","enum":["views","engagement"],"title":"Metric","default":"views"},"top_n":{"type":"integer","title":"Top N","default":1},"reward_amount":{"type":"string","title":"Reward Amount","default":"$100"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"}},"type":"object","required":["title"],"title":"ChallengeCreateRequest"},"ChallengeSubmissionRequest":{"properties":{"platform":{"type":"string","enum":["tiktok","instagram","youtube"],"title":"Platform"},"post_url":{"type":"string","maxLength":1000,"minLength":8,"title":"Post Url"},"views":{"type":"integer","title":"Views","default":0},"likes":{"type":"integer","title":"Likes","default":0},"comments":{"type":"integer","title":"Comments","default":0}},"type":"object","required":["platform","post_url"],"title":"ChallengeSubmissionRequest"},"ChatRequest":{"properties":{"message":{"type":"string","title":"Message"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","required":["message"],"title":"ChatRequest"},"CheckoutRequest":{"properties":{"annual":{"type":"boolean","title":"Annual","default":false},"plan":{"type":"string","title":"Plan","default":"flex"}},"type":"object","title":"CheckoutRequest"},"ClaimRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"claimed_views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Claimed Views"},"claimed_likes":{"type":"integer","title":"Claimed Likes","default":0},"claimed_comments":{"type":"integer","title":"Claimed Comments","default":0},"reward_tier":{"type":"string","title":"Reward Tier"},"claim_scope":{"type":"string","title":"Claim Scope","default":"cumulative"},"content_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Format"},"original_video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Video Url"},"original_video_fingerprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Video Fingerprint"},"original_video_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Original Video Bytes"},"original_video_content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Video Content Type"},"love_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Love Note"}},"type":"object","required":["platform","reward_tier"],"title":"ClaimRequest"},"CommentTestRequest":{"properties":{"post_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Url"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"pasted_comments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pasted Comments"}},"type":"object","title":"CommentTestRequest"},"CompetitorBriefRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"description":{"type":"string","title":"Description","default":""},"platform":{"type":"string","title":"Platform","default":"tiktok"},"niche":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche"}},"type":"object","title":"CompetitorBriefRequest"},"CompleteChallengeRequest":{"properties":{"challenge_id":{"type":"string","title":"Challenge Id"}},"type":"object","required":["challenge_id"],"title":"CompleteChallengeRequest"},"CompleteModuleRequest":{"properties":{"module_id":{"type":"string","title":"Module Id"},"gate_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Gate Data"}},"type":"object","required":["module_id"],"title":"CompleteModuleRequest"},"CompleteTaskRequest":{"properties":{"video_url":{"type":"string","title":"Video Url"}},"type":"object","required":["video_url"],"title":"CompleteTaskRequest"},"ConceptCoachRequest":{"properties":{"script":{"type":"string","title":"Script"},"feature_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Key"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"platform":{"type":"string","title":"Platform","default":"tiktok"},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}},"type":"object","required":["script"],"title":"ConceptCoachRequest"},"ConsumeAiCreditsRequest":{"properties":{"credits":{"type":"integer","title":"Credits"},"tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["credits"],"title":"ConsumeAiCreditsRequest"},"ContentItemIn":{"properties":{"title":{"type":"string","title":"Title"},"video_url":{"type":"string","title":"Video Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"rights_scope":{"type":"string","title":"Rights Scope","default":"source_only"},"rights_confirmed":{"type":"boolean","title":"Rights Confirmed","default":false}},"type":"object","required":["title","video_url"],"title":"ContentItemIn"},"ContractUpdateRequest":{"properties":{"terms":{"type":"string","title":"Terms"}},"type":"object","required":["terms"],"title":"ContractUpdateRequest"},"ConversionIn":{"properties":{"order_id":{"type":"string","title":"Order Id"},"amount":{"type":"number","title":"Amount"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"product":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"},"sig":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sig"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","default":"USD"},"post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Id"}},"type":"object","required":["order_id","amount"],"title":"ConversionIn"},"ConversionTrackRequest":{"properties":{"click_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Click Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"conversion_type":{"type":"string","title":"Conversion Type","default":"signup"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","default":"USD"},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"ConversionTrackRequest"},"CreateAdRequest":{"properties":{"video_url":{"type":"string","title":"Video Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Id"},"daily_budget_cents":{"type":"integer","title":"Daily Budget Cents","default":1000},"country":{"type":"string","title":"Country","default":"US"},"cta_type":{"type":"string","title":"Cta Type","default":"LEARN_MORE"},"link":{"type":"string","title":"Link"},"message":{"type":"string","title":"Message","default":""},"title":{"type":"string","title":"Title","default":"Try it today"}},"type":"object","required":["video_url","link"],"title":"CreateAdRequest"},"CreateApplicationFormRequest":{"properties":{"position_title":{"type":"string","title":"Position Title"},"company_name":{"type":"string","title":"Company Name"},"base_url":{"type":"string","title":"Base Url"},"publish_on_deo_jobs":{"type":"boolean","title":"Publish On Deo Jobs","default":false},"location_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Type"},"compensation_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compensation Range"},"employment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employment Type"},"role_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Summary"},"requirements":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Requirements"},"pipeline_stages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pipeline Stages"},"team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"},"send_to_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Send To Type"},"send_to_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Send To Id"}},"type":"object","required":["position_title","company_name","base_url"],"title":"CreateApplicationFormRequest","description":"Request model for creating an application form.\n\nAttributes:\n    team_id (str): ID of the team creating this form\n    position_title (str): Job position title\n    company_name (str): Company name to display on form\n    workspace_id (str): Workspace ID for Slack integration\n    send_to_type (str): \"user\" or \"channel\"\n    send_to_id (str): Slack user ID or channel ID to send applications to\n    base_url (str): Base URL for generating form link\n    publish_on_deo_jobs (bool): Whether to publish on public Deo Jobs board"},"CreateContractRequest":{"properties":{"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"email_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Subject"},"email_body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Body Html"}},"type":"object","required":["title","body"],"title":"CreateContractRequest"},"CreateHiringLinkRequest":{"properties":{"form_id":{"type":"string","title":"Form Id"},"source_name":{"type":"string","title":"Source Name"}},"type":"object","required":["form_id","source_name"],"title":"CreateHiringLinkRequest"},"CreateKeyRequest":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","title":"CreateKeyRequest"},"CreateUgcRequest":{"properties":{"external_user_id":{"type":"string","maxLength":200,"title":"External User Id"},"brief":{"type":"string","maxLength":2000,"title":"Brief","default":""},"reward":{"$ref":"#/components/schemas/RewardSpec","default":{"type":"in_app","label":""}},"criteria":{"$ref":"#/components/schemas/CriteriaSpec","default":{}},"auto_approve":{"type":"boolean","title":"Auto Approve","default":false},"ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Days"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"campaign_wallet_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Wallet Id"}},"type":"object","required":["external_user_id"],"title":"CreateUgcRequest"},"CreateWallet":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name"},"budget_cents":{"type":"integer","title":"Budget Cents","default":0},"max_submissions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Submissions"}},"type":"object","required":["name"],"title":"CreateWallet"},"CreateWorkspaceRequest":{"properties":{"username":{"type":"string","title":"Username"},"account_id":{"type":"string","title":"Account Id"},"gmail":{"type":"string","title":"Gmail","default":""},"bot_token":{"type":"string","title":"Bot Token"},"workspace_name":{"type":"string","title":"Workspace Name"},"workspace_id":{"type":"string","title":"Workspace Id"}},"type":"object","required":["username","account_id","bot_token","workspace_name","workspace_id"],"title":"CreateWorkspaceRequest","description":"Request model for creating a workspace without session authentication."},"CreateWorkspaceSimple":{"properties":{"workspace_name":{"type":"string","title":"Workspace Name"},"bot_token":{"type":"string","title":"Bot Token"},"allow_duplicate_token":{"type":"boolean","title":"Allow Duplicate Token","default":false}},"type":"object","required":["workspace_name","bot_token"],"title":"CreateWorkspaceSimple","description":"Simple workspace creation with just name and token."},"CreatorAgreementConfigRequest":{"properties":{"legal_entity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Entity Name"},"legal_entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Entity Type"},"signatory_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signatory Name"},"signatory_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signatory Title"},"governing_law_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Governing Law State"},"compensation_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compensation Model"},"flat_fee_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Flat Fee Cents"},"scope_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Title"},"scope_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Text"},"term_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Term Days"}},"type":"object","title":"CreatorAgreementConfigRequest"},"CreditsCheckoutRequest":{"properties":{"credits":{"type":"integer","title":"Credits"}},"type":"object","required":["credits"],"title":"CreditsCheckoutRequest"},"CriteriaSpec":{"properties":{"min_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Seconds"},"must_mention":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Must Mention"},"require_face":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Face"}},"type":"object","title":"CriteriaSpec"},"CurriculumStructureData":{"properties":{"modules":{"additionalProperties":true,"type":"object","title":"Modules","default":{}},"required":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Required"},"sequential_lock":{"type":"boolean","title":"Sequential Lock","default":true}},"type":"object","title":"CurriculumStructureData"},"DigestSettingsRequest":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"alerts_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Alerts Enabled"},"channel_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Override"},"clear_channel_override":{"type":"boolean","title":"Clear Channel Override","default":false}},"type":"object","title":"DigestSettingsRequest"},"DistributeRewardRequest":{"properties":{"reward_id":{"type":"string","title":"Reward Id"},"recipient_email":{"type":"string","title":"Recipient Email"},"recipient_name":{"type":"string","title":"Recipient Name"},"amount_override":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount Override"}},"type":"object","required":["reward_id","recipient_email","recipient_name"],"title":"DistributeRewardRequest"},"ExperimentsToggle":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"ExperimentsToggle"},"FeaturedLink":{"properties":{"url":{"type":"string","title":"Url"},"label":{"type":"string","title":"Label"}},"type":"object","required":["url","label"],"title":"FeaturedLink"},"FeaturedLinksRequest":{"properties":{"links":{"items":{"$ref":"#/components/schemas/FeaturedLink"},"type":"array","title":"Links"}},"type":"object","required":["links"],"title":"FeaturedLinksRequest"},"FeedCommentBody":{"properties":{"body":{"type":"string","maxLength":800,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"FeedCommentBody"},"FeedPostBody":{"properties":{"body":{"type":"string","maxLength":1500,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"FeedPostBody"},"GetChannelsRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"GetChannelsRequest","description":"Request model for retrieving Slack channels.\n\nAttributes:\n    token (str): Slack bot token for authentication (format: xoxb-...)\n\nExample:\n    {\n        \"token\": \"xoxb-your-token-here\"\n    }"},"GetUsersRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"GetUsersRequest","description":"Request model for retrieving Slack users.\n\nAttributes:\n    token (str): Slack bot token for authentication (format: xoxb-...)\n\nExample:\n    {\n        \"token\": \"xoxb-your-token-here\"\n    }"},"GoalRequest":{"properties":{"points":{"type":"integer","title":"Points"},"period":{"type":"string","title":"Period","default":"monthly"},"reward_description":{"type":"string","title":"Reward Description","default":""}},"type":"object","required":["points"],"title":"GoalRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HookScoreRequest":{"properties":{"hook":{"type":"string","title":"Hook"},"platform":{"type":"string","title":"Platform","default":"tiktok"}},"type":"object","required":["hook"],"title":"HookScoreRequest"},"HooksToolRequest":{"properties":{"topic":{"type":"string","title":"Topic"},"platform":{"type":"string","title":"Platform","default":"tiktok"}},"type":"object","required":["topic"],"title":"HooksToolRequest"},"HooksTopicRequest":{"properties":{"topic":{"type":"string","title":"Topic"}},"type":"object","required":["topic"],"title":"HooksTopicRequest"},"IdeasToolRequest":{"properties":{"topic":{"type":"string","title":"Topic"},"count":{"type":"integer","title":"Count","default":5}},"type":"object","required":["topic"],"title":"IdeasToolRequest"},"IdeationCapture":{"properties":{"feature_key":{"type":"string","title":"Feature Key"},"angle_text":{"type":"string","title":"Angle Text"},"hook_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hook Text"},"why_converts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Converts"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}},"type":"object","required":["feature_key","angle_text"],"title":"IdeationCapture"},"ImprovementStatusRequest":{"properties":{"status":{"type":"string","title":"Status"},"shipped_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipped At"}},"type":"object","required":["status"],"title":"ImprovementStatusRequest"},"InfluencerIn":{"properties":{"handle":{"type":"string","title":"Handle"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Followers"}},"type":"object","required":["handle"],"title":"InfluencerIn"},"InfluencerOnboardingRequest":{"properties":{"display_name":{"type":"string","title":"Display Name"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"niche":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Niche"},"goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goal"},"terms_accepted":{"type":"boolean","title":"Terms Accepted","default":false}},"type":"object","required":["display_name"],"title":"InfluencerOnboardingRequest","description":"Solo/individual creator (\"Influencer\") signup — no brand, no team.\n\nAn influencer runs their OWN account (going viral solo, or clipping for\npay-per-view programs). Under the hood they get a *personal* company they own\n+ a single marketer membership into it, so every existing creator tool\n(daily script, coach, studio, repurpose, passport, badges) works unchanged —\nthe personal company just carries `kind:\"personal\"` and stays `private` so it\nnever appears in the public brand directory or is joinable by strangers."},"InfluencerPatch":{"properties":{"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Followers"},"deal":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Deal"},"vet":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Vet"},"committed_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Committed Usd"}},"type":"object","title":"InfluencerPatch"},"InviteCreateRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"InviteCreateRequest"},"InviteCreatorRequest":{"properties":{"email":{"type":"string","title":"Email"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","default":""}},"type":"object","required":["email"],"title":"InviteCreatorRequest"},"LinkItem":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"}},"type":"object","required":["name","url"],"title":"LinkItem"},"LinkRequest":{"properties":{"external_user_id":{"type":"string","title":"External User Id"},"email":{"type":"string","title":"Email"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","default":"api"}},"type":"object","required":["external_user_id","email"],"title":"LinkRequest"},"LoveNoteRequest":{"properties":{"source":{"type":"string","title":"Source","default":"manual"},"love_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Love Text"},"improve_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Improve Text"},"would_recommend":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Would Recommend"},"favorite_feature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favorite Feature"},"sentiment_pick":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sentiment Pick"},"claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Id"},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}},"type":"object","title":"LoveNoteRequest"},"LoyaltyUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"weeks_required":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Weeks Required"},"step_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Step Bps"},"cap_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cap Bps"}},"type":"object","title":"LoyaltyUpdate"},"ManualDecisionRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"ManualDecisionRequest"},"MarketerCompleteRequest":{"properties":{"niche":{"type":"string","title":"Niche","default":""},"post_frequency":{"type":"string","title":"Post Frequency","default":""},"account_urls":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Account Urls"},"experience_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Experience Level"},"terms_accepted":{"type":"boolean","title":"Terms Accepted","default":false},"brand_feeling":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Brand Feeling"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"why_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Reason"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"}},"type":"object","title":"MarketerCompleteRequest"},"MarketerConfigPayload":{"properties":{"mission":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mission"},"edge":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edge"},"creator_persona":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Persona"},"creator_promise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Promise"},"destination_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Url"},"required_disclosures":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Required Disclosures"},"warmup_accounts":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Warmup Accounts"},"mandatory_hashtags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mandatory Hashtags"},"best_post_times":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Best Post Times"},"niche_suggestions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Niche Suggestions"},"launch_checklist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Launch Checklist"},"onboarding_documents":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Onboarding Documents"},"objectives_timeline":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Objectives Timeline"},"operations_rhythm":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Operations Rhythm"},"accountability_policy":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Accountability Policy"},"playbook_steps":{"anyOf":[{"items":{"$ref":"#/components/schemas/PlaybookStep"},"type":"array"},{"type":"null"}],"title":"Playbook Steps"},"voice_do":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Voice Do"},"voice_dont":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Voice Dont"},"banned_topics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Banned Topics"},"competitors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Competitors"},"active_platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Active Platforms"},"require_peer_quorum_for_payout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Peer Quorum For Payout"},"peer_quorum_min_votes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Peer Quorum Min Votes"},"link_bio_tracking_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Link Bio Tracking Enabled"},"referral_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Referral Enabled"},"referral_reward_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Reward Text"},"referral_reward_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Referral Reward Amount Cents"},"performance_bonus":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Performance Bonus"},"conversion_bonus":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Conversion Bonus"}},"type":"object","title":"MarketerConfigPayload"},"MarketerConfigUpdate":{"properties":{"mission":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mission"},"edge":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edge"},"creator_persona":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Persona"},"creator_promise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Promise"},"destination_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Url"},"active_platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Active Platforms"},"required_disclosures":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Required Disclosures"},"warmup_accounts":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Warmup Accounts"},"mandatory_hashtags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mandatory Hashtags"},"best_post_times":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Best Post Times"},"niche_suggestions":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Niche Suggestions"},"launch_checklist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Launch Checklist"},"onboarding_documents":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Onboarding Documents"},"objectives_timeline":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Objectives Timeline"},"operations_rhythm":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Operations Rhythm"},"accountability_policy":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Accountability Policy"},"playbook_steps":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Playbook Steps"},"voice_do":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Voice Do"},"voice_dont":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Voice Dont"},"banned_topics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Banned Topics"},"competitors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Competitors"},"inspiration_accounts":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Inspiration Accounts"},"example_videos":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Example Videos"},"require_peer_quorum_for_payout":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Peer Quorum For Payout"},"peer_quorum_min_votes":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Peer Quorum Min Votes"},"link_bio_tracking_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Link Bio Tracking Enabled"},"referral_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Referral Enabled"},"referral_reward_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Reward Text"},"referral_reward_amount_cents":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Referral Reward Amount Cents"},"product_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Description"},"selling_angles":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Selling Angles"},"demo_video":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Demo Video"}},"type":"object","title":"MarketerConfigUpdate"},"MarketplaceContactRequest":{"properties":{"creator_username":{"type":"string","title":"Creator Username"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["creator_username"],"title":"MarketplaceContactRequest"},"MediaEnhanceRequest":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base64"},"caption_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Text"},"auto_lighting":{"type":"boolean","title":"Auto Lighting","default":true},"caption_position":{"type":"string","title":"Caption Position","default":"bottom"}},"type":"object","title":"MediaEnhanceRequest"},"MetaSelectRequest":{"properties":{"ad_account_id":{"type":"string","title":"Ad Account Id"},"ad_account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Account Name"},"page_id":{"type":"string","title":"Page Id"},"page_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Name"}},"type":"object","required":["ad_account_id","page_id"],"title":"MetaSelectRequest"},"MomentDismissRequest":{"properties":{"ask_id":{"type":"string","title":"Ask Id"}},"type":"object","required":["ask_id"],"title":"MomentDismissRequest"},"MomentQuestionRequest":{"properties":{"qid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qid"},"prompt":{"type":"string","title":"Prompt"},"response_type":{"type":"string","title":"Response Type"},"moment":{"type":"string","title":"Moment"},"feature_options":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Feature Options"},"option_a":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Option A"},"option_b":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Option B"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["prompt","response_type","moment"],"title":"MomentQuestionRequest"},"MomentResponseRequest":{"properties":{"ask_id":{"type":"string","title":"Ask Id"},"value":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Value"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"}},"type":"object","required":["ask_id"],"title":"MomentResponseRequest"},"NoteIn":{"properties":{"text":{"type":"string","title":"Text"},"kind":{"type":"string","title":"Kind","default":"general"}},"type":"object","required":["text"],"title":"NoteIn"},"NotificationPrefsRequest":{"properties":{"categories":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Categories"}},"type":"object","required":["categories"],"title":"NotificationPrefsRequest","description":"Per-CATEGORY engagement toggles. Only known engagement categories\n(nudges/digests/coaching/community/streaks) are honored; anything else is\nignored. There is intentionally NO transactional toggle — payout/claim/\nbilling/security notices can never be muted."},"NudgeStuckRequest":{"properties":{"stage":{"type":"string","title":"Stage"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["stage"],"title":"NudgeStuckRequest"},"NudgeUnfilmedRequest":{"properties":{"marketer_id":{"type":"string","title":"Marketer Id"}},"type":"object","required":["marketer_id"],"title":"NudgeUnfilmedRequest"},"OfficialStatsUpdate":{"properties":{"marketer_id":{"type":"string","title":"Marketer Id"},"company_id":{"type":"string","title":"Company Id"},"views":{"type":"integer","title":"Views"},"video_ref":{"type":"string","title":"Video Ref","default":""},"post_url":{"type":"string","title":"Post Url","default":""},"source":{"type":"string","title":"Source","default":"official"},"likes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Likes"},"comments":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Comments"},"shares":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shares"}},"type":"object","required":["marketer_id","company_id","views"],"title":"OfficialStatsUpdate","description":"A pushed official-stats update from favente-supportive.\n\nMatch keys are ALWAYS tenant-scoped (marketer_id + company_id) plus a video\nreference (either the parsed platform `video_ref` or the raw `post_url`)."},"OnboardingThresholdsUpdate":{"properties":{"warm_up_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Warm Up Days"},"payout_min_videos":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Payout Min Videos"},"payout_min_views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Payout Min Views"}},"type":"object","title":"OnboardingThresholdsUpdate"},"OverageToggleRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"OverageToggleRequest"},"OwnerActionRequest":{"properties":{"item_id":{"type":"string","title":"Item Id"},"action":{"type":"string","enum":["ban","ignore","approve","deny"],"title":"Action"}},"type":"object","required":["item_id","action"],"title":"OwnerActionRequest"},"OwnerAiCreditsGrantRequest":{"properties":{"marketer_id":{"type":"string","title":"Marketer Id"},"credits":{"type":"integer","title":"Credits"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["marketer_id","credits"],"title":"OwnerAiCreditsGrantRequest"},"OwnerAiCreditsPolicyRequest":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"monthly_quota_per_marketer_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Quota Per Marketer Credits"},"monthly_quota_company_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Quota Company Credits"},"auto_grant_on_join_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Grant On Join Credits"}},"type":"object","title":"OwnerAiCreditsPolicyRequest"},"OwnerHiringEventRequest":{"properties":{"event_type":{"type":"string","title":"Event Type"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["event_type"],"title":"OwnerHiringEventRequest"},"OwnerIntegrationsUpdateRequest":{"properties":{"integrations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Integrations"}},"type":"object","title":"OwnerIntegrationsUpdateRequest"},"OwnerOnboardingRequest":{"properties":{"company_name":{"type":"string","title":"Company Name"},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"},"domain":{"type":"string","title":"Domain","default":""},"description":{"type":"string","title":"Description","default":""},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"subheadline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subheadline"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"secondary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondary Color"},"creator_persona":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Persona"},"creator_promise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Promise"},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visibility","default":"public"},"org_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Type"},"terms_accepted":{"type":"boolean","title":"Terms Accepted","default":false},"existing_creators":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Existing Creators"},"plan_intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Intent"},"payment_structure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Structure"},"monthly_active_users":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Active Users"},"traction_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Traction Tier"}},"type":"object","required":["company_name"],"title":"OwnerOnboardingRequest"},"OwnerReferralConfigRequest":{"properties":{"referral_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Referral Enabled"},"referral_reward_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Reward Text"},"referral_reward_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Referral Reward Amount Cents"}},"type":"object","title":"OwnerReferralConfigRequest"},"OwnerSetupStep":{"properties":{"key":{"type":"string","title":"Key"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Required","default":true},"verify_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verify Only","default":false}},"type":"object","required":["key"],"title":"OwnerSetupStep"},"OwnerSetupStepsRequest":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/OwnerSetupStep"},"type":"array","title":"Steps"}},"type":"object","required":["steps"],"title":"OwnerSetupStepsRequest"},"PauseAdRequest":{"properties":{"ad_id":{"type":"string","title":"Ad Id"}},"type":"object","required":["ad_id"],"title":"PauseAdRequest"},"PayCreatorRequest":{"properties":{"marketer_id":{"type":"string","title":"Marketer Id"},"model":{"type":"string","title":"Model"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"},"sale_amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Amount Usd"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["marketer_id","model"],"title":"PayCreatorRequest"},"PaymentIn":{"properties":{"amount_usd":{"type":"number","title":"Amount Usd"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["amount_usd"],"title":"PaymentIn"},"PayoutAdviceRequest":{"properties":{"goal":{"type":"string","title":"Goal","default":"awareness"},"product_type":{"type":"string","title":"Product Type","default":"app"},"can_track_sales":{"type":"boolean","title":"Can Track Sales","default":false},"budget_style":{"type":"string","title":"Budget Style","default":"pay_for_results"}},"type":"object","title":"PayoutAdviceRequest"},"PhoneConsentRequest":{"properties":{"sms_opt_in":{"type":"boolean","title":"Sms Opt In"}},"type":"object","required":["sms_opt_in"],"title":"PhoneConsentRequest","description":"Explicit SMS consent toggle (double opt-in — a verified phone is NOT\nauto-enrolled; the creator must opt in here)."},"PhoneVerifyConfirmRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"PhoneVerifyConfirmRequest","description":"The 6-digit code the creator received."},"PhoneVerifyStartRequest":{"properties":{"phone":{"type":"string","title":"Phone"}},"type":"object","required":["phone"],"title":"PhoneVerifyStartRequest","description":"A raw phone number (any format); normalized server-side to E.164."},"PlaybookStep":{"properties":{"title":{"type":"string","title":"Title"},"detail":{"type":"string","title":"Detail"}},"type":"object","required":["title","detail"],"title":"PlaybookStep"},"PolishRequest":{"properties":{"draft_script":{"type":"string","title":"Draft Script"},"platform":{"type":"string","title":"Platform","default":"tiktok"}},"type":"object","required":["draft_script"],"title":"PolishRequest"},"ProfileRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"}},"type":"object","title":"ProfileRequest"},"ProjectCreate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goal"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"starting_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starting Source"},"source_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Text"},"format_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Key"},"current_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Stage"}},"additionalProperties":false,"type":"object","title":"ProjectCreate"},"ProjectPatch":{"properties":{"expected_version":{"type":"integer","minimum":1.0,"title":"Expected Version"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goal"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"starting_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starting Source"},"source_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Text"},"format_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Key"},"current_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Stage"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"additionalProperties":false,"type":"object","required":["expected_version"],"title":"ProjectPatch"},"PublicApplyRequest":{"properties":{"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"}},"type":"object","title":"PublicApplyRequest"},"PublicTrackEventRequest":{"properties":{"event_type":{"type":"string","title":"Event Type"},"page_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Path"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"anon_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anon Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"}},"type":"object","required":["event_type"],"title":"PublicTrackEventRequest"},"RecommendFeatureRequest":{"properties":{"feature_key":{"type":"string","title":"Feature Key"}},"type":"object","required":["feature_key"],"title":"RecommendFeatureRequest"},"ReferralClaimRequest":{"properties":{"referred_email":{"type":"string","title":"Referred Email"}},"type":"object","required":["referred_email"],"title":"ReferralClaimRequest"},"RefundIn":{"properties":{"order_id":{"type":"string","title":"Order Id"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"sig":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sig"},"refund_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refund Id"}},"type":"object","required":["order_id"],"title":"RefundIn"},"RenderCompleteIngress":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status","default":"complete"},"video_url":{"type":"string","title":"Video Url","default":""},"kind":{"type":"string","title":"Kind","default":"slideshow"}},"type":"object","required":["job_id"],"title":"RenderCompleteIngress"},"RepurposeRequest":{"properties":{"claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Id"},"hook":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hook"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}},"type":"object","title":"RepurposeRequest"},"ResetOnboardingRequest":{"properties":{"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"wipe":{"type":"boolean","title":"Wipe","default":true},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}},"type":"object","title":"ResetOnboardingRequest"},"ResolveBody":{"properties":{"reason":{"anyOf":[{"type":"string","maxLength":1500},{"type":"null"}],"title":"Reason"}},"type":"object","title":"ResolveBody"},"RetainerCreateRequest":{"properties":{"marketer_id":{"type":"string","title":"Marketer Id"},"amount_usd":{"type":"number","title":"Amount Usd"},"cadence_days":{"type":"integer","title":"Cadence Days","default":30},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"max_cycles":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Cycles"}},"type":"object","required":["marketer_id","amount_usd"],"title":"RetainerCreateRequest"},"RevenueIn":{"properties":{"marketer_id":{"type":"string","title":"Marketer Id"},"amount_usd":{"type":"number","title":"Amount Usd"},"source":{"type":"string","title":"Source","default":"sale"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"post_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Url"}},"type":"object","required":["marketer_id","amount_usd"],"title":"RevenueIn"},"ReviewClaimRequest":{"properties":{"action":{"type":"string","title":"Action"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"feedback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Message"},"feedback_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Category"},"featured_example":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Featured Example"},"ban":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ban","default":false}},"type":"object","required":["action"],"title":"ReviewClaimRequest"},"ReviewRequest":{"properties":{"item_id":{"type":"string","title":"Item Id"},"action":{"type":"string","enum":["flag","verify","ignore"],"title":"Action"}},"type":"object","required":["item_id","action"],"title":"ReviewRequest"},"RewardCodesRequest":{"properties":{"codes":{"items":{"type":"string"},"type":"array","title":"Codes"}},"type":"object","required":["codes"],"title":"RewardCodesRequest"},"RewardPoolPreviewRequest":{"properties":{"rule":{"additionalProperties":true,"type":"object","title":"Rule"},"views":{"type":"integer","title":"Views","default":0},"creator_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Country"},"ytd_paid_cents":{"type":"integer","title":"Ytd Paid Cents","default":0},"has_tax_form":{"type":"boolean","title":"Has Tax Form","default":false},"has_vat_id":{"type":"boolean","title":"Has Vat Id","default":false}},"type":"object","required":["rule"],"title":"RewardPoolPreviewRequest"},"RewardSpec":{"properties":{"type":{"type":"string","maxLength":40,"title":"Type","default":"in_app"},"label":{"type":"string","maxLength":200,"title":"Label","default":""},"value_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value Cents"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"RewardSpec"},"RewardSystemUpdateRequest":{"properties":{"template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Id"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"}},"type":"object","title":"RewardSystemUpdateRequest"},"RewardTierItem":{"properties":{"label":{"type":"string","title":"Label"},"amount":{"type":"string","title":"Amount"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platforms"},"min_views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Views"}},"type":"object","required":["label","amount"],"title":"RewardTierItem"},"RosterInviteRequest":{"properties":{"emails":{"items":{"type":"string"},"type":"array","title":"Emails"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","default":""}},"type":"object","required":["emails"],"title":"RosterInviteRequest"},"RunRequest":{"properties":{"count":{"type":"integer","title":"Count","default":8},"target_cpa_usd":{"type":"number","title":"Target Cpa Usd","default":34},"daily_budget_usd":{"type":"number","title":"Daily Budget Usd","default":120}},"type":"object","title":"RunRequest"},"SaveCurriculumConfigRequest":{"properties":{"modules":{"additionalProperties":true,"type":"object","title":"Modules","default":{}},"global_rules":{"items":{},"type":"array","title":"Global Rules","default":[]},"f3_quiz_questions":{"items":{},"type":"array","title":"F3 Quiz Questions","default":[]},"f3_quiz_pass_threshold":{"type":"integer","title":"F3 Quiz Pass Threshold","default":2},"structure":{"anyOf":[{"$ref":"#/components/schemas/CurriculumStructureData"},{"type":"null"}]}},"type":"object","title":"SaveCurriculumConfigRequest"},"SaveDraftRequest":{"properties":{"draft_type":{"type":"string","title":"Draft Type"},"content":{"type":"string","title":"Content"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["draft_type","content"],"title":"SaveDraftRequest"},"ScoreHookToolRequest":{"properties":{"hook":{"type":"string","title":"Hook"},"platform":{"type":"string","title":"Platform","default":"tiktok"}},"type":"object","required":["hook"],"title":"ScoreHookToolRequest"},"ScriptProfileUpdate":{"properties":{"description":{"type":"string","title":"Description","default":""},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone"},"platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platforms"},"daily_enabled":{"type":"boolean","title":"Daily Enabled","default":false}},"type":"object","title":"ScriptProfileUpdate"},"ScriptToolRequest":{"properties":{"topic":{"type":"string","title":"Topic"},"platform":{"type":"string","title":"Platform","default":"tiktok"},"duration_seconds":{"type":"integer","title":"Duration Seconds","default":30}},"type":"object","required":["topic"],"title":"ScriptToolRequest"},"SectionInput":{"properties":{"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"},"label":{"type":"string","title":"Label"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords","default":[]}},"type":"object","required":["label"],"title":"SectionInput"},"SectionsUpdateRequest":{"properties":{"sections":{"items":{"$ref":"#/components/schemas/SectionInput"},"type":"array","title":"Sections"}},"type":"object","required":["sections"],"title":"SectionsUpdateRequest"},"SendContractRequest":{"properties":{"contract_id":{"type":"string","title":"Contract Id"},"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["contract_id","email"],"title":"SendContractRequest"},"SetGoalRequest":{"properties":{"type":{"type":"string","title":"Type","default":""},"target":{"type":"integer","title":"Target","default":0}},"type":"object","title":"SetGoalRequest"},"SetPayoutAutonomy":{"properties":{"auto_approve":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Approve"}},"type":"object","title":"SetPayoutAutonomy"},"ShopifyAuthorizeRequest":{"properties":{"shop":{"type":"string","title":"Shop"}},"type":"object","required":["shop"],"title":"ShopifyAuthorizeRequest"},"SignContractRequest":{"properties":{"signerName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signername"}},"type":"object","title":"SignContractRequest"},"SignatureRequest":{"properties":{"signature":{"type":"string","title":"Signature"},"signed_at":{"type":"string","title":"Signed At"},"agreements_acknowledged":{"type":"boolean","title":"Agreements Acknowledged","default":false}},"type":"object","required":["signature","signed_at"],"title":"SignatureRequest"},"SkillTiersUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"pro_bonus_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pro Bonus Pct"},"elite_bonus_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elite Bonus Pct"},"graduation_bonus_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Graduation Bonus Cents"},"review_bounty_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Bounty Cents"}},"type":"object","title":"SkillTiersUpdate"},"SlackConfigRequest":{"properties":{"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["client_id","client_secret","slug"],"title":"SlackConfigRequest"},"SlugRequestBody":{"properties":{"requested_slug":{"type":"string","title":"Requested Slug"}},"type":"object","required":["requested_slug"],"title":"SlugRequestBody"},"SocialProofItem":{"properties":{"label":{"type":"string","title":"Label"},"value":{"type":"string","title":"Value"}},"type":"object","required":["label","value"],"title":"SocialProofItem"},"StartRequest":{"properties":{"format":{"type":"string","title":"Format"},"angle_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Angle Tag"}},"type":"object","required":["format"],"title":"StartRequest"},"StoreConnectIn":{"properties":{"type":{"type":"string","title":"Type"},"domain":{"type":"string","title":"Domain"}},"type":"object","required":["type","domain"],"title":"StoreConnectIn"},"StudioSpendRequest":{"properties":{"renders":{"type":"integer","title":"Renders"}},"type":"object","required":["renders"],"title":"StudioSpendRequest"},"SubmitBody":{"properties":{"video_url":{"type":"string","maxLength":1000,"title":"Video Url"},"consent":{"type":"boolean","title":"Consent","default":false},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note"}},"type":"object","required":["video_url"],"title":"SubmitBody"},"SubscribeRequest":{"properties":{"subscription":{"additionalProperties":true,"type":"object","title":"Subscription"},"reminder_hour_utc":{"type":"integer","title":"Reminder Hour Utc","default":17}},"type":"object","required":["subscription"],"title":"SubscribeRequest"},"TaskCreateRequest":{"properties":{"title":{"type":"string","title":"Title"},"platform":{"type":"string","title":"Platform","default":"tiktok"},"description":{"type":"string","title":"Description","default":""},"points":{"type":"integer","title":"Points","default":10},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"},"audience":{"type":"string","title":"Audience","default":"all"}},"type":"object","required":["title"],"title":"TaskCreateRequest"},"TeamCallConfig":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"day_of_week":{"type":"string","title":"Day Of Week","default":"wednesday"},"time_utc":{"type":"string","title":"Time Utc","default":"17:00"},"duration_min":{"type":"integer","title":"Duration Min","default":30},"join_url":{"type":"string","title":"Join Url","default":""},"title":{"type":"string","title":"Title","default":"Weekly creator team call"},"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"TeamCallConfig"},"TeamCoachRequest":{"properties":{"marketer_id":{"type":"string","title":"Marketer Id"}},"type":"object","required":["marketer_id"],"title":"TeamCoachRequest"},"TeamNudgeRequest":{"properties":{"segment":{"type":"string","title":"Segment","default":"quiet"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"TeamNudgeRequest"},"TractionUpdate":{"properties":{"monthly_active_users":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Active Users"},"traction_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Traction Tier"}},"type":"object","title":"TractionUpdate"},"TrialSubmitRequest":{"properties":{"video_url":{"type":"string","title":"Video Url"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["video_url"],"title":"TrialSubmitRequest"},"UnsubscribeRequest":{"properties":{"endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint"}},"type":"object","title":"UnsubscribeRequest"},"UpdateApplicationStatusRequest":{"properties":{"status":{"type":"string","title":"Status"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"}},"type":"object","required":["status"],"title":"UpdateApplicationStatusRequest"},"UpdateAutomationRequest":{"properties":{"automation":{"additionalProperties":true,"type":"object","title":"Automation"}},"type":"object","required":["automation"],"title":"UpdateAutomationRequest"},"UpdateCompanySettingsRequest":{"properties":{"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"visibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visibility"},"org_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Type"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"subheadline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subheadline"},"faqs":{"anyOf":[{"items":{"$ref":"#/components/schemas/orchestra__company__FAQItem"},"type":"array"},{"type":"null"}],"title":"Faqs"},"cover_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"secondary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondary Color"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"cta_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Text"},"cta_subtext":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Subtext"},"cta_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Url"},"value_props":{"anyOf":[{"items":{"$ref":"#/components/schemas/ValuePropItem"},"type":"array"},{"type":"null"}],"title":"Value Props"},"social_proof":{"anyOf":[{"items":{"$ref":"#/components/schemas/SocialProofItem"},"type":"array"},{"type":"null"}],"title":"Social Proof"},"application_hub_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Application Hub Enabled"},"application_hub_headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Hub Headline"},"application_hub_subheadline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Hub Subheadline"},"links":{"anyOf":[{"items":{"$ref":"#/components/schemas/LinkItem"},"type":"array"},{"type":"null"}],"title":"Links"},"marketer_config":{"anyOf":[{"$ref":"#/components/schemas/MarketerConfigPayload"},{"type":"null"}]}},"type":"object","title":"UpdateCompanySettingsRequest"},"UpdateContractRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"email_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Subject"},"email_body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Body Html"}},"type":"object","title":"UpdateContractRequest"},"UpdateContractTermsRequest":{"properties":{"terms":{"type":"string","title":"Terms"}},"type":"object","required":["terms"],"title":"UpdateContractTermsRequest"},"UpdateHiringInfoRequest":{"properties":{"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"faqs":{"anyOf":[{"items":{"$ref":"#/components/schemas/orchestra__manage__FAQItem"},"type":"array"},{"type":"null"}],"title":"Faqs"}},"type":"object","title":"UpdateHiringInfoRequest"},"UpdateReferralCodeRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"UpdateReferralCodeRequest"},"UpdateRewardTiersRequest":{"properties":{"tiers":{"items":{"$ref":"#/components/schemas/RewardTierItem"},"type":"array","title":"Tiers"},"reward_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reward Type"}},"type":"object","required":["tiers"],"title":"UpdateRewardTiersRequest"},"UsageEvent":{"properties":{"external_user_id":{"type":"string","title":"External User Id"},"event":{"type":"string","title":"Event"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"ts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ts"},"props":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Props"}},"type":"object","required":["external_user_id","event"],"title":"UsageEvent"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValuePropItem":{"properties":{"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"}},"type":"object","required":["title","description"],"title":"ValuePropItem"},"VerifyRequest":{"properties":{"decision":{"type":"string","enum":["approve","deny"],"title":"Decision"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["decision"],"title":"VerifyRequest"},"VetRunIn":{"properties":{"post_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Url"},"pasted_comments":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pasted Comments"}},"type":"object","title":"VetRunIn"},"VideoToolRequest":{"properties":{"brief":{"type":"string","title":"Brief"},"format":{"type":"string","title":"Format","default":"9:16"},"duration_seconds":{"type":"integer","title":"Duration Seconds","default":30}},"type":"object","required":["brief"],"title":"VideoToolRequest"},"ViralityBreakdownRequest":{"properties":{"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"},"claim_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Id"},"views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Views"},"likes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Likes"},"comments":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Comments"},"shares":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shares"},"retention_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retention Pct"},"avg_watch_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Watch Seconds"},"video_length_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Length Seconds"}},"type":"object","title":"ViralityBreakdownRequest"},"VisibilityRequest":{"properties":{"visible":{"type":"boolean","title":"Visible"},"niches":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Niches"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"hidden_platforms":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Hidden Platforms"}},"type":"object","required":["visible"],"title":"VisibilityRequest"},"WeeklyReviewSubmit":{"properties":{"answers":{"additionalProperties":true,"type":"object","title":"Answers","default":{}},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"}},"type":"object","title":"WeeklyReviewSubmit"},"WhitelabelRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"WhitelabelRequest"},"XpRewardRequest":{"properties":{"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description","default":""},"xp_threshold":{"type":"integer","title":"Xp Threshold"},"reward":{"type":"string","title":"Reward"}},"type":"object","required":["title","xp_threshold","reward"],"title":"XpRewardRequest"},"_FromIdea":{"properties":{"hook":{"type":"string","title":"Hook","default":""}},"type":"object","title":"_FromIdea"},"_IdeaPick":{"properties":{"style":{"type":"string","title":"Style","default":""},"hook":{"type":"string","title":"Hook","default":""}},"type":"object","title":"_IdeaPick"},"_MarketerRef":{"properties":{"marketer_id":{"type":"string","title":"Marketer Id"}},"type":"object","required":["marketer_id"],"title":"_MarketerRef"},"_OrderRef":{"properties":{"order_id":{"type":"string","title":"Order Id"}},"type":"object","required":["order_id"],"title":"_OrderRef"},"_PhoneConfirm":{"properties":{"code":{"type":"string","title":"Code"},"sms_opt_in":{"type":"boolean","title":"Sms Opt In","default":true}},"type":"object","required":["code"],"title":"_PhoneConfirm"},"_PhoneStart":{"properties":{"phone":{"type":"string","title":"Phone"}},"type":"object","required":["phone"],"title":"_PhoneStart"},"endpoints__models__SendMessageRequest":{"properties":{"token":{"type":"string","title":"Token"},"channel":{"type":"string","title":"Channel"},"message":{"type":"string","title":"Message"}},"type":"object","required":["token","channel","message"],"title":"SendMessageRequest","description":"Request model for sending Slack messages.\n\nAttributes:\n    token (str): Slack bot token for authentication (format: xoxb-...)\n    channel (str): Slack channel ID where the message will be sent (format: C...)\n    message (str): The text content of the message to send\n\nExample:\n    {\n        \"token\": \"xoxb-your-token-here\",\n        \"channel\": \"C1234567890\",\n        \"message\": \"Hello from the Slack bot!\"\n    }"},"orchestra__chat__SendMessageRequest":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"SendMessageRequest"},"orchestra__company__FAQItem":{"properties":{"q":{"type":"string","title":"Q"},"a":{"type":"string","title":"A"}},"type":"object","required":["q","a"],"title":"FAQItem"},"orchestra__manage__FAQItem":{"properties":{"question":{"type":"string","title":"Question"},"answer":{"type":"string","title":"Answer"}},"type":"object","required":["question","answer"],"title":"FAQItem"}}}}