Classic LinkedIn

Salesflow’s New Messages Webhook notifies your system whenever an inbox synchronization is performed. This allows you to receive updates when needed and keep your internal messaging system.

Prerequisites

  • You configured a webhook via the Webhooks page in Salesflow. Once set up, the system will send a POST request to your webhook URL when you’re requesting synchronization.

  • Your webhook endpoint is reachable over HTTPS.

  • You verify the secret on every delivery (X-Webhook-Secret).

  • You trigger a sync via:

    • Inbox Sync: POST /conversations/sync — walks from the newest items down to the dates you pass (from-dates) and stops.

    • Specific Conversation Sync: POST /conversations/{id}/sync — walks the entire conversation from newest to the start (no date window).

See: Messaging & Chats → Sync Inbox or Specific Conversation
https://salesflow.apidocumentation.com/documentation/messaging-chats/sync-inbox-or-specific-conversation

How it works (single trigger → streamed webhooks)

You call the sync endpoint once. Our backend then runs a paginated crawl and streams results to your webhook in this order:

Inbox Sync run (newest → down to your dates)

For each inbox page:

  1. Stage A — CONVERSATIONS
    We fetch one page of conversations (with metadata) and send a webhook with
    SyncType: "CONVERSATIONS" containing that page.
    Persist these conversations by ConversationId.

  2. Stage B — MESSAGES (per conversation)
    For each conversation from that page, we fetch messages page-by-page (newest → older) and send one webhook per message page with
    SyncType: "MESSAGES".
    We continue paging messages until we reach the from-dates you provided for this run.

Only after we finish all conversations from the current inbox page do we move to the next inbox page, and repeat (A→B) — until the stop dates are reached.

Specific Conversation Sync run

  • We do only Stage B for the requested conversation: stream MESSAGES pages (newest → older) until the beginning of the thread (full history).

Important: deliveries are asynchronous. A MESSAGES webhook can arrive before its CONVERSATIONS page for the same ConversationId. Design for out-of-order.

You do not need to re-call the sync endpoint to get subsequent pages — the run continues until finished (we’ll indicate completion).

Security & Response

  • Verify X-Webhook-Secret on every request; reject if missing/invalid.

  • Respond quickly: return HTTP 200 OK within a few seconds; process asynchronously.

  • Deliveries are at-least-once; on non-2xx/timeouts we may retry.

General webhook payload example (top level)

{
    "EventType": "NEW_MESSAGE",
    "Payload": {
        "Data": {...},
        "Error": {...},
        "SyncFinished": null
    },
    "LinkedInAccountId": 1234,
    "LinkedInEmail": "linkedin@account.email"
}

/

Property Type Description
EventType string Indicates the type of event — in this case, NEW_MESSAGE.
Payload object Contains the main event data.
Data object | null If present - data with subscription or messages information
Error object | null If present - Sync failed. Also will be present information with data to try resync again
SyncFinished boolean | null If true - sync is finished.
LinkedInAccountId int64 Account Id
LinkedInEmail string Account email

Variant A — SyncType: "CONVERSATIONS" (one inbox page)

Payload.Data:

