Skip to content
Last updated

Webhooks


1. Overview

A webhook (also called a web callback or HTTP push API) enables third-party services to send real-time updates to your app. Updates are triggered by an event that occurs in Sprinklr, and the data is delivered to your endpoint immediately as it happens. Webhooks are also referred to as "Reverse APIs" — unlike typical APIs where you poll frequently for data, Sprinklr pushes the event to you, which is more efficient for both provider and consumer.

The Webhook Subscription API V3 manages the subscriptions that deliver those platform events to your endpoints. It supports listing and fetching, creating, updating, and deleting subscriptions, activating, deactivating, or verifying a subscription, and listing all webhook types.

V3 collapses the V2 endpoint family onto two paths plus one action path, differentiated by HTTP method and a query parameter:

OperationMethodPath
List or fetch webhook subscriptionsGET/api/v3/webhook-subscriptions
Create webhook subscriptionPOST/api/v3/webhook-subscriptions
Update webhook subscriptionPUT/api/v3/webhook-subscriptions?subscriptionId=
Delete webhook subscriptionDELETE/api/v3/webhook-subscriptions?subscriptionId=
Activate, deactivate, or verify a subscriptionPOST/api/v3/webhook-subscriptions/action?subscriptionId=&action=
List all webhook typesGET/api/v3/webhook-subscriptions/webhook-types

1.1 The subscription lifecycle

  1. Expose a callback URL. It must be publicly reachable and must answer a POST with an empty payload ({}) with a 2XX response. See §10 Callback URL verification check.
  2. Create the subscription — POST /api/v3/webhook-subscriptions. A newly created subscription comes back with "verified": false and "active": false.
  3. Verify it — POST /api/v3/webhook-subscriptions/action?subscriptionId=…&action=verify.
  4. Activate it — POST /api/v3/webhook-subscriptions/action?subscriptionId=…&action=activate. Only then does Sprinklr start dispatching events.
  5. Maintain it — update the subscribed types with PUT, pause delivery with action=deactivate, remove it with DELETE.

1.2 The subscription data model

LayerFieldWhat it holds
Identityid, name, descriptionSubscription ID and human-readable labels
Deliveryurl, preSharedKey, viaProxyWhere events are pushed and how the payload is signed
Event selectionsubscriptions[], filteredSubscriptions[]Which webhook types fire, and optional per-type attribute filters
Stateverified, active, lastSuccessTimestamp, lastFailedTimestampVerification/activation state and last delivery outcomes

2. Base URLs and environments

All API calls are sent to the production endpoint:

https://api3.sprinklr.com/{env}/api/v3

So the webhook subscription resource in production is:

https://api3.sprinklr.com/{env}/api/v3/webhook-subscriptions

Replace {env} with your assigned environment identifier (prod0, prod2, prod11, and so on — see APIs | Sprinklr Developer Portal for the environment list).


3. Authentication and common headers

All Webhook Subscription API calls are authenticated with OAuth 2.0. See Developer Tools in Sprinklr for API key and secret generation, and the Authorize flow.

HeaderValuePurposeRequired on
AuthorizationBearer {{accessToken}}Authenticates the user with the serverAll requests
Key{{apiKey}}The API key acts as both a unique identifier and a secret token for authentication to a set of access rightsAll requests
Content-Typeapplication/jsonRequest format should be JSON, as the endpoint expects a JSON bodyPOST, PUT
Acceptapplication/jsonDeclares the acceptable response typeAll requests

4. Write operations

4.1 Create a webhook subscription

POST /api/v3/webhook-subscriptions

Creates a webhook subscription. The response returns the subscription id, which you need for every other operation. A new subscription is created with verified: false and active: false.

Request body — WebhookSubscriptionCreateRequest

