Webhook by Example
Webhooks are part of the Dux-Soup API and are available in Expert UI to users with an active Dux-Soup Turbo or Cloud license, as well as to STACKED users.
Overview
Webhooks allow you to receive real-time event data from Dux-Soup and STACKED. Webhook events can include profile data collected during automated or manual profile visits and scans, as well as information about automated actions and their results as they are processed.
You can configure up to 5 webhooks, allowing different event types to be sent to different endpoints.
Enabling Webhooks
Webhooks can be enabled and configured manually under Settings → Connect.

They can also be enabled and configured programmatically using the User Settings API.
For example:
{
"webhookprofileflag": true,
"webhooks": [
{
"url": "https://your-webhook-endpoint.example.com",
"events": [
"action",
"rc"
]
}
]
}
Testing Webhooks
You can test your webhook configuration by clicking Send Sample under Settings → Connect. This sends sample webhook data to your configured endpoint so you can confirm that it is receiving events correctly.

The samples provided by Send Sample are limited and do not represent every webhook event or payload available through the API.
To test the webhook generated by a specific LinkedIn Activity API command, we recommend executing that API call. This allows you to receive and inspect the actual webhook event generated for that activity.
For example, if you need to test the webhook response for a connection request, message, profile visit, or another supported LinkedIn activity, execute the corresponding LinkedIn Activity API call and inspect the webhook event received by your endpoint.
Visit Event
Visit Events occur when manually and automatically viewing profiles on LinkedIn.
Visit.Create Event
This event occurs when a profile is initially opened and is recognized by Dux-Soup. It contains most of the profile details. Please also process the corresponding Update Event to ensure all the captured profile details are received.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid": "117917531760586753354", // The current Dux-Soup User
"time": "2019-01-06T08:45:03.239Z", // When the event was created
"type": "visit", // Visit Event
"event": "create", // Create Stage
"data": { // Profile Details
"id": "id.11964767",
"VisitTime": 1546764302571,
"Profile": "https://www.linkedin.com/in/jamesbrooks3/",
"Picture": "https://media.licdn.com/dms/image/C4E03AQGS174biYNVOA/profile-displayphoto-shrink_800_800/0?e=1552521600&v=beta&t=yWZVN_trvl0ycueCa4qayoJkVjqhPsuCzgzdQwv90mM",
"Degree": "1st",
"First Name": "James",
"Middle Name": "",
"Last Name": "Brooks",
"From": "2018",
"Title": "CX Innovation",
"Company": "Capita",
...
}
}
Visit.Update Event
This event occurs when additional profile information becomes available after the initial event was sent. It has the same structure as the Create Event and will include all data from the Create Stage as well as the Update Stage.
Example
{
"userid": "117917531760586753354", // The current Dux-Soup User
"time": "2019-01-06T08:45:06.233Z", // When the event was created
"type": "visit", // Visit Event
"event": "update", // Update Stage
"data": { // Profile Details
"id": "id.11964767",
"VisitTime": 1546764302571,
"Profile": "https://www.linkedin.com/in/jamesbrooks3/",
"Picture": "https://media.licdn.com/dms/image/C4E03AQGS174biYNVOA/profile-displayphoto-shrink_800_800/0?e=1552521600&v=beta&t=yWZVN_trvl0ycueCa4qayoJkVjqhPsuCzgzdQwv90mM",
"Degree": "1st",
"First Name": "James",
"Middle Name": "",
"Last Name": "Brooks",
"From": "2018",
"Title": "CX Innovation",
"Company": "Capita",
...
}
}
Scan Event
Scan Events occur as Dux-Soup processes a Profile List, after the user has selected "Scan Profiles".
Scan.Create Event
This event occurs when a profile is scanned by Dux-Soup. Scanning profiles is started by the user via the “Scan Profiles” option in the Dux-Soup drop down menu. Each profile in the list that is scanned will result in a single Webhook event.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid": "117917531760586753354", // The current Dux-Soup User
"time": "2019-01-06T08:45:06.233Z", // When the event was created
"type": "scan", // Scan Event
"event": "create", // Create Stage
"data": { // Scanned Profile Details
"id": "id.11964767",
"ScanTime": 1546764302571,
"Profile": "https://www.linkedin.com/in/jamesbrooks3/",
"First Name": "James",
"Middle Name": "",
"Last Name": "Brooks",
...
}
Action Event
Action Events occur when Dux-Soup automations, e.g., auto-invite, auto-endorse, are triggered on a profile.
Action.Create Event
This event occurs when an automated action has completed. The action name can be one of the following, corresponding to the automation actions that are available in Dux-Soup Option:
- connectProfile
- disconnectProfile
- endorseProfile
- followProfile
- inmailProfile
- messageProfile
- pdfProfile
- saveasleadProfile
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid": "117917536760586753354", // The current Dux-Soup User
"time": "2019-01-06T08:45:17.477Z", // When the event was created
"type": "action", // Action Event
"event": "create", // Create Stage
"data": { // Action Details
"name": "pdfProfile",
"targeturl": "https://www.linkedin.com/in/jamesbrooks3/",
"profileid": "id.11964767",
"successflag": true, // Success indicator
"returnvalue": null // Return value, if any
}
}
Message Event
Message Events occur when the Message Bridge has been enabled and new messages are being processed by Dux-Soup.
Message.Received Event
This event occurs when a new received message has been read by the message bridge. The message type can be one of the following, corresponding to the type of message that was read in the LinkedIn inbox.
- MEMBER_TO_MEMBER
- INVITATION_ACCEPT
- INMAIL
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid": "117917536760586753354", // The current Dux-Soup User
"time": "2019-03-21T16:51:25.899Z", // When the event was created
"type": "message", // Message Event
"event": "received", // Received message
"data": {
"url": // the conversation on LinkedIn
"https://www.linkedin.com/messaging/thread/64525225672721408/",
"timestamp": "2019-02-15T15:28:20.980Z", // Timestamp of the message
"from": // Message sender LinkedIn URL
"https://www.linkedin.com/in/rodrigo-ramos-a0ab9327",
"fromId": "id.26429462492", // Message sender profile id
"fromFirstName": "Rodrigo", // Message sender first name
"fromLastName": "Ramos", // Message sender last name
"type": "MEMBER_TO_MEMBER", // Type of message
"tags": [ "🦆-default-invited",
"🦆-default-accepted" ,
"🦆-default-responded" ], // Tags on the profile
"text": // Message body
"Hi man. You’re Welcome. Nice to have you in my contacts"
}
}
Message.Sent Event
This event occurs when a new sent message has been read by the message bridge. The message type is MEMBER_TO_MEMBER.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid": "117917536760586753354", // The current Dux-Soup User
"time": "2019-03-21T16:51:25.899Z", // When the event was created
"type": "message", // Message Event
"event": "sent", // Sent message
"data": {
"url": // the conversation on LinkedIn
"https://www.linkedin.com/messaging/thread/64525225672721408/",
"timestamp": "2019-02-15T15:28:20.980Z", // Timestamp of the message
"to": // Message sender LinkedIn URL
"https://www.linkedin.com/in/rodrigo-ramos-a0ab9327",
"toId": "id.26429462492", // Message recipient profile id
"toFirstName": "Rodrigo", // Message recipient first name
"toLastName": "Ramos", // Message recipient last name
"type": "MEMBER_TO_MEMBER", // Type of message
"tags": [ "🦆-default-invited",
"🦆-default-accepted" ], // Tags on the profile
"text": // Message body
"Hi Rodrigo, what are you up to these days?"
}
}
Remote Control Event
Remote Control Events occur as the Remote Control Robot processes commands.
RCCommand.received Event
This event occurs when a new Remote Control command has been read by the remote control robot.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid": "117917536760586753354", // The current Dux-Soup User
"time": "2019-03-25T14:13:15.814Z", // When the event was created
"type": "rccommand",
"event": "received",
"data": {
"id": "a5f64143-b847-5f473ac7488d",
"command": "visit",
"params": {
"profile": "https://www.linkedin.com/in/janjanjanjanjan/"
}
}
}
RCCommand.completed Event
This event occurs when a Remote Control command has been successfully executed by the remote control robot.
RCCommand.snooze Event
This event occurs when the Remote Control robot is snoozing due to the throttling configuration.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid": "103329626217674043154", // The current Dux-Soup User
"time": "2019-04-20T10:48:35.828Z", // When the event was created
"type": "rccommand",
"event": "snooze",
"data": {
"reason": "throttling",
"time": 15000
}
}
RCCommand.ready Event
This event occurs when the remote control robot is ready to receive commands.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid": "117917536760586753354", // The current Dux-Soup User
"time": "2022-06-25T14:13:15.814Z", // When the event was created
"type": "rccommand",
"event": "ready",
"data": {
"clientid":"203bc8fa-13e9-4efe-b0e1-26a4067c5c6e",
"exclusions":{
"commands":[], // list of commands to be excluded due to throttling
"campaigns":[ // list of disabled campaign ids
"default"
]
}
}
RCCommand.ignore Event
This event occurs when the command has been ignored. This happens when the target profile matches any of the action exclusion rules, e.g., blacklisted.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid" : "103329626217674043154", // The current Dux-Soup User
"time" : "2022-04-28T08:18:14.221Z", // When the event was created
"type" : "rccommand",
"event" : "ignore",
"data" : {
"id" : "a7f8508d-bae9-2caafac11c66",
"command" : "message",
"params" : {
"profile" : "https://www.linkedin.com/in/janjanjanjanjan/",
"messagetext" : "Hi _FN_,\n\nThanks for connecting.",
"campaignid" : "default",
},
"reason" : "blacklisted"
}
}
RCCommand.error Event
This event occurs when an error occurs when trying to execute the Remote Control command.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid" : "103329626217674043154", // The current Dux-Soup User
"time" : "2022-04-28T12:35:03.878Z", // When the event was created
"type" : "rccommand",
"event" : "error",
"data" : {
"id" : "86082680-b3c1-7e704c999d67",
"command" : "connect",
"params" : {
"profile" : "https://www.linkedin.com/in/janjanjanjanjan/",
"campaignid" : "playbook",
"messagetext" : "Hi _FN_,\n\nLet's connect."
},
"error" : "selector '*[type=connect-icon],.pvs-profile-actions__action.artdeco-button--primary[0] not found within timeout."
}
}
RCCommand.remove Event
An rccommand removed event is sent when a queued command is removed before it is delivered for execution.
The reason indicates why the command was removed. Possible values include:
- deleted
- reset
- campaign-cleared
- campaign-deleted
- unenrolled
- superseded
Example
{
"userid": "100000000000000000000",
"time": "2026-09-30T11:31:29.838Z",
"type": "rccommand",
"event": "removed",
"data": {
"id": "188fc5c4-892f-149d751cdb2c",
"command": "message",
"params": {
"profile": "https://www.linkedin.com/in/example-profile/",
"profileid": "id.123456789",
"campaignid": "my-campaign",
"actionindex": 5,
"attempt": 1,
"messagetext": "Hi FN, thanks for connecting..."
},
"reason": "unenrolled",
"by": "100000000000000000000"
}
}
A removed event is terminal for that command: it has been removed from the queue and will not subsequently be delivered for execution.
For more information about command states, retries and when it is safe to resend a command, see API Command Processing, Retries and Webhook Events.
RCCommand.retry Event
When a queued command fails because of a temporary condition and Dux-Soup schedules another attempt, an rccommand retry event is sent.
The retry is a new command with its own id. The params contain:
- attempt - the new attempt number
- retryof - the ID of the original command
retryof remains the same on subsequent attempts, allowing all attempts in the same retry chain to be correlated.
The when value indicates the earliest time the new command can run. Normal scheduling and daily limits still apply.
Example
{
"userid": "100000000000000000000",
"time": "2026-10-14T15:03:21.000Z",
"type": "rccommand",
"event": "retry",
"data": {
"id": "b7e2c1d4-4f0a-9c3e5a7d1b2f",
"command": "message",
"params": {
"profile": "https://www.linkedin.com/in/example-profile/",
"messagetext": "Hello",
"campaignid": "default",
"attempt": 2,
"retryof": "a5f64143-b847-5f473ac7488d"
},
"when": "2026-10-14T16:03:21.000Z"
}
}
For full details about retry timing, retryable errors, and determining when a command is finished, see API Command Processing, Retries and Webhook Events.
Session Event
Session Events occur when the Dux-Soup extension is started and when the user's LinkedIn session status changes.
Session.Create Event
This event is triggered at the start of the extension startup.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid" : "103329626277674043154", // The current Dux-Soup User
"time" : "2024-02-06T18:59:36.443Z", // When the event was created
"type" : "session",
"event" : "create",
"data" : {
"username" : "", // LinkedIn user
"profile" : "", // LinkedIn profile
"cloudsession" : false, // cloud or local
"loggedin" : false, // logged into Linkedin?
"paused" : false // extension paused?
},
}
Session.Update Event
This event occurs when anything changes in the state of the LinkedIn session of the extension, or when the extension is paused or unpaused via the API.
Example
This example shows the JSON structure that will be sent as an HTTP POST body to the webhook URL
{
"userid" : "103329626277674043154", // The current Dux-Soup User
"time" : "2024-02-06T19:09:33.212Z", // When the event was created
"type" : "session",
"event" : "update",
"data" : {
"username" : "John Doe", // LinkedIn user
"profile" : "https://www.linkedin.com/in/john-doe-381910160",
"cloudsession" : false, // cloud or local
"loggedin" : true, // logged into Linkedin?
"paused" : false // extension paused?
},
}