{
    "SyncType": "CONVERSATIONS",
    "Conversations": {
        "MemberParticipants": [
            {
                "LinkedInMemberId": 111,
                "ProfileId": "AAA",
                "FirstName": "Volodimir",
                "LastName": "Dem",
                "Headline": ".NET Developer",
                "Distance": "DISTANCE_1"
            },
            {
                "LinkedInMemberId": 222,
                "ProfileId": "BBB",
                "FirstName": "Josiane",
                "LastName": "Delport",
                "Headline": "DK Group Development Manager",
                "Distance": "SELF",
                "ProfilePictureUrl": "https://url_to_picture_image",
                "ProfilePictureUrlLarge": "https://url_to_large_picture_image"
            },
            {
                "LinkedInMemberId": 333,
                "ProfileId": "CCC",
                "FirstName": "Franklin",
                "LastName": "Tab",
                "Headline": "Senior Growth Manager @ LinkedIn | Brand Marketing",
                "Distance": "DISTANCE_3",
                "ProfilePictureUrl": "https://url_to_picture_image",
                "ProfilePictureUrlLarge": "https://url_to_large_picture_image"
            },
            {
                "LinkedInMemberId": 444,
                "ProfileId": "DDD",
                "FirstName": "Tiffany",
                "LastName": "Lab",
                "Headline": "Chargé de recrutement / Consultant en recrutement / Acquisition de talents",
                "Distance": "DISTANCE_2",
                "ProfilePictureUrl": "https://url_to_picture_image",
                "ProfilePictureUrlLarge": "https://url_to_large_picture_image"
            },
            {
                "LinkedInMemberId": 555,
                "ProfileId": "EEE",
                "FirstName": "Ilya",
                "LastName": "Chukhn",
                "Headline": "Principal Software Engineer | ex-Google, ex-Huawei",
                "Distance": "DISTANCE_1",
                "ProfilePictureUrl": "https://url_to_picture_image",
                "ProfilePictureUrlLarge": "https://url_to_large_picture_image"
            },
            {
                "LinkedInMemberId": 666,
                "ProfileId": "FFF",
                "FirstName": "Akhyar",
                "LastName": "Ah",
                "Headline": "Procurement Manager | MBA - CIPS",
                "Distance": "DISTANCE_1",
                "ProfilePictureUrl": "https://url_to_picture_image",
                "ProfilePictureUrlLarge": "https://url_to_large_picture_image"
            },
            {
                "LinkedInMemberId": 777,
                "ProfileId": "GGG",
                "FirstName": "saeid",
                "LastName": "kaze",
                "Headline": "Founder & Po at Applymorning",
                "Distance": "DISTANCE_1",
                "ProfilePictureUrl": "https://url_to_picture_image",
                "ProfilePictureUrlLarge": "https://url_to_large_picture_image"
            },
            {
                "LinkedInMemberId": 888,
                "ProfileId": "HHH",
                "FirstName": "Asif Ahmed",
                "LastName": "Barb",
                "Headline": "DevOps/DevSecOps and Cloud Professional (CI/CD | GitOps | Docker | Kubernetes-CKAD| AWS | Azure | Infrastructure as Code | Cloud Security and FinOps | Prometheus )",
                "Distance": "DISTANCE_1",
                "ProfilePictureUrl": "https://url_to_picture_image",
                "ProfilePictureUrlLarge": "https://url_to_large_picture_image"
            },
            {
                "LinkedInMemberId": 999,
                "ProfileId": "III",
                "FirstName": "Muhammed ",
                "LastName": "Has ",
                "Headline": "Senior SAP Sales Manager driving revenue growth and client satisfaction",
                "Distance": "DISTANCE_2",
                "ProfilePictureUrl": "https://url_to_picture_image",
                "ProfilePictureUrlLarge": "https://url_to_large_picture_image"
            }
        ],
        "Conversations": [
            {
                "UnreadCount": 1,
                "CreatedAt": "2025-07-15T09:58:03.613Z",
                "LastReadAt": "2025-07-31T11:57:46.742Z",
                "LastActivityAt": "2025-08-01T08:00:26.586Z",
                "GroupChat": false,
                "Read": false,
                "ConversationId": "CONV-ID-1",
                "IsCreatedByThisAccount": false,
                "Categories": [
                    "INBOX",
                    "PRIMARY_INBOX"
                ],
                "DisabledFeatures": [
                    "UPDATE_MESSAGE_REQUEST_STATE",
                    "ADD_PARTICIPANT",
                    "RENAMED_CONVERSATION",
                    "REMOVE_PARTICIPANT",
                    "CREATE_GROUP_CHAT_LINK"
                ],
                "Participants": [
                    {
                        "MemberProfileId": "HHH"
                    },
                    {
                        "MemberProfileId": "BBB"
                    }
                ]
            },
            {
                "UnreadCount": 0,
                "CreatedAt": "2024-07-22T08:39:43.531Z",
                "LastReadAt": "2025-07-31T14:36:25.686Z",
                "LastActivityAt": "2025-07-31T14:36:16.097Z",
                "GroupChat": false,
                "Read": true,
                "ConversationId": "CONV-ID-2",
                "IsCreatedByThisAccount": false,
                "Categories": [
                    "INBOX",
                    "PRIMARY_INBOX",
                    "INMAIL"
                ],
                "DisabledFeatures": [
                    "UPDATE_MESSAGE_REQUEST_STATE",
                    "REPLY_TO_MESSAGE",
                    "REPLY",
                    "SEND_EXTERNAL_MEDIA_MESSAGE",
                    "REACTIONS",
                    "CREATE_GROUP_CHAT_LINK",
                    "SEND_VOICE_MESSAGE",
                    "DELETE_MESSAGE",
                    "ADD_PARTICIPANT",
                    "EDIT_MESSAGE",
                    "CREATE_NEW_GROUP_CHAT",
                    "RENAMED_CONVERSATION",
                    "CREATE_LINKEDIN_VIRTUAL_MEETING",
                    "DISPLAY_URL_AS_LINK_IN_MESSAGE",
                    "REMOVE_PARTICIPANT",
                    "SEND_VIDEO_MESSAGE"
                ],
                "Participants": [
                    {
                        "MemberProfileId": "GGG"
                    },
                    {
                        "MemberProfileId": "BBB"
                    }
                ]
            },
            {
                "UnreadCount": 0,
                "CreatedAt": "2025-07-31T10:16:18.741Z",
                "LastReadAt": "2025-07-31T10:44:41.352Z",
                "LastActivityAt": "2025-07-31T10:16:18.858Z",
                "GroupChat": false,
                "Read": true,
                "ConversationId": "CONV-ID-3",
                "State": "PENDING",
                "IsCreatedByThisAccount": true,
                "Categories": [
                    "INBOX",
                    "PRIMARY_INBOX",
                    "INMAIL"
                ],
                "DisabledFeatures": [
                    "UPDATE_MESSAGE_REQUEST_STATE",
                    "REPLY_TO_MESSAGE",
                    "SEND_EXTERNAL_MEDIA_MESSAGE",
                    "REACTIONS",
                    "CREATE_GROUP_CHAT_LINK",
                    "SEND_VOICE_MESSAGE",
                    "DELETE_MESSAGE",
                    "ADD_PARTICIPANT",
                    "EDIT_MESSAGE",
                    "REPLY",
                    "CREATE_NEW_GROUP_CHAT",
                    "RENAMED_CONVERSATION",
                    "CREATE_LINKEDIN_VIRTUAL_MEETING",
                    "REMOVE_PARTICIPANT",
                    "SEND_VIDEO_MESSAGE"
                ],
                "Participants": [
                    {
                        "MemberProfileId": "FFF"
                    },
                    {
                        "MemberProfileId": "BBB"
                    }
                ]
            },
            {
                "UnreadCount": 0,
                "CreatedAt": "2025-07-31T06:29:28.125Z",
                "LastReadAt": "2025-07-31T07:45:55.94Z",
                "LastActivityAt": "2025-07-31T06:29:28.157Z",
                "GroupChat": false,
                "Read": true,
                "ConversationId": "CONV-ID-4",
                "IsCreatedByThisAccount": false,
                "Categories": [
                    "INBOX",
                    "PRIMARY_INBOX"
                ],
                "DisabledFeatures": [
                    "UPDATE_MESSAGE_REQUEST_STATE",
                    "ADD_PARTICIPANT",
                    "RENAMED_CONVERSATION",
                    "REMOVE_PARTICIPANT",
                    "CREATE_GROUP_CHAT_LINK"
                ],
                "Participants": [
                    {
                        "MemberProfileId": "EEE"
                    },
                    {
                        "MemberProfileId": "BBB"
                    }
                ]
            },
            {
                "UnreadCount": 2,
                "CreatedAt": "2025-07-27T09:45:05.359Z",
                "LastActivityAt": "2025-07-30T12:16:11.58Z",
                "GroupChat": false,
                "Read": false,
                "ConversationId": "CONV-ID-5",
                "IsCreatedByThisAccount": false,
                "Categories": [
                    "INBOX",
                    "PRIMARY_INBOX"
                ],
                "DisabledFeatures": [
                    "UPDATE_MESSAGE_REQUEST_STATE",
                    "ADD_PARTICIPANT",
                    "RENAMED_CONVERSATION",
                    "REMOVE_PARTICIPANT",
                    "CREATE_GROUP_CHAT_LINK"
                ],
                "Participants": [
                    {
                        "MemberProfileId": "DDD"
                    },
                    {
                        "MemberProfileId": "BBB"
                    }
                ]
            },
            {
                "UnreadCount": 0,
                "CreatedAt": "2025-07-30T11:18:31.582Z",
                "LastReadAt": "2025-07-31T14:09:42.882Z",
                "LastActivityAt": "2025-07-30T11:18:31.618Z",
                "GroupChat": false,
                "Read": true,
                "ConversationId": "CONV-ID-6",
                "IsCreatedByThisAccount": false,
                "Categories": [
                    "INBOX",
                    "PRIMARY_INBOX"
                ],
                "DisabledFeatures": [
                    "UPDATE_MESSAGE_REQUEST_STATE",
                    "ADD_PARTICIPANT",
                    "RENAMED_CONVERSATION",
                    "REMOVE_PARTICIPANT",
                    "CREATE_GROUP_CHAT_LINK"
                ],
                "Participants": [
                    {
                        "MemberProfileId": "III"
                    },
                    {
                        "MemberProfileId": "BBB"
                    }
                ]
            },
            {
                "UnreadCount": 0,
                "CreatedAt": "2025-07-25T14:31:42.674Z",
                "LastReadAt": "2025-07-31T11:57:35.08Z",
                "LastActivityAt": "2025-07-25T14:31:42.71Z",
                "GroupChat": false,
                "Read": true,
                "ConversationId": "CONV-ID-7",
                "IsCreatedByThisAccount": false,
                "Categories": [
                    "INBOX",
                    "PRIMARY_INBOX"
                ],
                "DisabledFeatures": [
                    "UPDATE_MESSAGE_REQUEST_STATE",
                    "ADD_PARTICIPANT",
                    "RENAMED_CONVERSATION",
                    "REMOVE_PARTICIPANT",
                    "CREATE_GROUP_CHAT_LINK"
                ],
                "Participants": [
                    {
                        "MemberProfileId": "AAA"
                    },
                    {
                        "MemberProfileId": "BBB"
                    }
                ]
            },
            {
                "UnreadCount": 0,
                "CreatedAt": "2025-07-22T12:48:31.756Z",
                "LastReadAt": "2025-07-24T13:59:41.307Z",
                "LastActivityAt": "2025-07-22T12:48:31.85Z",
                "GroupChat": false,
                "Read": true,
                "ConversationId": "CONV-ID-8",
                "State": "PENDING",
                "IsCreatedByThisAccount": true,
                "Categories": [
                    "INBOX",
                    "PRIMARY_INBOX",
                    "INMAIL"
                ],
                "DisabledFeatures": [
                    "UPDATE_MESSAGE_REQUEST_STATE",
                    "REPLY_TO_MESSAGE",
                    "SEND_EXTERNAL_MEDIA_MESSAGE",
                    "REACTIONS",
                    "CREATE_GROUP_CHAT_LINK",
                    "SEND_VOICE_MESSAGE",
                    "DELETE_MESSAGE",
                    "ADD_PARTICIPANT",
                    "EDIT_MESSAGE",
                    "REPLY",
                    "CREATE_NEW_GROUP_CHAT",
                    "RENAMED_CONVERSATION",
                    "CREATE_LINKEDIN_VIRTUAL_MEETING",
                    "REMOVE_PARTICIPANT",
                    "SEND_VIDEO_MESSAGE"
                ],
                "Participants": [
                    {
                        "MemberProfileId": "CCC"
                    },
                    {
                        "MemberProfileId": "BBB"
                    }
                ]
            }
        ],
        "InboxType": "LINKEDIN"
    }
}

