Skip to content

CFM Survey Response APIs V3 — Developer Guide


1. Overview

A survey response is a single completed submission against a Sprinklr CFM survey. It records what the respondent answered, who they were, how and when they answered, and any custom metadata attached to the response, the responder's profile, or the transaction that triggered the survey.

The CFM Survey Response APIs let you move response data programmatically in both directions. Per the Sprinklr Help Center: "You can leverage the Standard CRUD APIs for survey responses to programmatically create, retrieve, update, or delete response data within the Sprinklr system. This capability facilitates seamless integration with external systems and supports automated workflows."

Five operations are exposed across two paths — four methods on /api/v3/surveyResponse, plus a dedicated search path:

OperationMethodPathoperationId
Import (ingest) a survey responsePOST/api/v3/surveyResponseSurveyResponseApiV3_ingestSurveyResponse
Fetch survey response(s) by IDGET/api/v3/surveyResponse?id=SurveyResponseApiV3_fetchSurveyResponses
Search survey responsesPOST/api/v3/surveyResponse/search?surveyId=SurveyResponseApiV3_searchSurveyResponses
Update response custom fieldsPUT/api/v3/surveyResponse?id=SurveyResponseApiV3_updateSurveyResponse
Delete survey response(s) by IDDELETE/api/v3/surveyResponse?id=SurveyResponseApiV3_deleteSurveyResponses

This single-path, method-differentiated shape is the central design change in V3, and it matches the pattern already used by Profile V3 (/api/v3/profile) and Survey Transactions V3 (/api/v3/surveyTransactions). V2 spread the same capabilities across separately-named paths such as /api/v2/survey-response/{survey-response-id}.

1.1 The survey response data model

Response data is modeled in three layers. Understanding this model is the fastest way to understand every endpoint in this guide.

LayerObjectWhat it holds
Identity and contextsurveyId, responseId, responseStatus, surveyName, createdTime, surveyLanguage, surveyMode, surveyResponseType, responseType, distributionEntityId, surveyStartTime, surveyOpenTime, tagsWhich survey, which response, when, in what mode and language
Responder and deviceresponderSnId, responderSnType, browser, browserVersion, operatingSystem, deviceType, responseQualityWho answered, on what, and how trustworthy the answer is judged to be
Answers and metadataquestionResponses, customProperties, profileCustomProperties, transactionCustomPropertiesThe answers themselves, plus three separate namespaces of custom metadata

The three custom-metadata namespaces are the part most developers get wrong:

NamespaceScopeConfigured in
Response custom fieldsSpecific to this one responseGlobal Settings → Response Custom Fields
Profile custom fieldsAttached to the responder's audience profileProfile custom field configuration
Transaction custom fieldsAttached to the CFM transaction that triggered the surveyGlobal Settings → Transaction Fields

1.2 Addressing a survey response

A response is addressed by its responseId — for example 6a8c451269baf80612fb6417 — passed as the id query parameter.

sprinklr-v3.yaml describes id on GET and DELETE as a "Comma-separated list of survey response ids", so both operations are bulk-capable. On PUT the description is singular: "Survey response id."

To find a responseId in the Sprinklr UI:

  1. Open the Customer Feedback Management (CFM) persona app in Sprinklr.
  2. In the Programs tab, locate the survey whose responses you want.
  3. Hover over the survey. A View button is displayed. Click View.
  4. On the top bar, click Responses.
  5. The Response Id column values are the responseId.

To find a custom field's internal name:

  1. Open the CFM persona app and navigate to the Programs tab.
  2. Hover over the survey and click View.
  3. From the top navigation bar, click Settings.
  4. Scroll to Survey Custom Fields. It contains Transaction Fields and Response Custom Fields.
  5. Click View Fields next to the category you need.
  6. Find the field, click the three-dot menu (⋮), and select Copy Field Name to copy the internal field ID used in API requests.

Internal field names follow the pattern _c_<24-hex-id>, for example _c_67cb50793cae6f06c0c41de0.

