asyncapi: 3.0.0 info: title: 6sense AI Email Webhooks version: '2' description: >- Outbound webhook events emitted by the 6sense AI Email product (formerly Conversational Email, formerly Saleswhale) to a customer-configured Target URL. PROVENANCE: 6sense does not publish an AsyncAPI document. This one was generated by API Evangelist from the provider's own published webhook reference at https://docs.saleswhale.com/ — the three event names, the envelope, the payload fields, the HMAC-SHA256 query-parameter signature scheme and the retry policy are all taken verbatim from that reference. Nothing here is invented. Field types are inferred from the published example payloads where the reference does not state them explicitly. contact: name: 6sense AI Email Support email: support@saleswhale.com url: https://docs.saleswhale.com/ externalDocs: description: 6sense AI Email API Overview url: https://support.6sense.com/docs/6sense-conversational-email-overview-of-api defaultContentType: application/json servers: customerTarget: host: 'example.com' protocol: https description: >- Customer-configured webhook Target URL, set in AI Email Account Settings. 6sense POSTs to this URL with ?signature=×tamp= appended. channels: webhook: address: / title: Customer webhook Target URL description: The single endpoint all AI Email events are delivered to. servers: - $ref: '#/servers/customerTarget' messages: conversationEnded: $ref: '#/components/messages/ConversationEnded' emailSent: $ref: '#/components/messages/EmailSent' leadMarkedDoNotContact: $ref: '#/components/messages/LeadMarkedDoNotContact' operations: receiveConversationEnded: action: receive channel: $ref: '#/channels/webhook' summary: Conversation reached a terminal state. messages: - $ref: '#/channels/webhook/messages/conversationEnded' receiveEmailSent: action: receive channel: $ref: '#/channels/webhook' summary: The AI email agent sent an email to a lead. messages: - $ref: '#/channels/webhook/messages/emailSent' receiveLeadMarkedDoNotContact: action: receive channel: $ref: '#/channels/webhook' summary: A lead was marked Do Not Contact. messages: - $ref: '#/channels/webhook/messages/leadMarkedDoNotContact' components: messages: ConversationEnded: name: conversation.ended title: Conversation ended summary: >- Triggered whenever a conversation status changes to a terminal status. May fire more than once for the same conversation. contentType: application/json payload: $ref: '#/components/schemas/ConversationEndedPayload' examples: - name: qualified payload: event_name: conversation.ended event_time: '2017-05-19T12:11:03.321+08:00' event_payload: conversation: id: 12513522 started_at: '2018-08-16T06:32:00.000Z' handover_rep: id: 95233 type: sales_rep leads: - id: 32244 email: clara.smith@saleswhale.com is_main: false is_original: true - id: 32552 email: michael.wyke@saleswhale.com is_main: true is_original: false status: qualified enrolment: id: 2214225 status: processed campaign_id: 2245 lead_id: 32244 errors: null conversation_id: 12513522 EmailSent: name: email.sent title: Email sent summary: Triggered whenever an email is sent by the AI email agent. contentType: application/json payload: $ref: '#/components/schemas/EmailSentPayload' examples: - name: outbound payload: event_name: email.sent event_time: '2019-11-08T08:06:22.472+00:00' event_payload: email: cc: [] to: - jeremy@example.com from: david@example.com snippet: Hi Jeremy, would your company be interested in a great product? subject: Are you interested, Jeremy? created_at: '2019-11-08T08:03:37.000Z' conversation_id: 12513522 LeadMarkedDoNotContact: name: lead.marked_do_not_contact title: Lead marked Do Not Contact summary: >- Triggered whenever a lead is marked Do Not Contact. This cannot be reverted; treat as an authoritative suppression signal. contentType: application/json payload: $ref: '#/components/schemas/LeadMarkedDoNotContactPayload' schemas: Envelope: type: object required: - event_name - event_time - event_payload properties: event_name: type: string description: Name of the event that triggers the webhook request. event_time: type: string format: date-time description: Timestamp of when the webhook is triggered. event_payload: type: object ConversationEndedPayload: allOf: - $ref: '#/components/schemas/Envelope' - type: object properties: event_name: const: conversation.ended event_payload: type: object properties: conversation: $ref: '#/components/schemas/Conversation' EmailSentPayload: allOf: - $ref: '#/components/schemas/Envelope' - type: object properties: event_name: const: email.sent event_payload: type: object properties: email: $ref: '#/components/schemas/Email' LeadMarkedDoNotContactPayload: allOf: - $ref: '#/components/schemas/Envelope' - type: object properties: event_name: const: lead.marked_do_not_contact event_payload: type: object properties: lead: $ref: '#/components/schemas/Lead' Conversation: type: object description: >- The conversation that reached a terminal state. Retrieve full detail with the Show a Conversation endpoint using id. properties: id: type: integer started_at: type: string format: date-time handover_rep: $ref: '#/components/schemas/ActorRef' leads: type: array description: >- Usually one lead. Multiple when the lead referred a colleague or CCed others; all leads in a conversation share the conversation status. items: $ref: '#/components/schemas/ConversationLead' status: type: string description: Conversation status at the moment the webhook fired. enum: - bounced - human_review - not_interested - qualified - stopped_responding - unresponsive - cancelled enrolment: $ref: '#/components/schemas/Enrolment' ConversationLead: type: object properties: id: type: integer email: type: string format: email is_main: type: boolean description: >- True for the 'To' recipient — assumed to be the last person who replied to the AI email agent. is_original: type: boolean description: True for the lead the conversation was first started on. Enrolment: type: object properties: id: type: integer status: type: string campaign_id: type: integer lead_id: type: integer errors: type: - string - 'null' conversation_id: type: integer ActorRef: type: object properties: id: type: integer type: type: string examples: - sales_rep Email: type: object properties: to: type: array items: type: string format: email cc: type: array items: type: string format: email from: type: string format: email snippet: type: string maxLength: 117 description: Short summary of the email body, truncated to a maximum of 117 characters. subject: type: string created_at: type: string format: date-time conversation_id: type: integer Lead: type: object properties: id: type: integer email: type: string format: email first_name: type: string last_name: type: string job_title: type: - string - 'null' follow_up_at: type: - string - 'null' account_name: type: - string - 'null' lead_owner: $ref: '#/components/schemas/ActorRef' do_not_contact: type: boolean custom_attribute_values: type: array items: $ref: '#/components/schemas/CustomAttributeValue' CustomAttributeValue: type: object properties: custom_attribute_id: type: integer value: type: string custom_attribute_name: type: string securitySchemes: webhookSignature: type: httpApiKey name: signature in: query description: >- SHA256 HMAC hexdigest over ".", keyed with the account's AI Email API key, delivered as a query parameter alongside a timestamp parameter. Compare in constant time and enforce your own timestamp tolerance to reject replays. x-provenance: generated: '2026-08-13' method: generated generated_by: API Evangelist enrichment pipeline derived_from: https://docs.saleswhale.com/ catalog: asyncapi/6sense-ai-email-webhooks.yml provider_published: false