/** Campaign status literals. */ type CampaignStatus = 'ongoing' | 'finished' | 'paused' | 'scheduled'; /** Campaign provider literals. */ type CampaignProvider = 'whatsapp'; /** WhatsApp template component structure. */ interface WhatsAppTemplateComponent { type: string; format?: string; text?: string; example?: any; buttons?: any; } /** WhatsApp payload used when dispatching campaign messages. */ interface WhatsAppPayload { template: { name: string; components: WhatsAppTemplateComponent[]; language: string; status: string; category: string; id: string; }; templateOptions: { buttonsVariablesValues?: (string | null)[] | null; bodyVariablesValues?: string[]; headerVariablesValues?: string[]; headerFileInfos?: { filename: string; fileUrl: string; parsedFilename: string; }; }; } /** Contact filter applied when adding contacts to a campaign. */ interface CampaignContactFilter { excludeDeclinedMarketing?: boolean; } /** Schedule configuration for a campaign. */ interface CampaignSchedule { startAt?: string; repeat?: { delay?: number; count?: number; until?: string; }; } /** Retry configuration for a campaign. */ interface CampaignRetryConfig { maxAttempts: number; delay: number; } /** Campaign entity returned by the Campaigns API. */ interface Campaign { id: string; sid: number; companyId: string; createdBy: string; assignedTo: string; name?: string; provider: CampaignProvider; providerId: number; providerConfigId: string; associatedRuleId?: string; payload: WhatsAppPayload; conversionRuleIds: string[]; status: CampaignStatus; expiresAt?: string; createdAt: string; updatedAt: string; failedCampaignAttempts: number; queuedCampaignAttempts: number; deliveredCampaignAttempts: number; convertedCampaignAttempts: number; categoryId?: number; contactFilter?: CampaignContactFilter; schedule?: CampaignSchedule; followUp?: { message: WhatsAppPayload; schedule: { startAt?: string; delay?: number; }; }; retryConfig?: CampaignRetryConfig | null; } /** Paginated response returned by the Campaigns API for list endpoints. */ interface CampaignPaginatedResponse { total: number; limit: number; skip: number; data: Campaign[]; } /** Request payload for creating a campaign. */ interface CreateCampaignRequest { name: string; payload: WhatsAppPayload; provider: CampaignProvider; companyId: string; createdBy: string; providerId: number; providerConfigId: string; schedule: CampaignSchedule; associatedRuleId?: string; assignedTo?: string; expiresAt?: string; followUp?: { message: WhatsAppPayload; schedule: { startAt?: string; delay?: number; }; }; retryConfig?: CampaignRetryConfig | null; } /** Request payload for updating a campaign. */ interface PatchCampaignRequest { name?: string; expiresAt?: string; status?: CampaignStatus; categoryId?: number; contactFilter?: CampaignContactFilter; retryConfig?: CampaignRetryConfig | null; } /** Case-insensitive LIKE operator accepted by the campaign name filter. */ type CampaignNameLikeQueryOperators = { $ilike?: string; }; /** Query parameters for listing campaigns. */ interface CampaignQueryParams { companyId?: string; status?: CampaignStatus; createdBy?: string; assignedTo?: string; name?: string | CampaignNameLikeQueryOperators; $limit?: number; $skip?: number; $sort?: { name?: 1 | -1; }; } /** User entity returned by the Campaigns API. */ interface CampaignUser { id: string; name: string; status: 'new' | 'activated' | 'disabled'; } /** Dispatch status literals for a campaign contact. */ type CampaignContactDispatchStatus = 'scheduled' | 'queued' | 'delivered' | 'converted' | 'failed'; /** Campaign status literals accepted by campaign contact queries. */ type CampaignContactCampaignStatus = 'ongoing' | 'finished'; /** Primitive values accepted by REST query filters. */ type CampaignContactQueryValue = string | number | boolean; /** Sort direction accepted by REST query parameters. */ type CampaignContactSortDirection = 1 | -1; /** Query operators accepted by REST query filters. */ type CampaignContactQueryOperators = { $eq?: T; $ne?: T; $in?: T[]; $nin?: T[]; $lt?: T; $lte?: T; $gt?: T; $gte?: T; }; /** Case-insensitive LIKE operator accepted by contact name and endpoint filters. */ type CampaignContactLikeQueryOperators = { $ilike?: string; }; /** Campaign contact entity returned by the Campaign Contacts API. */ interface CampaignContactResponse { id: string; contactId: string; campaignId: string; createdAt: string; updatedAt: string; deliveredAt?: string | null; contactEndpointId?: string; dispatchStatusMessage: string; contactName?: string; contactEndpoint?: string; metadata?: unknown; communicationChannelId: string; dispatchStatus: CampaignContactDispatchStatus; isMessageRead?: boolean; retryCount?: number | null; convertedAt?: string | null; followUpSentAt?: string | null; } /** Paginated response returned by the Campaign Contacts API for list endpoints. */ type CampaignContactPaginatedResponse = { total: number; limit: number; skip: number; data: CampaignContactResponse[]; }; /** Request payload for creating a campaign contact. */ type CreateCampaignContactRequest = { contactId: string; campaignId: string; contactEndpointId?: string; contactName?: string; contactEndpoint?: string; metadata?: unknown; retryCount?: number | null; }; /** Request payload for partially updating a campaign contact. */ type PatchCampaignContactRequest = { id?: string; contactId?: string; campaignId?: string; createdAt?: string; updatedAt?: string; deliveredAt?: string | null; contactEndpointId?: string; dispatchStatusMessage?: string; contactName?: string; contactEndpoint?: string; metadata?: unknown; communicationChannelId?: string; dispatchStatus?: CampaignContactDispatchStatus; isMessageRead?: boolean; retryCount?: number | null; }; /** Sort fields accepted when listing campaign contacts. */ type CampaignContactSortParams = { contactId?: CampaignContactSortDirection; createdAt?: CampaignContactSortDirection; updatedAt?: CampaignContactSortDirection; campaignId?: CampaignContactSortDirection; dispatchStatus?: CampaignContactSortDirection; contactName?: CampaignContactSortDirection; contactEndpoint?: CampaignContactSortDirection; contactEndpointId?: CampaignContactSortDirection; communicationChannelId?: CampaignContactSortDirection; }; /** Query parameters for listing campaign contacts. */ type CampaignContactQueryParams = { contactId?: string | CampaignContactQueryOperators; createdAt?: string | CampaignContactQueryOperators; updatedAt?: string | CampaignContactQueryOperators; campaignId?: string | CampaignContactQueryOperators; dispatchStatus?: CampaignContactDispatchStatus | CampaignContactQueryOperators; contactName?: string | CampaignContactQueryOperators | CampaignContactLikeQueryOperators; contactEndpoint?: string | CampaignContactQueryOperators | CampaignContactLikeQueryOperators; contactEndpointId?: string | CampaignContactQueryOperators; communicationChannelId?: string | CampaignContactQueryOperators; 'campaign.status'?: CampaignContactCampaignStatus | CampaignContactQueryOperators; $limit?: number; $skip?: number; $sort?: CampaignContactSortParams; $select?: (keyof CampaignContactResponse)[]; }; type CampaignContactsDashboardInterval = 'day' | 'week' | 'month'; type CampaignContactsDashboardQueryValue = string | number | boolean; type CampaignContactsDashboardExactQueryOperators = { $in?: T[]; $ne?: T; }; type CampaignContactsDashboardRangeQueryOperators = CampaignContactsDashboardExactQueryOperators & { $gt?: T; $gte?: T; $lt?: T; $lte?: T; }; interface CampaignContactsDashboardQueryParams { companyId: string; id?: string | CampaignContactsDashboardExactQueryOperators; campaignId?: string | CampaignContactsDashboardExactQueryOperators; campaignName?: string | CampaignContactsDashboardExactQueryOperators; createdBy?: string | CampaignContactsDashboardExactQueryOperators; assignedTo?: string | CampaignContactsDashboardExactQueryOperators; campaignCreatedBy?: string | CampaignContactsDashboardExactQueryOperators; campaignAssignedTo?: string | CampaignContactsDashboardExactQueryOperators; clientId?: string | CampaignContactsDashboardExactQueryOperators; clientName?: string | CampaignContactsDashboardExactQueryOperators; clientEndpoint?: string | CampaignContactsDashboardExactQueryOperators; clientEndpointId?: string | CampaignContactsDashboardExactQueryOperators; serviceId?: string | CampaignContactsDashboardExactQueryOperators; communicationChannelId?: string | CampaignContactsDashboardExactQueryOperators; providerConfigId?: string | CampaignContactsDashboardExactQueryOperators; dispatchStatus?: CampaignContactDispatchStatus | CampaignContactsDashboardExactQueryOperators; dispatchStatusMessage?: string | CampaignContactsDashboardExactQueryOperators; wasMessageRead?: boolean | CampaignContactsDashboardExactQueryOperators; hasAutomaticFollowUp?: boolean | CampaignContactsDashboardExactQueryOperators; retryCount?: number | CampaignContactsDashboardRangeQueryOperators; createdAt?: string | CampaignContactsDashboardRangeQueryOperators; updatedAt?: string | CampaignContactsDashboardRangeQueryOperators; deliveredAt?: string | CampaignContactsDashboardRangeQueryOperators; convertedAt?: string | CampaignContactsDashboardRangeQueryOperators; followUpSentAt?: string | CampaignContactsDashboardRangeQueryOperators; timeToConvert?: number | CampaignContactsDashboardRangeQueryOperators; conversionHour?: number | CampaignContactsDashboardRangeQueryOperators; conversionDay?: number | CampaignContactsDashboardRangeQueryOperators; interval?: CampaignContactsDashboardInterval; } interface CampaignContactsDashboardStatusMetrics { scheduled: number; queued: number; delivered: number; converted: number; failed: number; } interface CampaignContactsDashboardSummary { campaignsSent: number; contactsImpacted: number; messagesSent: number; deliveredMessages: number; responseMessages: number; convertedMessages: number; rejectedMessages: number; deliveryRate: number; responseRate: number; conversionRate: number; rejectionRate: number; averageResponseTimeMinutes: number | null; resendCount: number; automaticFollowUpCount: number; } interface CampaignContactsDashboardFunnelItem { key: string; label: string; count: number; base: number; rate: number; } interface CampaignContactsDashboardEvolutionItem { period: string; sent: number; delivered: number; responses: number; conversions: number; } interface CampaignContactsDashboardTopCampaign { campaignId: string; campaignName?: string; createdBy?: string; contacts: number; delivered: number; responses: number; conversions: number; conversionRate: number; status?: CampaignStatus; } interface CampaignContactsDashboardChannelPerformance { serviceId: string; sent: number; delivered: number; responses: number; conversions: number; deliveryRate: number; responseRate: number; conversionRate: number; } interface CampaignContactsDashboardStatusDistribution { key: number; total: number; byStatus: CampaignContactsDashboardStatusMetrics; } interface CampaignContactsDashboardMetrics { byStatus: CampaignContactsDashboardStatusMetrics; averageTimeToConvert: number | null; summary: CampaignContactsDashboardSummary; funnel: CampaignContactsDashboardFunnelItem[]; evolution: CampaignContactsDashboardEvolutionItem[]; topCampaigns: CampaignContactsDashboardTopCampaign[]; byChannel: CampaignContactsDashboardChannelPerformance[]; byConversionDay: CampaignContactsDashboardStatusDistribution[]; byConversionHour: CampaignContactsDashboardStatusDistribution[]; } interface CampaignContactsDashboardData { total: number; filters: { from: string; to: string; }; metrics: CampaignContactsDashboardMetrics; } /** Work group entity returned by the Campaigns API. */ interface CampaignWorkGroup { id: string; name: string; companyId: string; } /** Paginated response returned when listing work groups. */ interface CampaignWorkGroupPaginatedResponse { total: number; limit: number; skip: number; data: CampaignWorkGroup[]; } /** Query parameters for listing work groups. */ interface CampaignWorkGroupQueryParams { id?: string; name?: string; companyId?: string; $limit?: number; $skip?: number; } /** Request payload for creating a work group. */ interface CreateCampaignWorkGroupRequest { id: string; name: string; companyId: string; } /** Reason why a user has (or does not have) access to the Campaigns module. */ type CampaignAccessReason = 'admin' | 'manager' | 'user' | 'none'; /** Response returned by the Campaigns API when checking the caller's access. */ interface CampaignAccessResponse { hasAccess: boolean; reason: CampaignAccessReason; } /** Response returned by the Campaigns API when fetching a company's module install. */ interface CampaignCompanyResponse { id: string; companyId: string; enabled: boolean; enabledByUserId: string | null; createdAt?: string; updatedAt?: string; } /** Request payload for enabling the Campaigns module for a company. */ interface EnableCampaignCompanyRequest { companyId: string; enabledByUserId?: string | null; } /** Query parameters supported when listing campaign companies. */ interface CampaignCompanyQueryParams { companyId?: string; enabled?: boolean; } /** Paginated envelope used when listing campaign companies. */ interface CampaignCompanyPaginatedResponse { total: number; limit: number; skip: number; data: CampaignCompanyResponse[]; } export type { Campaign, CampaignAccessReason, CampaignAccessResponse, CampaignCompanyPaginatedResponse, CampaignCompanyQueryParams, CampaignCompanyResponse, CampaignContactCampaignStatus, CampaignContactDispatchStatus, CampaignContactFilter, CampaignContactLikeQueryOperators, CampaignContactPaginatedResponse, CampaignContactQueryOperators, CampaignContactQueryParams, CampaignContactQueryValue, CampaignContactResponse, CampaignContactSortDirection, CampaignContactSortParams, CampaignContactsDashboardChannelPerformance, CampaignContactsDashboardData, CampaignContactsDashboardEvolutionItem, CampaignContactsDashboardExactQueryOperators, CampaignContactsDashboardFunnelItem, CampaignContactsDashboardInterval, CampaignContactsDashboardMetrics, CampaignContactsDashboardQueryParams, CampaignContactsDashboardQueryValue, CampaignContactsDashboardRangeQueryOperators, CampaignContactsDashboardStatusDistribution, CampaignContactsDashboardStatusMetrics, CampaignContactsDashboardSummary, CampaignContactsDashboardTopCampaign, CampaignNameLikeQueryOperators, CampaignPaginatedResponse, CampaignProvider, CampaignQueryParams, CampaignRetryConfig, CampaignSchedule, CampaignStatus, CampaignUser, CampaignWorkGroup, CampaignWorkGroupPaginatedResponse, CampaignWorkGroupQueryParams, CreateCampaignContactRequest, CreateCampaignRequest, CreateCampaignWorkGroupRequest, EnableCampaignCompanyRequest, PatchCampaignContactRequest, PatchCampaignRequest, WhatsAppPayload, WhatsAppTemplateComponent };