1.3 Prerequisites

  1. CFM must be enabled in your environment. Per the Developer Portal: "CFM must be enabled in your environment before you can utilize these APIs. Please contact your Success Manager for more details."
  2. Permissions. Per the Help Center: "You would need View and Edit Response and Analytics permissions at the Survey Level." The API user must be able to access the survey's analytics in the UI.
  3. You must know the surveyId for the survey you are integrating with, and the specific responseId values for read, update, and delete operations.
  4. Request a sample payload from Sprinklr Support. All five supplied endpoint specifications carry the same Dev Note: "To use this API, you will need values for the parameters mentioned below. To obtain these values, reach out to Sprinklr Support at tickets@sprinklr.com."

2. Base URLs and environments

All API calls are sent to the production endpoint:

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

So the survey response resource in production is:

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

Replace {env} with your assigned environment identifier (prod0, prod2, prod3, prod4, prod5, prod6, prod8, prod11, prod12, prod15–prod19, prod21, prod24, production, spr-uat, azrqa — see APIs | Sprinklr Developer Portal for the authoritative list).


3. Authentication and common headers

All CFM Survey Response API calls are authenticated with OAuth 2.0. See API Overview for portal registration, API key and secret generation, and the Authorize flow.

HeaderValuePurposeRequired on
AuthorizationBearer {{accessToken}}Authenticates the user with the server. For generating the authorization token, see the Authorize section on the developer portal.All requests
Key{{apiKey}}Authenticates the application with the server. For generating an API key, see the Getting Started guide.All requests
Content-Typeapplication/jsonDeclares the request body media typePOST, PUT
Acceptapplication/jsonDeclares the acceptable response typeAll requests

4. Import a survey response

Imports a survey response from any external source — a CRM, an internal application, or an offline data-collection tool — into Sprinklr CFM.

POST /api/v3/surveyResponse

Request schema: SurveyResponseIngestionRequest — "Survey Response Ingestion Request"

4.1 Request body

ParameterSub-parameterTypeDescription
surveyId—StringUnique identifier of the survey for which the response is being submitted.
questionResponses—ObjectContains the responses provided for survey questions.
questionResponses<QUESTION_ID>Array[String]Maps a survey question ID to one or more response values.
responseTime—LongTimestamp in milliseconds since Unix epoch, representing when the survey response was submitted.
tags—Array[String]List of tags associated with the survey response.
distributionChannel—StringChannel through which the survey response was collected. For example, EXTERNAL_APPLICATION.
responseCustomFields—ObjectCustom fields associated with the survey response. Values are arrays of strings.
profileCustomFields—ObjectCustom fields associated with the responder's profile. Values are arrays of strings.
transactionCustomFields—ObjectCustom fields associated with the survey transaction. Values are arrays of strings.
responderSnId—StringUnique identifier of the responder in the source system. Can be null if not available.
responderSnType—StringType of source network associated with the responder. Can be null if not available.
surveyLanguage—StringLanguage in which the survey response was submitted. Can be null if not specified.
elapsedTime—LongTime taken by the responder to complete the survey, in milliseconds. Can be null if not available.
allCustomFields—ObjectConsolidated object containing all custom fields associated with the response, profile, and transaction.

sprinklr-v3.yaml declares no required array on SurveyResponseIngestionRequest, so no field is formally mandatory. In practice surveyId and questionResponses are the minimum meaningful payload.

4.2 Example request