Data:

Property Type Description
SyncType string Indicates the type of payload for “NEW_MESSAGE” event — in this case “CONVERSATIONS”
Conversations object | null Not null when SyncType is“CONVERSATIONS”
Conversations.MemberParticipants[] array List of all members participating in conversations related to the message event.
Conversations.Conversations[] array List of all conversations filtered by requested conditions on the queried page
Conversations.InboxType string Indicates the type of the requested inbox. Now returns only LINKEDIN value
Messages object | null Null when SyncType is“CONVERSATIONS”

Conversations.MemberParticipant object:

Property Type Description
LinkedInMemberId int64 LinkedIn's unique internal member ID
ProfileId string Internal profile identifier.
FirstName string | null Profile’s first name.
LastName string | null Profile’s last name.
Headline string | null Professional headline as shown on their profile.
Distance string | null Connection level (e.g., DISTANCE_1 = 1st-degree connection(friends), SELF = the authenticated user).
ProfilePictureUrl string | null URL to a 100x100 profile photo.
ProfilePictureUrlLarge string | null URL to a larger (800x800) profile photo.

Conversations.Conversation object:

Field Type Description
UnreadCount Int64 | null Number of unread messages in the conversation.
CreatedAt date When the conversation was created.
LastReadAt date, | null When the last message in the conversation was read by the authenticated user.
LastActivityAt date | null Timestamp of the most recent message/activity in the conversation.
GroupChat boolean | null Indicates if the conversation is a group chat.
Read boolean | null Whether the latest message has been read.
ConversationId string Unique identifier for the conversation.
IsCreatedByThisAccount boolean Indicates if the authenticated user initiated the conversation.
State string | null Conversation status (created by inmail message) (e.g., PENDING, ACCEPTED) .
Categories[] array | null Tags that define the type of conversation (e.g., INBOX, INMAIL).
DisabledFeatures[] array | null List of disabled features for the conversation (e.g., REPLY, EDIT_MESSAGE).
Participants[] array Member identifiers in the conversation.

