UNPKG

@warriorteam/redai-zalo-sdk

Version:

Comprehensive TypeScript/JavaScript SDK for Zalo APIs - Official Account, ZNS, Consultation Service, Group Messaging, and Social APIs

1,791 lines 57.9 kB
/** * Types for Zalo Webhook Events * Based on Zalo Official Account Webhook API */ /** * Base webhook event structure */ export interface BaseWebhookEvent { /** Application ID */ app_id: string; /** User ID for Social API */ user_id_by_app: string; /** Event name */ event_name: string; /** Event timestamp */ timestamp: string; } /** * Webhook sender information */ export interface WebhookSender { /** Sender ID */ id: string; } /** * Webhook recipient information */ export interface WebhookRecipient { /** Recipient ID */ id: string; } /** * Webhook follower information (for follow events) */ export interface WebhookFollower { /** Follower ID */ id: string; } /** * Webhook customer information (for shop events) */ export interface WebhookCustomer { /** Customer ID */ id: string; } /** * User submitted information */ export interface UserSubmittedInfo { /** User address */ address?: string; /** User phone number */ phone?: string; /** User city */ city?: string; /** User district */ district?: string; /** User name */ name?: string; /** User ward */ ward?: string; } /** * Webhook user information (for click events) */ export interface WebhookUser { /** User ID */ id?: string; } /** * Message with reaction */ export interface ReactionMessage { /** Message ID */ msg_id: string; /** Reaction icon */ react_icon: string; } /** * Anonymous message with conversation ID */ export interface AnonymousMessage extends WebhookBaseMessage { /** Conversation ID for anonymous chat */ conversation_id: string; } /** * Call information for call events */ export interface CallInfo { /** Call ID */ call_id: string; /** Call type (AUDIO, VIDEO) */ call_type: string; /** Call initialization time */ init_time: string; /** Total call duration in milliseconds */ call_duration: string; /** Waiting time before call answered */ waiting_time: string; /** Actual talk time */ talk_time: string; /** Call status code */ status_code: string; /** Phone number */ phone?: string; } /** * Template message payload */ export interface TemplatePayload { /** Template checksum */ checksum: string; /** Template link URL */ link_url: string; /** Zalo instant ID */ zinstant_id: string; /** Template text content */ text: string; } /** * Template message source */ export interface TemplateSource { /** Service name */ service: string; /** Application ID */ app_id: string; } /** * Template message */ export interface TemplateMessage { /** Client message ID */ client_msg_id: string; /** Template payload */ payload: TemplatePayload; /** Message source */ source: TemplateSource; /** Message ID */ msg_id: string; /** Is reply flag */ is_reply: boolean; } /** * Business card payload */ export interface BusinessCardPayload { /** Business card thumbnail */ thumbnail: string; /** Business card description (JSON string) */ description: string; /** Business card URL */ url: string; } /** * Business card message */ export interface BusinessCardMessage extends WebhookBaseMessage { /** Client message ID */ client_msg_id: string; /** Business card attachments */ attachments: Array<MessageAttachment & { type: "link"; payload: BusinessCardPayload; }>; } /** * User feedback message */ export interface FeedbackMessage { /** Feedback note */ note: string; /** Rating score */ rate: number; /** Submit time */ submit_time: string; /** Feedback options */ feedbacks: string[]; /** Message ID */ msg_id: string; /** Tracking ID */ tracking_id: string; } /** * Quota change information */ export interface QuotaChange { /** Previous quota value */ prev_value: number; /** New quota value */ new_value: number; } /** * Tag level change information */ export interface TagLevelChange { /** Previous tag level */ prev_value: number; /** New tag level */ new_value: number; } /** * ZNS delivery message */ export interface ZNSDeliveryMessage { /** Delivery time */ delivery_time: string; /** Message ID */ msg_id: string; /** Tracking ID */ tracking_id: string; } /** * Group information */ export interface GroupInfo { /** Group ID */ group_id: string; /** Official Account ID */ oa_id: string; /** Application ID */ app_id: string; /** User list (for group events) */ users?: string[]; } /** * Widget interaction data */ export interface WidgetInteractionData { /** User ID by OA */ user_id_by_oa: string; /** User external ID */ user_external_id: string; /** Widget URL */ url: string; } /** * Widget sync failure data */ export interface WidgetSyncFailureData { /** Error message */ message: string; /** User ID by OA */ user_id_by_oa: string; /** User external ID */ user_external_id: string; } /** * Template status change */ export interface TemplateStatusChange { /** Previous status */ prev_status: string; /** New status */ new_status: string; } /** * Permission revoked data */ export interface PermissionRevokedData { /** Action performed by (APP or OA) */ action_by: string; /** Revoked timestamp */ revoked_at: string; } /** * Extension subscription info */ export interface ExtensionSubscriptionInfo { /** Valid through date */ valid_through_date: string; /** Duration in months */ duration_month: string; /** Valid start date */ valid_start_date: string; } /** * Update user info data */ export interface UpdateUserInfoData { /** Update method */ method: string; } /** * Anonymous message with attachments and conversation ID */ export interface AnonymousMessageWithAttachments extends WebhookMessageWithAttachments { /** Conversation ID for anonymous chat */ conversation_id: string; } /** * Location coordinates */ export interface LocationCoordinates { /** Latitude */ latitude: string; /** Longitude */ longitude: string; } /** * Location attachment payload */ export interface LocationPayload { /** Location coordinates */ coordinates: LocationCoordinates; } /** * Image attachment payload */ export interface ImagePayload { /** Thumbnail URL */ thumbnail: string; /** Full image URL */ url: string; } /** * Link attachment payload */ export interface LinkPayload { /** Link thumbnail URL */ thumbnail: string; /** Link description */ description: string; /** Link URL */ url: string; } /** * Sticker attachment payload */ export interface StickerPayload { /** Sticker ID */ id: string; /** Sticker URL */ url: string; } /** * GIF attachment payload */ export interface GifPayload { /** GIF thumbnail URL */ thumbnail: string; /** GIF URL */ url: string; } /** * Audio attachment payload */ export interface AudioPayload { /** Audio file URL */ url: string; } /** * Video attachment payload */ export interface VideoPayload { /** Video thumbnail URL */ thumbnail: string; /** Video description */ description: string; /** Video file URL */ url: string; } /** * File attachment payload */ export interface FilePayload { /** File download URL */ url: string; /** File size in bytes */ size: string; /** File name */ name: string; /** File checksum */ checksum: string; /** File type/MIME type */ type: string; } /** * Enhanced link payload for OA list messages */ export interface EnhancedLinkPayload extends LinkPayload { /** Link title */ title: string; } /** * Union type for all attachment payloads */ export type AttachmentPayload = LocationPayload | ImagePayload | LinkPayload | StickerPayload | GifPayload | AudioPayload | VideoPayload | FilePayload | EnhancedLinkPayload; /** * Message attachment */ export interface MessageAttachment { /** Attachment payload */ payload: AttachmentPayload; /** Attachment type */ type: "location" | "image" | "link" | "sticker" | "gif" | "audio" | "video" | "file"; } /** * Base webhook message structure */ export interface WebhookBaseMessage { /** Message ID */ msg_id: string; /** Quoted message ID when the message is a reply */ quote_msg_id?: string; /** Message text content */ text?: string; } /** * Webhook message with attachments */ export interface WebhookMessageWithAttachments extends WebhookBaseMessage { /** Message attachments */ attachments: MessageAttachment[]; } /** * Message for seen event (contains multiple message IDs) */ export interface SeenMessage { /** Array of message IDs that were seen */ msg_ids: string[]; } /** * User follows Official Account event */ export interface UserFollowEvent extends BaseWebhookEvent { event_name: "follow"; /** Official Account ID */ oa_id: string; /** Event source */ source: string; /** Follower information */ follower: WebhookFollower; } /** * User unfollows Official Account event */ export interface UserUnfollowEvent extends BaseWebhookEvent { event_name: "unfollow"; /** Official Account ID */ oa_id: string; /** Event source */ source: string; /** Follower information */ follower: WebhookFollower; } /** * Shop has order event */ export interface ShopHasOrderEvent extends BaseWebhookEvent { event_name: "shop_has_order"; /** Official Account ID */ oa_id: string; /** Customer information */ customer: WebhookCustomer; } /** * Add user to tag event */ export interface AddUserToTagEvent extends BaseWebhookEvent { event_name: "add_user_to_tag"; /** Official Account ID */ oa_id: string; } /** * OA sends text message event */ export interface OASendTextEvent extends BaseWebhookEvent { event_name: "oa_send_text"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookBaseMessage; } /** * OA sends image message event */ export interface OASendImageEvent extends BaseWebhookEvent { event_name: "oa_send_image"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "image"; payload: ImagePayload; }>; }; } /** * OA sends GIF message event */ export interface OASendGifEvent extends BaseWebhookEvent { event_name: "oa_send_gif"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "gif"; payload: GifPayload; }>; }; } /** * OA sends list message event (interactive message with multiple links) */ export interface OASendListEvent extends BaseWebhookEvent { event_name: "oa_send_list"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "link"; payload: EnhancedLinkPayload; }>; }; } /** * OA sends file message event */ export interface OASendFileEvent extends BaseWebhookEvent { event_name: "oa_send_file"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "file"; payload: FilePayload; }>; }; } /** * OA sends sticker message event */ export interface OASendStickerEvent extends BaseWebhookEvent { event_name: "oa_send_sticker"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "sticker"; payload: StickerPayload; }>; }; } /** * User clicks "Chat Now" button event */ export interface UserClickChatNowEvent extends BaseWebhookEvent { event_name: "user_click_chatnow"; /** Official Account ID */ oa_id: string; /** User ID (for OA API) */ user_id: string; } /** * User reacts to message event */ export interface UserReactedMessageEvent extends BaseWebhookEvent { event_name: "user_reacted_message"; sender: WebhookSender; recipient: WebhookRecipient; message: ReactionMessage; } /** * OA reacts to message event */ export interface OAReactedMessageEvent extends BaseWebhookEvent { event_name: "oa_reacted_message"; sender: WebhookSender; recipient: WebhookRecipient; message: ReactionMessage; } /** * OA sends consent request event */ export interface OASendConsentEvent extends BaseWebhookEvent { event_name: "oa_send_consent"; /** Official Account ID */ oa_id: string; /** Request type */ request_type: string; /** Create time */ create_time: string; /** Expired time */ expired_time: string; /** Phone number */ phone: string; } /** * User replies to consent request event */ export interface UserReplyConsentEvent extends BaseWebhookEvent { event_name: "user_reply_consent"; /** Official Account ID */ oa_id: string; /** Expired time */ expired_time: string; /** Confirmed time */ confirmed_time: string; /** Phone number */ phone: string; } /** * Anonymous user sends text message event */ export interface AnonymousSendTextEvent extends BaseWebhookEvent { event_name: "anonymous_send_text"; sender: WebhookSender; recipient: WebhookRecipient; message: AnonymousMessage; } /** * Anonymous user sends image message event */ export interface AnonymousSendImageEvent extends BaseWebhookEvent { event_name: "anonymous_send_image"; sender: WebhookSender; recipient: WebhookRecipient; message: AnonymousMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "image"; payload: ImagePayload; }>; }; } /** * Anonymous user sends file message event */ export interface AnonymousSendFileEvent extends BaseWebhookEvent { event_name: "anonymous_send_file"; sender: WebhookSender; recipient: WebhookRecipient; message: AnonymousMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "file"; payload: FilePayload; }>; }; } /** * Anonymous user sends sticker message event */ export interface AnonymousSendStickerEvent extends BaseWebhookEvent { event_name: "anonymous_send_sticker"; sender: WebhookSender; recipient: WebhookRecipient; message: AnonymousMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "sticker"; payload: StickerPayload; }>; }; } /** * OA sends anonymous text message event */ export interface OASendAnonymousTextEvent extends BaseWebhookEvent { event_name: "oa_send_anonymous_text"; sender: WebhookSender; recipient: WebhookRecipient; message: AnonymousMessage; } /** * OA sends anonymous image message event */ export interface OASendAnonymousImageEvent extends BaseWebhookEvent { event_name: "oa_send_anonymous_image"; sender: WebhookSender; recipient: WebhookRecipient; message: AnonymousMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "image"; payload: ImagePayload; }>; }; } /** * OA sends anonymous file message event */ export interface OASendAnonymousFileEvent extends BaseWebhookEvent { event_name: "oa_send_anonymous_file"; sender: WebhookSender; recipient: WebhookRecipient; message: AnonymousMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "file"; payload: FilePayload; }>; }; } /** * OA sends anonymous sticker message event */ export interface OASendAnonymousStickerEvent extends BaseWebhookEvent { event_name: "oa_send_anonymous_sticker"; sender: WebhookSender; recipient: WebhookRecipient; message: AnonymousMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "sticker"; payload: StickerPayload; }>; }; } /** * OA call user event */ export interface OACallUserEvent extends BaseWebhookEvent { event_name: "oa_call_user"; /** Official Account ID */ oa_id: string; /** Call information */ call_id: string; call_type: string; init_time: string; call_duration: string; waiting_time: string; talk_time: string; status_code: string; phone: string; } /** * User call OA event */ export interface UserCallOAEvent extends BaseWebhookEvent { event_name: "user_call_oa"; /** Official Account ID */ oa_id: string; /** User ID (for OA API) */ user_id: string; /** Call information */ call_id: string; call_type: string; init_time: string; call_duration: string; waiting_time: string; talk_time: string; status_code: string; } /** * OA sends template message event */ export interface OASendTemplateEvent extends BaseWebhookEvent { event_name: "oa_send_template"; sender: WebhookSender; recipient: WebhookRecipient; message: TemplateMessage; } /** * User sends business card event */ export interface UserSendBusinessCardEvent extends BaseWebhookEvent { event_name: "user_send_business_card"; sender: WebhookSender; recipient: WebhookRecipient; message: BusinessCardMessage; } /** * User feedback event */ export interface UserFeedbackEvent extends BaseWebhookEvent { event_name: "user_feedback"; message: FeedbackMessage; } /** * Change OA daily quota event */ export interface ChangeOADailyQuotaEvent extends BaseWebhookEvent { event_name: "change_oa_daily_quota"; /** Official Account ID */ oa_id: string; /** Quota change information */ quota: QuotaChange; } /** * Change OA template tags event */ export interface ChangeOATemplateTagsEvent extends BaseWebhookEvent { event_name: "change_oa_template_tags"; /** Official Account ID */ oa_id: string; /** Tag level change information */ tag_level: TagLevelChange; } /** * Change template quality event */ export interface ChangeTemplateQualityEvent extends BaseWebhookEvent { event_name: "change_template_quality"; /** Official Account ID */ oa_id: string; /** Template ID */ template_id: string; /** Template quality */ quality: string; } /** * Change template quota event */ export interface ChangeTemplateQuotaEvent extends BaseWebhookEvent { event_name: "change_template_quota"; /** Official Account ID */ oa_id: string; /** Template ID */ template_id: string; /** Quota change information */ quota: QuotaChange; } /** * Journey timeout event */ export interface JourneyTimeoutEvent extends BaseWebhookEvent { event_name: "event_journey_time_out"; /** Official Account ID */ oa_id: string; /** Journey ID */ journey_id: string; /** Application ID */ app_id: string; } /** * Journey acknowledged event */ export interface JourneyAcknowledgedEvent extends BaseWebhookEvent { event_name: "event_journey_acknowledged"; /** Official Account ID */ oa_id: string; /** Journey ID */ journey_id: string; /** Message ID */ msg_id: string; /** Application ID */ app_id: string; } /** * ZNS user received message event */ export interface ZNSUserReceivedMessageEvent extends BaseWebhookEvent { event_name: "user_received_message"; /** Application ID */ app_id: string; /** ZNS delivery message */ message: ZNSDeliveryMessage; } /** * Create group event */ export interface CreateGroupEvent extends BaseWebhookEvent { event_name: "create_group"; /** Official Account ID */ oa_id: string; /** Group ID */ group_id: string; /** Application ID */ app_id: string; } /** * User join group event */ export interface UserJoinGroupEvent extends BaseWebhookEvent { event_name: "user_join_group"; /** Official Account ID */ oa_id: string; /** Group ID */ group_id: string; /** Application ID */ app_id: string; /** User list */ users: string[]; } /** * User request join group event */ export interface UserRequestJoinGroupEvent extends BaseWebhookEvent { event_name: "user_request_join_group"; /** Official Account ID */ oa_id: string; /** Group ID */ group_id: string; /** Application ID */ app_id: string; /** User list */ users: string[]; } /** * React request join group event */ export interface ReactRequestJoinGroupEvent extends BaseWebhookEvent { event_name: "react_request_join_group"; /** Official Account ID */ oa_id: string; /** Group ID */ group_id: string; /** Application ID */ app_id: string; /** User list */ users: string[]; } /** * Reject request join group event */ export interface RejectRequestJoinGroupEvent extends BaseWebhookEvent { event_name: "reject_request_join_group"; /** Official Account ID */ oa_id: string; /** Group ID */ group_id: string; /** Application ID */ app_id: string; /** User list */ users: string[]; } /** * Add group admin event */ export interface AddGroupAdminEvent extends BaseWebhookEvent { event_name: "add_group_admin"; /** Official Account ID */ oa_id: string; /** Group ID */ group_id: string; /** Application ID */ app_id: string; /** User list */ users: string[]; } /** * Remove group admin event */ export interface RemoveGroupAdminEvent extends BaseWebhookEvent { event_name: "remove_group_admin"; /** Official Account ID */ oa_id: string; /** Group ID */ group_id: string; /** Application ID */ app_id: string; /** User list */ users: string[]; } /** * Update group info event */ export interface UpdateGroupInfoEvent extends BaseWebhookEvent { event_name: "update_group_info"; /** Official Account ID */ oa_id: string; /** Group ID */ group_id: string; /** Application ID */ app_id: string; } /** * User out group event */ export interface UserOutGroupEvent extends BaseWebhookEvent { event_name: "user_out_group"; /** Official Account ID */ oa_id: string; /** Group ID */ group_id: string; /** Application ID */ app_id: string; /** User list */ users: string[]; } /** * OA send group text event */ export interface OASendGroupTextEvent extends BaseWebhookEvent { event_name: "oa_send_group_text"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookBaseMessage; } /** * OA send group image event */ export interface OASendGroupImageEvent extends BaseWebhookEvent { event_name: "oa_send_group_image"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "image"; payload: ImagePayload; }>; }; } /** * OA send group link event */ export interface OASendGroupLinkEvent extends BaseWebhookEvent { event_name: "oa_send_group_link"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "link"; payload: LinkPayload; }>; }; } /** * OA send group audio event */ export interface OASendGroupAudioEvent extends BaseWebhookEvent { event_name: "oa_send_group_audio"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "audio"; payload: AudioPayload; }>; }; } /** * OA send group location event */ export interface OASendGroupLocationEvent extends BaseWebhookEvent { event_name: "oa_send_group_location"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "location"; payload: LocationPayload; }>; }; } /** * OA send group video event */ export interface OASendGroupVideoEvent extends BaseWebhookEvent { event_name: "oa_send_group_video"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "video"; payload: VideoPayload; }>; }; } /** * OA send group business card event */ export interface OASendGroupBusinessCardEvent extends BaseWebhookEvent { event_name: "oa_send_group_business_card"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: BusinessCardMessage; } /** * OA send group sticker event */ export interface OASendGroupStickerEvent extends BaseWebhookEvent { event_name: "oa_send_group_sticker"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "sticker"; payload: StickerPayload; }>; }; } /** * OA send group GIF event */ export interface OASendGroupGifEvent extends BaseWebhookEvent { event_name: "oa_send_group_gif"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "gif"; payload: GifPayload; }>; }; } /** * OA send group file event */ export interface OASendGroupFileEvent extends BaseWebhookEvent { event_name: "oa_send_group_file"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "file"; payload: FilePayload; }>; }; } /** * User send group text event */ export interface UserSendGroupTextEvent extends BaseWebhookEvent { event_name: "user_send_group_text"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookBaseMessage; } /** * User send group link event */ export interface UserSendGroupLinkEvent extends BaseWebhookEvent { event_name: "user_send_group_link"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "link"; payload: LinkPayload; }>; }; } /** * User send group audio event */ export interface UserSendGroupAudioEvent extends BaseWebhookEvent { event_name: "user_send_group_audio"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "audio"; payload: AudioPayload; }>; }; } /** * User send group location event */ export interface UserSendGroupLocationEvent extends BaseWebhookEvent { event_name: "user_send_group_location"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "location"; payload: LocationPayload; }>; }; } /** * User send group video event */ export interface UserSendGroupVideoEvent extends BaseWebhookEvent { event_name: "user_send_group_video"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "video"; payload: VideoPayload; }>; }; } /** * User send group business card event */ export interface UserSendGroupBusinessCardEvent extends BaseWebhookEvent { event_name: "user_send_group_business_card"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: BusinessCardMessage; } /** * User send group sticker event */ export interface UserSendGroupStickerEvent extends BaseWebhookEvent { event_name: "user_send_group_sticker"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "sticker"; payload: StickerPayload; }>; }; } /** * User send group GIF event */ export interface UserSendGroupGifEvent extends BaseWebhookEvent { event_name: "user_send_group_gif"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "gif"; payload: GifPayload; }>; }; } /** * User send group file event */ export interface UserSendGroupFileEvent extends BaseWebhookEvent { event_name: "user_send_group_file"; /** Official Account ID */ oa_id: string; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "file"; payload: FilePayload; }>; }; } /** * Widget interaction accepted event */ export interface WidgetInteractionAcceptedEvent extends BaseWebhookEvent { event_name: "widget_interaction_accepted"; /** Official Account ID */ oa_id: string; /** Widget interaction data */ data: WidgetInteractionData; } /** * Widget failed to sync user external ID event */ export interface WidgetFailedToSyncUserExternalIdEvent extends BaseWebhookEvent { event_name: "widget_failed_to_sync_user_external_id"; /** Official Account ID */ oa_id: string; /** Widget sync failure data */ data: WidgetSyncFailureData; } /** * Change template status event */ export interface ChangeTemplateStatusEvent extends BaseWebhookEvent { event_name: "change_template_status"; /** Official Account ID */ oa_id: string; /** Template ID */ template_id: string; /** Status change information */ status: TemplateStatusChange; /** Reason for status change */ reason: string; /** Application ID */ app_id: string; } /** * Permission revoked event */ export interface PermissionRevokedEvent extends BaseWebhookEvent { event_name: "permission_revoked"; /** Official Account ID */ oa_id: string; /** Permission revoked data */ data: PermissionRevokedData; /** Application ID */ app_id: string; } /** * Extension purchased event */ export interface ExtensionPurchasedEvent extends BaseWebhookEvent { event_name: "extension_purchased"; /** Extension ID */ extension_id: string; /** Official Account ID */ oa_id: string; /** Extension subscription info */ extension_sub_info: ExtensionSubscriptionInfo; } /** * Update user info event */ export interface UpdateUserInfoEvent extends BaseWebhookEvent { event_name: "update_user_info"; /** Official Account ID */ oa_id: string; /** User ID (for OA API) */ user_id: string; /** Update user info data */ data: UpdateUserInfoData; /** Application ID */ app_id: string; } /** * User sends location event */ export interface UserSendLocationEvent extends BaseWebhookEvent { event_name: "user_send_location"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "location"; payload: LocationPayload; }>; }; } /** * User sends image event */ export interface UserSendImageEvent extends BaseWebhookEvent { event_name: "user_send_image"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "image"; payload: ImagePayload; }>; }; } /** * User sends link event */ export interface UserSendLinkEvent extends BaseWebhookEvent { event_name: "user_send_link"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "link"; payload: LinkPayload; }>; }; } /** * User sends text event */ export interface UserSendTextEvent extends BaseWebhookEvent { event_name: "user_send_text"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookBaseMessage; } /** * User sends sticker event */ export interface UserSendStickerEvent extends BaseWebhookEvent { event_name: "user_send_sticker"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "sticker"; payload: StickerPayload; }>; }; } /** * User sends GIF event */ export interface UserSendGifEvent extends BaseWebhookEvent { event_name: "user_send_gif"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "gif"; payload: GifPayload; }>; }; } /** * User sends audio event */ export interface UserSendAudioEvent extends BaseWebhookEvent { event_name: "user_send_audio"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "audio"; payload: AudioPayload; }>; }; } /** * User received message event */ export interface UserReceivedMessageEvent extends BaseWebhookEvent { event_name: "user_received_message"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookBaseMessage; } /** * User seen message event */ export interface UserSeenMessageEvent extends BaseWebhookEvent { event_name: "user_seen_message"; sender: WebhookSender; recipient: WebhookRecipient; message: SeenMessage; } /** * User sends video event */ export interface UserSendVideoEvent extends BaseWebhookEvent { event_name: "user_send_video"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "video"; payload: VideoPayload; }>; }; } /** * User sends file event */ export interface UserSendFileEvent extends BaseWebhookEvent { event_name: "user_send_file"; sender: WebhookSender; recipient: WebhookRecipient; message: WebhookMessageWithAttachments & { attachments: Array<MessageAttachment & { type: "file"; payload: FilePayload; }>; }; } /** * User submit info event */ export interface UserSubmitInfoEvent extends BaseWebhookEvent { event_name: "user_submit_info"; sender: { id: string; }; recipient: { id: string; }; info: { name?: string; phone?: string; email?: string; address?: string; city?: string; district?: string; ward?: string; date_of_birth?: string; }; } /** * User click button event */ export interface UserClickButtonEvent extends BaseWebhookEvent { event_name: "user_click_chatnow" | "user_click_button"; sender: { id: string; }; recipient: { id: string; }; button?: { title: string; payload: string; }; } /** * OA send message event */ export interface OASendMessageEvent extends BaseWebhookEvent { event_name: "oa_send_text" | "oa_send_image" | "oa_send_file" | "oa_send_sticker" | "oa_send_gif" | "oa_send_audio" | "oa_send_video" | "oa_send_list"; sender: { id: string; }; recipient: { id: string; }; message: { text?: string; msg_id: string; /** Quoted message ID when the message is a reply */ quote_msg_id?: string; attachments?: Array<{ type: string; payload: { url?: string; title?: string; description?: string; }; }>; }; } /** * Anonymous user send message event */ export interface AnonymousUserSendMessageEvent extends BaseWebhookEvent { event_name: "anonymous_send_text" | "anonymous_send_image" | "anonymous_send_sticker" | "anonymous_send_file"; sender: { id: string; }; recipient: { id: string; }; message: { text?: string; msg_id: string; /** Quoted message ID when the message is a reply */ quote_msg_id?: string; attachments?: Array<{ type: string; payload: { url?: string; }; }>; }; } /** * ZNS message status event */ export interface ZNSMessageStatusEvent extends BaseWebhookEvent { event_name: "zns_message_status"; message_id: string; phone: string; status: "sent" | "delivered" | "read" | "failed"; error_code?: number; error_message?: string; timestamp: string; } /** * Template status event */ export interface TemplateStatusEvent extends BaseWebhookEvent { event_name: "template_status_update"; template_id: string; template_name: string; status: "ENABLE" | "PENDING_REVIEW" | "REJECT" | "DISABLE" | "DELETE"; reason?: string; quality?: "HIGH" | "MEDIUM" | "LOW" | "UNDEFINED"; } /** * Group message events */ export interface GroupUserJoinEvent extends BaseWebhookEvent { event_name: "group_user_join"; group_id: string; user: { id: string; name: string; }; } export interface GroupUserLeaveEvent extends BaseWebhookEvent { event_name: "group_user_leave"; group_id: string; user: { id: string; name: string; }; } export interface GroupSendMessageEvent extends BaseWebhookEvent { event_name: "group_send_text" | "group_send_image" | "group_send_sticker" | "group_send_file"; group_id: string; sender: { id: string; name: string; }; message: { text?: string; msg_id: string; /** Quoted message ID when the message is a reply */ quote_msg_id?: string; attachments?: Array<{ type: string; payload: { url?: string; }; }>; }; } /** * All user message-related webhook events */ export type UserMessageWebhookEvent = UserSendLocationEvent | UserSendImageEvent | UserSendLinkEvent | UserSendTextEvent | UserSendStickerEvent | UserSendGifEvent | UserSendAudioEvent | UserSendVideoEvent | UserSendFileEvent | UserReceivedMessageEvent | UserSeenMessageEvent; /** * All OA message-related webhook events */ export type OAMessageWebhookEvent = OASendTextEvent | OASendImageEvent | OASendGifEvent | OASendListEvent | OASendFileEvent | OASendStickerEvent | OASendAnonymousTextEvent | OASendAnonymousImageEvent | OASendAnonymousFileEvent | OASendAnonymousStickerEvent | OASendTemplateEvent; /** * All message-related webhook events */ export type MessageWebhookEvent = UserMessageWebhookEvent | OAMessageWebhookEvent; /** * All user action webhook events */ export type UserActionWebhookEvent = UserFollowEvent | UserUnfollowEvent | UserSubmitInfoEvent | UserClickChatNowEvent | UserReactedMessageEvent | UserReplyConsentEvent | UserSendBusinessCardEvent | UserFeedbackEvent; /** * All shop/business webhook events */ export type ShopWebhookEvent = ShopHasOrderEvent; /** * All call-related webhook events */ export type CallWebhookEvent = OACallUserEvent | UserCallOAEvent; /** * All ZNS-related webhook events */ export type ZNSWebhookEvent = ChangeOADailyQuotaEvent | ChangeOATemplateTagsEvent | ChangeTemplateQualityEvent | ChangeTemplateQuotaEvent | JourneyTimeoutEvent | JourneyAcknowledgedEvent | ZNSUserReceivedMessageEvent | ChangeTemplateStatusEvent; /** * All widget-related webhook events */ export type WidgetWebhookEvent = WidgetInteractionAcceptedEvent | WidgetFailedToSyncUserExternalIdEvent; /** * All group-related webhook events */ export type GroupWebhookEvent = CreateGroupEvent | UserJoinGroupEvent | UserRequestJoinGroupEvent | ReactRequestJoinGroupEvent | RejectRequestJoinGroupEvent | AddGroupAdminEvent | RemoveGroupAdminEvent | UpdateGroupInfoEvent | UserOutGroupEvent | OASendGroupTextEvent | OASendGroupImageEvent | OASendGroupLinkEvent | OASendGroupAudioEvent | OASendGroupLocationEvent | OASendGroupVideoEvent | OASendGroupBusinessCardEvent | OASendGroupStickerEvent | OASendGroupGifEvent | OASendGroupFileEvent | UserSendGroupTextEvent | UserSendGroupLinkEvent | UserSendGroupAudioEvent | UserSendGroupLocationEvent | UserSendGroupVideoEvent | UserSendGroupBusinessCardEvent | UserSendGroupStickerEvent | UserSendGroupGifEvent | UserSendGroupFileEvent; /** * All system/admin webhook events */ export type SystemWebhookEvent = AddUserToTagEvent | OAReactedMessageEvent | OASendConsentEvent | PermissionRevokedEvent | ExtensionPurchasedEvent | UpdateUserInfoEvent; /** * All anonymous user webhook events */ export type AnonymousWebhookEvent = AnonymousSendTextEvent | AnonymousSendImageEvent | AnonymousSendFileEvent | AnonymousSendStickerEvent; /** * Legacy webhook events (keeping for backward compatibility) */ export type LegacyWebhookEvent = UserSubmitInfoEvent | UserClickButtonEvent | OASendMessageEvent | AnonymousUserSendMessageEvent | ZNSMessageStatusEvent | TemplateStatusEvent | GroupUserJoinEvent | GroupUserLeaveEvent | GroupSendMessageEvent; /** * All webhook events union type */ export type WebhookEvent = MessageWebhookEvent | UserActionWebhookEvent | ShopWebhookEvent | SystemWebhookEvent | AnonymousWebhookEvent | CallWebhookEvent | ZNSWebhookEvent | GroupWebhookEvent | WidgetWebhookEvent | LegacyWebhookEvent; /** * Webhook payload wrapper */ export interface WebhookPayload { /** * Event data */ data: WebhookEvent; /** * Event signature for verification */ signature?: string; } /** * Webhook verification result */ export interface WebhookVerification { /** * Whether the webhook is valid */ valid: boolean; /** * Error message if invalid */ error?: string; } /** * Webhook handler function type */ export type WebhookHandler<T extends WebhookEvent = WebhookEvent> = (event: T) => Promise<void> | void; /** * Webhook event handlers map */ export interface WebhookHandlers { user_send_text?: WebhookHandler<UserSendTextEvent>; user_send_image?: WebhookHandler<UserSendImageEvent>; user_send_location?: WebhookHandler<UserSendLocationEvent>; user_send_link?: WebhookHandler<UserSendLinkEvent>; user_send_sticker?: WebhookHandler<UserSendStickerEvent>; user_send_gif?: WebhookHandler<UserSendGifEvent>; user_send_audio?: WebhookHandler<UserSendAudioEvent>; user_send_video?: WebhookHandler<UserSendVideoEvent>; user_send_file?: WebhookHandler<UserSendFileEvent>; user_received_message?: WebhookHandler<UserReceivedMessageEvent>; user_seen_message?: WebhookHandler<UserSeenMessageEvent>; follow?: WebhookHandler<UserFollowEvent>; unfollow?: WebhookHandler<UserUnfollowEvent>; user_submit_info?: WebhookHandler<UserSubmitInfoEvent>; oa_send_text?: WebhookHandler<OASendTextEvent>; oa_send_image?: WebhookHandler<OASendImageEvent>; oa_send_gif?: WebhookHandler<OASendGifEvent>; oa_send_list?: WebhookHandler<OASendListEvent>; oa_send_file?: WebhookHandler<OASendFileEvent>; oa_send_sticker?: WebhookHandler<OASendStickerEvent>; user_click_chatnow?: WebhookHandler<UserClickChatNowEvent>; user_reacted_message?: WebhookHandler<UserReactedMessageEvent>; user_reply_consent?: WebhookHandler<UserReplyConsentEvent>; oa_reacted_message?: WebhookHandler<OAReactedMessageEvent>; oa_send_consent?: WebhookHandler<OASendConsentEvent>; anonymous_send_text?: WebhookHandler<AnonymousSendTextEvent>; anonymous_send_image?: WebhookHandler<AnonymousSendImageEvent>; anonymous_send_file?: WebhookHandler<AnonymousSendFileEvent>; anonymous_send_sticker?: WebhookHandler<AnonymousSendStickerEvent>; oa_send_anonymous_text?: WebhookHandler<OASendAnonymousTextEvent>; oa_send_anonymous_image?: WebhookHandler<OASendAnonymousImageEvent>; oa_send_anonymous_file?: WebhookHandler<OASendAnonymousFileEvent>; oa_send_anonymous_sticker?: WebhookHandler<OASendAnonymousStickerEvent>; oa_call_user?: WebhookHandler<OACallUserEvent>; user_call_oa?: WebhookHandler<UserCallOAEvent>; oa_send_template?: WebhookHandler<OASendTemplateEvent>; user_send_business_card?: WebhookHandler<UserSendBusinessCardEvent>; user_feedback?: WebhookHandler<UserFeedbackEvent>; change_oa_daily_quota?: WebhookHandler<ChangeOADailyQuotaEvent>; change_oa_template_tags?: WebhookHandler<ChangeOATemplateTagsEvent>; change_template_quality?: WebhookHandler<ChangeTemplateQualityEvent>; change_template_quota?: WebhookHandler<ChangeTemplateQuotaEvent>; change_template_status?: WebhookHandler<ChangeTemplateStatusEvent>; event_journey_time_out?: WebhookHandler<JourneyTimeoutEvent>; event_journey_acknowledged?: WebhookHandler<JourneyAcknowledgedEvent>; zns_user_received_message?: WebhookHandler<ZNSUserReceivedMessageEvent>; create_group?: WebhookHandler<CreateGroupEvent>; user_join_group?: WebhookHandler<UserJoinGroupEvent>; user_request_join_group?: WebhookHandler<UserRequestJoinGroupEvent>; react_request_join_group?: WebhookHandler<ReactRequestJoinGroupEvent>; reject_request_join_group?: WebhookHandler<RejectRequestJoinGroupEvent>; add_group_admin?: WebhookHandler<AddGroupAdminEvent>; remove_group_admin?: WebhookHandler<RemoveGroupAdminEvent>; update_group_info?: WebhookHandler<UpdateGroupInfoEvent>; user_out_group?: WebhookHandler<UserOutGroupEvent>; oa_send_group_text?: WebhookHandler<OASendGroupTextEvent>; oa_send_group_image?: WebhookHandler<OASendGroupImageEvent>; oa_send_group_link?: WebhookHandler<OASendGroupLinkEvent>; oa_send_group_audio?: WebhookHandler<OASendGroupAudioEvent>; oa_send_group_location?: WebhookHandler<OASendGroupLocationEvent>; oa_send_group_video?: WebhookHandler<OASendGroupVideoEvent>; oa_send_group_business_card?: WebhookHandler<OASendGroupBusinessCardEvent>; oa_send_group_sticker?: WebhookHandler<OASendGroupStickerEvent>; oa_send_group_gif?: WebhookHandler<OASendGroupGifEvent>; oa_send_group_file?: WebhookHandler<OASendGroupFileEvent>; user_send_group_text?: WebhookHandler<UserSendGroupTextEvent>; user_send_group_link?: WebhookHandler<UserSendGroupLinkEvent>; user_send_group_audio?: WebhookHandler<UserSendGroupAudioEvent>; user_send_group_location?: WebhookHandler<UserSendGroupLocationEvent>; user_send_group_video?: WebhookHandler<UserSendGroupVideoEvent>; user_send_group_business_card?: WebhookHandler<UserSendGroupBusinessCardEvent>; user_send_group_sticker?: WebhookHandler<UserSendGroupStickerEvent>; user_send_group_gif?: WebhookHandler<UserSendGroupGifEvent>; user_send_group_file?: WebhookHandler<UserSendGroupFileEvent>; widget_interaction_accepted?: WebhookHandler<WidgetInteractionAcceptedEvent>; widget_failed_to_sync_user_external_id?: WebhookHandler<WidgetFailedToSyncUserExternalIdEvent>; permission_revoked?: WebhookHandler<PermissionRevokedEvent>; extension_purchased?: WebhookHandler<ExtensionPurchasedEvent>; update_user_info?: WebhookHandler<UpdateUserInfoEvent>; shop_has_order?: WebhookHandler<ShopHasOrderEvent>; add_user_to_tag?: WebhookHandler<AddUserToTagEvent>; user_click_button?: WebhookHandler<UserClickButtonEvent>; oa_send_audio?: WebhookHandler<OASendMessageEvent>; oa_send_video?: WebhookHandler<OASendMessageEvent>; zns_message_status?: WebhookHandler<ZNSMessageStatusEvent>; template_status_update?: WebhookHandler<TemplateStatusEvent>; group_user_join?: WebhookHandler<GroupUserJoinEvent>; group_user_leave?: WebhookHandler<GroupUserLeaveEvent>; group_send_text?: WebhookHandler<GroupSendMessageEvent>; group_send_image?: WebhookHandler<GroupSendMessageEvent>; group_send_sticker?: WebhookHandler<GroupSendMessageEvent>; group_send_file?: WebhookHandler<GroupSendMessageEvent>; "*"?: WebhookHandler<Webho