ParameterSub-parameterRequiredTypeDescription
nameRequiredStringThe name of the webhook subscription.
descriptionOptionalStringThe description of the webhook subscription.
subscriptionsConditionalArray[String]The list of webhook types on which you want to create the subscription. Either subscriptions or filteredSubscriptions must be provided.
filteredSubscriptionsConditionalArray[Object]The list of subscriptions with filters. Either subscriptions or filteredSubscriptions must be provided.
webhookTypeRequiredStringWebhook type the filter set applies to.
filtersOptionalArray[Object]Subscription filters. See the filter table below.
urlRequiredStringThe URL of the webhook endpoint.
preSharedKeyRequiredStringAn authorization key that can be used to confirm if the request is valid. A valid webhook will have a header X-Hub-Signature with value sha256={sha256 digested payload using the preSharedKey}.
viaProxyOptionalBooleanIf true, the webhooks are dispatched via Sprinklr proxy.

filters[] — Filter_webhooks

ParameterRequiredTypeDescription
idRequiredStringFilter identifier.
typeRequiredStringFilter type — for example PARTNER_CUSTOM_PROPERTY, ACCOUNT_TYPE.
checkConditionRequiredStringFilter check condition, for example IS, IS_NOT.
valuesRequiredArray[String]Filter values.

Request

curl --location 'https://api3.sprinklr.com/{env}/api/v3/webhook-subscriptions' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{
  "name": "My Webhook",
  "url": "https://mycallback.com",
  "preSharedKey": "{{preSharedKey}}",
  "subscriptions": [
    "CASE_CREATED"
  ]
}'

Response — 201 Created

{
    "data": {
        "id": "6a1d7399e944edfa60817e9d",
        "name": "My Webhook",
        "subscriptions": [
            "CASE_CREATED"
        ],
        "filteredSubscriptions": [
            {
                "webhookType": "CASE_CREATED"
            }
        ],
        "url": "https://mycallback.com",
        "preSharedKey": "secret",
        "viaProxy": false,
        "verified": false,
        "active": false
    },
    "errors": []
}

Note that the platform echoes the flat subscriptions array back as a filteredSubscriptions entry with no filters — a subscription with no filters is equivalent to an unfiltered subscription on that type.

Creating with filters

curl --location 'https://api3.sprinklr.com/{env}/api/v3/webhook-subscriptions' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{
  "name": "API test",
  "description": "Webhook for case creation.",
  "subscriptions": [
    "CASE_CREATED"
  ],
  "filteredSubscriptions": [
    {
      "webhookType": "CASE_CREATED",
      "filters": [
        {
          "id": "ACCOUNT_TYPE",
          "type": "ACCOUNT_TYPE",
          "checkCondition": "IS",
          "values": [
            "Whatsapp_Business"
          ]
        }
      ]
    }
  ],
  "url": "https://mycallback.com",
  "preSharedKey": "{{preSharedKey}}"
}'

4.2 Update a webhook subscription

PUT /api/v3/webhook-subscriptions?subscriptionId={subscriptionId}

Updates the name, description, and subscribed webhook types of an existing subscription. The update is incremental on subscription types — you add and remove types rather than resubmitting the full list.

Query parameters

ParameterRequiredTypeDescription
subscriptionIdRequired in practiceStringThe Sprinklr webhook subscriptionId.

Request body — WebhookSubscriptionUpdateDTO

ParameterRequiredTypeDescription
nameOptionalStringThe name of the webhook subscription.
descriptionOptionalStringThe description of the webhook subscription.
addSubscriptionsOptionalArray[String]Add subscriptions to the list of subscribed Sprinklr webhook types.
removeSubscriptionsOptionalArray[String]Remove subscriptions from the list of subscribed Sprinklr webhook types.

Request

curl --location --request PUT 'https://api3.sprinklr.com/{env}/api/v3/webhook-subscriptions?subscriptionId=6a1e8c2d4adcdb00e372fc37' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{
    "name": "vaibhav_api_4",
    "description": "updated the string",
    "addSubscriptions": [
        "CASE_CREATED"
    ],
    "removeSubscriptions": [
        "CASE_UPDATED"
    ]
}'

Response — 204 No Content

The response returns 204 No Content with an empty body.


4.3 Delete a webhook subscription

DELETE /api/v3/webhook-subscriptions?subscriptionId={subscriptionId}

Deletes a Sprinklr webhook subscription.