What to do

  • Upsert each conversation by (LinkedInAccountId, ConversationId).

  • Upsert MemberParticipants (profile mapping) by LinkedInMemberId.

  • Expect subsequent MESSAGES pages for each conversation from this page.

Variant B — SyncType: "MESSAGES" (messages page for one conversation)

Every NEW_MESSAGE delivery includes a Payload.Data.Messages object. Within it, Events[] holds the actual messages you must process. The content of each event lives inside MessageEvent, which can appear in three shapes:

  • Regular: MessageEvent with Text/Body/Attachments

  • Forwarded: MessageEvent with ForwardedContent

  • InMail: MessageEvent with InMailContent

Use the tables below to parse each shape predictably.

Example of Payload.Data for Regular message:

{
    "SyncType": "MESSAGES",
    "Messages": {
        "ConversationId": "2-NjcxODg3MzgtNDliZC00MjA2LWI0MzQtZTMxZWJlMGFhODdmXzEwMA==",
        "Profiles": [
            {
                "LinkedInMemberId": 1280758798,
                "ProfileId": "ACoAAExW1A4BXw6Fsys_BhrDzjoEF290dTPEUrA",
                "FirstName": "Josiane",
                "LastName": "Delport",
                "PublicIdentifier": "josiane-delport-a3ab0b2b8",
                "Occupation": "DK Group Development Manager",
                "BackgroundPictureUrl": "https://media.licdn.com/dms/image/v2/D4D16AQHp9DeL5JsfZA/profile-displaybackgroundimage-shrink_350_1400/profile-displaybackgroundimage-shrink_350_1400/0/1733411402731?e=1756944000&v=beta&t=gcztNDAVHoLw5w1AN6KVAiyBH-iABW1MZuftWeIfYnQ",
                "ProfilePictureUrl": "https://media.licdn.com/dms/image/v2/D4D03AQFYxFRdVdUeow/profile-displayphoto-shrink_100_100/profile-displayphoto-shrink_100_100/0/1709791882893?e=1756944000&v=beta&t=-OZZ__DhDB6iUKhABNI7dD-qWAg5OxjLB951uecBBFw",
                "ProfilePictureUrlLarge": "https://media.licdn.com/dms/image/v2/D4D03AQFYxFRdVdUeow/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1709791882893?e=1756944000&v=beta&t=V7-HTrTwU0zzu6Aqslr3QEn6EPRAPAveY5pCYGqXRgY"
            }
        ],
        "Events": [
            {
                "CreatedAt": "2025-07-12T10:15:43.656Z",
                "SubType": "MEMBER_TO_MEMBER",
                "MessageId": "2-MTc1MjMxNTM0MzY1NmI0MzYxMC0xMDAmNjcxODg3MzgtNDliZC00MjA2LWI0MzQtZTMxZWJlMGFhODdmXzEwMA==",
                "MessageEvent": {
                    "Body": "",
                    "Text": "Hi Ananth Nag, i will be so happy to connect !",
                    "Attachments": [
                    ]
                },
                "ReactionSummaries": [
                ],
                "From": {
                    "MessagingMemberProfileId": "ACoAAExW1A4BXw6Fsys_BhrDzjoEF290dTPEUrA"
                }
            }
        ],
        "ConversationSyncFinished": false,
        "InboxType": "LINKEDIN"
    }
}