curl --location 'https://api3.sprinklr.com/{env}/api/v3/surveyResponse' \
  --header 'Authorization: Bearer {{accessToken}}' \
  --header 'Key: {{apiKey}}' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --data '{
    "surveyId": "6a840fb9a64a419291aacd53",
    "questionResponses": {
      "422131e5-67e9-4e7d-8edf-448c7e455f0e": ["Neutral"]
    },
    "responseTime": 1738281600000,
    "tags": ["tag1"],
    "distributionChannel": "EXTERNAL_APPLICATION",
    "responseCustomFields": {
      "_c_67cb50793cae6f06c0c41de0": ["5"]
    },
    "profileCustomFields": {
      "_c_64cbf526fd8b0e259d72470a": ["20"]
    },
    "transactionCustomFields": {
      "_c_67056c1056182e36198d8eea": ["WHATSAPP"]
    },
    "responderSnId": null,
    "responderSnType": null,
    "surveyLanguage": null,
    "elapsedTime": null
  }'

4.3 Example response

{
  "data": {
    "responseId": "6a8c451269baf80612fb6417"
  },
  "errors": []
}

4.4 Response parameters

ParameterSub-parameterTypeDescription
data—ObjectContains details of the created survey response.
dataresponseIdStringUnique identifier of the survey response created successfully.
errors—ArrayContains details of any errors encountered while processing the request. Returns an empty array when the request is successful.

Persist data.responseId — it is the only handle for later fetch, update, or delete.


5. Fetch survey response(s)

Retrieves detailed information about a specific survey response using its unique ID.

GET /api/v3/surveyResponse?id={responseId}

Response schema (per sprinklr-v3.yaml): array of SurveyResponseDTO

5.1 Request parameters

ParameterInTypeRequired (spec)Description
idqueryStringrequired: false in the OpenAPI specification; Required in the supplied endpoint specificationComma-separated list of survey response IDs to retrieve.

5.2 Example request

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

5.3 Example response

{
  "data": [
    {
      "hasMore": false,
      "responses": [
        {
          "surveyId": "6a840fb9a64a419291aacd53",
          "responseId": "6a8c451269baf80612fb6417",
          "responseStatus": "COMPLETE_RESPONSES",
          "createdTime": 1738281600000,
          "surveyMode": "STANDARD",
          "surveyResponseType": "STANDARD",
          "responderSnId": "6a8c451269baf80612fb6416",
          "responderSnType": "EXTERNAL_APPLICATION",
          "responseQuality": "NA",
          "questionResponses": {
            "422131e5-67e9-4e7d-8edf-448c7e455f0e": ["Neutral"]
          },
          "customProperties": {},
          "profileCustomProperties": {},
          "transactionCustomProperties": {}
        }
      ],
      "metadata": {
        "customFieldLookup": {},
        "questionLookup": {
          "422131e5-67e9-4e7d-8edf-448c7e455f0e": "Question"
        }
      }
    }
  ],
  "errors": []
}

5.4 Response parameters

ParameterSub-parameterTypeDescription
data—Array[Object]Contains the survey response details and related metadata.
datahasMoreBooleanIndicates whether additional survey responses are available for retrieval.
dataresponsesArray[Object]Contains the list of survey responses.
data.responsessurveyIdStringUnique identifier of the survey associated with the response.
data.responsesresponseIdStringUnique identifier of the survey response.
data.responsesresponseStatusStringStatus of the survey response. See §11.1.
data.responsesresponseTypeStringResponse type. Declared in the schema; not present in the supplied sample.
data.responsessurveyNameStringName of the survey. Declared in the schema; not present in the supplied sample.
data.responsescreatedTimeLongTimestamp in milliseconds since Unix epoch, indicating when the response was created.
data.responsessurveyLanguageStringLanguage in which the survey was taken.
data.responsessurveyModeStringMode in which the survey was conducted. See §11.2.
data.responsessurveyResponseTypeStringType of survey response, for example STANDARD.
data.responsesdistributionEntityIdStringID of the distribution entity.
data.responsesresponderSnIdStringUnique identifier of the responder in the source system.
data.responsesresponderSnTypeStringSource network or channel through which the response was received.
data.responsessurveyStartTimeLongTimestamp at which the respondent started the survey. Declared in the schema; not present in the supplied sample.
data.responsessurveyOpenTimeLongTimestamp at which the survey was opened. Declared in the schema; not present in the supplied sample.
data.responsestagsArray[String]Tags associated with the response.
data.responsesbrowserStringBrowser used by the respondent.
data.responsesbrowserVersionStringVersion of the browser.
data.responsesoperatingSystemStringOperating system of the responder.
data.responsesdeviceTypeStringType of device used. See §11.3.
data.responsesresponseQualityStringQuality evaluation of the survey response. See §11.4.
data.responsesquestionResponsesObjectContains responses mapped to survey question identifiers.
data.responses.questionResponses<QUESTION_ID>Array[String]Response value(s) submitted for the corresponding survey question.
data.responsescustomPropertiesObjectCustom properties associated with the survey response.
data.responsesprofileCustomPropertiesObjectCustom properties associated with the responder's profile.
data.responsestransactionCustomPropertiesObjectCustom properties associated with the survey transaction.
datametadataObjectContains metadata related to the survey response.
errors—ArrayContains details of any errors encountered. Empty array when the request is successful.

