{"openapi":"3.0.0","paths":{"/api/v1/auth/register":{"post":{"description":"Requires same-origin JSON, accepted policies and the platform CAPTCHA when enabled. Sends a single-use email verification code. No session is issued until verification.","operationId":"PlatformAuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"requiresVerification":{"type":"boolean"}}}}}},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"summary":"Register with email and password","tags":["Identity"]}},"/api/v1/auth/verify-email":{"post":{"description":"Maximum five attempts per code. Success issues an HttpOnly san_session cookie; complete first and last name if profileComplete is false.","operationId":"PlatformAuthController_verify","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"number","description":"Session expiry as Unix milliseconds"},"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"tierCode":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"permissions":{"type":"array","items":{"type":"string"}},"profileComplete":{"type":"boolean"},"onboarding":{"type":"object"},"notifications":{"type":"object"}}},"platform":{"type":"object","description":"Safe public branding, login and legal configuration"},"requiresConsent":{"type":"boolean","description":"Google first registration must explicitly accept policies before a session is created"},"requiresVerification":{"type":"boolean"}}}}}},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"summary":"Verify a six-digit email code","tags":["Identity"]}},"/api/v1/auth/resend-verification":{"post":{"description":"Minimum sixty-second interval; earlier outstanding codes become invalid. Response does not disclose whether an account exists.","operationId":"PlatformAuthController_resend","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailDto"}}}},"responses":{"200":{"description":"Generic email delivery acknowledgement"},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"summary":"Resend a verification code","tags":["Identity"]}},"/api/v1/auth/login":{"post":{"description":"Sets an HttpOnly, SameSite=Lax session cookie. Browser clients must include credentials and a same-platform Origin header.","operationId":"PlatformAuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"number","description":"Session expiry as Unix milliseconds"},"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"tierCode":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"permissions":{"type":"array","items":{"type":"string"}},"profileComplete":{"type":"boolean"},"onboarding":{"type":"object"},"notifications":{"type":"object"}}},"platform":{"type":"object","description":"Safe public branding, login and legal configuration"},"requiresConsent":{"type":"boolean","description":"Google first registration must explicitly accept policies before a session is created"},"requiresVerification":{"type":"boolean"}}}}}},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"summary":"Sign in with a verified email and password","tags":["Identity"]}},"/api/v1/auth/google":{"post":{"description":"Validates signature, issuer, expiry, verified identity and the host platform OAuth client ID. New accounts return requiresConsent before creating a session. Non-authoritative third-party email addresses require email-code verification.","operationId":"PlatformAuthController_google","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"number","description":"Session expiry as Unix milliseconds"},"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"tierCode":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"permissions":{"type":"array","items":{"type":"string"}},"profileComplete":{"type":"boolean"},"onboarding":{"type":"object"},"notifications":{"type":"object"}}},"platform":{"type":"object","description":"Safe public branding, login and legal configuration"},"requiresConsent":{"type":"boolean","description":"Google first registration must explicitly accept policies before a session is created"},"requiresVerification":{"type":"boolean"}}}}}},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"summary":"Exchange a Google Identity Services ID token","tags":["Identity"]}},"/api/v1/auth/forgot-password":{"post":{"operationId":"PlatformAuthController_forgot","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailDto"}}}},"responses":{"200":{"description":"Generic acknowledgement independent of account existence"},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"summary":"Request a password reset code","tags":["Identity"]}},"/api/v1/auth/reset-password":{"post":{"operationId":"PlatformAuthController_reset","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordDto"}}}},"responses":{"200":{"description":"Password reset; sign in using the new password"},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"summary":"Reset a password and revoke existing sessions","tags":["Identity"]}},"/api/v1/auth/me":{"get":{"operationId":"PlatformAuthController_me","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"number","description":"Session expiry as Unix milliseconds"},"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"tierCode":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"permissions":{"type":"array","items":{"type":"string"}},"profileComplete":{"type":"boolean"},"onboarding":{"type":"object"},"notifications":{"type":"object"}}},"platform":{"type":"object","description":"Safe public branding, login and legal configuration"},"requiresConsent":{"type":"boolean","description":"Google first registration must explicitly accept policies before a session is created"},"requiresVerification":{"type":"boolean"}}}}}},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"Read the current signed-in identity and public platform","tags":["Identity"]}},"/api/v1/auth/logout":{"post":{"operationId":"PlatformAuthController_logout","parameters":[],"responses":{"200":{"description":"Session revoked"},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"Revoke the current session and clear its cookie","tags":["Identity"]}},"/api/v1/me":{"get":{"operationId":"PlatformMeController_me","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"number","description":"Session expiry as Unix milliseconds"},"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"tierCode":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"permissions":{"type":"array","items":{"type":"string"}},"profileComplete":{"type":"boolean"},"onboarding":{"type":"object"},"notifications":{"type":"object"}}},"platform":{"type":"object","description":"Safe public branding, login and legal configuration"},"requiresConsent":{"type":"boolean","description":"Google first registration must explicitly accept policies before a session is created"},"requiresVerification":{"type":"boolean"}}}}}},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"Read your account","tags":["Account"]}},"/api/v1/me/profile":{"patch":{"description":"Email, roles, password and tier cannot be changed through this endpoint.","operationId":"PlatformMeController_profile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"expiresAt":{"type":"number","description":"Session expiry as Unix milliseconds"},"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"tierCode":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"permissions":{"type":"array","items":{"type":"string"}},"profileComplete":{"type":"boolean"},"onboarding":{"type":"object"},"notifications":{"type":"object"}}},"platform":{"type":"object","description":"Safe public branding, login and legal configuration"},"requiresConsent":{"type":"boolean","description":"Google first registration must explicitly accept policies before a session is created"},"requiresVerification":{"type":"boolean"}}}}}},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"Complete or update your first and last name","tags":["Account"]}},"/api/v1/me/onboarding":{"patch":{"operationId":"PlatformMeController_onboarding","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingDto"}}}},"responses":{"200":{"description":"Saved onboarding flags"},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"Save walkthrough and setup checklist progress","tags":["Account"]}},"/api/v1/me/notifications":{"get":{"operationId":"PlatformMeController_notifications","parameters":[],"responses":{"200":{"description":"Enabled channels and recipient identifiers"},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"Read billing and service reminder preferences","tags":["Account"]},"patch":{"operationId":"PlatformMeController_setNotifications","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsDto"}}}},"responses":{"200":{"description":"Saved preferences"},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"Choose billing and service reminder destinations","tags":["Account"]}},"/api/v1/me/api-keys":{"get":{"description":"Secrets are never returned, only prefixes, scopes, timestamps and revocation state.","operationId":"PlatformMeController_apiKeys","parameters":[],"responses":{"200":{"description":"Array of key metadata"},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"List your API key metadata","tags":["Account"]},"post":{"description":"Returns the secret token once. Use Authorization: Bearer san_... for the same platform hostname. Keys have messaging scopes and cannot access administration or identity endpoints.","operationId":"PlatformMeController_createKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"token":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"message":{"type":"string"}}}}}},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"Create an API key","tags":["Account"]}},"/api/v1/me/api-keys/{id}":{"delete":{"operationId":"PlatformMeController_revokeKey","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Key revoked"},"400":{"description":"Input validation or policy error"},"401":{"description":"Session missing, expired or revoked"},"403":{"description":"Permission, origin or identity verification required"},"404":{"description":"Unknown platform or resource not visible to this account"}},"security":[{"san_session":[]}],"summary":"Immediately revoke your API key","tags":["Account"]}},"/api/v1/billing/catalog":{"get":{"operationId":"BillingPublicController_catalog","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"currency":{"enum":["USDT"]},"exchange_rate":{"type":"string","example":"1"},"tier_billing_period":{"enum":["annual"]},"annual_prices_confirmed":{"type":"boolean"},"package_expiry_policy":{"enum":["pending","purchase_30_days","monthly_cycle"]},"grace_policy":{"enum":["pending","expired_paid_package","global_monthly"]},"free_messages_per_connection":{"type":"integer","example":100},"free_period_days":{"type":"integer","example":30},"tiers":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"bronze"},"title":{"type":"string"},"price":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"period_days":{"type":"integer","enum":[365]},"channel_limit":{"type":"integer","nullable":true},"monthly_stars_per_connection":{"type":"integer","minimum":0,"example":100},"monthly_elixir":{"type":"integer","minimum":0,"example":5},"group_limit":{"type":"integer"},"group_scope":{"enum":["total","per_channel"]},"enabled":{"type":"boolean"},"one_per_type":{"type":"boolean"}}}},"packages":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"messages-1000"},"title":{"type":"string"},"price":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"message_count":{"type":"integer","example":1000},"expiry_days":{"type":"integer","enum":[30]},"enabled":{"type":"boolean"}}}}}}}}}},"summary":"Public platform pricing, limits and policy flags","tags":["Billing"]}},"/api/v1/billing/summary":{"get":{"operationId":"BillingController_summary","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"currency":{"enum":["USDT"]},"exchange_rate":{"type":"string","example":"1"},"tier_billing_period":{"enum":["annual"]},"annual_prices_confirmed":{"type":"boolean"},"package_expiry_policy":{"enum":["pending","purchase_30_days","monthly_cycle"]},"grace_policy":{"enum":["pending","expired_paid_package","global_monthly"]},"free_messages_per_connection":{"type":"integer","example":100},"free_period_days":{"type":"integer","example":30},"tiers":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"bronze"},"title":{"type":"string"},"price":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"period_days":{"type":"integer","enum":[365]},"channel_limit":{"type":"integer","nullable":true},"monthly_stars_per_connection":{"type":"integer","minimum":0,"example":100},"monthly_elixir":{"type":"integer","minimum":0,"example":5},"group_limit":{"type":"integer"},"group_scope":{"enum":["total","per_channel"]},"enabled":{"type":"boolean"},"one_per_type":{"type":"boolean"}}}},"packages":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"messages-1000"},"title":{"type":"string"},"price":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"message_count":{"type":"integer","example":1000},"expiry_days":{"type":"integer","enum":[30]},"enabled":{"type":"boolean"}}}}}},{"type":"object","properties":{"wallet":{"type":"object","properties":{"balance":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"currency":{"enum":["USDT"]},"expires_at":{"nullable":true}}},"subscription":{"type":"object","nullable":true,"properties":{"tier_code":{"type":"string"},"starts_at":{"type":"string","format":"date-time","nullable":true},"expires_at":{"type":"string","format":"date-time","nullable":true}}},"access":{"type":"object","properties":{"subscriptionStatus":{"enum":["normal","active","grace","suspended","disconnect"]},"canSend":{"type":"boolean"},"canCallback":{"type":"boolean"},"disconnectAt":{"type":"number","nullable":true,"description":"Unix milliseconds."},"tier":{"type":"object","properties":{"code":{"type":"string","example":"bronze"},"title":{"type":"string"},"price":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"period_days":{"type":"integer","enum":[365]},"channel_limit":{"type":"integer","nullable":true},"monthly_stars_per_connection":{"type":"integer","minimum":0,"example":100},"monthly_elixir":{"type":"integer","minimum":0,"example":5},"group_limit":{"type":"integer"},"group_scope":{"enum":["total","per_channel"]},"enabled":{"type":"boolean"},"one_per_type":{"type":"boolean"}}}}},"elixir":{"type":"object","properties":{"remaining":{"type":"integer"},"capacity":{"type":"integer"},"used":{"type":"integer"},"renews_at":{"type":"string","format":"date-time","nullable":true},"scope":{"enum":["total","per_channel"]}}},"quota":{"type":"object","properties":{"purchased_remaining":{"type":"integer"},"pools":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string"},"remaining":{"type":"integer"},"message_count":{"type":"integer"},"expires_at":{"type":"string","format":"date-time","nullable":true}}}},"free":{"type":"array","items":{"type":"object","properties":{"channel_id":{"type":"string"},"remaining":{"type":"integer"},"renews_at":{"type":"string","format":"date-time","nullable":true}}}},"grace":{"type":"object","nullable":true,"properties":{"capacity":{"type":"integer"},"remaining":{"type":"integer"},"expires_at":{"type":"string","format":"date-time","nullable":true}}}}},"orders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"kind":{"enum":["wallet_topup","package","tier"]},"item_code":{"type":"string","nullable":true},"amount":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"tax":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"status":{"enum":["pending","confirmed"]},"checkout_url":{"type":"string","format":"uri","nullable":true},"created_at":{"type":"string","format":"date-time","nullable":true},"paid_at":{"type":"string","format":"date-time","nullable":true}}}}}}]}}}}},"security":[{"san_session":[]}],"summary":"Read own wallet, quotas, subscription, access and orders","tags":["Billing"]}},"/api/v1/billing/topups":{"post":{"operationId":"BillingController_topup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["amount","idempotency_key"],"properties":{"amount":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"10.00","description":"Base wallet credit, minimum 0.01 USDT, up to two fractional digits."},"idempotency_key":{"type":"string","minLength":8,"maxLength":120,"example":"purchase-20261106-001"}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"type":"object","properties":{"id":{"type":"string"},"kind":{"enum":["wallet_topup","package","tier"]},"item_code":{"type":"string","nullable":true},"amount":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"tax":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"status":{"enum":["pending","confirmed"]},"checkout_url":{"type":"string","format":"uri","nullable":true},"created_at":{"type":"string","format":"date-time","nullable":true},"paid_at":{"type":"string","format":"date-time","nullable":true}}},"duplicate":{"type":"boolean"},"invoice_id":{"type":"string"}}}}}}},"security":[{"san_session":[]}],"summary":"Create an idempotent live wallet top-up checkout","tags":["Billing"]}},"/api/v1/billing/packages/purchase":{"post":{"operationId":"BillingController_package","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["package_code","idempotency_key"],"properties":{"package_code":{"type":"string","example":"messages-1000"},"idempotency_key":{"type":"string","minLength":8,"maxLength":120,"example":"purchase-20261106-001"}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"type":"object","properties":{"id":{"type":"string"},"kind":{"enum":["wallet_topup","package","tier"]},"item_code":{"type":"string","nullable":true},"amount":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"tax":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"status":{"enum":["pending","confirmed"]},"checkout_url":{"type":"string","format":"uri","nullable":true},"created_at":{"type":"string","format":"date-time","nullable":true},"paid_at":{"type":"string","format":"date-time","nullable":true}}},"duplicate":{"type":"boolean"},"invoice_id":{"type":"string"}}}}}}},"security":[{"san_session":[]}],"summary":"Explicitly purchase a monthly message package using wallet credit","tags":["Billing"]}},"/api/v1/billing/tiers/purchase":{"post":{"operationId":"BillingController_tier","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tier_code","idempotency_key"],"properties":{"tier_code":{"type":"string","example":"bronze"},"idempotency_key":{"type":"string","minLength":8,"maxLength":120,"example":"purchase-20261106-001"}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"type":"object","properties":{"id":{"type":"string"},"kind":{"enum":["wallet_topup","package","tier"]},"item_code":{"type":"string","nullable":true},"amount":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"tax":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"status":{"enum":["pending","confirmed"]},"checkout_url":{"type":"string","format":"uri","nullable":true},"created_at":{"type":"string","format":"date-time","nullable":true},"paid_at":{"type":"string","format":"date-time","nullable":true}}},"duplicate":{"type":"boolean"},"invoice_id":{"type":"string"}}}}}}},"security":[{"san_session":[]}],"summary":"Explicitly purchase or renew a confirmed-price annual tier","tags":["Billing"]}},"/api/v1/billing/invoices":{"get":{"operationId":"BillingController_invoices","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"invoices":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"number":{"type":"string"},"kind":{"enum":["commercial_draft","commercial_invoice","tax_invoice","payment_receipt"]},"order_id":{"type":"string"},"issuer":{"type":"object","properties":{"legalName":{"type":"string"},"address":{"type":"string"},"country":{"type":"string"},"trn":{"type":"string"},"taxRegistered":{"type":"boolean"},"vatPercent":{"type":"string"},"aedPerUsdt":{"type":"string"}}},"customer":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":"string","format":"email"}}},"description":{"type":"string"},"subtotal":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"tax":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"total":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"currency":{"enum":["USDT"]},"aed_exchange_rate":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"subtotal_aed":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"tax_aed":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"total_aed":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"created_at":{"type":"string","format":"date-time","nullable":true},"notice":{"type":"string","nullable":true}}}}}}}}}},"security":[{"san_session":[]}],"summary":"List own invoice and receipt snapshots","tags":["Billing"]}},"/api/v1/billing/invoices/{id}":{"get":{"operationId":"BillingController_invoice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"invoice":{"type":"object","properties":{"id":{"type":"string"},"number":{"type":"string"},"kind":{"enum":["commercial_draft","commercial_invoice","tax_invoice","payment_receipt"]},"order_id":{"type":"string"},"issuer":{"type":"object","properties":{"legalName":{"type":"string"},"address":{"type":"string"},"country":{"type":"string"},"trn":{"type":"string"},"taxRegistered":{"type":"boolean"},"vatPercent":{"type":"string"},"aedPerUsdt":{"type":"string"}}},"customer":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":"string","format":"email"}}},"description":{"type":"string"},"subtotal":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"tax":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"total":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"currency":{"enum":["USDT"]},"aed_exchange_rate":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"subtotal_aed":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"tax_aed":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"total_aed":{"type":"string","pattern":"^[0-9]+(\\.[0-9]{1,6})?$","example":"5.000000"},"created_at":{"type":"string","format":"date-time","nullable":true},"notice":{"type":"string","nullable":true}}}}}}}}},"security":[{"san_session":[]}],"summary":"Read an owned invoice snapshot; incomplete tax data is labelled draft","tags":["Billing"]}},"/api/v1/billing/notifications/preferences":{"get":{"operationId":"BillingController_preferences","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"boolean","default":true},"whatsapp":{"type":"boolean","default":false},"telegram":{"type":"boolean","default":false},"whatsapp_recipient":{"type":"string","example":"+971501234567"},"telegram_recipient":{"type":"string","example":"123456789"}}}}}}},"security":[{"san_session":[]}],"summary":"Read expiry warning delivery preferences","tags":["Billing"]},"patch":{"operationId":"BillingController_savePreferences","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"boolean","default":true},"whatsapp":{"type":"boolean","default":false},"telegram":{"type":"boolean","default":false},"whatsapp_recipient":{"type":"string","example":"+971501234567"},"telegram_recipient":{"type":"string","example":"123456789"}}}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"boolean","default":true},"whatsapp":{"type":"boolean","default":false},"telegram":{"type":"boolean","default":false},"whatsapp_recipient":{"type":"string","example":"+971501234567"},"telegram_recipient":{"type":"string","example":"123456789"}}}}}}},"security":[{"san_session":[]}],"summary":"Select email, WhatsApp and Telegram expiry warnings","tags":["Billing"]}},"/api/v1/support/tickets":{"get":{"operationId":"SupportController_list","parameters":[{"name":"status","required":false,"in":"query","schema":{"enum":["open","answered","closed","cancelled"],"type":"string"}},{"name":"search","required":false,"in":"query","schema":{}},{"name":"page_size","required":false,"in":"query","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"tickets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"reference":{"type":"string","example":"SUP-EXAMPLE-123456"},"subject":{"type":"string"},"category":{"enum":["general","technical","billing","account","other"]},"status":{"enum":["open","answered","closed","cancelled"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"user_id":{"type":"string","description":"Staff views only, subject to privileged-account visibility."},"user_name":{"type":"string"}}}},"pagination":{"type":"object","properties":{"page":{"type":"integer"},"page_size":{"type":"integer"},"total":{"type":"integer"}}},"categories":{"type":"array","items":{"type":"string"}}}}}}}},"security":[{"san_session":[]}],"summary":"List own support tickets with filters and pagination","tags":["Support"]},"post":{"operationId":"SupportController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["subject","message"],"properties":{"subject":{"type":"string","minLength":1,"maxLength":150,"example":"Help linking my connection"},"message":{"type":"string","minLength":1,"maxLength":5000,"example":"Please help me complete channel setup."},"category":{"enum":["general","technical","billing","account","other"],"default":"general"}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"type":"object","properties":{"id":{"type":"string"},"reference":{"type":"string","example":"SUP-EXAMPLE-123456"},"subject":{"type":"string"},"category":{"enum":["general","technical","billing","account","other"]},"status":{"enum":["open","answered","closed","cancelled"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"user_id":{"type":"string","description":"Staff views only, subject to privileged-account visibility."},"user_name":{"type":"string"}}},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"author":{"enum":["customer","staff"]},"author_name":{"type":"string","description":"Visible display name for a staff reply."},"body":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}}}}}}}}},"security":[{"san_session":[]}],"summary":"Open an owned support ticket, limited to ten per hour","tags":["Support"]}},"/api/v1/support/tickets/{id}":{"get":{"operationId":"SupportController_thread","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"type":"object","properties":{"id":{"type":"string"},"reference":{"type":"string","example":"SUP-EXAMPLE-123456"},"subject":{"type":"string"},"category":{"enum":["general","technical","billing","account","other"]},"status":{"enum":["open","answered","closed","cancelled"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"user_id":{"type":"string","description":"Staff views only, subject to privileged-account visibility."},"user_name":{"type":"string"}}},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"author":{"enum":["customer","staff"]},"author_name":{"type":"string","description":"Visible display name for a staff reply."},"body":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}}}}}}}}},"security":[{"san_session":[]}],"summary":"Read an owned ticket and its messages","tags":["Support"]}},"/api/v1/support/tickets/{id}/messages":{"post":{"operationId":"SupportController_reply","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","minLength":1,"maxLength":5000}}}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"type":"object","properties":{"id":{"type":"string"},"reference":{"type":"string","example":"SUP-EXAMPLE-123456"},"subject":{"type":"string"},"category":{"enum":["general","technical","billing","account","other"]},"status":{"enum":["open","answered","closed","cancelled"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"user_id":{"type":"string","description":"Staff views only, subject to privileged-account visibility."},"user_name":{"type":"string"}}},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"author":{"enum":["customer","staff"]},"author_name":{"type":"string","description":"Visible display name for a staff reply."},"body":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}}}}}}}}},"security":[{"san_session":[]}],"summary":"Reply to an owned ticket and reopen it","tags":["Support"]}},"/api/v1/support/tickets/{id}/close":{"post":{"operationId":"SupportController_close","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"type":"object","properties":{"id":{"type":"string"},"reference":{"type":"string","example":"SUP-EXAMPLE-123456"},"subject":{"type":"string"},"category":{"enum":["general","technical","billing","account","other"]},"status":{"enum":["open","answered","closed","cancelled"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"user_id":{"type":"string","description":"Staff views only, subject to privileged-account visibility."},"user_name":{"type":"string"}}},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"author":{"enum":["customer","staff"]},"author_name":{"type":"string","description":"Visible display name for a staff reply."},"body":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}}}}}}}}},"security":[{"san_session":[]}],"summary":"Close an owned support ticket","tags":["Support"]}},"/api/v1/support/tickets/{id}/cancel":{"post":{"operationId":"SupportController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"type":"object","properties":{"id":{"type":"string"},"reference":{"type":"string","example":"SUP-EXAMPLE-123456"},"subject":{"type":"string"},"category":{"enum":["general","technical","billing","account","other"]},"status":{"enum":["open","answered","closed","cancelled"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"user_id":{"type":"string","description":"Staff views only, subject to privileged-account visibility."},"user_name":{"type":"string"}}},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"author":{"enum":["customer","staff"]},"author_name":{"type":"string","description":"Visible display name for a staff reply."},"body":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}}}}}}}}},"security":[{"san_session":[]}],"summary":"Cancel an owned ticket","tags":["Support"]}},"/api/v1/channel-types":{"get":{"operationId":"ChannelsController_types","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/dashboard":{"get":{"operationId":"ChannelsController_dashboard","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections":{"get":{"operationId":"ChannelsController_list","parameters":[{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","required":false,"in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":30}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]},"post":{"operationId":"ChannelsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["channel_type","title"],"properties":{"channel_type":{"type":"string","enum":["whatsapp","telegram","email"]},"title":{"type":"string","maxLength":160},"code":{"type":"string","maxLength":80},"account_id":{"type":"string","description":"Required for WhatsApp (international phone number) and email (sender address)."},"bot_token":{"type":"string","writeOnly":true,"description":"BotFather token for Telegram."},"smtp":{"type":"object","description":"Required for email connections.","required":["host"],"properties":{"host":{"type":"string"},"port":{"type":"integer","enum":[25,465,587,2525]},"user":{"type":"string"},"password":{"type":"string","writeOnly":true}}}},"example":{"channel_type":"whatsapp","title":"My WhatsApp","account_id":"YOUR_INTERNATIONAL_NUMBER"}}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections/{id}":{"get":{"operationId":"ChannelsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]},"delete":{"operationId":"ChannelsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections/{id}/start":{"post":{"operationId":"ChannelsController_start","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections/{id}/disconnect":{"post":{"operationId":"ChannelsController_disconnect","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections/{id}/callback":{"put":{"operationId":"ChannelsController_callback","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"},"url":{"type":"string","format":"uri","description":"Public HTTPS webhook URL when enabled."},"headers":{"type":"object","additionalProperties":{"type":"string"}},"body":{"type":"object","additionalProperties":true}},"example":{"enabled":true,"url":"https://example.com/webhook"}}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections/{id}/callback/test":{"post":{"operationId":"ChannelsController_test","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections/{id}/logs":{"get":{"operationId":"ChannelsController_logs","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"direction","required":false,"in":"query","schema":{"enum":["all","inbound","outbound"],"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","required":false,"in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":30}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections/{id}/groups":{"get":{"operationId":"ChannelsController_groups","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]},"post":{"operationId":"ChannelsController_createGroup","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["alias","participants"],"properties":{"alias":{"type":"string","pattern":"^[a-z0-9_-]{1,80}$"},"title":{"type":"string"},"participants":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"string","description":"International phone number"}}},"example":{"alias":"team","title":"Team","participants":["YOUR_PARTICIPANT_NUMBER"]}}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections/{id}/groups/{groupId}":{"delete":{"operationId":"ChannelsController_removeGroup","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"groupId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/connections/{id}/messages":{"post":{"description":"Sends text or images to the specified recipient. The result can be sent, failed, partial or unconfirmed. Check the conversation before retrying an unconfirmed send.","operationId":"ChannelsController_send","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Use a unique key for each new send. Reuse it with the same body to retrieve the recorded outcome.","required":false,"schema":{"type":"string","maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["to"],"anyOf":[{"required":["text"]},{"required":["media"]}],"properties":{"to":{"type":"string","maxLength":200,"description":"International WhatsApp number, registered group:alias, Telegram chat ID or email address."},"text":{"type":"string","maxLength":10000},"idempotency_key":{"type":"string","maxLength":128,"description":"Alternative to the Idempotency-Key header."},"media":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","anyOf":[{"required":["url"]},{"required":["data","mime_type"]}],"properties":{"url":{"type":"string","format":"uri"},"data":{"type":"string","format":"byte","description":"Base64-encoded image."},"mime_type":{"type":"string","enum":["image/jpeg","image/png","image/webp","image/gif"]},"filename":{"type":"string"},"caption":{"type":"string"}}}}},"example":{"to":"YOUR_RECIPIENT","text":"Hello from Swagger UI"}}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"summary":"Send a message through this connection","tags":["Connections"]}},"/api/v1/messages":{"post":{"description":"Sends text or images to the specified recipient. The result can be sent, failed, partial or unconfirmed. Check the conversation before retrying an unconfirmed send.","operationId":"ChannelsController_unifiedSend","parameters":[{"name":"Idempotency-Key","in":"header","description":"Use a unique key for each new send. Reuse it with the same body to retrieve the recorded outcome.","required":false,"schema":{"type":"string","maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["connection_id","to"],"anyOf":[{"required":["text"]},{"required":["media"]}],"properties":{"connection_id":{"type":"string","format":"uuid","description":"ID of your connected channel."},"channel_type":{"type":"string","enum":["whatsapp","telegram","email"]},"to":{"type":"string","maxLength":200,"description":"International WhatsApp number, registered group:alias, Telegram chat ID or email address."},"text":{"type":"string","maxLength":10000},"idempotency_key":{"type":"string","maxLength":128,"description":"Alternative to the Idempotency-Key header."},"media":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","anyOf":[{"required":["url"]},{"required":["data","mime_type"]}],"properties":{"url":{"type":"string","format":"uri"},"data":{"type":"string","format":"byte","description":"Base64-encoded image."},"mime_type":{"type":"string","enum":["image/jpeg","image/png","image/webp","image/gif"]},"filename":{"type":"string"},"caption":{"type":"string"}}}}},"example":{"connection_id":"YOUR_CONNECTION_ID","to":"YOUR_RECIPIENT","text":"Hello from Swagger UI"}}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"summary":"Send a message using a connection ID","tags":["Connections"]}},"/api/v1/me/notification-preferences":{"get":{"operationId":"ChannelsController_preferences","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]},"put":{"operationId":"ChannelsController_savePreferences","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"boolean","default":true},"whatsapp":{"type":"boolean","default":false},"telegram":{"type":"boolean","default":false},"whatsapp_recipient":{"type":"string","example":"+971501234567"},"telegram_recipient":{"type":"string","example":"123456789"}}}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}},"/api/v1/events":{"get":{"operationId":"ChannelsController_stream","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]},{"san_session":[]}],"tags":["Connections"]}}},"info":{"title":"Smart Alive Notification API","description":"Try GET /api/v1/billing/catalog without signing in. To send a channel message, use POST /api/v1/connections/{id}/messages with your session or a scoped API key.","version":"1.0.0","contact":{}},"tags":[],"servers":[{"url":"/"}],"components":{"schemas":{"RegisterDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","maxLength":254},"captchaToken":{"type":"string","description":"Challenge response when CAPTCHA is enabled for this platform","maxLength":4096},"password":{"type":"string","format":"password","minLength":10,"maxLength":72,"writeOnly":true},"termsAccepted":{"type":"boolean","description":"Explicit acceptance of the current terms, privacy notice and acceptable-use policy","example":true}},"required":["email","password","termsAccepted"]},"VerifyEmailDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","maxLength":254},"captchaToken":{"type":"string","description":"Challenge response when CAPTCHA is enabled for this platform","maxLength":4096},"code":{"type":"string","pattern":"^\\d{6}$","description":"One-time six-digit code delivered to the email address; expires after 15 minutes"}},"required":["email","code"]},"EmailDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","maxLength":254},"captchaToken":{"type":"string","description":"Challenge response when CAPTCHA is enabled for this platform","maxLength":4096}},"required":["email"]},"LoginDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","maxLength":254},"captchaToken":{"type":"string","description":"Challenge response when CAPTCHA is enabled for this platform","maxLength":4096},"password":{"type":"string","format":"password","writeOnly":true}},"required":["email","password"]},"GoogleDto":{"type":"object","properties":{"credential":{"type":"string","description":"Google Identity Services ID token, validated against this platform client ID","writeOnly":true},"termsAccepted":{"type":"boolean","description":"Required on first registration; false returns requiresConsent without creating a session"},"captchaToken":{"type":"string"}},"required":["credential"]},"ResetPasswordDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","maxLength":254},"captchaToken":{"type":"string","description":"Challenge response when CAPTCHA is enabled for this platform","maxLength":4096},"code":{"type":"string","pattern":"^\\d{6}$","description":"One-time six-digit code delivered to the email address; expires after 15 minutes"},"password":{"type":"string","format":"password","minLength":10,"maxLength":72,"writeOnly":true}},"required":["email","code","password"]},"ProfileDto":{"type":"object","properties":{"firstName":{"type":"string","example":"Jane","maxLength":100},"lastName":{"type":"string","example":"Smith","maxLength":100}},"required":["firstName","lastName"]},"OnboardingDto":{"type":"object","properties":{"walkthroughCompleted":{"type":"boolean"},"setupCompleted":{"type":"boolean"}}},"NotificationsDto":{"type":"object","properties":{"email":{"type":"boolean"},"whatsapp":{"type":"boolean"},"telegram":{"type":"boolean"},"whatsappRecipient":{"type":"string","description":"International E.164 phone number","example":"+971501234567"},"telegramRecipient":{"type":"string","description":"Telegram chat ID for the configured platform bot"}}},"ApiKeyDto":{"type":"object","properties":{"name":{"type":"string","example":"Production n8n","maxLength":150}},"required":["name"]}},"securitySchemes":{"san_session":{"type":"apiKey","in":"cookie","name":"san_session","description":"Sign in on this site to use your browser session."},"api-key":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Enter the API key from your workspace settings."}}}}