ParameterRequiredTypeDescription
subscriptionIdRequired in practiceStringThe webhook subscriptionId.
curl --location --request DELETE 'https://api3.sprinklr.com/{env}/api/v3/webhook-subscriptions?subscriptionId=6a1d7399e944edfa60817e9d' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Accept: application/json'

The endpoint returns 204 No Content on success.


4.4 Activate, deactivate, or verify a subscription

POST /api/v3/webhook-subscriptions/action?subscriptionId={subscriptionId}&action={action}

Performs a lifecycle action on an existing subscription. This single V3 endpoint replaces the three separate V2 endpoints for verify, activate, and deactivate.

Query parameters

ParameterRequiredTypeDescription
subscriptionIdRequiredStringThe webhook subscriptionId.
actionRequiredStringAction to perform: activate, deactivate, or verify.
action valueEffect
verifyRuns the callback URL verification check against the configured url. Sets verified to true on success.
activateActivates the subscription so Sprinklr dispatches matching events. Sets active to true.
deactivateDeactivates the subscription and stops dispatch. Sets active to false.

Request

curl --location --request POST 'https://api3.sprinklr.com/{env}/api/v3/webhook-subscriptions/action?subscriptionId=6a0d7df617ab2359996fb225&action=verify' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Accept: application/json'

Response — 200 OK

{
    "data": true,
    "errors": []
}

data is true when the action succeeds, otherwise false.


5. Read operations

5.1 GET /api/v3/webhook-subscriptions — List or fetch subscriptions

Returns one subscription when subscriptionId is supplied, or a page of subscriptions when it is not. This single endpoint replaces the V2 Read Subscription and Read All Subscription endpoints.

Query parameters

ParameterRequiredTypeDescription
subscriptionIdOptionalStringSubscription id(s), comma-separated. Omit to list all subscriptions.
pageNumberOptionalStringPage number (0-based).
pageSizeOptionalStringPage size.
sinceTimeOptionalStringPagination cursor.

Request

curl --location 'https://api3.sprinklr.com/{env}/api/v3/webhook-subscriptions?subscriptionId=6a0d7df617ab2359996fb225' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Accept: application/json'

Response — 200 OK

{
    "data": [
        {
            "id": "6a0d7df617ab2359996fb225",
            "name": "SALESFORCE - Paris_test",
            "description": "Webhook subscription for SALESFORCE connector: Paris_test",
            "subscriptions": [
                "CASE_CREATED",
                "CASE_UPDATED"
            ],
            "filteredSubscriptions": [
                {
                    "webhookType": "CASE_CREATED",
                    "filters": [
                        {
                            "id": "6a0d7fa117ab23599970b714",
                            "type": "PARTNER_CUSTOM_PROPERTY",
                            "checkCondition": "IS",
                            "values": [
                                "DEV"
                            ]
                        }
                    ]
                },
                {
                    "webhookType": "CASE_UPDATED",
                    "filters": [
                        {
                            "id": "6a0d7fa117ab23599970b714",
                            "type": "PARTNER_CUSTOM_PROPERTY",
                            "checkCondition": "IS",
                            "values": [
                                "DEV"
                            ]
                        }
                    ]
                }
            ],
            "url": "https://qa6-std-connector-tier1.sprinklr.com/crm/SALESFORCE/6a0d7dc917ab2359996f90db?sprPartnerId=66000000",
            "viaProxy": false,
            "verified": true,
            "active": true,
            "lastSuccessTimestamp": 1779270302235
        }
    ],
    "errors": []
}

data is always an array on this endpoint, even when a single subscriptionId is requested.

Response fields — WebhookSubscriptionConfigAPIResponse