5.5 Metadata parameters

The metadata object is what makes a response payload human-readable: it maps opaque identifiers back to display names.

ParameterTypeDescription
metadataObjectContains supplementary information used to interpret and map survey response data.
metadata.questionLookupObjectMaps survey question identifiers to their display names.
metadata.questionLookup.<QUESTION_ID>StringHuman-readable name of the corresponding survey question.
metadata.customFieldLookupObjectMaps custom field identifiers to their corresponding field names or definitions.
metadata.customFieldLookup.<CUSTOM_FIELD_ID>StringHuman-readable name of the corresponding custom field. Returned when custom fields are available in the response.

6. Search survey responses

Searches survey responses for a specific survey, with pagination and filtering.

POST /api/v3/surveyResponse/search?surveyId={surveyId}

*** SurveyResponseFetchRequest — "Survey Response Fetch Request"

Per the Help Center, this operation exists to "Obtain a list of survey responses that fulfill particular filtering criteria, including survey custom properties or responder characteristics… Collect survey responses in large quantities according to specific criteria for the purpose of reporting or integration."

6.1 Query parameters

ParameterInTypeRequired (spec)Description
surveyIdqueryStringrequired: falseUnique identifier of the survey whose responses are searched.

6.2 Request body

Two incompatible request-body shapes are documented. Both are reproduced here because neither can be dismissed from the available evidence.

ParameterSub-parameterTypeDescription
page—IntegerSpecifies the page number to retrieve. Pagination starts from 0.
pageSize—IntegerSpecifies the maximum number of records to return per page.
ParameterSub-parameterTypeDescription
page—Page objectPagination descriptor.
pagestartInteger (int32)Start of the page in search results.
pagesizeInteger (int32)Size of the page in search results.
pagecursorStringCursor for resuming a paginated search.
filters—Array[Filter_shifu]Filters to apply to the search.
filters[]fieldStringSpecifies the field on which the filter is applied.
filters[]filterTypeStringFilter type, for example IN.
filters[]valuesArray[Object]Specifies values for this filter.
filters[]detailsObjectAdditional details for the filter — for example {"fieldName": "_c_67ce77b1ddff1d4b9bc831ce"}.
filters[]filtersArray[Filter_shifu]Nested filters.

6.3 Documented filter types

Search value typeFilter typeDescription
StringINMatches records where the field value exists in the specified list of values.
StringTOPICFilters data using one or more Topic IDs provided in the filter values.

Values in the supplied table listed as filter types but which are in fact properties of a filter, not types:

PropertyTypeDescription
filterValues (spec: values)Array[String]List of values used for filtering. For example, topic IDs, category IDs, or other dimension values.
dimension (spec: field)StringSpecifies the dimension or field on which the filter is applied.

V2 documents SURVEY_CUSTOM_PROPERTY as a field value, paired with details.fieldName carrying the internal custom-field ID.

6.4 Example request