Example of Payload.Data for InMail message:

{
  "EventType": "NEW_MESSAGE",
  "Payload": {
    "Data": {
      "Messages": {
        "ConversationId": "2-NDQyMTc3NDAtYzdlZi00Y2U3LTk4NjYtNjhiYzNmN2YxNDVhXzEwMA==",
        "Profiles": [
          {
            "LinkedInMemberId": 760655377,
            "ProfileId": "ACoAAC1WrhEBnrh7ko6jZaTsK_2gOux5Q5edfMg",
            "FirstName": "Béatrice",
            "LastName": "AUGER",
            "PublicIdentifier": "béatrice-auger-1018aa192",
            "Occupation": "Responsable Recrutement et Ressources humaines chez Exens Ingénierie | Psychologie du travail",
            "BackgroundPictureUrl": "https://media.licdn.com/dms/image/v2/D4D16AQF_D5V5frgHEQ/profile-displaybackgroundimage-shrink_350_1400/profile-displaybackgroundimage-shrink_350_1400/0/1730823975154?e=1758153600&v=beta&t=oO6pODi-Qv9JKvV7D1Oc-N05l1MD0F5ik9aW-uyKaaU",
            "ProfilePictureUrl": "https://media.licdn.com/dms/image/v2/D4D03AQHOw3LekCEtzg/profile-displayphoto-shrink_100_100/profile-displayphoto-shrink_100_100/0/1714138375047?e=1758153600&v=beta&t=r4ItTKjdKnDakjnQzTsdzj52CunqVp9KTCxciWlJgrk",
            "ProfilePictureUrlLarge": "https://media.licdn.com/dms/image/v2/D4D03AQHOw3LekCEtzg/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1714138375047?e=1758153600&v=beta&t=TkURG1zL1D_euUgcq-n0JTMEQbYonxQdAojaCZ6YK98"
          }
        ],
        "Events": [
          {
            "CreatedAt": "2025-05-21T06:19:31.426Z",
            "SubType": "INMAIL",
            "MessageId": "2-MTc0NzgwODM3MTE4NGI0MzQzMy0xMDAmNDQyMTc3NDAtYzdlZi00Y2U3LTk4NjYtNjhiYzNmN2YxNDVhXzEwMA==",
            "MessageEvent": {
              "Body": "",
              "Subject": "Opportunité : Business development specialist chez Exens Ingénierie à Lyon",
              "Text": "Bonjour Josiane,\n\nJe me permets de vous contacter car votre parcours en business development a attiré mon attention. \n\nChez Exens, société de conseil en ingénierie basée à Lyon, nous amorçons une phase de structuration commerciale ambitieuse après 2,5 ans d'activité. Nous cherchons un profil capable d'allier vision stratégique, data et exécution commerciale, pour renforcer notre équipe et maximiser la transformation de nos actions de prospection en opportunités réelles. \n\nLe rôle est transversal et clé : segmentation des marchés, qualification des leads, campagnes automatisées, KPIs, accompagnement des ingénieurs d'affaires dans la préparation et la conversion des rendez-vous. Une vraie mission à impact. \n\nJe serais ravie d'échanger avec vous quelques minutes pour en discuter. Êtes-vous ouverte à un court échange cette semaine ou la prochaine ? \n\nBien cordialement, \n\nBéatrice AUGER \nResponsable Recrutement/ Ressources humaines & Psychologue du travail\n\nBéatrice AUGER\nResponsable Recrutement/ Ressources humaines & Psychologue du travail",
              "InMailContent": {
                "InmailType": "JOB_INQUIRIES",
                "ClickToReplyInmail": false,
                "RecruiterInmail": true,
                "InmailProductType": "RECRUITER"
              }
            },
            "ReactionSummaries": [],
            "From": {
              "MessagingMemberProfileId": "ACoAAC1WrhEBnrh7ko6jZaTsK_2gOux5Q5edfMg"
            }
          }
        ],
        "ConversationSyncFinished": true,
        "InboxType": "LINKEDIN"
      },
      "SyncType": "MESSAGES"
    },
    "SyncFinished": true
  },
  "LinkedInAccountId": 8969,
  "LinkedInEmail": "josiane.delport34@laposte.net"
}