FieldTypeDescription
idStringThe subscription ID associated with the subscription you created via an API call or in the Sprinklr UI.
nameStringName of the webhook subscription.
descriptionStringDescription of the webhook subscription.
subscriptionsArray[String]List of Sprinklr webhook types subscribed.
filteredSubscriptionsArray[Object]The list of subscriptions with filters (webhookType plus filters[]).
urlStringThe URL of the webhook endpoint.
preSharedKeyStringAn authorization key that can be used to confirm if the request is valid. A valid webhook will have a header X-Hub-Signature with value sha256={sha256 digested payload using the preSharedKey}.
viaProxyBooleanIf true, the webhooks are dispatched via Sprinklr proxy.
verifiedBooleantrue if the webhook subscription is verified.
activeBooleantrue if the webhook subscription is active.
lastSuccessTimestampInteger (int64)Last success timestamp of the webhook, in epoch milliseconds.
lastFailedTimestampInteger (int64)Last failed timestamp of the webhook, in epoch milliseconds.

5.2 GET /api/v3/webhook-subscriptions/webhook-types — List all webhook types

Returns every webhook subscription type available in your environment. Use the returned type value in subscriptions[] or filteredSubscriptions[].webhookType when creating or updating a subscription. This endpoint takes no parameters.

curl --location 'https://api3.sprinklr.com/{env}/api/v3/webhook-subscriptions/webhook-types' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Accept: application/json'

Response — 200 OK (truncated)

{
    "data": [
        {
            "type": "ACCOUNT_CREATED",
            "label": "Account Created Event",
            "category": "Account"
        },
        {
            "type": "CASE_CREATED",
            "label": "Case Created",
            "category": "Case"
        }
    ],
    "errors": []
}

Response fields — WebhookType

FieldTypeDescription
typeStringWebhook type. Use this value in subscriptions[].
labelStringLabel of the webhook type, as shown in the Sprinklr UI.
categoryStringParent category of the webhook type.

6. Response format and status codes

6.1 The V3 envelope

Every V3 webhook subscription endpoint that returns a body returns the standard envelope:

{
  "data": [ ... ],
  "errors": []
}
FieldTypeDescription
dataArray / Object / BooleanPayload of the operation. Array on GET /webhook-subscriptions and GET /webhook-subscriptions/webhook-types, object on POST /webhook-subscriptions, boolean on POST /webhook-subscriptions/action.
errorsArray[Error]Array of error objects (empty if no errors). Each Error carries id, code, and message.

6.2 Response codes

HTTP codeScenarioDescription
200 OKSuccessSubscriptions or webhook types returned; action performed (data: true).
201 CreatedSuccessSubscription created. Observed in the Postman collection; not declared in sprinklr-v3.yaml.
204 No ContentSuccessUpdate succeeded with no response body. Observed in the Postman collection; sprinklr-v3.yaml declares 200 with a string schema.
400 Bad RequestInvalid parametersMissing required parameters or invalid parameter combinations.
401 UnauthorizedAuthentication failedInvalid or missing Authorization token.
403 ForbiddenInsufficient permissionsCaller lacks permission on the webhook subscription entity.
404 Not FoundNot foundNo subscription matches the supplied subscriptionId.

400, 401, 403, and 404 are the four shared responses declared on all six operations in sprinklr-v3.yaml. No 429 or 5xx response is declared anywhere in the V3 specification.


7. V2 → V3 migration

7.1 Endpoint mapping

V2V3
POST /api/v2/webhook-subscriptionsPOST /api/v3/webhook-subscriptions
GET /api/v2/webhook-subscriptions/{subscriptionId} (Read Subscription)GET /api/v3/webhook-subscriptions?subscriptionId=
Read All SubscriptionGET /api/v3/webhook-subscriptions (omit subscriptionId)
Update SubscriptionPUT /api/v3/webhook-subscriptions?subscriptionId=
DELETE /api/v2/webhook-subscriptions/{subscriptionId}DELETE /api/v3/webhook-subscriptions?subscriptionId=
Verify SubscriptionPOST /api/v3/webhook-subscriptions/action?subscriptionId=&action=verify
POST /api/v2/webhook-subscriptions/{subscriptionId}/activatePOST /api/v3/webhook-subscriptions/action?subscriptionId=&action=activate
POST /api/v2/webhook-subscriptions/deactivatePOST /api/v3/webhook-subscriptions/action?subscriptionId=&action=deactivate
GET /api/v2/webhook-subscriptions/webhook-typesGET /api/v3/webhook-subscriptions/webhook-types