curl --location 'https://api3.sprinklr.com/{env}/api/v3/surveyResponse/search?surveyId=6a840fb9a64a419291aacd53' \
  --header 'Authorization: Bearer {{accessToken}}' \
  --header 'Key: {{apiKey}}' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --data '{
    "page": 0,
    "pageSize": 20
  }'
curl --location 'https://api3.sprinklr.com/{env}/api/v3/surveyResponse/search?surveyId=6a840fb9a64a419291aacd53' \
  --header 'Authorization: Bearer {{accessToken}}' \
  --header 'Key: {{apiKey}}' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --data '{
    "page": {
      "start": 0,
      "size": 20
    },
    "filters": [
      {
        "field": "SURVEY_CUSTOM_PROPERTY",
        "filterType": "IN",
        "values": ["Promoter"],
        "details": {
          "fieldName": "_c_67ce77b1ddff1d4b9bc831ce"
        }
      }
    ]
  }'

6.5 Example response

{
  "data": {
    "hasMore": false
  },
  "errors": []
}
ParameterSub-parameterTypeDescription
data—ObjectContains the response details returned by the API.
datahasMoreBooleanIndicates whether additional records are available for retrieval. false means there are no more records.
errors—ArrayContains details of any errors encountered. Empty array when the request is successful.

7. Update survey response custom fields

Updates the custom fields on an existing survey response. Per the Help Center, use it to "Change particular areas in a survey response, including the modification of tags, custom fields, or metadata… Improve or enhance current replies by adding missing information or making corrections. Utilize this API for performing bulk updates through scripts."

PUT /api/v3/surveyResponse?id={responseId}

Request schema: SurveyResponseUpdateV3Request — "Request body for updating CFM survey response custom fields via API v3."

7.1 Request parameters

ParameterInTypeRequired (spec)Description
idqueryStringrequired: falseSurvey response ID.

7.2 Request body

ParameterSub-parameterTypeDescription
responseCustomFields—ObjectSurvey response custom fields to update.
responseCustomFields<CUSTOM_FIELD_KEY>Array[String]Custom field identifier and its corresponding value.
profileCustomFields—ObjectProfile custom fields to update.
profileCustomFields<CUSTOM_FIELD_KEY>Array[String]Custom profile field identifier and its corresponding value.
transactionCustomFields—ObjectTransaction custom fields to update.
transactionCustomFields<CUSTOM_FIELD_KEY>Array[String]Custom transaction field identifier and its corresponding value.

Only custom fields can be updated. Answers (questionResponses), responseStatus, tags, and every system field are not writable through this endpoint. Despite the method being PUT, the operation summary in sprinklr-v3.yaml is "Update survey response custom fields by id" — it is scoped to the three custom-field namespaces only.

7.3 Example request

curl --location --request PUT 'https://api3.sprinklr.com/{env}/api/v3/surveyResponse?id=6a8c451269baf80612fb6417' \
  --header 'Authorization: Bearer {{accessToken}}' \
  --header 'Key: {{apiKey}}' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --data '{
    "responseCustomFields": {
      "_c_67cb50793cae6f06c0c41de0": ["5"]
    },
    "profileCustomFields": {
      "_c_64cbf526fd8b0e259d72470a": ["20"]
    },
    "transactionCustomFields": {
      "_c_67056c1056182e36198d8eea": ["WHATSAPP"]
    }
  }'

7.4 Example response

The sources disagree.

SourceDeclared response
sprinklr-v3.yaml200 Success, application/json, $ref: APIResponse
Supplied specification — "Example Response"HTTP/1.1 204 (No Content)

8. Delete survey response(s)

Permanently deletes a survey response using its unique ID. Per the Help Center, use it to "Remove any duplicate, test, or incorrect entries from the system."

DELETE /api/v3/surveyResponse?id={responseId}

8.1 Request parameters

ParameterInTypeRequired (spec)Description
idqueryStringrequired: false in the OpenAPI specification; Required in the supplied endpoint specificationComma-separated list of survey response IDs to delete.

8.2 Example request