Example of Payload.Data for Forwarded message:

{
  "EventType": "NEW_MESSAGE",
  "Payload": {
    "Data": {
      "Messages": {
        "ConversationId": "2-NzkyNjQ1ZGItYjE2Yi00MDQ0LTliZGItMjZhZjcxYzg1OTQ0XzEwMA==",
        "Profiles": [
          {
            "LinkedInMemberId": 717285120,
            "ProfileId": "ACoAACrA5wABV_zTuyfQqQTn18Gx55y1aQSkUlA",
            "FirstName": "Volodimir",
            "LastName": "Demiak",
            "PublicIdentifier": "volodimir-demiak-680273180",
            "Occupation": ".NET Developer"
          },
          {
            "LinkedInMemberId": 1280758798,
            "ProfileId": "ACoAAExW1A4BXw6Fsys_BhrDzjoEF290dTPEUrA",
            "FirstName": "Josiane",
            "LastName": "Delport",
            "PublicIdentifier": "josiane-delport-a3ab0b2b8",
            "Occupation": "DK Group Development Manager",
            "BackgroundPictureUrl": "https://media.licdn.com/dms/image/v2/D4D16AQHp9DeL5JsfZA/profile-displaybackgroundimage-shrink_350_1400/profile-displaybackgroundimage-shrink_350_1400/0/1733411402731?e=1758153600&v=beta&t=xgo9kBkHYQrVW9FD41YPUI6HuJYl_f0QzA7IfXJbI2w",
            "ProfilePictureUrl": "https://media.licdn.com/dms/image/v2/D4D03AQFYxFRdVdUeow/profile-displayphoto-shrink_100_100/profile-displayphoto-shrink_100_100/0/1709791882893?e=1758153600&v=beta&t=v_UkGT78da1biUEGXLXD_TsTgQBSef1Tm72BJr-3jtw",
            "ProfilePictureUrlLarge": "https://media.licdn.com/dms/image/v2/D4D03AQFYxFRdVdUeow/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1709791882893?e=1758153600&v=beta&t=eHxH0vOLODv_B1h-lni8zvEwRIadgK4V774dePj1QSc"
          },
          {
            "LinkedInMemberId": 640381435,
            "ProfileId": "ACoAACYrcfsBfmMAfQHwgdeoT7XppQU7ekeYMio",
            "FirstName": "Valentyna",
            "LastName": "Boiko",
            "PublicIdentifier": "valentyna-boikoo",
            "Occupation": "IT Talent Acquisition | Development Lead at ExtTech Development",
            "BackgroundPictureUrl": "https://media.licdn.com/dms/image/v2/D4D16AQGC8pqIf0FHvQ/profile-displaybackgroundimage-shrink_350_1400/B4DZijqV9iH8AY-/0/1755092443557?e=1758153600&v=beta&t=eIYfAqtMO-MNPRhZaBGm8lIB1IIvgEBOq2JGdr_LRA4"
          }
        ],
        "Events": [
          {
            "CreatedAt": "2025-08-01T08:00:26.586Z",
            "SubType": "MEMBER_TO_MEMBER",
            "MessageId": "2-MTc1NDAzNTIyNjU4NmI0ODA5NS0xMDAmNzkyNjQ1ZGItYjE2Yi00MDQ0LTliZGItMjZhZjcxYzg1OTQ0XzEwMA==",
            "PreviousMessageInConversation": "2-MTc1Mzk1OTU0NjY0OWI5MzYzMS0xMDAmNzkyNjQ1ZGItYjE2Yi00MDQ0LTliZGItMjZhZjcxYzg1OTQ0XzEwMA==",
            "MessageEvent": {
              "Body": "",
              "Text": "test again",
              "ForwardedContent": {
                "OriginalCreatedAt": "2025-03-26T14:45:17.483Z",
                "ForwardedContentType": "TEXT",
                "ForwardedBody": "Привіт :hugging_face:\n\nЗапрошую доєднатись до нашої Telegram-спільноти, де ми публікуємо:\n:computer: Безкоштовні курси | вебінари | івенти.\n:clipboard: Свіжі вакансії, актуальні новини.\n\nНаприклад, сьогодні опублікований пост \"Безкоштовні вебінари-івенти з 26.03-29.03», також попередні пост «Збірник ресурсів для вивчення англійської: рівні A2-B2»\n\nПриєднуйтесь за посиланням: https://t.me/+w8Z1Y79BdhtkNzNi (@dostupne_it)\n\nБуду рада бачити вас у нашій спільноті! :white_heart:",
                "OriginalFrom": {
                  "MessagingMemberProfileId": "ACoAACYrcfsBfmMAfQHwgdeoT7XppQU7ekeYMio"
                }
              }
            },
            "ReactionSummaries": [],
            "From": {
              "MessagingMemberProfileId": "ACoAACrA5wABV_zTuyfQqQTn18Gx55y1aQSkUlA"
            }
          }       ],
        "InboxType": "LINKEDIN"
      },
      "SyncType": "MESSAGES"
    }
  },
  "LinkedInAccountId": 8969,
  "LinkedInEmail": "josiane.delport34@laposte.net"
}

