- Applies to: Sprinklr Customer Feedback Management (CFM) Survey Response APIs V3 (
/api/v3/surveyResponse) - V2 API reference: CFM Survey Response APIs | Sprinklr Developer Portal · Fetch Survey Response (V2)
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:
| Operation | Method | Path | operationId |
|---|---|---|---|
| Import (ingest) a survey response | POST | /api/v3/surveyResponse | SurveyResponseApiV3_ingestSurveyResponse |
| Fetch survey response(s) by ID | GET | /api/v3/surveyResponse?id= | SurveyResponseApiV3_fetchSurveyResponses |
| Search survey responses | POST | /api/v3/surveyResponse/search?surveyId= | SurveyResponseApiV3_searchSurveyResponses |
| Update response custom fields | PUT | /api/v3/surveyResponse?id= | SurveyResponseApiV3_updateSurveyResponse |
| Delete survey response(s) by ID | DELETE | /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}.
Response data is modeled in three layers. Understanding this model is the fastest way to understand every endpoint in this guide.
| Layer | Object | What it holds |
|---|---|---|
| Identity and context | surveyId, responseId, responseStatus, surveyName, createdTime, surveyLanguage, surveyMode, surveyResponseType, responseType, distributionEntityId, surveyStartTime, surveyOpenTime, tags | Which survey, which response, when, in what mode and language |
| Responder and device | responderSnId, responderSnType, browser, browserVersion, operatingSystem, deviceType, responseQuality | Who answered, on what, and how trustworthy the answer is judged to be |
| Answers and metadata | questionResponses, customProperties, profileCustomProperties, transactionCustomProperties | The answers themselves, plus three separate namespaces of custom metadata |
The three custom-metadata namespaces are the part most developers get wrong:
| Namespace | Scope | Configured in |
|---|---|---|
| Response custom fields | Specific to this one response | Global Settings → Response Custom Fields |
| Profile custom fields | Attached to the responder's audience profile | Profile custom field configuration |
| Transaction custom fields | Attached to the CFM transaction that triggered the survey | Global Settings → Transaction Fields |
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:
- Open the Customer Feedback Management (CFM) persona app in Sprinklr.
- In the Programs tab, locate the survey whose responses you want.
- Hover over the survey. A View button is displayed. Click View.
- On the top bar, click Responses.
- The Response Id column values are the
responseId.
To find a custom field's internal name:
- Open the CFM persona app and navigate to the Programs tab.
- Hover over the survey and click View.
- From the top navigation bar, click Settings.
- Scroll to Survey Custom Fields. It contains Transaction Fields and Response Custom Fields.
- Click View Fields next to the category you need.
- 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.
- 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."
- 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.
- You must know the
surveyIdfor the survey you are integrating with, and the specificresponseIdvalues for read, update, and delete operations. - 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."
All API calls are sent to the production endpoint:
https://api3.sprinklr.com/{env}/api/v3So the survey response resource in production is:
https://api3.sprinklr.com/{env}/api/v3/surveyResponseReplace {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).
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.
| Header | Value | Purpose | Required on |
|---|---|---|---|
Authorization | Bearer {{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-Type | application/json | Declares the request body media type | POST, PUT |
Accept | application/json | Declares the acceptable response type | All requests |
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/surveyResponseRequest schema: SurveyResponseIngestionRequest — "Survey Response Ingestion Request"
| Parameter | Sub-parameter | Type | Description |
|---|---|---|---|
surveyId | — | String | Unique identifier of the survey for which the response is being submitted. |
questionResponses | — | Object | Contains the responses provided for survey questions. |
questionResponses | <QUESTION_ID> | Array[String] | Maps a survey question ID to one or more response values. |
responseTime | — | Long | Timestamp in milliseconds since Unix epoch, representing when the survey response was submitted. |
tags | — | Array[String] | List of tags associated with the survey response. |
distributionChannel | — | String | Channel through which the survey response was collected. For example, EXTERNAL_APPLICATION. |
responseCustomFields | — | Object | Custom fields associated with the survey response. Values are arrays of strings. |
profileCustomFields | — | Object | Custom fields associated with the responder's profile. Values are arrays of strings. |
transactionCustomFields | — | Object | Custom fields associated with the survey transaction. Values are arrays of strings. |
responderSnId | — | String | Unique identifier of the responder in the source system. Can be null if not available. |
responderSnType | — | String | Type of source network associated with the responder. Can be null if not available. |
surveyLanguage | — | String | Language in which the survey response was submitted. Can be null if not specified. |
elapsedTime | — | Long | Time taken by the responder to complete the survey, in milliseconds. Can be null if not available. |
allCustomFields | — | Object | Consolidated 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.
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
}'{
"data": {
"responseId": "6a8c451269baf80612fb6417"
},
"errors": []
}| Parameter | Sub-parameter | Type | Description |
|---|---|---|---|
data | — | Object | Contains details of the created survey response. |
data | responseId | String | Unique identifier of the survey response created successfully. |
errors | — | Array | Contains 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.
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
| Parameter | In | Type | Required (spec) | Description |
|---|---|---|---|---|
id | query | String | required: false in the OpenAPI specification; Required in the supplied endpoint specification | Comma-separated list of survey response IDs to retrieve. |
curl --location 'https://api3.sprinklr.com/{env}/api/v3/surveyResponse?id=6a8c451269baf80612fb6417' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Accept: application/json'{
"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": []
}| Parameter | Sub-parameter | Type | Description |
|---|---|---|---|
data | — | Array[Object] | Contains the survey response details and related metadata. |
data | hasMore | Boolean | Indicates whether additional survey responses are available for retrieval. |
data | responses | Array[Object] | Contains the list of survey responses. |
data.responses | surveyId | String | Unique identifier of the survey associated with the response. |
data.responses | responseId | String | Unique identifier of the survey response. |
data.responses | responseStatus | String | Status of the survey response. See §11.1. |
data.responses | responseType | String | Response type. Declared in the schema; not present in the supplied sample. |
data.responses | surveyName | String | Name of the survey. Declared in the schema; not present in the supplied sample. |
data.responses | createdTime | Long | Timestamp in milliseconds since Unix epoch, indicating when the response was created. |
data.responses | surveyLanguage | String | Language in which the survey was taken. |
data.responses | surveyMode | String | Mode in which the survey was conducted. See §11.2. |
data.responses | surveyResponseType | String | Type of survey response, for example STANDARD. |
data.responses | distributionEntityId | String | ID of the distribution entity. |
data.responses | responderSnId | String | Unique identifier of the responder in the source system. |
data.responses | responderSnType | String | Source network or channel through which the response was received. |
data.responses | surveyStartTime | Long | Timestamp at which the respondent started the survey. Declared in the schema; not present in the supplied sample. |
data.responses | surveyOpenTime | Long | Timestamp at which the survey was opened. Declared in the schema; not present in the supplied sample. |
data.responses | tags | Array[String] | Tags associated with the response. |
data.responses | browser | String | Browser used by the respondent. |
data.responses | browserVersion | String | Version of the browser. |
data.responses | operatingSystem | String | Operating system of the responder. |
data.responses | deviceType | String | Type of device used. See §11.3. |
data.responses | responseQuality | String | Quality evaluation of the survey response. See §11.4. |
data.responses | questionResponses | Object | Contains responses mapped to survey question identifiers. |
data.responses.questionResponses | <QUESTION_ID> | Array[String] | Response value(s) submitted for the corresponding survey question. |
data.responses | customProperties | Object | Custom properties associated with the survey response. |
data.responses | profileCustomProperties | Object | Custom properties associated with the responder's profile. |
data.responses | transactionCustomProperties | Object | Custom properties associated with the survey transaction. |
data | metadata | Object | Contains metadata related to the survey response. |
errors | — | Array | Contains details of any errors encountered. Empty array when the request is successful. |
The metadata object is what makes a response payload human-readable: it maps opaque identifiers back to display names.
| Parameter | Type | Description |
|---|---|---|
metadata | Object | Contains supplementary information used to interpret and map survey response data. |
metadata.questionLookup | Object | Maps survey question identifiers to their display names. |
metadata.questionLookup.<QUESTION_ID> | String | Human-readable name of the corresponding survey question. |
metadata.customFieldLookup | Object | Maps custom field identifiers to their corresponding field names or definitions. |
metadata.customFieldLookup.<CUSTOM_FIELD_ID> | String | Human-readable name of the corresponding custom field. Returned when custom fields are available in the response. |
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."
| Parameter | In | Type | Required (spec) | Description |
|---|---|---|---|---|
surveyId | query | String | required: false | Unique identifier of the survey whose responses are searched. |
Two incompatible request-body shapes are documented. Both are reproduced here because neither can be dismissed from the available evidence.
| Parameter | Sub-parameter | Type | Description |
|---|---|---|---|
page | — | Integer | Specifies the page number to retrieve. Pagination starts from 0. |
pageSize | — | Integer | Specifies the maximum number of records to return per page. |
| Parameter | Sub-parameter | Type | Description |
|---|---|---|---|
page | — | Page object | Pagination descriptor. |
page | start | Integer (int32) | Start of the page in search results. |
page | size | Integer (int32) | Size of the page in search results. |
page | cursor | String | Cursor for resuming a paginated search. |
filters | — | Array[Filter_shifu] | Filters to apply to the search. |
filters[] | field | String | Specifies the field on which the filter is applied. |
filters[] | filterType | String | Filter type, for example IN. |
filters[] | values | Array[Object] | Specifies values for this filter. |
filters[] | details | Object | Additional details for the filter — for example {"fieldName": "_c_67ce77b1ddff1d4b9bc831ce"}. |
filters[] | filters | Array[Filter_shifu] | Nested filters. |
| Search value type | Filter type | Description |
|---|---|---|
| String | IN | Matches records where the field value exists in the specified list of values. |
| String | TOPIC | Filters 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:
| Property | Type | Description |
|---|---|---|
filterValues (spec: values) | Array[String] | List of values used for filtering. For example, topic IDs, category IDs, or other dimension values. |
dimension (spec: field) | String | Specifies 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.
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"
}
}
]
}'{
"data": {
"hasMore": false
},
"errors": []
}| Parameter | Sub-parameter | Type | Description |
|---|---|---|---|
data | — | Object | Contains the response details returned by the API. |
data | hasMore | Boolean | Indicates whether additional records are available for retrieval. false means there are no more records. |
errors | — | Array | Contains details of any errors encountered. Empty array when the request is successful. |
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."
| Parameter | In | Type | Required (spec) | Description |
|---|---|---|---|---|
id | query | String | required: false | Survey response ID. |
| Parameter | Sub-parameter | Type | Description |
|---|---|---|---|
responseCustomFields | — | Object | Survey response custom fields to update. |
responseCustomFields | <CUSTOM_FIELD_KEY> | Array[String] | Custom field identifier and its corresponding value. |
profileCustomFields | — | Object | Profile custom fields to update. |
profileCustomFields | <CUSTOM_FIELD_KEY> | Array[String] | Custom profile field identifier and its corresponding value. |
transactionCustomFields | — | Object | Transaction 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.
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"]
}
}'The sources disagree.
| Source | Declared response |
|---|---|
sprinklr-v3.yaml | 200 Success, application/json, $ref: APIResponse |
| Supplied specification — "Example Response" | HTTP/1.1 204 (No Content) |
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}| Parameter | In | Type | Required (spec) | Description |
|---|---|---|---|---|
id | query | String | required: false in the OpenAPI specification; Required in the supplied endpoint specification | Comma-separated list of survey response IDs to delete. |
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'| Source | Declared response |
|---|---|
sprinklr-v3.yaml | 200 Success, application/json, $ref: APIResponse |
| Supplied specification — "Example Response" | HTTP/1.1 204 (No Content) |
| Field | Type | Description |
|---|---|---|
data | Object or Array | The 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. |
errors | Array of Error | The list of errors. Empty on success. |
metadata | ResponseMetadata | Response metadata. |
Declared in sprinklr-v3.yaml for all five operations:
| Code | Meaning | Typical cause |
|---|---|---|
200 | Success | The request was processed. Inspect errors before assuming complete success. |
400 | Bad Request | Malformed 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. |
401 | Unauthorized | Missing, expired, or invalid Authorization token. |
403 | Forbidden | The caller lacks View and Edit Response and Analytics permission at the survey level, or CFM is not enabled for the environment. |
404 | Not Found | No 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.
| V2 operation | V2 path | V3 equivalent |
|---|---|---|
| Ingest response (bulk or single) | POST /api/v2/survey-response (surveyId in header) | POST /api/v3/surveyResponse (surveyId in body) |
| Get responses using filters | POST with filters body (surveyId in header) | POST /api/v3/surveyResponse/search?surveyId= |
| Get response by ID | GET /api/v2/survey-response/{survey-response-id} | GET /api/v3/surveyResponse?id= |
| Update response by ID | PUT with updates wrapper (responseID in header) | PUT /api/v3/surveyResponse?id= |
| Delete response by ID | DELETE (responseID in header) | DELETE /api/v3/surveyResponse?id= |
This is the change most likely to break a V2 client silently.
| Identifier | V2 | V3 |
|---|---|---|
surveyId on ingest | Request header | Request body |
surveyId on search | Request header | Query parameter ?surveyId= |
responseId on get | Path segment /survey-response/{id} | Query parameter ?id= |
responseId on update | Request header | Query parameter ?id= |
responseId on delete | Request header | Query 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.
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"] }
}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
| Value | Meaning |
|---|---|
COMPLETE_RESPONSES | The respondent completed the survey. |
ARCHIVED_RESPONSES | The response has been archived. |
IMPORTED_RESPONSES | The response was imported from an external source. |
LIVE_RESPONSES | The response is live. |
TEST_RESPONSES | The response was captured during testing. |
| Value | Meaning |
|---|---|
STANDARD | Standard survey presentation. |
CONVERSATIONAL | Conversational survey presentation. |
| Value | Meaning |
|---|---|
COMPUTER | Desktop or laptop computer. |
MOBILE | Mobile phone. |
TABLET | Tablet. |
GAME_CONSOLE | Games console. |
DMR | Digital media receiver. |
WEARABLE | Wearable device. |
UNKNOWN | Device type could not be determined. |
AI-generated quality assessment of the response.
| Value | Meaning |
|---|---|
N/A | Quality assessment has not been generated yet. Returned as NA in the V3 sample payload. |
High | High-quality response. |
Medium | Medium-quality response. |
Low | Low-quality response. |
Bot | The system has flagged the submission as a bot response. |
| Value | Meaning |
|---|---|
SURVEY_CUSTOM_PROPERTY | Filter on a survey custom property. Pair with details.fieldName carrying the internal custom-field ID. Source: V2 Help Center sample. |
Bulk import of historical responses from a legacy platform. Iterate a legacy export and
POSTeach response with its originalresponseTimeandsurveyLanguage. Per the Help Center this "Facilitates the automatic integration of large quantities of survey responses from external systems into Sprinklr."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
responseTimerather than the upload time.CRM-triggered feedback capture. When a CRM records a closed case, submit the associated survey response with
transactionCustomFieldscarrying the case attributes, so the response is analysable alongside the interaction that produced it.Feeding a downstream analytics warehouse. Page through
POST /searchon a schedule, resolve question IDs viametadata.questionLookup, and load flattened rows into a warehouse. This "Enables downstream analytics tools to retrieve or modify response data as required."Backfilling custom fields on historical responses. A new segmentation attribute is defined after responses were collected. Script a
PUTacross the affectedresponseIdvalues to populate it — the Help Center's documented pattern of "bulk updates on older responses in light of the latest information for analytical purposes."Enriching responses with profile data resolved later. A response arrives anonymously and the responder is identified afterwards. Use
PUTto attachprofileCustomFieldsonce the identity is known.Correcting a mis-mapped custom field. An ingestion job wrote the wrong internal field name. Fetch the affected responses, then
PUTthe corrected mapping — subject to confirming replace-versus-merge semantics.Purging test and duplicate submissions before reporting. Search for responses with
responseStatusofTEST_RESPONSES, thenDELETEthem so they do not distort dashboards.Filtering out low-quality and bot responses. Use
responseQualityto identifyBotandLowsubmissions and either delete them or tag them for exclusion, protecting score integrity.Auditing a single response after a customer complaint. Fetch by
responseIdto 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."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.
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.
| Operation | Method | Path | Required input | Success payload |
|---|---|---|---|---|
| Import response | POST | /api/v3/surveyResponse | Body: surveyId, questionResponses | 200 — data.responseId |
| Fetch response(s) | GET | /api/v3/surveyResponse?id= | Query: id (comma-separated) | 200 — data[] with responses[] and metadata |
| Search responses | POST | /api/v3/surveyResponse/search?surveyId= | Query: surveyId; Body: pagination (shape unsettled) | 200 — data.hasMore |
| Update custom fields | PUT | /api/v3/surveyResponse?id= | Query: id; Body: three custom-field objects | 200 or 204 (unsettled) |
| Delete response(s) | DELETE | /api/v3/surveyResponse?id= | Query: id (comma-separated) | 200 or 204 (unsettled) |
PATCH | — | Not implemented. | — |
| Endpoint | Method | Purpose |
|---|---|---|
/api/v3/cfmWorkflow/trigger | POST | Trigger a CFM workflow for an existing profile. See the CFM Workflow API V3 developer guide. |
/api/v3/cfmWorkflow/triggerWithNewProfile | POST | Create or update a profile and trigger a CFM workflow. See the CFM Workflow API V3 developer guide. |
/api/v3/surveyTransactions | POST, GET, DELETE | Manage CFM transactions. See the CFM Transaction APIs V3 developer guide. |
/api/v3/surveyDistribution/transactions/link | POST | Create a personalized survey transaction link. |
Authorization: Bearer {{accessToken}}
Key: {{apiKey}}
Content-Type: application/json # POST and PUT only
Accept: application/json