curl --location --request DELETE 'https://api3.sprinklr.com/{env}/api/v3/surveyResponse?id=6a8c451269baf80612fb6417' \
  --header 'Authorization: Bearer {{accessToken}}' \
  --header 'Key: {{apiKey}}' \
  --header 'Accept: application/json'

8.3 Example response

SourceDeclared response
sprinklr-v3.yaml200 Success, application/json, $ref: APIResponse
Supplied specification — "Example Response"HTTP/1.1 204 (No Content)

9. Response format and status codes

9.1 The response envelope

FieldTypeDescription
dataObject or ArrayThe operation payload. An object with responseId on POST; an array of wrapper objects on GET; an object with hasMore on POST /search. Unconfirmed on PUT and DELETE.
errorsArray of ErrorThe list of errors. Empty on success.
metadataResponseMetadataResponse metadata.

9.2 Status codes

Declared in sprinklr-v3.yaml for all five operations:

CodeMeaningTypical cause
200SuccessThe request was processed. Inspect errors before assuming complete success.
400Bad RequestMalformed JSON, an unknown surveyId, an unrecognised custom-field key, a custom-field value sent as a bare string instead of an array, or a responseTime sent as a formatted string instead of epoch milliseconds.
401UnauthorizedMissing, expired, or invalid Authorization token.
403ForbiddenThe caller lacks View and Edit Response and Analytics permission at the survey level, or CFM is not enabled for the environment.
404Not FoundNo survey response exists for the supplied id, or the surveyId does not exist.

Per the Help Center's testing guidance, a successful ingestion should return 200 OK and the response should then be visible in the Sprinklr UI under the Survey Responses tab.


10. Migrating from V2

10.1 Endpoint mapping

V2 operationV2 pathV3 equivalent
Ingest response (bulk or single)POST /api/v2/survey-response (surveyId in header)POST /api/v3/surveyResponse (surveyId in body)
Get responses using filtersPOST with filters body (surveyId in header)POST /api/v3/surveyResponse/search?surveyId=
Get response by IDGET /api/v2/survey-response/{survey-response-id}GET /api/v3/surveyResponse?id=
Update response by IDPUT with updates wrapper (responseID in header)PUT /api/v3/surveyResponse?id=
Delete response by IDDELETE (responseID in header)DELETE /api/v3/surveyResponse?id=

10.2 Identifier passing — the biggest behavioural change

This is the change most likely to break a V2 client silently.

IdentifierV2V3
surveyId on ingestRequest headerRequest body
surveyId on searchRequest headerQuery parameter ?surveyId=
responseId on getPath segment /survey-response/{id}Query parameter ?id=
responseId on updateRequest headerQuery parameter ?id=
responseId on deleteRequest headerQuery parameter ?id=

V2 routinely carried business identifiers in headers. V3 moves every one of them into the URL or the body. A client that keeps setting the V2 headers will send them harmlessly but will address no resource, producing 400 or 404.

10.3 Request body restructuring

Ingest — the customFields wrapper is removed.

V2:

{
  "questionResponses": { "questionID": ["Free-text answer"] },
  "responseTime": "2025-03-06 15:00:00",
  "customFields": {
    "responseCustomFields": { "_c_67cb50793cae6f06c0c41de0": ["5"] },
    "transactionCustomFields": { "_c_67056c1056182e36198d8eea": ["WHATSAPP"] },
    "profileCustomFields": { "_c_64cbf526fd8b0e259d72470a": ["20"] }
  }
}

V3 — the three objects move to the top level, and surveyId joins them:

{
  "surveyId": "6a840fb9a64a419291aacd53",
  "questionResponses": { "questionID": ["Free-text answer"] },
  "responseTime": 1738281600000,
  "responseCustomFields": { "_c_67cb50793cae6f06c0c41de0": ["5"] },
  "transactionCustomFields": { "_c_67056c1056182e36198d8eea": ["WHATSAPP"] },
  "profileCustomFields": { "_c_64cbf526fd8b0e259d72470a": ["20"] }
}