Envelope (MESSAGES)

Path Field Type Notes
Payload.Data SyncType string "MESSAGES" for message pages
Payload.Data.Messages ConversationId string Link every message to this conversation
Payload.Data.Messages Profiles array List profiles who send messages. (List can have only 1 profile, in case when all messages in payload are from same sender)
Payload.Data.Messages Events array Each array item is a message event (see next table)
Payload.Data.Messages ConversationSyncFinished boolean Nullable boolean value. true if all messages for this conversation is up to date.
Payload.Data.Messages InboxType string "LINKEDIN"

Events[] — Common Message Fields

/Path Field Type Description / Notes
Events[i] CreatedAt date Original creation timestamp (use for ordering within a conversation)
Events[i] SubType string "MEMBER_TO_MEMBER" – indicates a direct LinkedIn message between members. “INMAIL” - indicates a inmail messages
Events[i] MessageId string Unique identifier for the message.
Events[i].From MessagingMemberProfileId string Author’s profileId; compare with your account to detect inbound/outbound
Events[i] ReactionSummaries array | null Array of emoji reactions to the message.Emoji: the emoji used (e.g. 👍),- Count: how many users reacted,
  • FirstReactedAt: when the first reaction was added,

  • ViewerReacted: whether the viewer. | | Events[i] | PreviousMessageInConversation | string | null | Present on some events (e.g., forwarded) for referencing threading | | Events[i] | MessageEvent | object | Content object — shape varies by type (tables below) |

MessageEvent Base Structure

Property Type Description
Body string | null Message Body (Can be empty, depends of message event type).
Subject string | null Message Subject (Can be empty, depends of message event type).
Text string | null Message Text (Can be empty, depends of message event type).
LastEditedAt date, | null Nullable date when message was last time edited.
InMailContent object | null See InmailContent object description.
ThirdPartyMedia object | null See ThirdPartyMedia object description.
ForwardedContent object | null See ForwardedContent object description.

Regular MessageEvent (Member-to-Member)

When does it occur?

  • SubType == "MEMBER_TO_MEMBER"

  • MessageEvent does not contain InMailContent and ForwardedContent

Path Field Type Notes
MessageEvent Text string Display text
MessageEvent Body string Raw body (can be empty)
MessageEvent Attachments array Files/links if present

MessageEvent with ForwardedContent

Detection rule: MessageEvent.ForwardedContent exists.

Path Field Type Notes
MessageEvent Text string Wrapper’s text (if any)
MessageEvent Body string Wrapper’s body (if any)
MessageEvent Attachments array Wrapper’s attachments
MessageEvent.ForwardedContent OriginalCreatedAt date | null (ISO-8601) Timestamp of the original forwarded message
MessageEvent.ForwardedContent ForwardedContentType string | null e.g., "TEXT"
MessageEvent.ForwardedContent ForwardedBody string | null Text of the forwarded message
MessageEvent.ForwardedContent.OriginalFrom MessagingMemberProfileId string Author of the forwarded message

MessageEvent with InMailContent

Detection rule: MessageEvent.InMailContent exists (also SubType == "INMAIL").

Path Field Type Notes
MessageEvent Subject string InMail subject
MessageEvent Text string InMail body text
MessageEvent.InMailContent InmailType string | null e.g., "JOB_INQUIRIES"
MessageEvent.InMailContent ClickToReplyInmail boolean Reply capability
MessageEvent.InMailContent RecruiterInmail boolean Sent via Recruiter
MessageEvent.InMailContent InmailProductType string Inmail product type, like “SUBSCRIPTION”, "RECRUITER”, and others.

Profiles[]