7.2 Key changes

AspectAPI V2API V3Impact
Subscription addressingPath segment /{subscriptionId}Query parameter ?subscriptionId=Rebuild every URL; V3 never puts the ID in the path.
Verify / activate / deactivateThree distinct endpoints, two of them path-basedOne POST /webhook-subscriptions/action with an action query parameterCollapse three client methods into one.
Update verbPOSTPUTChange the HTTP method on the update call.
Read single vs. read allTwo endpointsOne GET, switched by presence of subscriptionIdMerge two client methods; data is an array in both cases.
PaginationNot documented on the V2 read pagespageNumber, pageSize, sinceTime query parametersNew capability on GET /webhook-subscriptions.
Multi-ID fetchOne ID per callsubscriptionId accepts comma-separated IDsBatch reads in a single call.

8. Supported webhook types

The following 91 types across 32 categories were returned by GET /api/v3/webhook-subscriptions/webhook-types in the supplied collection. Available types are environment-dependent — always call the endpoint rather than hard-coding this list.

TypeLabelCategory
ACCOUNT_CREATEDAccount Created EventAccount
ACCOUNT_UPDATEDAccount Updated EventAccount
AUDIENCE_ACTIVITY_CREATEDAudience ActivityActivity
ASSET_GROUP_CREATEDAsset Group CreatedAsset Group
ASSET_GROUP_DELETEDAsset Group DeletedAsset Group
ASSET_GROUP_UPDATEDAsset Group UpdatedAsset Group
ASSIGNMENT_CHANGEAssignment ChangeAssignment Change
BUSINESS_HOLIDAY_LIST_CREATEDBusiness Holiday List CreatedBusiness Holiday List
BUSINESS_HOLIDAY_LIST_UPDATEDBusiness Holiday List UpdatedBusiness Holiday List
BUSINESS_HOURS_CREATEDBusiness Hours CreatedBusiness Hours
BUSINESS_HOURS_UPDATEDBusiness Hours UpdatedBusiness Hours
CAMPAIGN_CREATEDCampaign CreatedCampaign
CAMPAIGN_DELETEDCampaign DeletedCampaign
CAMPAIGN_UPDATEDCampaign UpdatedCampaign
CASE_CREATEDCase CreatedCase
CASE_DELETEDCase DeletedCase
CASE_UPDATEDCase UpdatedCase
MESSAGE_ASSOCIATION_CHANGEMessage Association ChangeCase
COMMENT_CREATEDComment CreatedComment
COMMENT_UPDATEDComment UpdatedComment
COMMUNITY_MESSAGE_CREATEDCommunity Message CreatedCommunity
COMMUNITY_USER_CREATEDCommunity User CreatedCommunity
COMMUNITY_USER_UPDATEDCommunity User UpdatedCommunity
API_COMPLIANCE_EVENTAPI Compliance eventCompliance
CUSTOM_FIELD_CREATEDCustom Field CreatedCustom Field
CUSTOM_FIELD_UPDATEDCustom Field UpdatedCustom Field
DIGITAL_ASSET_CREATEDAsset CreatedDAM
DIGITAL_ASSET_DELETEDAsset DeletedDAM
DIGITAL_ASSET_UPDATEDAsset UpdatedDAM
TEMPLATE_ASSET_CREATEDTemplate Asset CreatedDAM
TEMPLATE_ASSET_DELETEDTemplate Asset DeletedDAM
TEMPLATE_ASSET_UPDATEDTemplate Asset UpdatedDAM
DRAFT_CREATEDDraft CreatedDraft
DRAFT_SCHEDULEDDraft ScheduledDraft
DRAFT_UPDATEDDraft UpdatedDraft
SMART_RESPONSE_FEEDBACKFeedback given on smart responsesIntuition
KB_CONTENT_CREATEDKnowledge Base Content CreatedKnowledge Base
KB_CONTENT_DELETEDKnowledge Base Content DeletedKnowledge Base
KB_CONTENT_UPDATEDKnowledge Base Content UpdatedKnowledge Base
MESSAGE_APPROVAL_REJECTEDMessage Approval RejectedMessage
MESSAGE_BOUNCEDMessage BouncedMessage
MESSAGE_COMPLAINTMessage ComplaintMessage
MESSAGE_DELETEDMessage DeletedMessage
MESSAGE_DELIVEREDMessage DeliveredMessage
MESSAGE_DELIVERY_DELAYEDMessage Delivery DelayedMessage
MESSAGE_ENGAGEMENT_UPDATEDMessage Engagement UpdatedMessage
MESSAGE_FAILEDMessage FailedMessage
MESSAGE_PUBLISH_FAILEDMessage Publish FailedMessage
MESSAGE_PUBLISHEDMessage PublishedMessage
MESSAGE_READMessage ReadMessage
MESSAGE_CREATEDMessage ReceivedMessage
MESSAGE_REJECTEDMessage RejectedMessage
MESSAGE_RENDERING_FAILEDMessage Rendering failedMessage
MESSAGE_SENTMessage SentMessage
MESSAGE_SENT_FOR_APPROVALMessage Sent For ApprovalMessage
MESSAGE_SUBSCRIPTION_UPDATEDMessage Subscription UpdatedMessage
MESSAGE_UPDATEDMessage UpdatedMessage
OUTBOUND_MESSAGE_CHANNEL_EVENTOutbound Message Channel EventMessage
OUTBOUND_WORKFLOW_UPDATEDOutbound Workflow UpdatedMessage
POST_TREND_METRICS_CHANGEPost Trend Metrics ChangeMessage
SOURCE_AGNOSTIC_MESSAGE_CREATEDSource Agnostic Message CreatedMessage
SOURCE_AGNOSTIC_MESSAGE_EDITEDSource Agnostic Message EditedMessage
PROFILE_CREATEDProfile CreatedProfile
PROFILE_DELETEDProfile DeletedProfile
PROFILE_SUBSCRIBEDProfile SubscribedProfile
PROFILE_UNSUBSCRIBEDProfile UnsubscribedProfile
PROFILE_UPDATEDProfile UpdatedProfile
PROFILES_MERGEDProfiles MergedProfile
RECOMMENDATION_CREATEDRecommendation Created EventRecommendation
SURVEY_RESPONSE_CREATEDSurvey Response CreatedSurvey Response
TASK_CREATETask CreateTask
TASK_DELETETask DeleteTask
TASK_UPDATETask UpdateTask
THREAD_CONTROL_UPDATEDThread Control UpdatedThread Control
UI_LOG_CREATEDUI Log CreatedUI Logging
USER_CREATEDUser CreateUser
USER_DELETEDUser DeleteUser
USER_UPDATEDUser UpdateUser
USER_ACTIVITY_CREATEDUser Activity CreatedUser Activity
USER_CURRENT_STATEUser Current StateUser Current State
VOICE_CALL_EVENT_UPDATESVoice Call Event UpdatesVoice Call Event Updates
VOICE_CALL_QUALITY_EVENTVoice Call Quality EventVoice Call Quality Event
WORK_QUEUE_CREATEDWork Queue CreateWork Queue
WORK_QUEUE_DELETEDWork Queue DeleteWork Queue
WORK_QUEUE_UPDATEDWork Queue UpdateWork Queue
WORKFLOW_UPDATEDWorkflow UpdatedWorkflow