11. Reference values

The enum values below are documented on the V2 Fetch Survey Response reference page. The corresponding fields in sprinklr-v3.yaml are declared as unconstrained type: string with no enum, so these values are carried forward from V2 documentation rather than from the V3 specification. They should be added as enums to the V3 schema

11.1 responseStatus

ValueMeaning
COMPLETE_RESPONSESThe respondent completed the survey.
ARCHIVED_RESPONSESThe response has been archived.
IMPORTED_RESPONSESThe response was imported from an external source.
LIVE_RESPONSESThe response is live.
TEST_RESPONSESThe response was captured during testing.

11.2 surveyMode

ValueMeaning
STANDARDStandard survey presentation.
CONVERSATIONALConversational survey presentation.

11.3 deviceType

ValueMeaning
COMPUTERDesktop or laptop computer.
MOBILEMobile phone.
TABLETTablet.
GAME_CONSOLEGames console.
DMRDigital media receiver.
WEARABLEWearable device.
UNKNOWNDevice type could not be determined.

11.4 responseQuality

AI-generated quality assessment of the response.

ValueMeaning
N/AQuality assessment has not been generated yet. Returned as NA in the V3 sample payload.
HighHigh-quality response.
MediumMedium-quality response.
LowLow-quality response.
BotThe system has flagged the submission as a bot response.

11.6 Filter fields

ValueMeaning
SURVEY_CUSTOM_PROPERTYFilter on a survey custom property. Pair with details.fieldName carrying the internal custom-field ID. Source: V2 Help Center sample.

12. Use cases

  1. Bulk import of historical responses from a legacy platform. Iterate a legacy export and POST each response with its original responseTime and surveyLanguage. Per the Help Center this "Facilitates the automatic integration of large quantities of survey responses from external systems into Sprinklr."

  2. Real-time sync from an offline collection tool. Kiosk or field-agent applications collect feedback without connectivity, then ingest queued responses when the device reconnects, preserving the true responseTime rather than the upload time.

  3. CRM-triggered feedback capture. When a CRM records a closed case, submit the associated survey response with transactionCustomFields carrying the case attributes, so the response is analysable alongside the interaction that produced it.

  4. Feeding a downstream analytics warehouse. Page through POST /search on a schedule, resolve question IDs via metadata.questionLookup, and load flattened rows into a warehouse. This "Enables downstream analytics tools to retrieve or modify response data as required."

  5. Backfilling custom fields on historical responses. A new segmentation attribute is defined after responses were collected. Script a PUT across the affected responseId values to populate it — the Help Center's documented pattern of "bulk updates on older responses in light of the latest information for analytical purposes."

  6. Enriching responses with profile data resolved later. A response arrives anonymously and the responder is identified afterwards. Use PUT to attach profileCustomFields once the identity is known.

  7. Correcting a mis-mapped custom field. An ingestion job wrote the wrong internal field name. Fetch the affected responses, then PUT the corrected mapping — subject to confirming replace-versus-merge semantics.

  8. Purging test and duplicate submissions before reporting. Search for responses with responseStatus of TEST_RESPONSES, then DELETE them so they do not distort dashboards.

  9. Filtering out low-quality and bot responses. Use responseQuality to identify Bot and Low submissions and either delete them or tag them for exclusion, protecting score integrity.

  10. Auditing a single response after a customer complaint. Fetch by responseId to inspect exactly what was answered, on what device and browser, and at what time — the audit use case the Help Center describes as "Obtain a particular reply for examination, auditing, or modification."

  11. Data-subject erasure. Search for a responder's submissions, then delete each by ID. Confirm the permanence of deletion before relying on this for a compliance workflow.


13. Caveats and best practices

Verify required fields before ingestion. The Help Center is explicit: "Always verify the necessary fields prior to ingestion." SurveyResponseIngestionRequest declares no required array, so the server will accept structurally valid but semantically empty payloads. Validate client-side.

