{"openapi":"3.0.0","paths":{"/v1/accounts":{"post":{"operationId":"AccountsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAccountDto"}}}},"responses":{"201":{"description":"Account created successfully"}},"summary":"Create a new account","tags":["accounts"]}},"/v1/accounts/me":{"get":{"operationId":"AccountsController_getCurrentAccount","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get current account","tags":["accounts"]}},"/v1/accounts/me/usage":{"get":{"operationId":"AccountsController_getUsage","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get account usage","tags":["accounts"]}},"/v1/accounts/me/members":{"get":{"description":"API-key-accessible member list for integrations that need to populate an assignee picker. GET /auth/members is session-only and cannot serve this. Returns ids suitable for Ticket.assigneeId.","operationId":"AccountsController_listMembers","parameters":[],"responses":{"200":{"description":"Members list"}},"security":[{"api-key":[]}],"summary":"List account members (assignable agents)","tags":["accounts"]}},"/v1/accounts/me/api-keys":{"get":{"operationId":"AccountsController_listApiKeys","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List API keys","tags":["accounts"]},"post":{"operationId":"AccountsController_createApiKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":"API key created. The key value is only returned once."}},"security":[{"api-key":[]}],"summary":"Create new API key","tags":["accounts"]}},"/v1/accounts/me/api-keys/{keyId}/scope":{"patch":{"operationId":"AccountsController_updateApiKeyScope","parameters":[{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeyScopeDto"}}}},"responses":{"200":{"description":"API key scope updated"}},"security":[{"api-key":[]}],"summary":"Update API key brand scope","tags":["accounts"]}},"/v1/accounts/me/api-keys/{keyId}":{"delete":{"operationId":"AccountsController_revokeApiKey","parameters":[{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Revoke an API key","tags":["accounts"]}},"/v1/auth/check-email":{"post":{"operationId":"AuthController_checkEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMagicLinkDto"}}}},"responses":{"200":{"description":"Returns exists: true/false"},"429":{"description":"Rate limit exceeded"}},"summary":"Check if an account exists for the given email","tags":["auth"]}},"/v1/auth/checkout":{"post":{"operationId":"AuthController_createCheckout","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutDto"}}}},"responses":{"200":{"description":"Checkout URL returned"},"400":{"description":"Failed to create checkout session"}},"summary":"Create a checkout session for signup","tags":["auth"]}},"/v1/auth/signup":{"post":{"operationId":"AuthController_signup","parameters":[{"name":"origin","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupDto"}}}},"responses":{"200":{"description":"Account created, magic link sent"},"400":{"description":"Failed to create account or email already exists"}},"summary":"Complete signup after checkout","tags":["auth"]}},"/v1/auth/magic-link":{"post":{"operationId":"AuthController_sendMagicLink","parameters":[{"name":"origin","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMagicLinkDto"}}}},"responses":{"200":{"description":"Magic link sent"},"400":{"description":"Failed to send magic link"}},"summary":"Send magic link email for authentication","tags":["auth"]}},"/v1/auth/verify":{"post":{"operationId":"AuthController_verifyToken","parameters":[{"name":"setCookies","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyTokenDto"}}}},"responses":{"200":{"description":"Session created"},"400":{"description":"Invalid or expired token"}},"summary":"Verify magic link token and create session","tags":["auth"]}},"/v1/auth/session":{"get":{"operationId":"AuthController_getSession","parameters":[],"responses":{"200":{"description":"Session info"},"401":{"description":"Invalid session"}},"security":[{"session-token":[]}],"summary":"Get current session info","tags":["auth"]}},"/v1/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"responses":{"200":{"description":"Logged out"}},"security":[{"session-token":[]}],"summary":"Logout and invalidate session","tags":["auth"]}},"/v1/auth/accept-invite":{"post":{"operationId":"AuthController_acceptInvite","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteDto"}}}},"responses":{"200":{"description":"Invite accepted"},"400":{"description":"Failed to accept invite"},"404":{"description":"Invite not found or expired"}},"security":[{"session-token":[]}],"summary":"Accept an organization invite","tags":["auth"]}},"/v1/auth/connect":{"post":{"operationId":"AuthController_connect","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectApiKeyDto"}}}},"responses":{"200":{"description":"API key connected"},"400":{"description":"Invalid API key"}},"security":[{"session-token":[]}],"summary":"Connect organization to Dispatch API key","tags":["auth"]}},"/v1/auth/members":{"get":{"operationId":"AuthController_getMembers","parameters":[{"name":"brandId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Members list"}},"security":[{"session-token":[]}],"summary":"List organization members","tags":["auth"]}},"/v1/auth/members/invite":{"post":{"operationId":"AuthController_inviteMember","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteMemberDto"}}}},"responses":{"200":{"description":"Invitation sent"},"400":{"description":"User is already a member"},"403":{"description":"Only owners and admins can invite"}},"security":[{"session-token":[]}],"summary":"Invite a member to the organization","tags":["auth"]}},"/v1/auth/members/{memberId}/resend-invite":{"post":{"operationId":"AuthController_resendInvite","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Invitation resent"},"400":{"description":"Member is not pending"},"403":{"description":"Only owners and admins can resend invites"},"404":{"description":"Member not found"}},"security":[{"session-token":[]}],"summary":"Resend invite to a pending member","tags":["auth"]}},"/v1/auth/members/{memberId}":{"patch":{"operationId":"AuthController_updateMember","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberDto"}}}},"responses":{"200":{"description":"Member updated"},"403":{"description":"Only owners and admins can update"},"404":{"description":"Member not found"}},"security":[{"session-token":[]}],"summary":"Update member role","tags":["auth"]},"delete":{"operationId":"AuthController_removeMember","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Member removed"},"403":{"description":"Only owners and admins can remove"},"404":{"description":"Member not found"}},"security":[{"session-token":[]}],"summary":"Remove member from organization","tags":["auth"]}},"/v1/auth/transfer-ownership":{"post":{"operationId":"AuthController_transferOwnership","parameters":[],"responses":{"200":{"description":"Ownership transferred successfully"},"403":{"description":"Only the owner can transfer ownership"},"404":{"description":"New owner must be an existing member"}},"security":[{"session-token":[]}],"summary":"Transfer organization ownership to another member","tags":["auth"]}},"/v1/auth/members/{memberId}/brands":{"get":{"operationId":"AuthController_getBrandAssignments","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Brand assignments returned"},"404":{"description":"Member not found"}},"security":[{"session-token":[]}],"summary":"Get member brand assignments","tags":["auth"]},"put":{"operationId":"AuthController_updateBrandAssignments","parameters":[{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBrandAssignmentsDto"}}}},"responses":{"200":{"description":"Brand assignments updated"},"403":{"description":"Insufficient permissions"},"404":{"description":"Member not found"}},"security":[{"session-token":[]}],"summary":"Update member brand assignments","tags":["auth"]}},"/v1/auth/organizations":{"get":{"operationId":"AuthController_listOrganizations","parameters":[],"responses":{"200":{"description":"Organizations list"}},"security":[{"session-token":[]}],"summary":"List organizations the current user belongs to","tags":["auth"]}},"/v1/auth/switch-organization":{"post":{"operationId":"AuthController_switchOrganization","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchOrganizationDto"}}}},"responses":{"200":{"description":"Switched organization, new session token returned"},"403":{"description":"Not a member of this organization"}},"security":[{"session-token":[]}],"summary":"Switch to a different organization","tags":["auth"]}},"/v1/auth/organization":{"get":{"operationId":"AuthController_getOrganization","parameters":[],"responses":{"200":{"description":"Organization details"}},"security":[{"session-token":[]}],"summary":"Get organization details","tags":["auth"]},"patch":{"operationId":"AuthController_updateOrganization","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrganizationDto"}}}},"responses":{"200":{"description":"Organization updated"},"403":{"description":"Only owners can update"}},"security":[{"session-token":[]}],"summary":"Update organization name","tags":["auth"]}},"/v1/auth/profile":{"get":{"operationId":"AuthController_getProfile","parameters":[],"responses":{"200":{"description":"User profile"}},"security":[{"session-token":[]}],"summary":"Get current user profile","tags":["auth"]},"patch":{"operationId":"AuthController_updateProfile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":"Profile updated"}},"security":[{"session-token":[]}],"summary":"Update user profile","tags":["auth"]}},"/v1/auth/profile/avatar":{"post":{"operationId":"AuthController_initiateAvatarUpload","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarUploadDto"}}}},"responses":{"200":{"description":"Upload URL returned"}},"security":[{"session-token":[]}],"summary":"Initiate avatar upload - get presigned URL","tags":["auth"]},"delete":{"operationId":"AuthController_deleteAvatar","parameters":[],"responses":{"200":{"description":"Avatar deleted"}},"security":[{"session-token":[]}],"summary":"Delete avatar and revert to default","tags":["auth"]}},"/v1/auth/profile/avatar/upload":{"post":{"operationId":"AuthController_uploadAvatarDirect","parameters":[],"responses":{"200":{"description":"Avatar uploaded and profile updated"}},"security":[{"session-token":[]}],"summary":"Upload avatar directly (multipart/form-data)","tags":["auth"]}},"/v1/auth/profile/avatar/confirm":{"post":{"operationId":"AuthController_confirmAvatarUpload","parameters":[],"responses":{"200":{"description":"Avatar updated"}},"security":[{"session-token":[]}],"summary":"Confirm avatar upload completed","tags":["auth"]}},"/v1/auth/plans":{"get":{"operationId":"AuthController_getPlans","parameters":[],"responses":{"200":{"description":"List of active plans"}},"summary":"Get available pricing plans","tags":["auth"]}},"/v1/auth/coupons":{"get":{"operationId":"AuthController_listCoupons","parameters":[],"responses":{"200":{"description":"List of coupons"}},"security":[{"session-token":[]}],"summary":"List available coupons (admin only)","tags":["auth"]}},"/v1/auth/coupons/{code}":{"patch":{"operationId":"AuthController_updateCoupon","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Coupon updated"}},"security":[{"session-token":[]}],"summary":"Update coupon usage limit (admin only)","tags":["auth"]}},"/v1/auth/subscription":{"get":{"operationId":"AuthController_getSubscription","parameters":[],"responses":{"200":{"description":"Subscription info"}},"security":[{"session-token":[]}],"summary":"Get current subscription info","tags":["auth"]}},"/v1/auth/usage":{"get":{"operationId":"AuthController_getUsage","parameters":[],"responses":{"200":{"description":"Usage info"}},"security":[{"session-token":[]}],"summary":"Get ticket usage for current billing period","tags":["auth"]}},"/v1/auth/subscription/upgrade":{"post":{"operationId":"AuthController_upgradeSubscription","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeSubscriptionDto"}}}},"responses":{"200":{"description":"Checkout URL returned"},"400":{"description":"Failed to create upgrade session"}},"security":[{"session-token":[]}],"summary":"Create checkout session for plan upgrade","tags":["auth"]}},"/v1/auth/subscription/cancel-pending-change":{"post":{"operationId":"AuthController_cancelPendingChange","parameters":[],"responses":{"200":{"description":"Scheduled plan change cleared"}},"security":[{"session-token":[]}],"summary":"Cancel a scheduled (deferred) plan change — keep the current plan","tags":["auth"]}},"/v1/auth/subscription/cancel":{"post":{"operationId":"AuthController_cancelSubscription","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSubscriptionDto"}}}},"responses":{"200":{"description":"Subscription cancelled"},"404":{"description":"No active subscription"}},"security":[{"session-token":[]}],"summary":"Cancel subscription","tags":["auth"]}},"/v1/auth/subscription/reactivate":{"post":{"operationId":"AuthController_reactivateSubscription","parameters":[],"responses":{"200":{"description":"Subscription reactivated"},"404":{"description":"No subscription found"}},"security":[{"session-token":[]}],"summary":"Reactivate cancelled subscription","tags":["auth"]}},"/v1/auth/subscription/confirm":{"post":{"operationId":"AuthController_confirmCheckout","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmCheckoutDto"}}}},"responses":{"200":{"description":"Subscription created and cached"},"400":{"description":"Missing planRef or unknown planRef"}},"security":[{"session-token":[]}],"summary":"Confirm embedded checkout — creates Throttle subscription after card is vaulted","tags":["auth"]}},"/v1/auth/invoices":{"get":{"operationId":"AuthController_getInvoices","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Invoice list returned"}},"security":[{"session-token":[]}],"summary":"Get invoice/payment history","tags":["auth"]}},"/v1/auth/subscription/history":{"get":{"operationId":"AuthController_getSubscriptionHistory","parameters":[],"responses":{"200":{"description":"Subscription history returned"}},"security":[{"session-token":[]}],"summary":"Get subscription history (all past and current)","tags":["auth"]}},"/v1/auth/feature-requests":{"get":{"operationId":"AuthController_listFeatureRequests","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"sortBy","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Feature requests list"}},"security":[{"session-token":[]}],"summary":"List feature requests","tags":["auth"]},"post":{"operationId":"AuthController_createFeatureRequest","parameters":[],"responses":{"201":{"description":"Feature request created"}},"security":[{"session-token":[]}],"summary":"Create a feature request","tags":["auth"]}},"/v1/auth/feature-requests/activity":{"get":{"operationId":"AuthController_getFeatureActivity","parameters":[],"responses":{"200":{"description":"User activity (votes and authored)"}},"security":[{"session-token":[]}],"summary":"Get current user feature request activity","tags":["auth"]}},"/v1/auth/feature-requests/{id}/vote":{"post":{"operationId":"AuthController_voteFeatureRequest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Vote recorded"}},"security":[{"session-token":[]}],"summary":"Vote for a feature request","tags":["auth"]},"delete":{"operationId":"AuthController_unvoteFeatureRequest","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Vote removed"}},"security":[{"session-token":[]}],"summary":"Remove vote from a feature request","tags":["auth"]}},"/v1/auth/mentions/unread":{"get":{"operationId":"AuthController_getUnreadMentions","parameters":[],"responses":{"200":{"description":"Unread mentions list"}},"security":[{"session-token":[]}],"summary":"Get unread mentions for current user","tags":["auth"]}},"/v1/auth/mentions/{id}/ack":{"post":{"operationId":"AuthController_acknowledgeMention","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Mention acknowledged"},"404":{"description":"Mention not found"}},"security":[{"session-token":[]}],"summary":"Mark a mention as acknowledged","tags":["auth"]}},"/v1/auth/mentions/ack-ticket/{ticketId}":{"post":{"operationId":"AuthController_acknowledgeMentionsForTicket","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Mentions acknowledged"}},"security":[{"session-token":[]}],"summary":"Acknowledge all mentions for a ticket","tags":["auth"]}},"/v1/auth/payment-methods/client-token":{"get":{"operationId":"AuthController_getPmClientToken","parameters":[],"responses":{"200":{"description":"PM client token returned"}},"security":[{"session-token":[]}],"summary":"Mint a PM client token for the <PaymentMethods> component","tags":["auth"]}},"/v1/auth/payment-methods":{"get":{"operationId":"AuthController_listPaymentMethods","parameters":[],"responses":{"200":{"description":"Saved payment methods returned"}},"security":[{"session-token":[]}],"summary":"List saved payment methods","tags":["auth"]}},"/v1/auth/payment-methods/add":{"post":{"operationId":"AuthController_startAddCard","parameters":[],"responses":{"200":{"description":"Embed token returned"}},"security":[{"session-token":[]}],"summary":"Start add-card flow — mints a vault embed token","tags":["auth"]}},"/v1/auth/payment-methods/{id}/default":{"post":{"operationId":"AuthController_setDefaultPaymentMethod","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Default payment method updated"}},"security":[{"session-token":[]}],"summary":"Set a payment method as the default","tags":["auth"]}},"/v1/auth/payment-methods/{id}":{"delete":{"operationId":"AuthController_removePaymentMethod","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Payment method removed"},"400":{"description":"Cannot remove default or only payment method on active subscription"}},"security":[{"session-token":[]}],"summary":"Remove a saved payment method","tags":["auth"]}},"/v1/auth/account":{"delete":{"operationId":"AuthController_deleteAccount","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountDto"}}}},"responses":{"200":{"description":"Account deleted"},"400":{"description":"Invalid confirmation"},"403":{"description":"Only owners can delete accounts"}},"security":[{"session-token":[]}],"summary":"Delete account and all associated data","tags":["auth"]}},"/v1/billing/config":{"get":{"operationId":"BillingController_getConfig","parameters":[],"responses":{"200":{"description":"Active billing provider and checkout mode","content":{"application/json":{"schema":{"example":{"provider":"stackbe","checkoutMode":"redirect"}}}}}},"summary":"Get active billing provider config","tags":["billing"]}},"/v1/billing/throttle-webhooks":{"post":{"operationId":"ThrottleWebhooksController_handle","parameters":[],"responses":{"200":{"description":""}},"tags":["ThrottleWebhooks"]}},"/v1/webhooks/clerk":{"post":{"operationId":"ClerkWebhookController_handle","parameters":[],"responses":{"200":{"description":""}},"tags":["ClerkWebhook"]}},"/v1/brands/{brandId}/logs":{"get":{"operationId":"AuditLogController_getBrandLogs","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"entityType","required":true,"in":"query","schema":{"type":"string"}},{"name":"entityId","required":true,"in":"query","schema":{"type":"string"}},{"name":"event","required":true,"in":"query","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"performerType","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["AuditLog"]}},"/v1/workspaces/{brandId}/logs":{"get":{"operationId":"AuditLogController_getWorkspaceLogs","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"entityType","required":true,"in":"query","schema":{"type":"string"}},{"name":"entityId","required":true,"in":"query","schema":{"type":"string"}},{"name":"event","required":true,"in":"query","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"performerType","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["AuditLog"]}},"/v1/brands/{brandId}/tickets/{ticketId}/logs":{"get":{"operationId":"AuditLogController_getTicketLogs","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["AuditLog"]}},"/v1/workspaces/{brandId}/tickets/{ticketId}/logs":{"get":{"operationId":"AuditLogController_getTicketLogsApi","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["AuditLog"]}},"/v1/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":""}},"summary":"Health check endpoint","tags":["health"]}},"/v1/health/live":{"get":{"operationId":"HealthController_live","parameters":[],"responses":{"200":{"description":""}},"summary":"Liveness probe","tags":["health"]}},"/v1/health/ready":{"get":{"operationId":"HealthController_ready","parameters":[],"responses":{"200":{"description":""}},"summary":"Readiness probe","tags":["health"]}},"/v1/brands":{"post":{"operationId":"BrandsController_create[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBrandDto"}}}},"responses":{"201":{"description":"Brand created"}},"security":[{"api-key":[]}],"summary":"Create a new brand","tags":["brands"]},"get":{"operationId":"BrandsController_findAll[0]","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List all brands","tags":["brands"]}},"/v1/workspaces":{"post":{"operationId":"BrandsController_create[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBrandDto"}}}},"responses":{"201":{"description":"Brand created"}},"security":[{"api-key":[]}],"summary":"Create a new brand","tags":["brands"]},"get":{"operationId":"BrandsController_findAll[1]","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List all brands","tags":["brands"]}},"/v1/brands/{brandId}":{"get":{"operationId":"BrandsController_findOne[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a brand by ID","tags":["brands"]},"patch":{"operationId":"BrandsController_update[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBrandDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a brand","tags":["brands"]},"delete":{"description":"Deletes a brand and all associated data. Without confirm=true, returns a preview of what will be deleted. Requires owner role when using session auth.","operationId":"BrandsController_delete[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"confirm","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Brand deleted or deletion preview returned"},"403":{"description":"Only organization owners can delete brands"}},"security":[{"api-key":[]}],"summary":"Delete a brand","tags":["brands"]}},"/v1/workspaces/{brandId}":{"get":{"operationId":"BrandsController_findOne[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a brand by ID","tags":["brands"]},"patch":{"operationId":"BrandsController_update[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBrandDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a brand","tags":["brands"]},"delete":{"description":"Deletes a brand and all associated data. Without confirm=true, returns a preview of what will be deleted. Requires owner role when using session auth.","operationId":"BrandsController_delete[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"confirm","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Brand deleted or deletion preview returned"},"403":{"description":"Only organization owners can delete brands"}},"security":[{"api-key":[]}],"summary":"Delete a brand","tags":["brands"]}},"/v1/brands/{brandId}/schema":{"get":{"operationId":"BrandsController_getSchema[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get brand ticket schema","tags":["brands"]},"put":{"operationId":"BrandsController_setSchema[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Set brand ticket schema","tags":["brands"]}},"/v1/workspaces/{brandId}/schema":{"get":{"operationId":"BrandsController_getSchema[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get brand ticket schema","tags":["brands"]},"put":{"operationId":"BrandsController_setSchema[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Set brand ticket schema","tags":["brands"]}},"/v1/brands/{brandId}/statuses":{"get":{"operationId":"StatusesController_findAll[0]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"responses":{"200":{"description":"List of statuses"}},"security":[{"bearer":[]}],"summary":"List all statuses for a brand","tags":["Statuses"]},"post":{"operationId":"StatusesController_create[0]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStatusDto"}}}},"responses":{"201":{"description":"Status created"},"409":{"description":"Status with key already exists"}},"security":[{"bearer":[]}],"summary":"Create a new custom status","tags":["Statuses"]}},"/v1/workspaces/{brandId}/statuses":{"get":{"operationId":"StatusesController_findAll[1]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"responses":{"200":{"description":"List of statuses"}},"security":[{"bearer":[]}],"summary":"List all statuses for a brand","tags":["Statuses"]},"post":{"operationId":"StatusesController_create[1]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStatusDto"}}}},"responses":{"201":{"description":"Status created"},"409":{"description":"Status with key already exists"}},"security":[{"bearer":[]}],"summary":"Create a new custom status","tags":["Statuses"]}},"/v1/brands/{brandId}/statuses/stats":{"get":{"operationId":"StatusesController_getStats[0]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Statuses with ticket counts"}},"security":[{"bearer":[]}],"summary":"Get ticket counts per status","tags":["Statuses"]}},"/v1/workspaces/{brandId}/statuses/stats":{"get":{"operationId":"StatusesController_getStats[1]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Statuses with ticket counts"}},"security":[{"bearer":[]}],"summary":"Get ticket counts per status","tags":["Statuses"]}},"/v1/brands/{brandId}/statuses/{id}":{"get":{"operationId":"StatusesController_findById[0]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Status ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Status details"},"404":{"description":"Status not found"}},"security":[{"bearer":[]}],"summary":"Get a status by ID","tags":["Statuses"]},"patch":{"operationId":"StatusesController_update[0]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Status ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStatusDto"}}}},"responses":{"200":{"description":"Status updated"},"404":{"description":"Status not found"}},"security":[{"bearer":[]}],"summary":"Update a status","tags":["Statuses"]},"delete":{"operationId":"StatusesController_delete[0]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Status ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Status deleted"},"403":{"description":"Cannot delete system statuses"},"404":{"description":"Status not found"}},"security":[{"bearer":[]}],"summary":"Delete a custom status","tags":["Statuses"]}},"/v1/workspaces/{brandId}/statuses/{id}":{"get":{"operationId":"StatusesController_findById[1]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Status ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Status details"},"404":{"description":"Status not found"}},"security":[{"bearer":[]}],"summary":"Get a status by ID","tags":["Statuses"]},"patch":{"operationId":"StatusesController_update[1]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Status ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStatusDto"}}}},"responses":{"200":{"description":"Status updated"},"404":{"description":"Status not found"}},"security":[{"bearer":[]}],"summary":"Update a status","tags":["Statuses"]},"delete":{"operationId":"StatusesController_delete[1]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Status ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Status deleted"},"403":{"description":"Cannot delete system statuses"},"404":{"description":"Status not found"}},"security":[{"bearer":[]}],"summary":"Delete a custom status","tags":["Statuses"]}},"/v1/brands/{brandId}/statuses/reorder":{"post":{"operationId":"StatusesController_reorder[0]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderStatusesDto"}}}},"responses":{"200":{"description":"Statuses reordered"}},"security":[{"bearer":[]}],"summary":"Reorder statuses","tags":["Statuses"]}},"/v1/workspaces/{brandId}/statuses/reorder":{"post":{"operationId":"StatusesController_reorder[1]","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderStatusesDto"}}}},"responses":{"200":{"description":"Statuses reordered"}},"security":[{"bearer":[]}],"summary":"Reorder statuses","tags":["Statuses"]}},"/v1/brands/{brandId}/tickets":{"post":{"operationId":"TicketsController_create[0]","parameters":[{"name":"x-idempotency-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","description":"Unique key to prevent duplicate ticket creation (UUID recommended)","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTicketDto"}}}},"responses":{"200":{"description":"Ticket already created (idempotent retry)"},"201":{"description":"Ticket created"}},"security":[{"api-key":[]}],"summary":"Create a new ticket in a brand","tags":["tickets"]},"get":{"operationId":"TicketsController_findAll[0]","parameters":[{"name":"status","required":false,"in":"query","description":"Filter by status. Supports comma-separated values (e.g., \"open,pending\") or \"active\" as alias for \"open,pending\"","schema":{"example":"open","type":"string"}},{"name":"priority","required":false,"in":"query","schema":{"example":"high","type":"string"}},{"name":"assigneeId","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","description":"Filter by customer ID","schema":{"type":"string"}},{"name":"customerEmail","required":false,"in":"query","description":"Filter by customer email (convenience filter, looks up customerId)","schema":{"type":"string"}},{"name":"companyId","required":false,"in":"query","description":"Filter to tickets whose contact belongs to this company. Lets an integrator show one client org its own tickets without exposing the rest of the brand.","schema":{"type":"string"}},{"name":"createdBy","required":false,"in":"query","schema":{"type":"string"}},{"name":"createdAfter","required":false,"in":"query","schema":{"type":"string"}},{"name":"createdBefore","required":false,"in":"query","schema":{"type":"string"}},{"name":"hasAttachments","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"isSpam","required":false,"in":"query","description":"Filter by spam status. If not specified, spam tickets are excluded by default.","schema":{"type":"boolean"}},{"name":"search","required":false,"in":"query","description":"Full-text search in title/body","schema":{"type":"string"}},{"name":"categoryId","required":false,"in":"query","description":"Filter by category ID. Use \"null\" to find uncategorized tickets.","schema":{"example":"cat_abc123","type":"string"}},{"name":"tagIds","required":false,"in":"query","description":"Filter by tag IDs (comma-separated). Tickets must have ALL specified tags.","schema":{"type":"array","items":{"type":"string"}}},{"name":"sort","required":false,"in":"query","schema":{"default":"createdAt","enum":["createdAt","updatedAt","priority","ticketNumber","title","status","customer","company","assignee","category"],"type":"string"}},{"name":"order","required":false,"in":"query","schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List tickets in a brand","tags":["tickets"]}},"/v1/workspaces/{workspaceId}/tickets":{"post":{"operationId":"TicketsController_create[1]","parameters":[{"name":"x-idempotency-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","description":"Unique key to prevent duplicate ticket creation (UUID recommended)","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTicketDto"}}}},"responses":{"200":{"description":"Ticket already created (idempotent retry)"},"201":{"description":"Ticket created"}},"security":[{"api-key":[]}],"summary":"Create a new ticket in a brand","tags":["tickets"]},"get":{"operationId":"TicketsController_findAll[1]","parameters":[{"name":"status","required":false,"in":"query","description":"Filter by status. Supports comma-separated values (e.g., \"open,pending\") or \"active\" as alias for \"open,pending\"","schema":{"example":"open","type":"string"}},{"name":"priority","required":false,"in":"query","schema":{"example":"high","type":"string"}},{"name":"assigneeId","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","description":"Filter by customer ID","schema":{"type":"string"}},{"name":"customerEmail","required":false,"in":"query","description":"Filter by customer email (convenience filter, looks up customerId)","schema":{"type":"string"}},{"name":"companyId","required":false,"in":"query","description":"Filter to tickets whose contact belongs to this company. Lets an integrator show one client org its own tickets without exposing the rest of the brand.","schema":{"type":"string"}},{"name":"createdBy","required":false,"in":"query","schema":{"type":"string"}},{"name":"createdAfter","required":false,"in":"query","schema":{"type":"string"}},{"name":"createdBefore","required":false,"in":"query","schema":{"type":"string"}},{"name":"hasAttachments","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"isSpam","required":false,"in":"query","description":"Filter by spam status. If not specified, spam tickets are excluded by default.","schema":{"type":"boolean"}},{"name":"search","required":false,"in":"query","description":"Full-text search in title/body","schema":{"type":"string"}},{"name":"categoryId","required":false,"in":"query","description":"Filter by category ID. Use \"null\" to find uncategorized tickets.","schema":{"example":"cat_abc123","type":"string"}},{"name":"tagIds","required":false,"in":"query","description":"Filter by tag IDs (comma-separated). Tickets must have ALL specified tags.","schema":{"type":"array","items":{"type":"string"}}},{"name":"sort","required":false,"in":"query","schema":{"default":"createdAt","enum":["createdAt","updatedAt","priority","ticketNumber","title","status","customer","company","assignee","category"],"type":"string"}},{"name":"order","required":false,"in":"query","schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List tickets in a brand","tags":["tickets"]}},"/v1/brands/{brandId}/tickets/{ticketId}":{"get":{"operationId":"TicketsController_findOne[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a ticket by ID","tags":["tickets"]},"patch":{"operationId":"TicketsController_update[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTicketDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a ticket","tags":["tickets"]},"delete":{"operationId":"TicketsController_delete[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a ticket","tags":["tickets"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}":{"get":{"operationId":"TicketsController_findOne[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a ticket by ID","tags":["tickets"]},"patch":{"operationId":"TicketsController_update[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTicketDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a ticket","tags":["tickets"]},"delete":{"operationId":"TicketsController_delete[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a ticket","tags":["tickets"]}},"/v1/brands/{brandId}/tickets/{ticketId}/spam":{"post":{"operationId":"TicketsController_markAsSpam[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkAsSpamDto"}}}},"responses":{"200":{"description":"Ticket spam status updated"}},"security":[{"api-key":[]}],"summary":"Mark or unmark a ticket as spam","tags":["tickets"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/spam":{"post":{"operationId":"TicketsController_markAsSpam[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkAsSpamDto"}}}},"responses":{"200":{"description":"Ticket spam status updated"}},"security":[{"api-key":[]}],"summary":"Mark or unmark a ticket as spam","tags":["tickets"]}},"/v1/brands/{brandId}/tickets/{ticketId}/merge":{"post":{"operationId":"TicketsController_merge[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeTicketsDto"}}}},"responses":{"200":{"description":"Tickets merged successfully"}},"security":[{"api-key":[]}],"summary":"Merge multiple tickets into one","tags":["tickets"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/merge":{"post":{"operationId":"TicketsController_merge[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeTicketsDto"}}}},"responses":{"200":{"description":"Tickets merged successfully"}},"security":[{"api-key":[]}],"summary":"Merge multiple tickets into one","tags":["tickets"]}},"/v1/brands/{brandId}/tickets/{ticketId}/watchers":{"get":{"operationId":"TicketsController_getWatchers[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"List of watchers"}},"security":[{"api-key":[]}],"summary":"Get all watchers for a ticket","tags":["tickets"]},"post":{"operationId":"TicketsController_addWatcher[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Watcher added"}},"security":[{"api-key":[]}],"summary":"Add a watcher to a ticket","tags":["tickets"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/watchers":{"get":{"operationId":"TicketsController_getWatchers[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"List of watchers"}},"security":[{"api-key":[]}],"summary":"Get all watchers for a ticket","tags":["tickets"]},"post":{"operationId":"TicketsController_addWatcher[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Watcher added"}},"security":[{"api-key":[]}],"summary":"Add a watcher to a ticket","tags":["tickets"]}},"/v1/brands/{brandId}/tickets/{ticketId}/watchers/{memberId}":{"delete":{"operationId":"TicketsController_removeWatcher[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Watcher removed"}},"security":[{"api-key":[]}],"summary":"Remove a watcher from a ticket","tags":["tickets"]},"patch":{"operationId":"TicketsController_updateWatcherPreferences[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Watcher preferences updated"}},"security":[{"api-key":[]}],"summary":"Update watcher notification preferences","tags":["tickets"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/watchers/{memberId}":{"delete":{"operationId":"TicketsController_removeWatcher[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Watcher removed"}},"security":[{"api-key":[]}],"summary":"Remove a watcher from a ticket","tags":["tickets"]},"patch":{"operationId":"TicketsController_updateWatcherPreferences[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Watcher preferences updated"}},"security":[{"api-key":[]}],"summary":"Update watcher notification preferences","tags":["tickets"]}},"/v1/brands/{brandId}/tickets/bulk":{"post":{"operationId":"TicketsController_bulkAction[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionDto"}}}},"responses":{"200":{"description":"Bulk action completed"}},"security":[{"api-key":[]}],"summary":"Perform bulk action on multiple tickets","tags":["tickets"]}},"/v1/workspaces/{workspaceId}/tickets/bulk":{"post":{"operationId":"TicketsController_bulkAction[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionDto"}}}},"responses":{"200":{"description":"Bulk action completed"}},"security":[{"api-key":[]}],"summary":"Perform bulk action on multiple tickets","tags":["tickets"]}},"/v1/brands/{brandId}/blocked-sources":{"get":{"operationId":"BlockedSourcesController_list[0]","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List blocked sources for a brand","tags":["blocked-sources"]},"post":{"operationId":"BlockedSourcesController_block[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockSourceDto"}}}},"responses":{"201":{"description":"Source blocked"}},"security":[{"api-key":[]}],"summary":"Block a source","tags":["blocked-sources"]}},"/v1/workspaces/{workspaceId}/blocked-sources":{"get":{"operationId":"BlockedSourcesController_list[1]","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List blocked sources for a brand","tags":["blocked-sources"]},"post":{"operationId":"BlockedSourcesController_block[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockSourceDto"}}}},"responses":{"201":{"description":"Source blocked"}},"security":[{"api-key":[]}],"summary":"Block a source","tags":["blocked-sources"]}},"/v1/brands/{brandId}/blocked-sources/{sourceId}":{"delete":{"operationId":"BlockedSourcesController_unblock[0]","parameters":[{"name":"sourceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Unblock a source","tags":["blocked-sources"]}},"/v1/workspaces/{workspaceId}/blocked-sources/{sourceId}":{"delete":{"operationId":"BlockedSourcesController_unblock[1]","parameters":[{"name":"sourceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Unblock a source","tags":["blocked-sources"]}},"/v1/tickets":{"get":{"operationId":"CrossWorkspaceTicketsController_findAll","parameters":[{"name":"status","required":false,"in":"query","description":"Filter by status. Supports comma-separated values (e.g., \"open,pending\") or \"active\" as alias for \"open,pending\"","schema":{"example":"open","type":"string"}},{"name":"priority","required":false,"in":"query","schema":{"example":"high","type":"string"}},{"name":"assigneeId","required":false,"in":"query","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","description":"Filter by customer ID","schema":{"type":"string"}},{"name":"customerEmail","required":false,"in":"query","description":"Filter by customer email (convenience filter, looks up customerId)","schema":{"type":"string"}},{"name":"companyId","required":false,"in":"query","description":"Filter to tickets whose contact belongs to this company. Lets an integrator show one client org its own tickets without exposing the rest of the brand.","schema":{"type":"string"}},{"name":"createdBy","required":false,"in":"query","schema":{"type":"string"}},{"name":"createdAfter","required":false,"in":"query","schema":{"type":"string"}},{"name":"createdBefore","required":false,"in":"query","schema":{"type":"string"}},{"name":"hasAttachments","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"isSpam","required":false,"in":"query","description":"Filter by spam status. If not specified, spam tickets are excluded by default.","schema":{"type":"boolean"}},{"name":"search","required":false,"in":"query","description":"Full-text search in title/body","schema":{"type":"string"}},{"name":"categoryId","required":false,"in":"query","description":"Filter by category ID. Use \"null\" to find uncategorized tickets.","schema":{"example":"cat_abc123","type":"string"}},{"name":"tagIds","required":false,"in":"query","description":"Filter by tag IDs (comma-separated). Tickets must have ALL specified tags.","schema":{"type":"array","items":{"type":"string"}}},{"name":"sort","required":false,"in":"query","schema":{"default":"createdAt","enum":["createdAt","updatedAt","priority","ticketNumber","title","status","customer","company","assignee","category"],"type":"string"}},{"name":"order","required":false,"in":"query","schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}},{"name":"brandIds","required":false,"in":"query","description":"Filter to specific brand IDs (comma-separated). Alias: workspaceIds","schema":{"type":"array","items":{"type":"string"}}},{"name":"workspaceIds","required":false,"in":"query","description":"Alias for brandIds (deprecated, use brandIds)","deprecated":true,"schema":{"type":"array","items":{"type":"string"}}},{"name":"source","required":false,"in":"query","description":"Filter by ticket source (email, api, web, etc.)","schema":{"example":"email","type":"string"}}],"responses":{"200":{"description":"Paginated list of tickets from all brands"}},"security":[{"session":[]}],"summary":"List tickets across all brands","tags":["dashboard"]}},"/v1/tickets/stats":{"get":{"operationId":"CrossWorkspaceTicketsController_getStats","parameters":[],"responses":{"200":{"description":"Ticket counts by status and brand"}},"security":[{"session":[]}],"summary":"Get ticket statistics across all brands","tags":["dashboard"]}},"/v1/tickets/trends":{"get":{"operationId":"CrossWorkspaceTicketsController_getTrends","parameters":[],"responses":{"200":{"description":"Daily ticket counts (created and resolved)"}},"security":[{"session":[]}],"summary":"Get ticket volume trends over time","tags":["dashboard"]}},"/v1/tickets/team-metrics":{"get":{"operationId":"CrossWorkspaceTicketsController_getTeamMetrics","parameters":[],"responses":{"200":{"description":"Team member performance metrics"}},"security":[{"session":[]}],"summary":"Get team performance metrics (resolved tickets and CSAT)","tags":["dashboard"]}},"/v1/brands/{brandId}/contacts":{"post":{"operationId":"ContactsController_create[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContactDto"}}}},"responses":{"201":{"description":"Contact created"}},"security":[{"api-key":[]}],"summary":"Create a new contact","tags":["contacts"]},"get":{"operationId":"ContactsController_findAll[0]","parameters":[{"name":"search","required":false,"in":"query","description":"Search by email or name","schema":{"type":"string"}},{"name":"companyId","required":false,"in":"query","description":"Filter by company ID","schema":{"type":"string"}},{"name":"hideBlocked","required":false,"in":"query","description":"Hide contacts with blocked/spammed emails","schema":{"default":true,"type":"boolean"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List contacts","tags":["contacts"]}},"/v1/workspaces/{workspaceId}/contacts":{"post":{"operationId":"ContactsController_create[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContactDto"}}}},"responses":{"201":{"description":"Contact created"}},"security":[{"api-key":[]}],"summary":"Create a new contact","tags":["contacts"]},"get":{"operationId":"ContactsController_findAll[1]","parameters":[{"name":"search","required":false,"in":"query","description":"Search by email or name","schema":{"type":"string"}},{"name":"companyId","required":false,"in":"query","description":"Filter by company ID","schema":{"type":"string"}},{"name":"hideBlocked","required":false,"in":"query","description":"Hide contacts with blocked/spammed emails","schema":{"default":true,"type":"boolean"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List contacts","tags":["contacts"]}},"/v1/brands/{brandId}/contacts/search":{"get":{"operationId":"ContactsController_search[0]","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Search contacts for autocomplete","tags":["contacts"]}},"/v1/workspaces/{workspaceId}/contacts/search":{"get":{"operationId":"ContactsController_search[1]","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Search contacts for autocomplete","tags":["contacts"]}},"/v1/brands/{brandId}/contacts/{contactId}":{"get":{"operationId":"ContactsController_findOne[0]","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a contact by ID","tags":["contacts"]},"patch":{"operationId":"ContactsController_update[0]","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContactDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a contact","tags":["contacts"]},"delete":{"operationId":"ContactsController_delete[0]","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a contact","tags":["contacts"]}},"/v1/workspaces/{workspaceId}/contacts/{contactId}":{"get":{"operationId":"ContactsController_findOne[1]","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a contact by ID","tags":["contacts"]},"patch":{"operationId":"ContactsController_update[1]","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContactDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a contact","tags":["contacts"]},"delete":{"operationId":"ContactsController_delete[1]","parameters":[{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a contact","tags":["contacts"]}},"/v1/brands/{brandId}/webhooks":{"post":{"operationId":"WebhooksController_create","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Create a webhook subscription","tags":["webhooks"]},"get":{"operationId":"WebhooksController_findAll","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List webhook subscriptions","tags":["webhooks"]}},"/v1/brands/{brandId}/webhooks/{webhookId}":{"get":{"operationId":"WebhooksController_findOne","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"webhookId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a webhook by ID","tags":["webhooks"]},"delete":{"operationId":"WebhooksController_delete","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"webhookId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a webhook subscription","tags":["webhooks"]}},"/v1/brands/{brandId}/webhooks/{webhookId}/deliveries":{"get":{"operationId":"WebhooksController_getDeliveries","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"webhookId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get recent webhook delivery attempts","tags":["webhooks"]}},"/v1/workspaces/{workspaceId}/webhooks":{"post":{"operationId":"WebhooksLegacyController_create","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Create a webhook subscription (legacy route)","tags":["webhooks"]},"get":{"operationId":"WebhooksLegacyController_findAll","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List webhook subscriptions (legacy route)","tags":["webhooks"]}},"/v1/workspaces/{workspaceId}/webhooks/{webhookId}":{"get":{"operationId":"WebhooksLegacyController_findOne","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"webhookId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a webhook by ID (legacy route)","tags":["webhooks"]},"delete":{"operationId":"WebhooksLegacyController_delete","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"webhookId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a webhook subscription (legacy route)","tags":["webhooks"]}},"/v1/brands/{brandId}/enrichment":{"get":{"operationId":"EnrichmentController_get","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get the brand's enrichment endpoint configuration","tags":["enrichment"]},"put":{"operationId":"EnrichmentController_upsert","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertEnrichmentDto"}}}},"responses":{"403":{"description":"Owners and admins only"}},"security":[{"api-key":[]}],"summary":"Create or update the enrichment endpoint","tags":["enrichment"]},"delete":{"operationId":"EnrichmentController_remove","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"403":{"description":"Owners and admins only"}},"security":[{"api-key":[]}],"summary":"Remove the enrichment endpoint","tags":["enrichment"]}},"/v1/brands/{brandId}/enrichment/rotate-secret":{"post":{"operationId":"EnrichmentController_rotateSecret","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"403":{"description":"Owners and admins only"}},"security":[{"api-key":[]}],"summary":"Generate a new signing secret (returned once)","tags":["enrichment"]}},"/v1/brands/{brandId}/enrichment/reveal-secret":{"post":{"operationId":"EnrichmentController_revealSecret","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"403":{"description":"Owners and admins only"}},"security":[{"api-key":[]}],"summary":"Read back the signing secret","tags":["enrichment"]}},"/v1/brands/{brandId}/enrichment/test":{"post":{"operationId":"EnrichmentController_test","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestEnrichmentDto"}}}},"responses":{"403":{"description":"Owners and admins only"}},"security":[{"api-key":[]}],"summary":"Probe the endpoint and return the raw response plus any contract warnings","tags":["enrichment"]}},"/v1/brands/{brandId}/tickets/{ticketId}/enrichment/refresh":{"post":{"operationId":"TicketEnrichmentController_refresh","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Re-fetch enrichment for a ticket now","tags":["enrichment"]}},"/v1/brands/{brandId}/email-connections":{"get":{"operationId":"EmailConnectionsController_getConnections[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmailConnectionResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Get all email connections for brand","tags":["email-connections"]}},"/v1/workspaces/{brandId}/email-connections":{"get":{"operationId":"EmailConnectionsController_getConnections[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmailConnectionResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Get all email connections for brand","tags":["email-connections"]}},"/v1/brands/{brandId}/email-connections/{connectionId}":{"get":{"operationId":"EmailConnectionsController_getConnection[0]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailConnectionResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get a specific email connection","tags":["email-connections"]},"patch":{"operationId":"EmailConnectionsController_updateConnection[0]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConnectionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailConnectionResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Update connection settings (name)","tags":["email-connections"]},"delete":{"operationId":"EmailConnectionsController_disconnect[0]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Connection removed"}},"security":[{"bearer":[]}],"summary":"Disconnect and remove an email connection","tags":["email-connections"]}},"/v1/workspaces/{brandId}/email-connections/{connectionId}":{"get":{"operationId":"EmailConnectionsController_getConnection[1]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailConnectionResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get a specific email connection","tags":["email-connections"]},"patch":{"operationId":"EmailConnectionsController_updateConnection[1]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConnectionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailConnectionResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Update connection settings (name)","tags":["email-connections"]},"delete":{"operationId":"EmailConnectionsController_disconnect[1]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Connection removed"}},"security":[{"bearer":[]}],"summary":"Disconnect and remove an email connection","tags":["email-connections"]}},"/v1/brands/{brandId}/email-connections/authorize":{"post":{"operationId":"EmailConnectionsController_initiateOAuth[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateOAuthDto"}}}},"responses":{"200":{"description":"Returns OAuth authorization URL"}},"security":[{"bearer":[]}],"summary":"Initiate OAuth flow to add a new email connection","tags":["email-connections"]}},"/v1/workspaces/{brandId}/email-connections/authorize":{"post":{"operationId":"EmailConnectionsController_initiateOAuth[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateOAuthDto"}}}},"responses":{"200":{"description":"Returns OAuth authorization URL"}},"security":[{"bearer":[]}],"summary":"Initiate OAuth flow to add a new email connection","tags":["email-connections"]}},"/v1/brands/{brandId}/email-connections/{connectionId}/primary":{"post":{"operationId":"EmailConnectionsController_setPrimary[0]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Connection set as primary"}},"security":[{"bearer":[]}],"summary":"Set connection as primary for outbound emails","tags":["email-connections"]}},"/v1/workspaces/{brandId}/email-connections/{connectionId}/primary":{"post":{"operationId":"EmailConnectionsController_setPrimary[1]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Connection set as primary"}},"security":[{"bearer":[]}],"summary":"Set connection as primary for outbound emails","tags":["email-connections"]}},"/v1/brands/{brandId}/email-connections/sync":{"post":{"operationId":"EmailConnectionsController_sync[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"full","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Sync completed"}},"security":[{"bearer":[]}],"summary":"Trigger manual sync of all email connections","tags":["email-connections"]}},"/v1/workspaces/{brandId}/email-connections/sync":{"post":{"operationId":"EmailConnectionsController_sync[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"full","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Sync completed"}},"security":[{"bearer":[]}],"summary":"Trigger manual sync of all email connections","tags":["email-connections"]}},"/v1/brands/{brandId}/email-connections/{connectionId}/sync":{"post":{"operationId":"EmailConnectionsController_syncConnection[0]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}},{"name":"full","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Sync completed"}},"security":[{"bearer":[]}],"summary":"Trigger manual sync for a specific connection","tags":["email-connections"]}},"/v1/workspaces/{brandId}/email-connections/{connectionId}/sync":{"post":{"operationId":"EmailConnectionsController_syncConnection[1]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}},{"name":"full","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Sync completed"}},"security":[{"bearer":[]}],"summary":"Trigger manual sync for a specific connection","tags":["email-connections"]}},"/v1/brands/{brandId}/email-connections/{connectionId}/retry":{"post":{"operationId":"EmailConnectionsController_retryConnection[0]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Connection retried"}},"security":[{"bearer":[]}],"summary":"Retry a failed connection - resets error status and syncs","tags":["email-connections"]}},"/v1/workspaces/{brandId}/email-connections/{connectionId}/retry":{"post":{"operationId":"EmailConnectionsController_retryConnection[1]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Connection retried"}},"security":[{"bearer":[]}],"summary":"Retry a failed connection - resets error status and syncs","tags":["email-connections"]}},"/v1/brands/{brandId}/email-connections/{connectionId}/reconnect":{"post":{"operationId":"EmailConnectionsController_reconnect[0]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns OAuth authorization URL"}},"security":[{"bearer":[]}],"summary":"Initiate OAuth reconnection for a disconnected connection","tags":["email-connections"]}},"/v1/workspaces/{brandId}/email-connections/{connectionId}/reconnect":{"post":{"operationId":"EmailConnectionsController_reconnect[1]","parameters":[{"name":"connectionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns OAuth authorization URL"}},"security":[{"bearer":[]}],"summary":"Initiate OAuth reconnection for a disconnected connection","tags":["email-connections"]}},"/v1/email-connection/gmail/callback":{"get":{"operationId":"EmailConnectionsCallbackController_gmailCallback","parameters":[{"name":"code","required":true,"in":"query","schema":{"type":"string"}},{"name":"state","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Gmail OAuth callback handler","tags":["email-connections"]}},"/v1/brands/{brandId}/categories":{"get":{"operationId":"CategoriesController_findAll","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List all categories for a brand","tags":["Categories"]},"post":{"operationId":"CategoriesController_create","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCategoryDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Create a new category","tags":["Categories"]}},"/v1/brands/{brandId}/categories/stats":{"get":{"operationId":"CategoriesController_getStats","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get category usage statistics","tags":["Categories"]}},"/v1/brands/{brandId}/categories/{categoryId}":{"get":{"operationId":"CategoriesController_findById","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"categoryId","required":true,"in":"path","description":"Category ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a category by ID","tags":["Categories"]},"patch":{"operationId":"CategoriesController_update","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"categoryId","required":true,"in":"path","description":"Category ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCategoryDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a category","tags":["Categories"]},"delete":{"operationId":"CategoriesController_delete","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"categoryId","required":true,"in":"path","description":"Category ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a category","tags":["Categories"]}},"/v1/brands/{brandId}/categories/reorder":{"post":{"operationId":"CategoriesController_reorder","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderCategoriesDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Reorder categories","tags":["Categories"]}},"/v1/workspaces/{brandId}/categories":{"get":{"operationId":"CategoriesLegacyController_findAll","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Categories"]},"post":{"operationId":"CategoriesLegacyController_create","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCategoryDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"tags":["Categories"]}},"/v1/workspaces/{brandId}/categories/stats":{"get":{"operationId":"CategoriesLegacyController_getStats","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Categories"]}},"/v1/workspaces/{brandId}/categories/{categoryId}":{"get":{"operationId":"CategoriesLegacyController_findById","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"categoryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Categories"]},"patch":{"operationId":"CategoriesLegacyController_update","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"categoryId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCategoryDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Categories"]},"delete":{"operationId":"CategoriesLegacyController_delete","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"categoryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Categories"]}},"/v1/workspaces/{brandId}/categories/reorder":{"post":{"operationId":"CategoriesLegacyController_reorder","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderCategoriesDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"tags":["Categories"]}},"/v1/brands/{brandId}/tags":{"get":{"operationId":"TagsController_findAll","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List all tags for a brand","tags":["Tags"]},"post":{"operationId":"TagsController_create","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTagDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Create a new tag","tags":["Tags"]}},"/v1/brands/{brandId}/tags/stats":{"get":{"operationId":"TagsController_getStats","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get tag usage statistics","tags":["Tags"]}},"/v1/brands/{brandId}/tags/{tagId}":{"get":{"operationId":"TagsController_findById","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"path","description":"Tag ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a tag by ID","tags":["Tags"]},"patch":{"operationId":"TagsController_update","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"path","description":"Tag ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTagDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a tag","tags":["Tags"]},"delete":{"operationId":"TagsController_delete","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"path","description":"Tag ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a tag","tags":["Tags"]}},"/v1/brands/{brandId}/tags/merge":{"post":{"operationId":"TagsController_merge","parameters":[{"name":"brandId","required":true,"in":"path","description":"Brand ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeTagsDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Merge multiple tags into one","tags":["Tags"]}},"/v1/workspaces/{brandId}/tags":{"get":{"operationId":"TagsLegacyController_findAll","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Tags"]},"post":{"operationId":"TagsLegacyController_create","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTagDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"tags":["Tags"]}},"/v1/workspaces/{brandId}/tags/stats":{"get":{"operationId":"TagsLegacyController_getStats","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Tags"]}},"/v1/workspaces/{brandId}/tags/{tagId}":{"get":{"operationId":"TagsLegacyController_findById","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Tags"]},"patch":{"operationId":"TagsLegacyController_update","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTagDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Tags"]},"delete":{"operationId":"TagsLegacyController_delete","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"tagId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Tags"]}},"/v1/workspaces/{brandId}/tags/merge":{"post":{"operationId":"TagsLegacyController_merge","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeTagsDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"tags":["Tags"]}},"/v1/feedback/{token}":{"get":{"operationId":"PublicFeedbackController_getFeedback","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Feedback form data"},"400":{"description":"Already submitted or expired"},"404":{"description":"Feedback request not found"}},"summary":"Get feedback form data by token (public)","tags":["feedback"]},"post":{"operationId":"PublicFeedbackController_submitFeedback","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitFeedbackDto"}}}},"responses":{"200":{"description":"Feedback submitted successfully"},"400":{"description":"Invalid rating or already submitted"},"404":{"description":"Feedback request not found"}},"summary":"Submit feedback rating (public)","tags":["feedback"]}},"/v1/brands/{brandId}/feedback":{"get":{"operationId":"BrandFeedbackController_listFeedback[0]","parameters":[{"name":"resolverId","required":false,"in":"query","description":"Filter by resolver member ID","schema":{"type":"string"}},{"name":"submitted","required":false,"in":"query","description":"Filter by whether feedback has been submitted","schema":{"type":"boolean"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return (max 100)","schema":{"default":50,"type":"number"}}],"responses":{"200":{"description":"Paginated list of feedback"}},"security":[{"api-key":[]}],"summary":"List feedback for a brand","tags":["brand-feedback"]}},"/v1/workspaces/{workspaceId}/feedback":{"get":{"operationId":"BrandFeedbackController_listFeedback[1]","parameters":[{"name":"resolverId","required":false,"in":"query","description":"Filter by resolver member ID","schema":{"type":"string"}},{"name":"submitted","required":false,"in":"query","description":"Filter by whether feedback has been submitted","schema":{"type":"boolean"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return (max 100)","schema":{"default":50,"type":"number"}}],"responses":{"200":{"description":"Paginated list of feedback"}},"security":[{"api-key":[]}],"summary":"List feedback for a brand","tags":["brand-feedback"]}},"/v1/brands/{brandId}/feedback/ticket/{ticketId}":{"get":{"operationId":"BrandFeedbackController_getFeedbackByTicket[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Feedback for the ticket"}},"security":[{"api-key":[]}],"summary":"Get feedback for a specific ticket","tags":["brand-feedback"]}},"/v1/workspaces/{workspaceId}/feedback/ticket/{ticketId}":{"get":{"operationId":"BrandFeedbackController_getFeedbackByTicket[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Feedback for the ticket"}},"security":[{"api-key":[]}],"summary":"Get feedback for a specific ticket","tags":["brand-feedback"]}},"/v1/brands/{brandId}/tickets/{ticketId}/attachments":{"post":{"operationId":"AttachmentsController_initiateUpload[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAttachmentDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Get upload URL for a new attachment","tags":["attachments"]},"get":{"operationId":"AttachmentsController_findAll[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List attachments on a ticket","tags":["attachments"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/attachments":{"post":{"operationId":"AttachmentsController_initiateUpload[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAttachmentDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Get upload URL for a new attachment","tags":["attachments"]},"get":{"operationId":"AttachmentsController_findAll[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List attachments on a ticket","tags":["attachments"]}},"/v1/brands/{brandId}/tickets/{ticketId}/attachments/upload":{"post":{"operationId":"AttachmentsController_uploadDirect[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Upload attachment directly (multipart/form-data)","tags":["attachments"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/attachments/upload":{"post":{"operationId":"AttachmentsController_uploadDirect[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Upload attachment directly (multipart/form-data)","tags":["attachments"]}},"/v1/brands/{brandId}/tickets/{ticketId}/attachments/{attachmentId}/confirm":{"post":{"operationId":"AttachmentsController_confirmUpload[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Confirm attachment upload completed","tags":["attachments"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/attachments/{attachmentId}/confirm":{"post":{"operationId":"AttachmentsController_confirmUpload[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Confirm attachment upload completed","tags":["attachments"]}},"/v1/brands/{brandId}/tickets/{ticketId}/attachments/{attachmentId}":{"get":{"operationId":"AttachmentsController_findOne[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get attachment with download URL","tags":["attachments"]},"delete":{"operationId":"AttachmentsController_delete[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete an attachment","tags":["attachments"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/attachments/{attachmentId}":{"get":{"operationId":"AttachmentsController_findOne[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get attachment with download URL","tags":["attachments"]},"delete":{"operationId":"AttachmentsController_delete[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete an attachment","tags":["attachments"]}},"/v1/brands/{brandId}/attachments/urls":{"post":{"operationId":"AttachmentsUrlsController_getUrls[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUrlsDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Get fresh download URLs for multiple attachments","tags":["attachments"]}},"/v1/workspaces/{workspaceId}/attachments/urls":{"post":{"operationId":"AttachmentsUrlsController_getUrls[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUrlsDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Get fresh download URLs for multiple attachments","tags":["attachments"]}},"/v1/brands/{brandId}/attachments/pending":{"post":{"operationId":"AttachmentsUrlsController_initiatePendingUpload[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAttachmentDto"}}}},"responses":{"201":{"description":"Upload URL generated"}},"security":[{"api-key":[]}],"summary":"Get upload URL for a pending attachment (before ticket creation)","tags":["attachments"]}},"/v1/workspaces/{workspaceId}/attachments/pending":{"post":{"operationId":"AttachmentsUrlsController_initiatePendingUpload[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAttachmentDto"}}}},"responses":{"201":{"description":"Upload URL generated"}},"security":[{"api-key":[]}],"summary":"Get upload URL for a pending attachment (before ticket creation)","tags":["attachments"]}},"/v1/brands/{brandId}/attachments/pending/upload":{"post":{"operationId":"AttachmentsUrlsController_uploadPendingDirect[0]","parameters":[],"responses":{"201":{"description":"File uploaded"}},"security":[{"api-key":[]}],"summary":"Upload a pending attachment directly (multipart/form-data)","tags":["attachments"]}},"/v1/workspaces/{workspaceId}/attachments/pending/upload":{"post":{"operationId":"AttachmentsUrlsController_uploadPendingDirect[1]","parameters":[],"responses":{"201":{"description":"File uploaded"}},"security":[{"api-key":[]}],"summary":"Upload a pending attachment directly (multipart/form-data)","tags":["attachments"]}},"/v1/brands/{brandId}/attachments/pending/{attachmentId}/confirm":{"post":{"operationId":"AttachmentsUrlsController_confirmPendingUpload[0]","parameters":[{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Upload confirmed"}},"security":[{"api-key":[]}],"summary":"Confirm a pending attachment upload","tags":["attachments"]}},"/v1/workspaces/{workspaceId}/attachments/pending/{attachmentId}/confirm":{"post":{"operationId":"AttachmentsUrlsController_confirmPendingUpload[1]","parameters":[{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Upload confirmed"}},"security":[{"api-key":[]}],"summary":"Confirm a pending attachment upload","tags":["attachments"]}},"/v1/brands/{brandId}/stream/token":{"post":{"operationId":"StreamController_mintToken","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Mint a short-lived token for the event stream","tags":["stream"]}},"/v1/brands/{brandId}/stream":{"get":{"operationId":"StreamController_openStream","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"401":{"description":"Missing, expired or reused token"}},"summary":"Server-sent event stream for a brand","tags":["stream"]}},"/v1/brands/{brandId}/stream/test-event":{"post":{"operationId":"StreamController_testEvent","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestEventDto"}}}},"responses":{"403":{"description":"Owners and admins only"}},"security":[{"api-key":[]}],"summary":"Publish a diagnostic event to the brand stream","tags":["stream"]}},"/v1/stream/token":{"post":{"operationId":"AccountStreamController_mintToken","parameters":[],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Mint a short-lived token for the account-wide event stream","tags":["stream"]}},"/v1/stream":{"get":{"operationId":"AccountStreamController_openStream","parameters":[{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Server-sent events for every brand the caller can access","tags":["stream"]}},"/v1/brands/{brandId}/tickets/{ticketId}/comments":{"post":{"operationId":"CommentsController_create","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-idempotency-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","description":"Unique key to prevent duplicate comment creation (UUID recommended)","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommentDto"}}}},"responses":{"200":{"description":"Comment already created (idempotent retry)"},"201":{"description":"Comment created"}},"security":[{"api-key":[]}],"summary":"Add a comment to a ticket","tags":["comments"]},"get":{"operationId":"CommentsController_findAll","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List comments on a ticket","tags":["comments"]}},"/v1/brands/{brandId}/tickets/{ticketId}/comments/{commentId}":{"get":{"operationId":"CommentsController_findOne","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"commentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a comment by ID","tags":["comments"]},"patch":{"operationId":"CommentsController_update","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"commentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCommentDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a comment","tags":["comments"]},"delete":{"operationId":"CommentsController_delete","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"commentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a comment","tags":["comments"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/comments":{"post":{"operationId":"CommentsLegacyController_create","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-idempotency-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","description":"Unique key to prevent duplicate comment creation (UUID recommended)","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommentDto"}}}},"responses":{"200":{"description":"Comment already created (idempotent retry)"},"201":{"description":"Comment created"}},"security":[{"api-key":[]}],"summary":"Add a comment to a ticket (deprecated: use /brands/:brandId)","tags":["comments"]},"get":{"operationId":"CommentsLegacyController_findAll","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List comments on a ticket (deprecated: use /brands/:brandId)","tags":["comments"]}},"/v1/workspaces/{workspaceId}/tickets/{ticketId}/comments/{commentId}":{"get":{"operationId":"CommentsLegacyController_findOne","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"commentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a comment by ID (deprecated: use /brands/:brandId)","tags":["comments"]},"patch":{"operationId":"CommentsLegacyController_update","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"commentId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCommentDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a comment (deprecated: use /brands/:brandId)","tags":["comments"]},"delete":{"operationId":"CommentsLegacyController_delete","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"commentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a comment (deprecated: use /brands/:brandId)","tags":["comments"]}},"/v1/brands/{brandId}/domains":{"get":{"operationId":"DomainsController_listDomains[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"List of domains with DNS records"}},"security":[{"session-token":[]}],"summary":"List all domains for brand","tags":["domains"]},"post":{"operationId":"DomainsController_addDomain[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddDomainDto"}}}},"responses":{"201":{"description":"Domain added successfully"},"400":{"description":"Invalid domain or already in use"},"403":{"description":"Custom domains not available on current plan"}},"security":[{"session-token":[]}],"summary":"Add a new domain to brand","tags":["domains"]}},"/v1/workspaces/{brandId}/domains":{"get":{"operationId":"DomainsController_listDomains[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"List of domains with DNS records"}},"security":[{"session-token":[]}],"summary":"List all domains for brand","tags":["domains"]},"post":{"operationId":"DomainsController_addDomain[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddDomainDto"}}}},"responses":{"201":{"description":"Domain added successfully"},"400":{"description":"Invalid domain or already in use"},"403":{"description":"Custom domains not available on current plan"}},"security":[{"session-token":[]}],"summary":"Add a new domain to brand","tags":["domains"]}},"/v1/brands/{brandId}/domains/forwarding-address":{"get":{"operationId":"DomainsController_getForwardingAddress[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Forwarding address for this brand"}},"security":[{"session-token":[]}],"summary":"Get the forwarding address for inbound email","tags":["domains"]}},"/v1/workspaces/{brandId}/domains/forwarding-address":{"get":{"operationId":"DomainsController_getForwardingAddress[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Forwarding address for this brand"}},"security":[{"session-token":[]}],"summary":"Get the forwarding address for inbound email","tags":["domains"]}},"/v1/brands/{brandId}/domains/{domainId}":{"get":{"operationId":"DomainsController_getDomain[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"domainId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Domain details with DNS records"},"404":{"description":"Domain not found"}},"security":[{"session-token":[]}],"summary":"Get a single domain with DNS records","tags":["domains"]},"patch":{"operationId":"DomainsController_updateDomain[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"domainId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDomainDto"}}}},"responses":{"200":{"description":"Domain updated"},"404":{"description":"Domain not found"}},"security":[{"session-token":[]}],"summary":"Update domain settings (sender info, primary status)","tags":["domains"]},"delete":{"operationId":"DomainsController_removeDomain[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"domainId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Domain removed"},"404":{"description":"Domain not found"}},"security":[{"session-token":[]}],"summary":"Remove a domain from brand","tags":["domains"]}},"/v1/workspaces/{brandId}/domains/{domainId}":{"get":{"operationId":"DomainsController_getDomain[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"domainId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Domain details with DNS records"},"404":{"description":"Domain not found"}},"security":[{"session-token":[]}],"summary":"Get a single domain with DNS records","tags":["domains"]},"patch":{"operationId":"DomainsController_updateDomain[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"domainId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDomainDto"}}}},"responses":{"200":{"description":"Domain updated"},"404":{"description":"Domain not found"}},"security":[{"session-token":[]}],"summary":"Update domain settings (sender info, primary status)","tags":["domains"]},"delete":{"operationId":"DomainsController_removeDomain[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"domainId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Domain removed"},"404":{"description":"Domain not found"}},"security":[{"session-token":[]}],"summary":"Remove a domain from brand","tags":["domains"]}},"/v1/brands/{brandId}/domains/{domainId}/verify":{"post":{"operationId":"DomainsController_verifyDomain[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"domainId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Verification result"},"404":{"description":"Domain not found"}},"security":[{"session-token":[]}],"summary":"Verify domain DNS configuration","tags":["domains"]}},"/v1/workspaces/{brandId}/domains/{domainId}/verify":{"post":{"operationId":"DomainsController_verifyDomain[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"domainId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Verification result"},"404":{"description":"Domain not found"}},"security":[{"session-token":[]}],"summary":"Verify domain DNS configuration","tags":["domains"]}},"/v1/brands/{brandId}/tickets/{ticketId}/chat":{"get":{"operationId":"TicketChatController_visitor","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"A chat ticket's visitor: presence and what they've told us","tags":["TicketChat"]}},"/v1/brands/{brandId}/chat/identity-token":{"post":{"operationId":"ChatIdentityController_mint","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIdentityTokenDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Mint a 1-hour identity token for a signed-in user (server-side, API key)","tags":["ChatIdentity"]}},"/v1/brands/{brandId}/presence":{"get":{"operationId":"BrandPresenceController_list","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Who is available on this brand. 'status' is what routing should use.","tags":["presence"]},"put":{"operationId":"BrandPresenceController_set","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetBrandPresenceDto"}}}},"responses":{"403":{"description":"Setting another member's status from a session needs owner or admin"}},"security":[{"api-key":[]}],"summary":"Set a member status (and heartbeat) on this brand","tags":["presence"]}},"/v1/presence":{"get":{"operationId":"AccountPresenceController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Presence on the brands the caller can access (sessions: every member; API keys: members present there)","tags":["presence"]}},"/v1/presence/me":{"get":{"operationId":"AccountPresenceController_mine","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"The signed-in member's own presence","tags":["presence"]},"put":{"operationId":"AccountPresenceController_setMine","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMyPresenceDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"The availability toggle: one status on every brand the member can access","tags":["presence"]}},"/v1/webhooks/inbound-email":{"post":{"operationId":"InboundEmailController_handleInboundEmail","parameters":[],"responses":{"201":{"description":""}},"summary":"Postmark inbound email webhook","tags":["webhooks"]}},"/v1/webhooks/failed-emails":{"get":{"operationId":"InboundEmailController_getFailedEmails","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"List failed inbound emails","tags":["webhooks"]}},"/v1/webhooks/failed-emails/{id}/retry":{"post":{"operationId":"InboundEmailController_retryFailedEmail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Retry processing a failed email","tags":["webhooks"]}},"/v1/webhooks/failed-emails/{id}/discard":{"post":{"operationId":"InboundEmailController_discardFailedEmail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Discard a failed email","tags":["webhooks"]}},"/v1/admin/email-logs":{"get":{"operationId":"EmailLogAdminController_getEmailLogs","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"brandId","required":true,"in":"query","schema":{"type":"string"}},{"name":"fromEmail","required":true,"in":"query","schema":{"type":"string"}},{"name":"toEmail","required":true,"in":"query","schema":{"type":"string"}},{"name":"messageId","required":true,"in":"query","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"List inbound email logs","tags":["admin"]}},"/v1/admin/email-logs/stats":{"get":{"operationId":"EmailLogAdminController_getEmailStats","parameters":[{"name":"brandId","required":true,"in":"query","schema":{"type":"string"}},{"name":"period","required":true,"in":"query","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get email processing statistics","tags":["admin"]}},"/v1/admin/email-logs/{id}":{"get":{"operationId":"EmailLogAdminController_getEmailLog","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get email log details","tags":["admin"]}},"/v1/admin/email-logs/{id}/replay":{"post":{"operationId":"EmailLogAdminController_replayEmail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Replay an email","tags":["admin"]}},"/v1/admin/email-logs/{id}/discard":{"post":{"operationId":"EmailLogAdminController_discardEmail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Discard an email","tags":["admin"]}},"/v1/admin/reconciliation/run":{"post":{"operationId":"ReconciliationAdminController_runReconciliation","parameters":[{"name":"hours","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Run email reconciliation now","tags":["admin"]}},"/v1/admin/reconciliation":{"get":{"operationId":"ReconciliationAdminController_getReconciliations","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"List reconciliation results","tags":["admin"]}},"/v1/admin/reconciliation/{id}":{"get":{"operationId":"ReconciliationAdminController_getReconciliation","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get reconciliation details","tags":["admin"]}},"/v1/brands/{brandId}/companies":{"post":{"operationId":"CompaniesController_create[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCompanyDto"}}}},"responses":{"201":{"description":"Company created"}},"security":[{"api-key":[]}],"summary":"Create a new company","tags":["companies"]},"get":{"operationId":"CompaniesController_findAll[0]","parameters":[{"name":"search","required":false,"in":"query","description":"Search by name or domain","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List companies","tags":["companies"]}},"/v1/workspaces/{workspaceId}/companies":{"post":{"operationId":"CompaniesController_create[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCompanyDto"}}}},"responses":{"201":{"description":"Company created"}},"security":[{"api-key":[]}],"summary":"Create a new company","tags":["companies"]},"get":{"operationId":"CompaniesController_findAll[1]","parameters":[{"name":"search","required":false,"in":"query","description":"Search by name or domain","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List companies","tags":["companies"]}},"/v1/brands/{brandId}/companies/{companyId}":{"get":{"operationId":"CompaniesController_findOne[0]","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a company by ID with its customers","tags":["companies"]},"patch":{"operationId":"CompaniesController_update[0]","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCompanyDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a company","tags":["companies"]},"delete":{"operationId":"CompaniesController_delete[0]","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a company","tags":["companies"]}},"/v1/workspaces/{workspaceId}/companies/{companyId}":{"get":{"operationId":"CompaniesController_findOne[1]","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a company by ID with its customers","tags":["companies"]},"patch":{"operationId":"CompaniesController_update[1]","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCompanyDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a company","tags":["companies"]},"delete":{"operationId":"CompaniesController_delete[1]","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a company","tags":["companies"]}},"/v1/brands/{brandId}/forms":{"post":{"operationId":"FormsController_create[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormTokenDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Create a form token","tags":["forms"]},"get":{"operationId":"FormsController_findAll[0]","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List form tokens","tags":["forms"]}},"/v1/workspaces/{workspaceId}/forms":{"post":{"operationId":"FormsController_create[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFormTokenDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Create a form token","tags":["forms"]},"get":{"operationId":"FormsController_findAll[1]","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"List form tokens","tags":["forms"]}},"/v1/brands/{brandId}/forms/{formId}":{"get":{"operationId":"FormsController_findOne[0]","parameters":[{"name":"formId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a form token by ID","tags":["forms"]},"patch":{"operationId":"FormsController_update[0]","parameters":[{"name":"formId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFormTokenDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a form token","tags":["forms"]},"delete":{"operationId":"FormsController_delete[0]","parameters":[{"name":"formId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a form token","tags":["forms"]}},"/v1/workspaces/{workspaceId}/forms/{formId}":{"get":{"operationId":"FormsController_findOne[1]","parameters":[{"name":"formId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Get a form token by ID","tags":["forms"]},"patch":{"operationId":"FormsController_update[1]","parameters":[{"name":"formId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFormTokenDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Update a form token","tags":["forms"]},"delete":{"operationId":"FormsController_delete[1]","parameters":[{"name":"formId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Delete a form token","tags":["forms"]}},"/v1/brands/{brandId}/forms/{formId}/regenerate":{"post":{"operationId":"FormsController_regenerate[0]","parameters":[{"name":"formId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Regenerate a form token","tags":["forms"]}},"/v1/workspaces/{workspaceId}/forms/{formId}/regenerate":{"post":{"operationId":"FormsController_regenerate[1]","parameters":[{"name":"formId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Regenerate a form token","tags":["forms"]}},"/v1/forms/{token}":{"get":{"description":"Returns basic form info for client-side validation","operationId":"PublicFormsController_getFormInfo","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get form info (public)","tags":["forms"]}},"/v1/brands/{brandId}/portal/token":{"post":{"description":"Used in authenticated mode. The integrator passes customer email/name from their auth system, and receives a portal token to pass to the frontend portal component.","operationId":"PortalController_generateToken","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratePortalTokenDto"}}}},"responses":{"201":{"description":"Portal token generated"}},"security":[{"api-key":[]}],"summary":"Generate portal token for customer","tags":["portal"]}},"/v1/brands/{brandId}/portal/magic-link":{"post":{"description":"Used in self-auth mode. Sends an email to the customer with a link they can click to access their tickets without needing to be logged in.","operationId":"PortalController_sendMagicLink","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMagicLinkDto"}}}},"responses":{"201":{"description":"Magic link sent"}},"security":[{"api-key":[]}],"summary":"Send portal magic link email","tags":["portal"]}},"/v1/workspaces/{workspaceId}/portal/token":{"post":{"deprecated":true,"description":"Deprecated: Use /brands/:brandId/portal/token instead.","operationId":"PortalLegacyController_generateToken","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratePortalTokenDto"}}}},"responses":{"201":{"description":"Portal token generated"}},"security":[{"api-key":[]}],"summary":"Generate portal token for customer (deprecated)","tags":["portal"]}},"/v1/workspaces/{workspaceId}/portal/magic-link":{"post":{"deprecated":true,"description":"Deprecated: Use /brands/:brandId/portal/magic-link instead.","operationId":"PortalLegacyController_sendMagicLink","parameters":[{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMagicLinkDto"}}}},"responses":{"201":{"description":"Magic link sent"}},"security":[{"api-key":[]}],"summary":"Send portal magic link email (deprecated)","tags":["portal"]}},"/v1/portal/verify":{"post":{"description":"Exchanges a magic link token for a portal token. Called from the frontend when user clicks the magic link in their email.","operationId":"PortalVerifyController_verifyMagicLink","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyMagicLinkDto"}}}},"responses":{"201":{"description":"Portal token returned"}},"summary":"Verify magic link and get portal token","tags":["portal"]}},"/v1/portal/refresh":{"post":{"description":"Exchanges a valid portal token for a new one with extended expiry.","operationId":"PortalVerifyController_refreshToken","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"New portal token returned"}},"summary":"Refresh portal token","tags":["portal"]}},"/v1/portal/tickets":{"get":{"operationId":"PortalTicketsController_listTickets","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"example":"open","type":"string"}},{"name":"sort","required":false,"in":"query","schema":{"default":"createdAt","enum":["createdAt","updatedAt"],"type":"string"}},{"name":"order","required":false,"in":"query","schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"maximum":50,"default":20,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for pagination","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of tickets"}},"security":[{"portal-token":[]}],"summary":"List my tickets","tags":["portal-tickets"]},"post":{"operationId":"PortalTicketsController_createTicket","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}},{"name":"x-idempotency-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","description":"Unique key to prevent duplicate creation","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalCreateTicketDto"}}}},"responses":{"201":{"description":"Ticket created"}},"security":[{"portal-token":[]}],"summary":"Create a ticket","tags":["portal-tickets"]}},"/v1/portal/tickets/{ticketId}":{"get":{"operationId":"PortalTicketsController_getTicket","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Ticket details with comments"}},"security":[{"portal-token":[]}],"summary":"Get ticket details","tags":["portal-tickets"]}},"/v1/portal/tickets/{ticketId}/comments":{"post":{"operationId":"PortalTicketsController_createComment","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-idempotency-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"X-Idempotency-Key","in":"header","description":"Unique key to prevent duplicate creation","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalCreateCommentDto"}}}},"responses":{"201":{"description":"Comment added"}},"security":[{"portal-token":[]}],"summary":"Add a comment to ticket","tags":["portal-tickets"]}},"/v1/portal/tickets/attachments/pending":{"post":{"operationId":"PortalTicketsController_initiatePendingUpload","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalCreateAttachmentDto"}}}},"responses":{"201":{"description":"Upload URL generated"}},"security":[{"portal-token":[]}],"summary":"Initiate pending attachment upload","tags":["portal-tickets"]}},"/v1/portal/tickets/attachments/pending/{attachmentId}/confirm":{"post":{"operationId":"PortalTicketsController_confirmPendingUpload","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Upload confirmed"}},"security":[{"portal-token":[]}],"summary":"Confirm pending attachment upload","tags":["portal-tickets"]}},"/v1/portal/tickets/{ticketId}/attachments":{"post":{"operationId":"PortalTicketsController_initiateUpload","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalCreateAttachmentDto"}}}},"responses":{"201":{"description":"Upload URL generated"}},"security":[{"portal-token":[]}],"summary":"Initiate attachment upload for ticket","tags":["portal-tickets"]},"get":{"operationId":"PortalTicketsController_listAttachments","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"List of attachments"}},"security":[{"portal-token":[]}],"summary":"List ticket attachments","tags":["portal-tickets"]}},"/v1/portal/tickets/{ticketId}/attachments/{attachmentId}/confirm":{"post":{"operationId":"PortalTicketsController_confirmUpload","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Upload confirmed"}},"security":[{"portal-token":[]}],"summary":"Confirm attachment upload","tags":["portal-tickets"]}},"/v1/portal/tickets/{ticketId}/attachments/{attachmentId}":{"get":{"operationId":"PortalTicketsController_getAttachment","parameters":[{"name":"Authorization","in":"header","description":"Bearer <portal_token>","required":true,"schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Attachment with download URL"}},"security":[{"portal-token":[]}],"summary":"Get attachment download URL","tags":["portal-tickets"]}},"/v1/brands/{brandId}/fields":{"get":{"operationId":"FieldsController_getAll[0]","parameters":[],"responses":{"200":{"description":"Field definitions retrieved"}},"security":[{"api-key":[]}],"summary":"Get all field definitions for a brand","tags":["fields"]}},"/v1/workspaces/{workspaceId}/fields":{"get":{"operationId":"FieldsController_getAll[1]","parameters":[],"responses":{"200":{"description":"Field definitions retrieved"}},"security":[{"api-key":[]}],"summary":"Get all field definitions for a brand","tags":["fields"]}},"/v1/brands/{brandId}/fields/{entityType}":{"get":{"operationId":"FieldsController_getByEntity[0]","parameters":[{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"responses":{"200":{"description":"Fields retrieved"}},"security":[{"api-key":[]}],"summary":"Get field definitions for a specific entity type","tags":["fields"]},"post":{"operationId":"FieldsController_create[0]","parameters":[{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFieldDto"}}}},"responses":{"201":{"description":"Field created"},"409":{"description":"Field with this key already exists"}},"security":[{"api-key":[]}],"summary":"Create a new field definition","tags":["fields"]}},"/v1/workspaces/{workspaceId}/fields/{entityType}":{"get":{"operationId":"FieldsController_getByEntity[1]","parameters":[{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"responses":{"200":{"description":"Fields retrieved"}},"security":[{"api-key":[]}],"summary":"Get field definitions for a specific entity type","tags":["fields"]},"post":{"operationId":"FieldsController_create[1]","parameters":[{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFieldDto"}}}},"responses":{"201":{"description":"Field created"},"409":{"description":"Field with this key already exists"}},"security":[{"api-key":[]}],"summary":"Create a new field definition","tags":["fields"]}},"/v1/brands/{brandId}/fields/{entityType}/{key}":{"patch":{"operationId":"FieldsController_update[0]","parameters":[{"name":"key","required":true,"in":"path","description":"Field key","schema":{"type":"string"}},{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFieldDto"}}}},"responses":{"200":{"description":"Field updated"},"404":{"description":"Field not found"}},"security":[{"api-key":[]}],"summary":"Update a field definition","tags":["fields"]},"delete":{"operationId":"FieldsController_delete[0]","parameters":[{"name":"key","required":true,"in":"path","description":"Field key","schema":{"type":"string"}},{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"responses":{"200":{"description":"Field deleted"},"404":{"description":"Field not found"}},"security":[{"api-key":[]}],"summary":"Delete a field definition","tags":["fields"]}},"/v1/workspaces/{workspaceId}/fields/{entityType}/{key}":{"patch":{"operationId":"FieldsController_update[1]","parameters":[{"name":"key","required":true,"in":"path","description":"Field key","schema":{"type":"string"}},{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFieldDto"}}}},"responses":{"200":{"description":"Field updated"},"404":{"description":"Field not found"}},"security":[{"api-key":[]}],"summary":"Update a field definition","tags":["fields"]},"delete":{"operationId":"FieldsController_delete[1]","parameters":[{"name":"key","required":true,"in":"path","description":"Field key","schema":{"type":"string"}},{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"responses":{"200":{"description":"Field deleted"},"404":{"description":"Field not found"}},"security":[{"api-key":[]}],"summary":"Delete a field definition","tags":["fields"]}},"/v1/brands/{brandId}/fields/{entityType}/reorder":{"post":{"operationId":"FieldsController_reorder[0]","parameters":[{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderFieldsDto"}}}},"responses":{"200":{"description":"Fields reordered"}},"security":[{"api-key":[]}],"summary":"Reorder field definitions","tags":["fields"]}},"/v1/workspaces/{workspaceId}/fields/{entityType}/reorder":{"post":{"operationId":"FieldsController_reorder[1]","parameters":[{"name":"entityType","required":true,"in":"path","description":"Entity type (ticket, contact, or company)","schema":{"enum":["ticket","contact","company"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderFieldsDto"}}}},"responses":{"200":{"description":"Fields reordered"}},"security":[{"api-key":[]}],"summary":"Reorder field definitions","tags":["fields"]}},"/v1/migrations/debug-attachments":{"post":{"operationId":"MigrationsController_debugAttachments","parameters":[{"name":"key","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Debug: List recent attachments","tags":["migrations"]}},"/v1/migrations/fix-attachment-refs":{"post":{"operationId":"MigrationsController_fixAttachmentRefs","parameters":[{"name":"key","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Fix comments with attachment:undefined references","tags":["migrations"]}},"/v1/migrations/fix-presigned-urls":{"post":{"operationId":"MigrationsController_fixPresignedUrls","parameters":[{"name":"key","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Fix comments with expired presigned R2 URLs","tags":["migrations"]}},"/v1/migrations/fix-tenant-isolation":{"post":{"operationId":"MigrationsController_fixTenantIsolation","parameters":[{"name":"key","required":true,"in":"query","schema":{"type":"string"}},{"name":"dryRun","required":true,"in":"query","schema":{"type":"string"}},{"name":"targetOrgId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Fix brand accountIds for tenant isolation","tags":["migrations"]}},"/v1/migrations/fix-ticket-account-ids":{"post":{"operationId":"MigrationsController_fixTicketAccountIds","parameters":[{"name":"key","required":true,"in":"query","schema":{"type":"string"}},{"name":"dryRun","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Fix ticket accountIds to match their brand accountIds","tags":["migrations"]}},"/v1/migrations/set-account-plan":{"post":{"operationId":"MigrationsController_setAccountPlan","parameters":[{"name":"key","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Set an account plan by email (temp — remove after billing migration)","tags":["migrations"]}},"/v1/brands/{brandId}/ecommerce/stores":{"get":{"operationId":"EcommerceController_getStores[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/stores":{"get":{"operationId":"EcommerceController_getStores[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/stores/connect":{"post":{"operationId":"EcommerceController_connectStore[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectStoreDto"}}}},"responses":{"201":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/stores/connect":{"post":{"operationId":"EcommerceController_connectStore[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectStoreDto"}}}},"responses":{"201":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/stores/{storeId}":{"delete":{"operationId":"EcommerceController_disconnectStore[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/stores/{storeId}":{"delete":{"operationId":"EcommerceController_disconnectStore[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/stores/{storeId}/sync":{"post":{"operationId":"EcommerceController_triggerSync[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/stores/{storeId}/sync":{"post":{"operationId":"EcommerceController_triggerSync[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/orders":{"get":{"operationId":"EcommerceController_listOrders[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/orders":{"get":{"operationId":"EcommerceController_listOrders[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/orders/by-customer/{customerId}":{"get":{"operationId":"EcommerceController_getOrdersByCustomer[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/orders/by-customer/{customerId}":{"get":{"operationId":"EcommerceController_getOrdersByCustomer[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/orders/by-ticket/{ticketId}":{"get":{"operationId":"EcommerceController_getOrdersByTicket[0]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/orders/by-ticket/{ticketId}":{"get":{"operationId":"EcommerceController_getOrdersByTicket[1]","parameters":[{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/orders/{orderId}":{"get":{"operationId":"EcommerceController_getOrderById[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/orders/{orderId}":{"get":{"operationId":"EcommerceController_getOrderById[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/orders/{orderId}/link":{"post":{"operationId":"EcommerceController_linkOrderToTicket[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkOrderTicketDto"}}}},"responses":{"201":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/orders/{orderId}/link":{"post":{"operationId":"EcommerceController_linkOrderToTicket[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkOrderTicketDto"}}}},"responses":{"201":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/orders/{orderId}/link/{ticketId}":{"delete":{"operationId":"EcommerceController_unlinkOrderFromTicket[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/orders/{orderId}/link/{ticketId}":{"delete":{"operationId":"EcommerceController_unlinkOrderFromTicket[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"orderId","required":true,"in":"path","schema":{"type":"string"}},{"name":"ticketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/products":{"get":{"operationId":"EcommerceController_listProducts[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/products":{"get":{"operationId":"EcommerceController_listProducts[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/brands/{brandId}/ecommerce/products/{productId}":{"get":{"operationId":"EcommerceController_getProductById[0]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/workspaces/{workspaceId}/ecommerce/products/{productId}":{"get":{"operationId":"EcommerceController_getProductById[1]","parameters":[{"name":"brandId","required":true,"in":"path","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Ecommerce"]}},"/v1/ecommerce/webhooks/{platform}/{storeId}":{"post":{"operationId":"EcommerceWebhookController_handleWebhook","parameters":[{"name":"platform","required":true,"in":"path","schema":{"type":"string"}},{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["EcommerceWebhook"]}},"/v1/brands/{brandId}/import":{"post":{"description":"Import up to 100 tickets per request from an external system (HappyFox, Zendesk, CSV, etc.).\n\n**Idempotency:** Tickets are deduplicated by `source` + `sourceId`. Safe to retry failed batches.\n\n**Auto-creation:** Statuses, categories, tags, customers, and field definitions are automatically created if they don't exist. Statuses are matched by key first, then by name (case-insensitive), then auto-created.\n\n**Side effects skipped:** Webhooks, email notifications, usage counting, entitlement checks, and CSAT surveys are all skipped since the data is historical.\n\n**Attachments:** Created as PENDING records and downloaded in the background via a job queue. Source URLs should be publicly accessible (presigned URLs are fine — no Authorization header is sent).\n\n**Error isolation:** Each ticket is processed independently. One failure does not affect the rest of the batch.","operationId":"ImportController_importTickets[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportTicketsDto"}}}},"responses":{"201":{"description":"Import completed. Returns summary counts, per-ticket results, and any errors."},"400":{"description":"Validation error (invalid payload shape)"},"404":{"description":"Brand not found"}},"security":[{"api-key":[]}],"summary":"Bulk import tickets from an external source","tags":["import"]}},"/v1/workspaces/{workspaceId}/import":{"post":{"description":"Import up to 100 tickets per request from an external system (HappyFox, Zendesk, CSV, etc.).\n\n**Idempotency:** Tickets are deduplicated by `source` + `sourceId`. Safe to retry failed batches.\n\n**Auto-creation:** Statuses, categories, tags, customers, and field definitions are automatically created if they don't exist. Statuses are matched by key first, then by name (case-insensitive), then auto-created.\n\n**Side effects skipped:** Webhooks, email notifications, usage counting, entitlement checks, and CSAT surveys are all skipped since the data is historical.\n\n**Attachments:** Created as PENDING records and downloaded in the background via a job queue. Source URLs should be publicly accessible (presigned URLs are fine — no Authorization header is sent).\n\n**Error isolation:** Each ticket is processed independently. One failure does not affect the rest of the batch.","operationId":"ImportController_importTickets[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportTicketsDto"}}}},"responses":{"201":{"description":"Import completed. Returns summary counts, per-ticket results, and any errors."},"400":{"description":"Validation error (invalid payload shape)"},"404":{"description":"Brand not found"}},"security":[{"api-key":[]}],"summary":"Bulk import tickets from an external source","tags":["import"]}},"/v1/brands/{brandId}/recurring-tickets":{"post":{"operationId":"RecurringTicketsController_create[0]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRecurringTicketDto"}}}},"responses":{"201":{"description":"Recurring ticket created"}},"security":[{"api-key":[]}],"summary":"Create a recurring ticket template","tags":["recurring-tickets"]},"get":{"operationId":"RecurringTicketsController_list[0]","parameters":[{"name":"status","required":false,"in":"query","schema":{"example":"active","enum":["active","paused","all"],"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"default":50,"example":50,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"example":0,"type":"number"}},{"name":"sortBy","required":false,"in":"query","schema":{"example":"nextRunAt","enum":["nextRunAt","createdAt","title"],"type":"string"}},{"name":"order","required":false,"in":"query","schema":{"example":"asc","enum":["asc","desc"],"type":"string"}}],"responses":{"200":{"description":"Recurring tickets list"}},"security":[{"api-key":[]}],"summary":"List recurring ticket templates","tags":["recurring-tickets"]}},"/v1/workspaces/{workspaceId}/recurring-tickets":{"post":{"operationId":"RecurringTicketsController_create[1]","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRecurringTicketDto"}}}},"responses":{"201":{"description":"Recurring ticket created"}},"security":[{"api-key":[]}],"summary":"Create a recurring ticket template","tags":["recurring-tickets"]},"get":{"operationId":"RecurringTicketsController_list[1]","parameters":[{"name":"status","required":false,"in":"query","schema":{"example":"active","enum":["active","paused","all"],"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"default":50,"example":50,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"example":0,"type":"number"}},{"name":"sortBy","required":false,"in":"query","schema":{"example":"nextRunAt","enum":["nextRunAt","createdAt","title"],"type":"string"}},{"name":"order","required":false,"in":"query","schema":{"example":"asc","enum":["asc","desc"],"type":"string"}}],"responses":{"200":{"description":"Recurring tickets list"}},"security":[{"api-key":[]}],"summary":"List recurring ticket templates","tags":["recurring-tickets"]}},"/v1/brands/{brandId}/recurring-tickets/{id}":{"get":{"operationId":"RecurringTicketsController_findOne[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Recurring ticket detail"}},"security":[{"api-key":[]}],"summary":"Get a recurring ticket template","tags":["recurring-tickets"]},"patch":{"operationId":"RecurringTicketsController_update[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRecurringTicketDto"}}}},"responses":{"200":{"description":"Recurring ticket updated"}},"security":[{"api-key":[]}],"summary":"Update a recurring ticket template","tags":["recurring-tickets"]},"delete":{"operationId":"RecurringTicketsController_delete[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Recurring ticket deleted"}},"security":[{"api-key":[]}],"summary":"Delete a recurring ticket template","tags":["recurring-tickets"]}},"/v1/workspaces/{workspaceId}/recurring-tickets/{id}":{"get":{"operationId":"RecurringTicketsController_findOne[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Recurring ticket detail"}},"security":[{"api-key":[]}],"summary":"Get a recurring ticket template","tags":["recurring-tickets"]},"patch":{"operationId":"RecurringTicketsController_update[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRecurringTicketDto"}}}},"responses":{"200":{"description":"Recurring ticket updated"}},"security":[{"api-key":[]}],"summary":"Update a recurring ticket template","tags":["recurring-tickets"]},"delete":{"operationId":"RecurringTicketsController_delete[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Recurring ticket deleted"}},"security":[{"api-key":[]}],"summary":"Delete a recurring ticket template","tags":["recurring-tickets"]}},"/v1/brands/{brandId}/recurring-tickets/{id}/run":{"post":{"operationId":"RecurringTicketsController_triggerManually[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Ticket created from template"}},"security":[{"api-key":[]}],"summary":"Manually trigger a recurring ticket (creates a ticket now)","tags":["recurring-tickets"]}},"/v1/workspaces/{workspaceId}/recurring-tickets/{id}/run":{"post":{"operationId":"RecurringTicketsController_triggerManually[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Ticket created from template"}},"security":[{"api-key":[]}],"summary":"Manually trigger a recurring ticket (creates a ticket now)","tags":["recurring-tickets"]}},"/v1/brands/{brandId}/recurring-tickets/{id}/pause":{"post":{"operationId":"RecurringTicketsController_pause[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Recurring ticket paused"}},"security":[{"api-key":[]}],"summary":"Pause a recurring ticket","tags":["recurring-tickets"]}},"/v1/workspaces/{workspaceId}/recurring-tickets/{id}/pause":{"post":{"operationId":"RecurringTicketsController_pause[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Recurring ticket paused"}},"security":[{"api-key":[]}],"summary":"Pause a recurring ticket","tags":["recurring-tickets"]}},"/v1/brands/{brandId}/recurring-tickets/{id}/resume":{"post":{"operationId":"RecurringTicketsController_resume[0]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Recurring ticket resumed"}},"security":[{"api-key":[]}],"summary":"Resume a paused recurring ticket","tags":["recurring-tickets"]}},"/v1/workspaces/{workspaceId}/recurring-tickets/{id}/resume":{"post":{"operationId":"RecurringTicketsController_resume[1]","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Recurring ticket resumed"}},"security":[{"api-key":[]}],"summary":"Resume a paused recurring ticket","tags":["recurring-tickets"]}}},"info":{"title":"Dispatch Tickets API","description":"Multi-tenant tickets as a service API.\n\n## SDK\n\nInstall the official TypeScript SDK for easier integration:\n\n```bash\nnpm install @dispatchtickets/sdk\n```\n\n```typescript\nimport { DispatchTickets } from '@dispatchtickets/sdk';\n\nconst client = new DispatchTickets({ apiKey: 'sk_...' });\nconst brands = await client.brands.list();\n```\n\n- [SDK on npm](https://www.npmjs.com/package/@dispatchtickets/sdk)\n- [SDK on GitHub](https://github.com/Epic-Design-Labs/app-dispatchtickets-sdk)\n- [Website](https://dispatchtickets.com)","version":"1.0","contact":{}},"tags":[{"name":"brands","description":"Brand management"},{"name":"tickets","description":"Ticket operations"},{"name":"comments","description":"Comment operations"},{"name":"attachments","description":"File attachments"},{"name":"webhooks","description":"Webhook subscriptions"},{"name":"import","description":"Bulk ticket import from external systems"}],"servers":[],"components":{"securitySchemes":{"api-key":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Enter your API key"}},"schemas":{"CreateAccountDto":{"type":"object","properties":{"name":{"type":"string","example":"Acme Inc"},"email":{"type":"string","example":"admin@acme.com"}},"required":["name","email"]},"CreateApiKeyDto":{"type":"object","properties":{"name":{"type":"string","description":"Name for the API key","example":"Production API Key"},"allBrands":{"type":"boolean","description":"Whether this key can access all brands (default: true)","example":true,"default":true},"brandIds":{"description":"Specific brand IDs this key can access (only if allBrands is false)","example":["ws_abc123","ws_def456"],"type":"array","items":{"type":"string"}}}},"UpdateApiKeyScopeDto":{"type":"object","properties":{"allBrands":{"type":"boolean","description":"Whether this key can access all brands","example":false},"brandIds":{"description":"Specific brand IDs this key can access (required if allBrands is false)","example":["ws_abc123","ws_def456"],"type":"array","items":{"type":"string"}}}},"SendMagicLinkDto":{"type":"object","properties":{}},"CreateCheckoutDto":{"type":"object","properties":{"email":{"type":"string","description":"Email address for the account"},"successUrl":{"type":"string","description":"URL to redirect to after successful checkout"},"cancelUrl":{"type":"string","description":"URL to redirect to if checkout is cancelled"},"planId":{"type":"string","description":"Plan ID (defaults to free plan)"},"couponCode":{"type":"string","description":"Coupon code for discount"}},"required":["email","successUrl"]},"SignupDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com"},"firstName":{"type":"string","example":"John"},"lastName":{"type":"string","example":"Doe"},"companyName":{"type":"string","example":"Acme Inc"}},"required":["email"]},"VerifyTokenDto":{"type":"object","properties":{"token":{"type":"string","description":"Magic link token from email"}},"required":["token"]},"AcceptInviteDto":{"type":"object","properties":{"inviteId":{"type":"string","example":"clxyz123","description":"The invite ID from the org_invite query parameter"}},"required":["inviteId"]},"ConnectApiKeyDto":{"type":"object","properties":{"apiKey":{"type":"string","description":"Dispatch API key to link to this organization","example":"sk_live_xxxxxxxxxxxxxxxx"}},"required":["apiKey"]},"InviteMemberDto":{"type":"object","properties":{"email":{"type":"string","example":"newuser@example.com"},"role":{"type":"string","example":"member","description":"Role for the invited member (e.g., admin, member)"},"allBrands":{"type":"boolean","example":true,"description":"If true, member has access to all current and future brands"},"brandIds":{"example":["ws_abc123","ws_def456"],"description":"Specific brand IDs the member can access (only used when allBrands is false)","type":"array","items":{"type":"string"}}},"required":["email","role"]},"UpdateMemberDto":{"type":"object","properties":{"role":{"type":"string","example":"admin","description":"New role for the member"}},"required":["role"]},"UpdateBrandAssignmentsDto":{"type":"object","properties":{"allBrands":{"type":"boolean","example":true,"description":"Whether the member has access to all current and future brands"},"brandIds":{"example":["ws_abc123","ws_def456"],"description":"Specific brand IDs to assign (required if allBrands is false)","type":"array","items":{"type":"string"}},"workspaceIds":{"example":["ws_abc123","ws_def456"],"description":"Alias for brandIds (deprecated, use brandIds)","deprecated":true,"type":"array","items":{"type":"string"}}},"required":["allBrands"]},"SwitchOrganizationDto":{"type":"object","properties":{"organizationId":{"type":"string","example":"cmxyz123","description":"The organization ID to switch to"}},"required":["organizationId"]},"UpdateOrganizationDto":{"type":"object","properties":{"name":{"type":"string","example":"Epic Design Labs","description":"Organization name"}},"required":["name"]},"UpdateProfileDto":{"type":"object","properties":{"displayName":{"type":"string","example":"Kal","description":"Display name shown on comments"},"avatarUrl":{"type":"string","example":"https://example.com/avatar.jpg","description":"Profile image URL"},"notifyEmail":{"type":"boolean","example":true,"description":"Receive email notifications"},"notifyToast":{"type":"boolean","example":true,"description":"Show in-app toast notifications"},"notifyDesktop":{"type":"boolean","example":true,"description":"Show desktop notifications"}}},"AvatarUploadDto":{"type":"object","properties":{"filename":{"type":"string","example":"avatar.jpg","description":"Original filename"},"contentType":{"type":"string","example":"image/jpeg","description":"Content type of the file"},"size":{"type":"number","example":102400,"description":"File size in bytes (max 5MB)"}},"required":["filename","contentType","size"]},"UpgradeSubscriptionDto":{"type":"object","properties":{"planId":{"type":"string","example":"plan_pro_monthly","description":"Plan ID to upgrade to"},"successUrl":{"type":"string","description":"URL to redirect to after successful upgrade"},"cancelUrl":{"type":"string","description":"URL to redirect to if upgrade is cancelled"},"couponCode":{"type":"string","description":"Coupon code for discount"}},"required":["planId","successUrl"]},"CancelSubscriptionDto":{"type":"object","properties":{"immediate":{"type":"boolean","description":"Cancel immediately instead of at end of billing period","default":false}}},"ConfirmCheckoutDto":{"type":"object","properties":{"checkoutSessionId":{"type":"string","description":"Checkout session ID from the Throttle embed"},"planRef":{"type":"string","description":"Plan ref to subscribe to (falls back to pending plan ref on account)"}},"required":["checkoutSessionId"]},"DeleteAccountDto":{"type":"object","properties":{"confirmation":{"type":"string","description":"Confirmation text - must be \"DELETE\" to confirm","example":"DELETE"}},"required":["confirmation"]},"CreateBrandDto":{"type":"object","properties":{"name":{"type":"string","example":"Acme Corp"},"slug":{"type":"string","example":"acme-corp","description":"URL-safe identifier"},"metadata":{"type":"object","example":{"industry":"tech"}},"ticketSchema":{"type":"object"},"ticketPrefix":{"type":"string","example":"AC","description":"Prefix for public ticket IDs (e.g., \"AC\" -> \"AC-1001\"). Defaults to brand initials."},"ticketNumberStart":{"type":"number","example":1000,"description":"Starting number for tickets (default: 1000)"}},"required":["name","slug"]},"UpdateBrandDto":{"type":"object","properties":{"name":{"type":"string","example":"Acme Corp"},"slug":{"type":"string","example":"acme-corp","description":"URL-safe identifier"},"metadata":{"type":"object","example":{"industry":"tech"}},"ticketSchema":{"type":"object"},"ticketPrefix":{"type":"string","example":"AC","description":"Prefix for public ticket IDs (e.g., \"AC\" -> \"AC-1001\"). Defaults to brand initials."},"ticketNumberStart":{"type":"number","example":1000,"description":"Starting number for tickets (default: 1000)"},"url":{"type":"string","example":"https://example.com","description":"Brand website URL"},"iconUrl":{"type":"string","example":"https://example.com/favicon.ico","description":"Brand icon/favicon URL"},"fromName":{"type":"string","example":"Support Team","description":"Sender name for outbound emails"},"fromEmail":{"type":"string","example":"support@yourdomain.com","description":"Sender email for outbound emails (requires Resend domain verification)"},"autoresponseEnabled":{"type":"boolean","example":true,"description":"Enable autoresponse emails when new tickets are created"},"autoresponseSubject":{"type":"string","example":"We received your request [{{ticketNumber}}]","description":"Subject line for autoresponse. Supports {{ticketNumber}}, {{ticketTitle}} placeholders."},"autoresponseBody":{"type":"string","example":"<p>Thank you for contacting us. We have received your request and will respond shortly.</p>","description":"HTML body for autoresponse. Supports {{ticketNumber}}, {{ticketTitle}}, {{customerName}} placeholders."},"slaEnabled":{"type":"boolean","example":true,"description":"Enable SLA for this brand"},"slaDefaultHours":{"type":"number","example":72,"description":"Default SLA in hours (e.g., 72 = 3 days)"},"slaByPriority":{"type":"object","example":{"urgent":4,"high":24,"normal":72,"low":168},"description":"SLA hours per priority level"},"slaNotifyOverdue":{"type":"boolean","example":true,"description":"Send notifications when tickets are overdue"},"slaBusinessHoursOnly":{"type":"boolean","example":false,"description":"Only count business hours toward SLA deadlines"},"slaBusinessHours":{"type":"object","example":{"start":"09:00","end":"17:00","days":[1,2,3,4,5],"timezone":"America/New_York"},"description":"Business hours config (days: 0=Sun, 6=Sat)"},"portalOrigins":{"example":["https://myapp.com","https://www.myapp.com"],"description":"Allowed origins for portal API CORS. Empty array = block all cross-origin requests.","type":"array","items":{"type":"string"}},"chatEnabled":{"type":"boolean","example":false,"description":"Allow the chat widget to open conversations for this brand"},"chatAllowedOrigins":{"example":["https://myapp.com"],"description":"Sites allowed to embed the chat widget. Empty array = none.","type":"array","items":{"type":"string"}}}},"CreateStatusDto":{"type":"object","properties":{"name":{"type":"string","example":"In Progress","description":"Display name for the status"},"key":{"type":"string","example":"in_progress","description":"Unique key (lowercase, alphanumeric + underscore)"},"color":{"type":"string","example":"#6366f1","description":"Hex color for badge"},"description":{"type":"string","example":"Ticket is being worked on","description":"Optional description"}},"required":["name","key"]},"ReorderStatusesDto":{"type":"object","properties":{"statusIds":{"example":["sts_abc","sts_def","sts_ghi"],"description":"Ordered array of status IDs","type":"array","items":{"type":"string"}}},"required":["statusIds"]},"UpdateStatusDto":{"type":"object","properties":{"name":{"type":"string","example":"In Progress","description":"Display name for the status"},"color":{"type":"string","example":"#6366f1","description":"Hex color for badge"},"description":{"type":"string","example":"Ticket is being worked on","description":"Optional description"},"isActive":{"type":"boolean","example":true,"description":"Whether status is active (shown in dropdowns)"},"sortOrder":{"type":"number","example":0,"description":"Sort order for display"}}},"LinkDto":{"type":"object","properties":{"url":{"type":"string","example":"https://github.com/acme/app/issues/123"},"title":{"type":"string","example":"Related GitHub issue"},"type":{"type":"string","example":"github_issue"}},"required":["url"]},"WatcherDto":{"type":"object","properties":{"memberId":{"type":"string","example":"mem_abc123","description":"Member ID (can be team member or external user ID)"},"memberEmail":{"type":"string","example":"user@example.com","description":"Email address for notifications"},"memberName":{"type":"string","example":"John Doe","description":"Display name"}},"required":["memberId","memberEmail"]},"CreateTicketDto":{"type":"object","properties":{"title":{"type":"string","example":"Cannot login to dashboard"},"body":{"type":"string","example":"Getting a 500 error when I try to login..."},"status":{"type":"string","example":"open","enum":["open","pending","resolved","closed"]},"priority":{"type":"string","example":"high","enum":["low","normal","medium","high","urgent"]},"assigneeId":{"type":"string","example":"user_agent_123"},"createdBy":{"type":"string","example":"user_customer_456"},"links":{"type":"array","items":{"$ref":"#/components/schemas/LinkDto"}},"customFields":{"type":"object","example":{"browser":"Chrome 120","errorCode":500,"tags":["urgent","billing"]},"description":"Flexible custom fields - any JSON structure (max 64KB)"},"metadata":{"type":"object","example":{"source":"web"}},"source":{"type":"string","example":"email","enum":["api","web","email","slack","sms","discord","instagram","twitter","whatsapp","recurring","chat","custom"],"default":"api","description":"Source channel where the ticket originated"},"sourceId":{"type":"string","example":"<message-id@mail.example.com>","description":"Original ID from the source (email message-id, slack thread ts, etc.)"},"sourceData":{"type":"object","example":{"from":"customer@example.com","subject":"Help needed"},"description":"Additional source-specific data (max 64KB)"},"categoryId":{"type":"string","example":"cat_abc123","description":"Category ID (must exist in brand)"},"tags":{"example":["urgent","billing"],"description":"Tag names (will be created if they don't exist)","type":"array","items":{"type":"string"}},"dueAt":{"type":"string","example":"2025-04-01T00:00:00Z","description":"Due date (ISO 8601). Auto-set from brand SLA if not provided."},"notifyCustomer":{"type":"boolean","example":true,"description":"Send a confirmation email to the customer when ticket is created (manual tickets only)"},"watchers":{"description":"Initial watchers to add to the ticket","type":"array","items":{"$ref":"#/components/schemas/WatcherDto"}},"attachmentIds":{"example":["att_abc123","att_def456"],"description":"IDs of pending attachments to associate with the ticket","type":"array","items":{"type":"string"}}},"required":["title"]},"UpdateTicketDto":{"type":"object","properties":{"title":{"type":"string","example":"Cannot login to dashboard"},"body":{"type":"string","example":"Getting a 500 error when I try to login..."},"status":{"type":"string","example":"open","enum":["open","pending","resolved","closed"]},"priority":{"type":"string","example":"high","enum":["low","normal","medium","high","urgent"]},"assigneeId":{"type":"string","example":"user_agent_123","description":"Assignee ID (set to null to unassign)","nullable":true},"createdBy":{"type":"string","example":"user_customer_456"},"links":{"type":"array","items":{"$ref":"#/components/schemas/LinkDto"}},"customFields":{"type":"object","example":{"browser":"Chrome 120","errorCode":500,"tags":["urgent","billing"]},"description":"Flexible custom fields - any JSON structure (max 64KB)"},"metadata":{"type":"object","example":{"source":"web"}},"source":{"type":"string","example":"email","enum":["api","web","email","slack","sms","discord","instagram","twitter","whatsapp","recurring","chat","custom"],"default":"api","description":"Source channel where the ticket originated"},"sourceId":{"type":"string","example":"<message-id@mail.example.com>","description":"Original ID from the source (email message-id, slack thread ts, etc.)"},"sourceData":{"type":"object","example":{"from":"customer@example.com","subject":"Help needed"},"description":"Additional source-specific data (max 64KB)"},"categoryId":{"type":"string","example":"cat_abc123","description":"Category ID (set to null to remove category)","nullable":true},"tags":{"example":["urgent","billing"],"description":"Tag names to set (replaces existing tags, will create new tags if needed)","type":"array","items":{"type":"string"}},"dueAt":{"type":"string","example":"2025-04-01T00:00:00Z","description":"Due date (ISO 8601). Auto-set from brand SLA if not provided."},"notifyCustomer":{"type":"boolean","example":true,"description":"Send a confirmation email to the customer when ticket is created (manual tickets only)"},"watchers":{"description":"Initial watchers to add to the ticket","type":"array","items":{"$ref":"#/components/schemas/WatcherDto"}},"attachmentIds":{"example":["att_abc123","att_def456"],"description":"IDs of pending attachments to associate with the ticket","type":"array","items":{"type":"string"}},"isSpam":{"type":"boolean","example":true,"description":"Mark ticket as spam (excludes from billable count)"},"closeReason":{"type":"string","example":"no_response","description":"Reason for closing (only valid when status is closed)","enum":["no_response","out_of_scope","customer_left","duplicate"]}}},"MarkAsSpamDto":{"type":"object","properties":{"isSpam":{"type":"boolean","description":"Whether to mark the ticket as spam"}},"required":["isSpam"]},"MergeTicketsDto":{"type":"object","properties":{"sourceTicketIds":{"description":"IDs of tickets to merge into the target ticket","example":["tkt_abc123","tkt_def456"],"type":"array","items":{"type":"string"}}},"required":["sourceTicketIds"]},"BulkActionDto":{"type":"object","properties":{"action":{"type":"string","description":"Action to perform on tickets","enum":["spam","resolve","close","delete","assign","setCategory","setTags"],"example":"spam"},"ticketIds":{"description":"Array of ticket IDs to perform action on","example":["ticket_abc123","ticket_def456"],"type":"array","items":{"type":"string"}},"assigneeId":{"type":"object","description":"Assignee ID for assign action (null to unassign)"},"categoryId":{"type":"object","description":"Category ID for setCategory action (null to remove)"},"tags":{"description":"Tag names for setTags action (replaces existing tags)","type":"array","items":{"type":"string"}},"closeReason":{"type":"string","description":"Close reason for close action","enum":["no_response","out_of_scope","customer_left","duplicate"]}},"required":["action","ticketIds"]},"BlockSourceDto":{"type":"object","properties":{"type":{"type":"string","enum":["EMAIL","DOMAIN"],"description":"Type of source to block (EMAIL or DOMAIN)","example":"EMAIL"},"value":{"type":"string","description":"The email address or domain to block","example":"spammer@example.com"},"reason":{"type":"string","description":"Optional reason for blocking","example":"Known spam sender"}},"required":["type","value"]},"CreateContactDto":{"type":"object","properties":{"email":{"type":"string","example":"john@acme.com"},"name":{"type":"string","example":"John Smith"},"avatarUrl":{"type":"string","example":"https://example.com/avatar.jpg"},"companyId":{"type":"string","example":"cmp_abc123"},"metadata":{"type":"object","example":{"source":"signup"},"description":"Additional metadata (max 64KB)"},"notifyEmail":{"type":"boolean","example":true,"description":"Whether to send email notifications to this contact"}},"required":["email"]},"UpdateContactDto":{"type":"object","properties":{"email":{"type":"string","example":"john@acme.com"},"name":{"type":"string","example":"John Smith"},"avatarUrl":{"type":"string","example":"https://example.com/avatar.jpg"},"companyId":{"type":"string","example":"cmp_abc123"},"metadata":{"type":"object","example":{"source":"signup"},"description":"Additional metadata (max 64KB)"},"notifyEmail":{"type":"boolean","example":true,"description":"Whether to send email notifications to this contact"}}},"CreateWebhookDto":{"type":"object","properties":{"url":{"type":"string","example":"https://your-app.com/webhooks/tickets"},"secret":{"type":"string","example":"whsec_your_secret_key"},"events":{"example":["ticket.created","ticket.updated","comment.created"],"description":"Events to subscribe to","type":"array","items":{"type":"string"}}},"required":["url","secret","events"]},"UpsertEnrichmentDto":{"type":"object","properties":{"url":{"type":"string","example":"https://your-app.com/dispatch/context"},"secret":{"type":"string","description":"HMAC-SHA256 signing secret. Omit to keep the existing secret, or to have one generated on first save."},"enabled":{"type":"boolean","default":true},"events":{"example":["ticket.created"],"description":"Which events trigger a fetch. One or more of: ticket.created, ticket.opened","type":"array","items":{"type":"string"}},"timeoutMs":{"type":"number","default":2000,"maximum":2000,"description":"Request budget in milliseconds. Hard-capped at 2000ms server-side."}},"required":["url"]},"TestEnrichmentDto":{"type":"object","properties":{"url":{"type":"string","description":"Override the saved URL for this probe"},"secret":{"type":"string","description":"Override the saved secret for this probe"},"ticketId":{"type":"string","description":"Probe against a real ticket instead of a sample payload"}}},"EmailConnectionResponseDto":{"type":"object","properties":{"id":{"type":"string"},"brandId":{"type":"string"},"name":{"type":"string","description":"Display name for the connection"},"isPrimary":{"type":"boolean","description":"Whether this is the primary connection for outbound"},"provider":{"type":"string","enum":["GMAIL","OUTLOOK"]},"email":{"type":"string","description":"Connected email address"},"status":{"type":"string","enum":["ACTIVE","ERROR","DISCONNECTED"]},"lastSyncAt":{"format":"date-time","type":"string"},"errorMessage":{"type":"string"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","brandId","name","isPrimary","provider","email","status","createdAt"]},"InitiateOAuthDto":{"type":"object","properties":{"provider":{"type":"string","enum":["GMAIL","OUTLOOK"],"example":"GMAIL"},"redirectUrl":{"type":"string","description":"URL to redirect after OAuth completes"},"connectionName":{"type":"string","description":"Display name for the connection (e.g., \"Marketing\", \"Support\")"}},"required":["provider"]},"UpdateConnectionDto":{"type":"object","properties":{"name":{"type":"string","description":"Display name for the connection"}}},"CreateCategoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Bug Fix","description":"Category name"},"color":{"type":"string","example":"#ef4444","description":"Hex color for UI badges"},"description":{"type":"string","example":"Issues with bugs or defects"},"sortOrder":{"type":"number","example":0,"description":"Sort order (lower = first)"}},"required":["name"]},"ReorderCategoriesDto":{"type":"object","properties":{"categoryIds":{"example":["cat_abc123","cat_def456","cat_ghi789"],"description":"Array of category IDs in desired order","type":"array","items":{"type":"string"}}},"required":["categoryIds"]},"UpdateCategoryDto":{"type":"object","properties":{"name":{"type":"string","example":"Bug Report"},"color":{"type":"string","example":"#ef4444"},"description":{"type":"string","example":"Issues with bugs or defects"},"sortOrder":{"type":"number","example":1}}},"CreateTagDto":{"type":"object","properties":{"name":{"type":"string","example":"urgent","description":"Tag name (will be lowercased)"},"color":{"type":"string","example":"#ef4444","description":"Hex color for UI badges"}},"required":["name"]},"MergeTagsDto":{"type":"object","properties":{"sourceTagIds":{"example":["tag_abc123","tag_def456"],"description":"Tag IDs to merge (will be deleted after merge)","type":"array","items":{"type":"string"}},"targetTagId":{"type":"string","example":"tag_ghi789","description":"Tag ID to merge into (will receive all tickets)"}},"required":["sourceTagIds","targetTagId"]},"UpdateTagDto":{"type":"object","properties":{"name":{"type":"string","example":"high-priority"},"color":{"type":"string","example":"#ef4444"}}},"SubmitFeedbackDto":{"type":"object","properties":{"rating":{"type":"number","description":"Rating value (-1/1 for thumbs, 1-5 for scale5, 1-10 for scale10)","example":1},"comment":{"type":"string","description":"Optional feedback comment","example":"Great support, very helpful!"}},"required":["rating"]},"CreateAttachmentDto":{"type":"object","properties":{"filename":{"type":"string","example":"screenshot.png"},"contentType":{"type":"string","example":"image/png","description":"MIME type of the file. Must be an allowed type (images, documents, archives, media)."},"size":{"type":"number","example":102400,"description":"File size in bytes"},"uploadedBy":{"type":"string","example":"user_123"}},"required":["filename","contentType","size"]},"GetUrlsDto":{"type":"object","properties":{}},"TestEventDto":{"type":"object","properties":{"message":{"type":"string","maxLength":200}}},"CreateCommentDto":{"type":"object","properties":{"body":{"type":"string","example":"Thanks for reporting. Can you share more details?"},"authorId":{"type":"string","example":"user_agent_123"},"authorName":{"type":"string","example":"John Smith"},"authorType":{"type":"string","enum":["CUSTOMER","AGENT","SYSTEM"],"default":"CUSTOMER"},"parentId":{"type":"string","description":"Parent comment ID for threaded replies"},"links":{"type":"array","items":{"$ref":"#/components/schemas/LinkDto"}},"metadata":{"type":"object","description":"Additional metadata (max 64KB)"},"source":{"type":"string","example":"email","enum":["api","web","email","slack","sms","discord","instagram","twitter","whatsapp","recurring","chat","custom"],"default":"api","description":"Source channel where the comment originated"},"sourceId":{"type":"string","example":"<reply-id@mail.example.com>","description":"Original ID from the source"},"sourceData":{"type":"object","example":{"from":"customer@example.com"},"description":"Additional source-specific data (max 64KB)"},"setStatus":{"type":"string","example":"pending","enum":["open","pending","resolved"],"description":"Optionally set the ticket status when adding this comment"},"connectionId":{"type":"string","example":"emc_abc123","description":"Email connection ID to send the reply from (uses primary if not specified)"},"cc":{"example":["manager@example.com","team@example.com"],"description":"CC recipients for the email reply","type":"array","items":{"type":"string"}}},"required":["body"]},"UpdateCommentDto":{"type":"object","properties":{"body":{"type":"string","example":"Thanks for reporting. Can you share more details?"},"authorName":{"type":"string","example":"John Smith"},"links":{"type":"array","items":{"$ref":"#/components/schemas/LinkDto"}},"metadata":{"type":"object","description":"Additional metadata (max 64KB)"},"source":{"type":"string","example":"email","enum":["api","web","email","slack","sms","discord","instagram","twitter","whatsapp","recurring","chat","custom"],"default":"api","description":"Source channel where the comment originated"},"sourceId":{"type":"string","example":"<reply-id@mail.example.com>","description":"Original ID from the source"},"sourceData":{"type":"object","example":{"from":"customer@example.com"},"description":"Additional source-specific data (max 64KB)"},"setStatus":{"type":"string","example":"pending","enum":["open","pending","resolved"],"description":"Optionally set the ticket status when adding this comment"},"connectionId":{"type":"string","example":"emc_abc123","description":"Email connection ID to send the reply from (uses primary if not specified)"},"cc":{"example":["manager@example.com","team@example.com"],"description":"CC recipients for the email reply","type":"array","items":{"type":"string"}}}},"AddDomainDto":{"type":"object","properties":{"domain":{"type":"string","description":"The domain to add (e.g., support.acme.com for inbound, acme.com for outbound)","example":"acme.com"},"type":{"type":"string","description":"The type of domain (INBOUND for receiving, OUTBOUND for sending)","enum":["INBOUND","OUTBOUND"],"example":"OUTBOUND"}},"required":["domain","type"]},"UpdateDomainDto":{"type":"object","properties":{"fromEmail":{"type":"string","description":"The sender email address (must match domain, outbound only)","example":"support@acme.com"},"fromName":{"type":"string","description":"The sender display name (outbound only)","example":"Acme Support"},"isPrimary":{"type":"boolean","description":"Set this domain as the primary for its type","example":true},"replyMode":{"type":"string","description":"How to determine the reply-from address (SINGLE = use fromEmail, MATCH = match original recipient)","enum":["SINGLE","MATCH"],"example":"SINGLE"}}},"CreateIdentityTokenDto":{"type":"object","properties":{}},"SetBrandPresenceDto":{"type":"object","properties":{"status":{"type":"string","enum":["available","busy","away","offline"]},"memberId":{"type":"string","description":"Whose presence. Defaults to the signed-in member. Required with an API key; setting someone else from a session needs owner or admin.","example":"usr_abc123"},"maxConcurrent":{"type":"number","description":"Conversations this member can hold at once","default":1},"activeCount":{"type":"number","description":"Conversations this member is holding now (maintained by the router)"},"ttlSeconds":{"type":"number","description":"Seconds the status holds without a refresh. API keys only: a signed-in member is kept alive by their open admin tab. Default 300."}},"required":["status"]},"SetMyPresenceDto":{"type":"object","properties":{"status":{"type":"string","enum":["available","busy","away","offline"]}},"required":["status"]},"CreateCompanyDto":{"type":"object","properties":{"name":{"type":"string","example":"Acme Corp"},"domain":{"type":"string","example":"acme.com","description":"Domain for auto-matching customer emails"},"metadata":{"type":"object","example":{"industry":"tech"}}},"required":["name"]},"UpdateCompanyDto":{"type":"object","properties":{"name":{"type":"string","example":"Acme Corp"},"domain":{"type":"string","example":"acme.com","description":"Domain for auto-matching customer emails"},"metadata":{"type":"object","example":{"industry":"tech"}}}},"CreateFormTokenDto":{"type":"object","properties":{"name":{"type":"string","example":"Contact Form","description":"Name for this form"},"successUrl":{"type":"string","example":"https://example.com/thank-you","description":"URL to redirect to after successful submission"},"errorUrl":{"type":"string","example":"https://example.com/error","description":"URL to redirect to on error"},"thankYouMessage":{"type":"string","example":"Thanks for reaching out! We will get back to you within 24 hours.","description":"Custom thank-you message (shown when no successUrl is set)"},"fieldMapping":{"type":"object","example":{"email":"customFields.requesterEmail","subject":"title"},"description":"Custom field mapping from form fields to ticket fields"},"honeypotField":{"type":"string","example":"_gotcha","description":"Hidden field name for honeypot spam protection"},"allowedOrigins":{"example":["https://example.com","https://www.example.com"],"description":"Allowed origins for CORS (empty = allow all)","type":"array","items":{"type":"string"}}},"required":["name"]},"UpdateFormTokenDto":{"type":"object","properties":{"name":{"type":"string","example":"Contact Form"},"successUrl":{"type":"string","example":"https://example.com/thank-you"},"errorUrl":{"type":"string","example":"https://example.com/error"},"thankYouMessage":{"type":"string","example":"Thanks for reaching out! We will get back to you within 24 hours."},"fieldMapping":{"type":"object","example":{"email":"customFields.requesterEmail"}},"honeypotField":{"type":"string","example":"_gotcha"},"allowedOrigins":{"example":["https://example.com"],"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean","example":true}}},"GeneratePortalTokenDto":{"type":"object","properties":{}},"VerifyMagicLinkDto":{"type":"object","properties":{}},"PortalCreateTicketDto":{"type":"object","properties":{}},"PortalCreateCommentDto":{"type":"object","properties":{}},"PortalCreateAttachmentDto":{"type":"object","properties":{}},"CreateFieldDto":{"type":"object","properties":{"key":{"type":"string","example":"order_id","description":"Unique key for the field (snake_case)"},"label":{"type":"string","example":"Order ID","description":"Display label for the field"},"type":{"type":"string","example":"text","enum":["text","number","boolean","date","select","multiselect","url","array","object"],"description":"Field type"},"required":{"type":"boolean","example":false,"description":"Whether the field is required"},"defaultValue":{"type":"object","example":"N/A","description":"Default value for the field"},"description":{"type":"string","example":"Enter the customer order ID","description":"Help text for the field"},"placeholder":{"type":"string","example":"e.g., ORD-12345","description":"Placeholder text for the input"},"options":{"example":["low","medium","high"],"description":"Options for select/multiselect fields","type":"array","items":{"type":"string"}},"showOnCreate":{"type":"boolean","example":true,"description":"Whether the field appears on the new ticket form"},"showInTable":{"type":"boolean","example":true,"description":"Whether the field appears in table columns"},"showInDetail":{"type":"boolean","example":true,"description":"Whether the field appears in ticket detail view"},"visible":{"type":"boolean","example":true,"description":"Deprecated: use showOnCreate/showInTable/showInDetail instead","deprecated":true},"sortOrder":{"type":"number","example":0,"description":"Display order (lower = first)"},"source":{"type":"string","example":"shopify","description":"Integration source that created the field"}},"required":["key","label","type"]},"UpdateFieldDto":{"type":"object","properties":{"label":{"type":"string","example":"Order ID","description":"Display label for the field"},"type":{"type":"string","example":"text","enum":["text","number","boolean","date","select","multiselect","url","array","object"],"description":"Field type"},"required":{"type":"boolean","example":false,"description":"Whether the field is required"},"defaultValue":{"type":"object","example":"N/A","description":"Default value for the field"},"description":{"type":"string","example":"Enter the customer order ID","description":"Help text for the field"},"placeholder":{"type":"string","example":"e.g., ORD-12345","description":"Placeholder text for the input"},"options":{"example":["low","medium","high"],"description":"Options for select/multiselect fields","type":"array","items":{"type":"string"}},"showOnCreate":{"type":"boolean","example":true,"description":"Whether the field appears on the new ticket form"},"showInTable":{"type":"boolean","example":true,"description":"Whether the field appears in table columns"},"showInDetail":{"type":"boolean","example":true,"description":"Whether the field appears in ticket detail view"},"visible":{"type":"boolean","example":true,"description":"Deprecated: use showOnCreate/showInTable/showInDetail instead","deprecated":true},"sortOrder":{"type":"number","example":0,"description":"Display order (lower = first)"},"source":{"type":"string","example":"shopify","description":"Integration source that created the field"}}},"ReorderFieldsDto":{"type":"object","properties":{"keys":{"example":["order_id","customer_type","priority_level"],"description":"Field keys in the desired order","type":"array","items":{"type":"string"}}},"required":["keys"]},"ConnectStoreDto":{"type":"object","properties":{}},"LinkOrderTicketDto":{"type":"object","properties":{}},"ImportOptionsDto":{"type":"object","properties":{"skipDuplicates":{"type":"boolean","default":true},"autoCreateStatuses":{"type":"boolean","default":true},"autoCreateCategories":{"type":"boolean","default":true},"autoCreateTags":{"type":"boolean","default":true},"autoRegisterFields":{"type":"boolean","default":true}}},"ImportCustomerDto":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com"},"name":{"type":"string","example":"John Doe"}},"required":["email"]},"ImportAttachmentDto":{"type":"object","properties":{"url":{"type":"string","example":"https://cdn.example.com/file.pdf"},"filename":{"type":"string","example":"receipt.pdf"},"contentType":{"type":"string","example":"application/pdf"}},"required":["url","filename"]},"ImportCommentDto":{"type":"object","properties":{"sourceId":{"type":"string","example":"HF-C-5678","description":"Source comment ID for idempotency"},"body":{"type":"string","example":"Agent reply text..."},"authorType":{"type":"string","example":"AGENT","enum":["CUSTOMER","AGENT","SYSTEM"]},"authorEmail":{"type":"string","example":"agent@company.com"},"authorName":{"type":"string","example":"Jane Agent"},"createdAt":{"type":"string","example":"2024-01-16T10:00:00Z"},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/ImportAttachmentDto"}}},"required":["body","authorType"]},"ImportTicketDto":{"type":"object","properties":{"sourceId":{"type":"string","example":"HF-1234","description":"Source ticket ID for idempotency"},"title":{"type":"string","example":"Help with billing"},"body":{"type":"string","example":"Full description..."},"status":{"type":"string","example":"in_progress","description":"Status string (matched by key, then name, then auto-created)"},"priority":{"type":"string","example":"high","enum":["low","normal","medium","high","urgent"]},"customer":{"$ref":"#/components/schemas/ImportCustomerDto"},"assigneeEmail":{"type":"string","example":"agent@company.com","description":"Assignee email (matched against team members)"},"category":{"type":"string","example":"Billing","description":"Category name (matched or auto-created)"},"tags":{"example":["urgent","vip"],"type":"array","items":{"type":"string"}},"customFields":{"type":"object","example":{"order_id":"ORD-123"}},"sourceData":{"type":"object","description":"Source-specific metadata"},"createdAt":{"type":"string","example":"2024-01-15T10:00:00Z","description":"Original creation timestamp"},"comments":{"type":"array","items":{"$ref":"#/components/schemas/ImportCommentDto"}},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/ImportAttachmentDto"}}},"required":["sourceId","title"]},"ImportTicketsDto":{"type":"object","properties":{"source":{"type":"string","example":"happyfox","description":"Import source identifier"},"options":{"$ref":"#/components/schemas/ImportOptionsDto"},"tickets":{"description":"Tickets to import (max 100)","type":"array","items":{"$ref":"#/components/schemas/ImportTicketDto"}}},"required":["source","tickets"]},"ScheduleDto":{"type":"object","properties":{"frequency":{"type":"string","example":"weekly","enum":["daily","weekly","monthly","yearly"]},"dayOfWeek":{"type":"number","example":1,"description":"Day of week (0=Sunday, 6=Saturday). Required for weekly."},"dayOfMonth":{"type":"number","example":15,"description":"Day of month (1-31). Required for monthly/yearly."},"month":{"type":"number","example":1,"description":"Month (1-12). Required for yearly."},"timeOfDay":{"type":"string","example":"09:00","description":"24h time (HH:mm)"},"timezone":{"type":"string","example":"America/New_York","description":"IANA timezone identifier"},"skipWeekends":{"type":"boolean","example":false,"description":"Skip Saturdays and Sundays (push to next Monday)"}},"required":["frequency","timeOfDay","timezone"]},"CreateRecurringTicketDto":{"type":"object","properties":{"title":{"type":"string","example":"Weekly Security Review - {{date}}","description":"Ticket title. Supports placeholders: {{date}}, {{count}}, {{month}}"},"body":{"type":"string","example":"Review the security dashboard and check for anomalies."},"priority":{"type":"string","example":"high","enum":["low","normal","medium","high","urgent"]},"assigneeId":{"type":"string","example":"mem_abc123"},"categoryId":{"type":"string","example":"cat_abc123"},"tags":{"example":["maintenance","security"],"type":"array","items":{"type":"string"}},"customFields":{"type":"object","example":{"department":"engineering"}},"schedule":{"description":"Schedule configuration","allOf":[{"$ref":"#/components/schemas/ScheduleDto"}]},"cronExpr":{"type":"string","example":"0 9 * * 1","description":"Raw cron expression (overrides schedule if provided)"}},"required":["title","schedule"]},"UpdateRecurringTicketDto":{"type":"object","properties":{"title":{"type":"string","example":"Weekly Security Review - {{date}}"},"body":{"type":"string"},"priority":{"type":"string","example":"high","enum":["low","normal","medium","high","urgent"]},"assigneeId":{"type":"string"},"categoryId":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"customFields":{"type":"object"},"schedule":{"description":"Updated schedule configuration","allOf":[{"$ref":"#/components/schemas/ScheduleDto"}]},"cronExpr":{"type":"string","description":"Raw cron expression (overrides schedule)"}}}}},"externalDocs":{"description":"TypeScript SDK","url":"https://www.npmjs.com/package/@dispatchtickets/sdk"}}