Event payload shapes for each type are documented on the V2 portal under Webhook Response Payloads. The payload contract is unchanged by the V3 subscription API — V3 changes how you manage subscriptions, not what Sprinklr posts to your callback URL.


9. Use cases

9.1 Stand up a new case-event integration

  1. GET /webhook-subscriptions/webhook-types — confirm CASE_CREATED and CASE_UPDATED are available.
  2. POST /webhook-subscriptions with name, url, preSharedKey, and "subscriptions": ["CASE_CREATED","CASE_UPDATED"]. Store the returned id.
  3. POST /webhook-subscriptions/action?subscriptionId={id}&action=verify — expect "data": true.
  4. POST /webhook-subscriptions/action?subscriptionId={id}&action=activate.
  5. GET /webhook-subscriptions?subscriptionId={id} — confirm "verified": true and "active": true.

9.2 Restrict a subscription to one segment

Create the subscription with filteredSubscriptions instead of subscriptions, setting type to PARTNER_CUSTOM_PROPERTY, checkCondition to IS, and values to the property values you want, so only matching cases are dispatched. The GET example in §5.1 shows this shape on a live subscription.

9.3 Add an event type to a running integration

PUT /webhook-subscriptions?subscriptionId={id} with "addSubscriptions": ["CASE_CREATED"]. Use removeSubscriptions in the same call to drop types you no longer want. There is no need to deactivate and recreate the subscription.