Field Type Notes
LinkedInMemberId int64 LinkedIn's unique internal member ID.
ProfileId string Join key; match with From.MessagingMemberProfileId
FirstName / LastName string | null Display name
PublicIdentifier string | null Public LinkedIn URL segment (https://linkedin.com/in/{PublicIdentifier}). ex. josiane-delport-a3ab0b2b8
Occupation string | null Job title on LinkedIn.
BackgroundPictureUrl string | null URL to the user's LinkedIn background photo.
ProfilePictureUrl string | null Small profile pictureSmall profile picture.
ProfilePictureUrlLarge string | null Large version of profile picture.

ThirdPartyMedia:

Property Type Description
MediaType string | null Media type.
Title string | null Title
Id string Third party media identifier
GifUrl string | null Url for image
PreviewGifUrl string | null Url for image preview

Parsing & Handling Flow (developer checklist)

  1. Envelope & routing

    • Ensure Payload.Data.SyncType == "MESSAGES".

    • Read ConversationId, Events[], Profiles[].

  2. For each Events[i]

    • Read identity: MessageId, CreatedAt, From.MessagingMemberProfileId, SubType.

    • Detect content shape (in order):

      1. If MessageEvent.InMailContentInMail

      2. Else if MessageEvent.ForwardedContentForwarded

      3. Else → Regular

    • Direction: inbound/outbound by comparing From.MessagingMemberProfileId with your account’s profileId.

    • Normalize into your model and UPSERT by (LinkedInAccountId, ConversationId, MessageId).

  3. Change detection (edits)

    • Compare mutable fields (text/body, attachments, reactions, and the mutable sub-objects of InMail/Forwarded).

    • If changed → UPDATE only the changed fields.

    • If identical → no-op (don’t re-emit notifications/counters).

  4. Out-of-order safety

    • If the conversation is unknown, create a placeholder by ConversationId (link messages now, upsert conversation metadata later when the CONVERSATIONS page arrives).
  5. Ordering & UI

    • Inside a conversation, sort by CreatedAt (UTC) for display/logic.

    • Use ConversationSyncFinished to know if more message pages are coming for this conversation in the current run.

  6. Duplicates

    • Deliveries are at-least-once; the same message can reappear (retries/overlap).

    • With UPSERT + change detection, duplicates become no-ops.

Quick Type Detection Rules (copy/paste)

  • InMail: MessageEvent.InMailContent exists (and usually SubType == "INMAIL").

  • Forwarded: MessageEvent.ForwardedContent exists.

  • Regular: neither InMailContent nor ForwardedContent are present (typically SubType == "MEMBER_TO_MEMBER").

What to do

  • Ensure the conversation exists (create a placeholder by ConversationId if you haven’t seen it yet).

  • Upsert each message by (LinkedInAccountId, ConversationId, MessageId); link to the conversation.

  • Use ConversationSyncFinished to know whether more message pages are expected for this conversation within the same run.

Ordering & duplicates (must-read)

  • Out-of-order: MESSAGES can arrive before CONVERSATIONS.

    • Create a placeholder conversation keyed by ConversationId; attach messages.

    • When the CONVERSATIONS page arrives, upsert metadata into the placeholder.

  • Duplicates: The same conversation or the same message can arrive more than once (retries, overlapping ranges, repeated runs).

    • With UPSERT + unique keys, storage stays correct;

    • For business logic, if an upsert produced no field changes, treat it as a no-op (don’t re-fire notifications, counters, downstream events).

  • Parallel runs: Avoid overlapping runs for the same account unless you’re prepared for extra duplicates and interleaved deliveries.

Run completion

At the end of the run we set Payload.SyncFinished = true.
Use this to mark the sync run as finished on your side (useful for job orchestration and dashboards).

Minimal processing flow (reference)

  1. Verify X-Webhook-Secretreturn 200 OK quickly.

  2. Enqueue payload for async handling.

  3. Switch by SyncType:

    • CONVERSATIONS → upsert conversations & participants.

    • MESSAGES → ensure conversation (placeholder if needed) → upsert messages (with edit detection).

  4. If upsert produced no changes, treat as no-op for side effects.

  5. Order messages by CreatedAt (UTC) within each ConversationId.

  6. On Payload.SyncFinished == true → mark the run complete.

Error Handling

If synchronization fails, the webhook includes Payload.Error and Payload.Data is null.

Need do several actions:

  • verify account status

  • verify account’s proxy

  • verify account’s cookies by requesting own account profile information.

Conversations sync failed (SyncType: "CONVERSATIONS")

Property Type Description
ConversationsFromDate date Date requested by user.
MessagesFromDate string Date requested by user.
Cursor string | null Cursor of last page.
InboxType string Indicates the type of the requested inbox. Now returns only LINKEDIN value
SyncType string For conversation synchronization this value is “CONVERSATIONS” .

Retry: call POST /api/v1/conversations/sync again with the same ConversationsFromDate / MessagesFromDate and the Cursor from the error.

Single conversation sync failed (SyncType: "MESSAGES")

Property Type Description
ConversationId string ConversationId requested by user.
InboxType string Indicates the type of the requested inbox. Now returns only LINKEDIN value
SyncType string For conversation messages (single conversation) synchronization this value is “MESSAGES” .

Retry: call POST /api/v1/conversations/{id}/sync again with the same parameters.

Use Cases

1) Sync Inbox in

  • Inbox Refresh before sending message
    Sync LinkedIn conversations/messages before sending new messages.

  • Initial Message Import
    Import all conversations from a given time to populate your platform with past data.

  • Scheduled CRM Sync
    Periodically fetch all messages using fromDateTime to keep CRM records up to date.

2) Trigger Follow-up Workflows
Automatically tag leads, assign tasks, or notify sales reps when replies come in.

3) Build a Unified Inbox
Combine LinkedIn messages with other channels (email, WhatsApp, etc.) in your platform.

4) Track Engagement
Detect who replied, when, and how—enabling response tracking and conversion insights.

5) Trigger AI/Chatbot Responses
Detect incoming messages to trigger auto-replies.

6) Analytics
Analyze message content and give end user understanding how well their outreach sequence works.