Batch large ingestions. Per the Help Center: "Utilize APIs in groups for large-scale data ingestion to minimize overhead." No maximum batch size or request-size limit is documented, so keep batches conservative until one is confirmed.

Filter searches narrowly. Per the Help Center: "Utilize filtering with appropriate fields to refine GET APIs and prevent timeouts." An unfiltered search over a high-volume survey is the most likely cause of a timeout on this API.

Custom field values are always arrays of strings. ["5"], never "5" and never 5. This applies on ingest and on update, across all three namespaces.

Request and response custom-field names differ. Requests use responseCustomFields / profileCustomFields / transactionCustomFields; responses use customProperties / profileCustomProperties / transactionCustomProperties. Write an explicit bidirectional mapping.

Never hard-code question IDs. Resolve them through metadata.questionLookup on every fetch. Question IDs change when a survey is edited or cloned, and some IDs are compound (<questionId>_<optionId>, as in the V2 sample c958057e-…_778dcad1-…).

PUT is not a general-purpose update. It writes custom fields only. Answers, status, and system fields cannot be modified through this API.

Treat PUT as potentially destructive until proven otherwise. With replace semantics, a payload containing one custom field could erase all the others.

PATCH does not exist. Do not build against the PATCH operation.

Guard DELETE client-side. id is declared optional on a destructive operation. Assert it is non-empty before dispatching, and consider requiring an explicit confirmation flag in any script that deletes in bulk.

Test the round trip in the UI. The Help Center recommends starting with a test survey and a test responder address such as test@sprinklr.com, confirming the API returns 200 OK, and then "verify that the response is visible in the Sprinklr UI under the Survey Responses tab." An API success does not by itself prove the response was indexed.

Do not assume idempotency. No idempotency key, deduplication window, or uniqueness constraint is documented for ingestion. A retried POST will most likely create a duplicate response and distort your scores. Deduplicate at the client.

Rate limits are undocumented. No rate-limit headers, quotas, or 429 responses are declared. Build in client-side throttling and exponential backoff regardless.

Timestamps are epoch milliseconds in V3. responseTime, createdTime, surveyStartTime, surveyOpenTime, and elapsedTime are all int64. V2's formatted-string responseTime will be rejected.

Keep credentials and session artefacts out of examples. Strip Cookie: JSESSIONID headers, and never paste live tokens into tickets or shared Postman collections.


14. Quick reference

14.1 Operations

OperationMethodPathRequired inputSuccess payload
Import responsePOST/api/v3/surveyResponseBody: surveyId, questionResponses200 — data.responseId
Fetch response(s)GET/api/v3/surveyResponse?id=Query: id (comma-separated)200 — data[] with responses[] and metadata
Search responsesPOST/api/v3/surveyResponse/search?surveyId=Query: surveyId; Body: pagination (shape unsettled)200 — data.hasMore
Update custom fieldsPUT/api/v3/surveyResponse?id=Query: id; Body: three custom-field objects200 or 204 (unsettled)
Delete response(s)DELETE/api/v3/surveyResponse?id=Query: id (comma-separated)200 or 204 (unsettled)
Partial updatePATCH—Not implemented.—
EndpointMethodPurpose
/api/v3/cfmWorkflow/triggerPOSTTrigger a CFM workflow for an existing profile. See the CFM Workflow API V3 developer guide.
/api/v3/cfmWorkflow/triggerWithNewProfilePOSTCreate or update a profile and trigger a CFM workflow. See the CFM Workflow API V3 developer guide.
/api/v3/surveyTransactionsPOST, GET, DELETEManage CFM transactions. See the CFM Transaction APIs V3 developer guide.
/api/v3/surveyDistribution/transactions/linkPOSTCreate a personalized survey transaction link.

14.3 Required headers

Authorization: Bearer {{accessToken}}
Key: {{apiKey}}
Content-Type: application/json      # POST and PUT only
Accept: application/json