9.4 Pause delivery during a downstream outage

POST /webhook-subscriptions/action?subscriptionId={id}&action=deactivate while your consumer is down, then action=activate when it is back. Deactivating stops dispatch without losing the subscription configuration. For events missed while deactivated, see the Webhook Replay and Retrieve API — failed webhook events are retrievable for 7 days.

9.5 Audit every subscription in a workspace

GET /webhook-subscriptions with no subscriptionId, paging with pageNumber and pageSize. Inspect lastSuccessTimestamp and lastFailedTimestamp on each record to find subscriptions whose endpoints have started failing.

9.6 Rotate a callback endpoint

No V3 operation updates url or preSharedKey on an existing subscription. Create a new subscription against the new URL, verify and activate it, confirm delivery, then DELETE the old one.


10. Caveats and best practices

Callback URL verification check

  • For any callback URL to work within a webhook subscription, a POST to that URL with an empty payload ({}) must return a 2XX response.
  • Test it directly before calling action=verify:
    curl -X POST 'https://{Callback Url}' \
    --header 'Content-Type: application/json' \
    --data-raw '{}'
  • The callback URL must be publicly reachable over the internet.

Webhook retries logic

  • Sprinklr's webhook retries logic works on a count of 10 seconds. Once the webhook is triggered, Sprinklr waits 10 seconds to receive an HTTP 200 status code.
  • If a webhook cannot be delivered successfully, it is retried three times through different queues (Queue 1 → Queue 2 → Queue 3) until the request receives a 200. Events that fail all three consecutive tries are stored in the Deleted Queue.
  • The default 10-second window is unalterable — changing it would delay every webhook in the queue.
  • Use an asynchronous webhook endpoint that returns 200 OK within 10 seconds. This avoids congestion at either the sender's or the receiver's end.

Payload signing

  • The payload is signed with the preSharedKey using SHA-256 and added to the header X-Hub-Signature with the value sha256={sha256 digested payload using the preSharedKey}. Validate this signature on every inbound request.
  • preSharedKey is required on create. Never log it or commit it.

Lifecycle

  • A newly created subscription is verified: false and active: false. It dispatches nothing until it is verified and activated.
  • verify and activate are separate actions — performing one does not perform the other.

Parameters

  • subscriptionId on GET accepts comma-separated IDs; on PUT, DELETE, and /action supply exactly one.
  • Do not wrap query values in braces. {6a0d7df617ab2359996fb225} is a Postman placeholder artifact, not a value format.
  • pageNumber is 0-based and is typed as string in sprinklr-v3.yaml, as are pageSize and sinceTime.

Responses

  • data is an array on GET /webhook-subscriptions even for a single-ID fetch.
  • POST /webhook-subscriptions/action returns a boolean in data — true on success, false otherwise. Inspect it; a 200 alone does not prove the action succeeded.
  • Always inspect the errors array even on a 200 response.

Authentication types

  • The V3 create schema exposes only preSharedKey and viaProxy. The additional authentication types available in the Sprinklr UI — Salesforce, Public URL, Basic Auth, OAuth 2.0, External Authentication Credentials, and Marketplace Apps — have no representation in the V3 request schema. Configure those in the UI (see Create and Manage Webhook Subscription in Sprinklr)

Rate limiting and server errors

  • No 429 or 5xx response is declared for these operations in sprinklr-v3.yaml. Implement retry with exponential backoff defensively rather than relying on the specification.