# Support Ticket API V3

The Support Ticket API lets your application raise a support case in Sprinklr Care Lite on behalf of an end user, and discover the case-level custom fields available in your workspace.

> **Beta.** The Support Ticket API belongs to the **Sprinklr Care Lite** product.


## Overview

Once a case is created through this API, it is sent to Sprinklr Care Lite and a ticket is created automatically. You can enrich the ticket with custom fields that describe the problem and your business use case.

V3 serves both operations from a single resource path, `/supportTicket`, distinguished by HTTP method:

| Operation | Method | Path |
|  --- | --- | --- |
| Create a support ticket | `POST` | `/api/v3/supportTicket` |
| Fetch support ticket metadata | `GET` | `/api/v3/supportTicket?type=caseCustomFields` |


### Typical sequence

1. Call `GET /supportTicket?type=caseCustomFields` to discover the case custom fields configured in your workspace.
2. Note the `id` of each field you want to populate.
3. Call `POST /supportTicket`, passing those ids as keys in `caseCustomProperties`, each prefixed with `_c_`.
4. Store the returned case number (`dCNu`) against your own record.


Step 1 is a configuration-time activity. Custom field definitions change rarely and the list can be large, so fetch it once, cache it, and refresh on a schedule rather than calling it before every ticket creation.

> Because `POST` and `GET` share one path, make sure your HTTP client does not retry a `POST` as a `GET` on redirect. Such a retry returns a custom field list with `200 OK` rather than an error, so assert on the response shape, not only the status code.


## Base URLs

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

Replace `{env}` with your assigned environment identifier. Valid values are `prod`, `prod0`, `prod2`, `prod3`, `prod4`, `prod5`, `prod6`, `prod8`, `prod11`, `prod12`, `prod15`, `prod16`, `prod17`, `prod18`, `prod19`, `prod21`, and `prod25`.

Make the base URL a single configuration value so that promoting between environments is a configuration change rather than a code change.

## Authentication

All calls are authenticated with OAuth 2.0. See [API Overview](https://dev.sprinklr.com/api-overview) and [API Key and Secret Generation](https://dev.sprinklr.com/api-key-and-secret-generation) for registration and credential setup.

| Header | Value | Purpose | Required on |
|  --- | --- | --- | --- |
| `Authorization` | `Bearer {{accessToken}}` | Authenticates the user with the server | All requests |
| `Key` | `{{apiKey}}` | Authenticates the application with the server | All requests |
| `Content-Type` | `application/json` | Declares the request body media type | `POST` |
| `Accept` | `application/json` | Declares the acceptable response type | All requests |


## Create a support ticket

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

### Request parameters

| Parameter | Required | Type | Description |
|  --- | --- | --- | --- |
| `title` | Required | String | Subject of the case or issue |
| `email` | Required | String | Email address of the user, used for further communication |
| `accountId` | Required | Integer (`int64`) | Unique identifier of the account the case is created for |
| `description` | Optional | String | Description of the issue |
| `firstName` | Optional | String | First name of the user creating the case |
| `lastName` | Optional | String | Last name of the user creating the case |
| `fullName` | Optional | String | Full name of the user |
| `caseCustomProperties` | Optional | Object | Case-level custom field values |
| `messageCustomProperties` | Optional | Object | Message-level custom field values |


### Custom property format

`caseCustomProperties` and `messageCustomProperties` are maps of custom field id to **an array of string values**. Each key is a custom field `id` prefixed with `_c_`.

```json
"caseCustomProperties": {
  "_c_5cc9a7cfe4b01904c8dfc8f9": ["North America"],
  "_c_5cc9a7cfe4b01904c8dfc8fa": ["Priority customer"]
}
```

Values are **always arrays of strings**, including for single-valued fields, booleans, and numbers. Obtain each `id` from [Fetch support case custom fields](#fetch-support-case-custom-fields).

### Example request

```bash
curl --location 'https://api3.sprinklr.com/{env}/api/v3/supportTicket' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{
  "title": "Unable to complete checkout",
  "description": "Customer reports a payment error at the final step.",
  "email": "jane.doe@example.com",
  "firstName": "Jane",
  "lastName": "Doe",
  "fullName": "Jane Doe",
  "caseCustomProperties": {
    "_c_5cc9a7cfe4b01904c8dfc8f9": ["North America"]
  },
  "messageCustomProperties": {},
  "accountId": 600000000
}'
```

### Example response

```json
{
  "data": {
    "id": "0000000000000000000000aa",
    "version": 0,
    "cType": "LIFE_EVENT",
    "sub": "#100000000 Email ",
    "piiMaskedSub": "#100000000 Email ",
    "cByUI": 60000000,
    "aUM": [],
    "cCMT": 1784567588577,
    "cCT": 1784567588573,
    "cMT": 1784567588577,
    "del": false,
    "uCW": {
      "que": [], "comm": [], "cProp": {}, "subs": [], "arc": false,
      "kbD": {}, "acl": {}, "aclM": {}, "clW": [], "surveyRespDets": {},
      "smRU": false, "smRP": false, "smRE": false, "smRV": false,
      "uSmResDets": [], "predSmResConf": [], "predFaqBotQues": [],
      "predFaqBotIntents": [], "predFaqBotThemes": [], "usedFaqBotQues": [],
      "usedFaqBotIntents": [], "usedFaqBotThemes": [], "nOCRU": 0, "tQD": {}
    },
    "caseNu": 100000000,
    "dCNu": "100000000",
    "sId": 600000000,
    "read": false
  },
  "errors": []
}
```

*Values shown are illustrative.*

### Notes on the response

- **Use `dCNu`, not `caseNu`, to store the case number.** Both carry the same value, `caseNu` as an integer and `dCNu` as a string. The string form avoids precision loss in JavaScript and tolerates future format changes.
- **The case subject is generated by the server.** The `title` you submit does not appear in the response; `sub` is derived from the case number and channel. Note that `sub` and `piiMaskedSub` may include a trailing space — trim before display or comparison.
- **`cCT`, `cMT`, and `cCMT` are epoch milliseconds.**
- **`uCW` is the case workflow container.** On a newly created case every member is empty. It populates later in the case lifecycle.


See the [Response field reference](#response-field-reference) for the meaning of each abbreviated field name.

## Fetch support case custom fields

```
GET https://api3.sprinklr.com/{env}/api/v3/supportTicket?type=caseCustomFields
```

### Query parameters

| Parameter | Required | Type | Description |
|  --- | --- | --- | --- |
| `type` | Required | String | The kind of metadata to fetch. Use `caseCustomFields` to retrieve case-level custom field definitions. |


### Example request

```bash
curl --location 'https://api3.sprinklr.com/{env}/api/v3/supportTicket?type=caseCustomFields' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Accept: application/json'
```

### Example response

```json
{
  "data": {
    "entities": [
      {
        "id": "5cc9a7cfe4b01904c8dfc8f9",
        "fieldName": "5cc9a7cfe4b01904c8dfc8f5",
        "label": { "en": "Region" },
        "fieldType": "PICKLIST",
        "optionType": "GENERAL",
        "scopeType": "DEFAULT",
        "report": "CUSTOM_FIELD",
        "enabled": true,
        "required": false,
        "isHidden": false,
        "mandatoryForClosingTicket": false,
        "ownerUserId": 60000000,
        "assetClassList": ["UNIVERSAL_CASE", "MESSAGE"],
        "dateµcreatedTime": "Mar 26, 2026, 02:54:33 PM",
        "dateµmodifiedTime": "Mar 26, 2026, 02:54:33 PM"
      }
    ],
    "count": 2669,
    "hasMore": true
  },
  "errors": []
}
```

*Abridged. Values shown are illustrative.*

### Response structure

| Field | Type | Description |
|  --- | --- | --- |
| `data.entities` | Array | Custom field definitions |
| `data.count` | Integer | Total number of custom fields available |
| `data.hasMore` | Boolean | Whether further custom fields exist beyond those returned |


### Custom field properties

The fields you are most likely to need:

| Field | Example | Description |
|  --- | --- | --- |
| `id` | `5cc9a7cfe4b01904c8dfc8f9` | Custom field identifier. **Prefix with `_c_` to use as a `caseCustomProperties` key** |
| `fieldName` | `5cc9a7cfe4b01904c8dfc8f5` | Internal field name |
| `label` | `{"en": "Region"}` | Display label, keyed by locale code |
| `fieldType` | `PICKLIST` | Field type. See [Custom Fields](https://dev.sprinklr.com/custom-field) for available types |
| `enabled` | `true` | Whether the field is active |
| `required` | `false` | Whether the field is mandatory |
| `isHidden` | `false` | Whether the field is hidden in the UI |
| `mandatoryForClosingTicket` | `false` | Whether the field must be set before a ticket can be closed |
| `assetClassList` | `["UNIVERSAL_CASE"]` | Asset classes the field applies to |
| `governance` | Object | Visibility and sharing configuration |
| `ownerUserId` | `60000000` | Owning user |


Each entity also carries `adhocSearchEnabled`, `assetLevelConfig`, `assetTypeVsOrder`, `contentReplacementEnabled`, `customFieldControllerById`, `description`, `enabledForAiConcierge`, `facetEnabled`, `globalAsset`, `hasEntityScopedOptions`, `helpText`, `isHiddenFromCFMSurvey`, `isHiddenFromMonitoring`, `isTokenizedField`, `minimumInput`, `nested`, `options`, `options2`, `optionsOrder`, `optionsVisibilityList`, `order`, `preferred`, `validationCriteria`, and `visibilityCriteria`.

> **`id` and `fieldName` are different values.** They are both 24-character hexadecimal identifiers and can look similar at a glance. Use **`id`** to build the `_c_` key for `caseCustomProperties`.


> **`dateµcreatedTime` and `dateµmodifiedTime` contain a micro sign (`µ`, U+00B5).** These keys are not valid identifiers in most languages, so access them with quoted or bracket notation and confirm your JSON parser and storage layer handle UTF-8 keys correctly. Their values are formatted display strings such as `"Mar 26, 2026, 02:54:33 PM"` and carry no timezone, so do not parse them for time-based logic.


### Large custom field sets

`count` reports the total number of custom fields in your workspace, and `hasMore` indicates whether more exist beyond those returned in the response. Workspaces can hold several thousand definitions.

Check `hasMore` explicitly rather than assuming a single response contains the complete set. If `hasMore` is `true` and you need custom fields that are not present in the response, contact [Sprinklr Support](https://www.sprinklr.com/help/) for guidance on retrieving the full set for your workspace.

## Response field reference

The `POST` response uses abbreviated field names. This table gives the meaning of each.

### Top level

| Field | Meaning | Type |
|  --- | --- | --- |
| `id` | Case identifier | String |
| `version` | Record version | Integer |
| `cType` | Channel type | String |
| `sub` | Case subject | String |
| `piiMaskedSub` | Case subject with PII masked | String |
| `cByUI` | Id of the user that created the case | Integer |
| `aUM` | Associated universal messages | Array |
| `cCT` | Case creation time (epoch ms) | Integer |
| `cMT` | Case modification time (epoch ms) | Integer |
| `cCMT` | Case channel modification time (epoch ms) | Integer |
| `del` | Whether the case is deleted | Boolean |
| `uCW` | Case workflow object | Object |
| `caseNu` | Case number | Integer |
| `dCNu` | Case number for display | String |
| `sId` | Source id | Integer |
| `read` | Whether the case has been read | Boolean |


### Inside `uCW` (case workflow)

| Field | Meaning |
|  --- | --- |
| `que` | Queues |
| `comm` | Comments |
| `cProp` | Custom properties |
| `subs` | Subscribers |
| `arc` | Archived |
| `kbD` | Knowledge base details |
| `acl` | Associated checklists |
| `aclM` | Associated checklists map |
| `clW` | Checklist workflows |
| `surveyRespDets` | Survey response details |
| `smRU` | Smart response used |
| `smRP` | Smart responses predicted |
| `smRE` | Smart response edited |
| `smRV` | Smart response viewed |
| `uSmResDets` | Used smart responses |
| `predSmResConf` | Predicted smart response confidence |
| `predFaqBotQues` | Predicted FAQ bot questions |
| `predFaqBotIntents` | Predicted FAQ bot intents |
| `predFaqBotThemes` | Predicted FAQ bot themes |
| `usedFaqBotQues` | Used FAQ bot questions |
| `usedFaqBotIntents` | Used FAQ bot intents |
| `usedFaqBotThemes` | Used FAQ bot themes |
| `nOCRU` | Number of canned responses used |
| `tQD` | Total queue duration |


> Field name abbreviation is applied per field rather than by a uniform rule — note that `usedFaqBotIntents` and `usedFaqBotThemes` appear in full while `usedFaqBotQues` is abbreviated. Map these names explicitly in your client rather than deriving them programmatically.


## Status codes

| Code | Meaning |
|  --- | --- |
| `200` | Success |
| `400` | Bad Request — the request was malformed or a required field was missing |
| `401` | Unauthorized — the access token is missing, invalid, or expired |
| `403` | Forbidden — the authenticated user lacks permission for the requested account |
| `404` | Not Found |


Errors are returned in the standard V3 envelope:

```json
{
  "data": null,
  "errors": [
    {
      "id": "0000000000000000000000aa",
      "code": 400,
      "message": "account.not.found"
    }
  ],
  "metadata": {}
}
```

| Field | Type | Description |
|  --- | --- | --- |
| `id` | String | Error identifier |
| `code` | Integer | Numeric error code |
| `message` | String | Error key |


## Migrating from V2

### Path changes

|  | V2 | V3 |
|  --- | --- | --- |
| Create a support ticket | `POST /api/v2/support-ticket/create-case` | `POST /api/v3/supportTicket` |
| Fetch case custom fields | `GET /api/v2/support-ticket/case-custom-fields` | `GET /api/v3/supportTicket?type=caseCustomFields` |


V3 drops the verb-based suffix `/create-case` and the `/case-custom-fields` sub-path, expressing intent through the HTTP method and the `type` query parameter instead.

### The request body is unchanged

All nine `POST` request fields keep their names, types, and semantics. Migrating the create call is a URL change:

```diff
- POST https://api2.sprinklr.com/{env}/api/v2/support-ticket/create-case
+ POST https://api3.sprinklr.com/{env}/api/v3/supportTicket
```

### Responses are wrapped in a `data` / `errors` envelope

This is the breaking change. In V2, `POST` returned the case object directly and `GET` returned `{"entities": [...], "count": ..., "hasMore": ...}` at the top level. In V3 both payloads move one level down, into `data`:

```diff
  // Create
- const caseNumber = response.caseNu;
+ const caseNumber = response.data.caseNu;

  // Custom fields
- const fields  = response.entities;
- const hasMore = response.hasMore;
+ const fields  = response.data.entities;
+ const hasMore = response.data.hasMore;
```

Note that the key `entities` is retained — only its depth changed.

### Supporting both versions during transition

Isolate the envelope in one place rather than branching at every call site:

```javascript
/**
 * Returns the payload from either a V2 (bare) or V3 (enveloped) response.
 * V3 wraps every payload in { data, errors }; V2 returns it at the top level.
 */
function unwrap(response) {
  if ("data" in response && "errors" in response) {
    if (response.errors && response.errors.length > 0) {
      throw new Error(response.errors[0].message);
    }
    return response.data;
  }
  return response;
}

const caseNumber = unwrap(createResponse).dCNu;
const fields     = unwrap(customFieldsResponse).entities;
```

Remove the shim once your integration is fully on V3.

### Migration checklist

- [ ] Update both URLs — `api2` to `api3`, `v2` to `v3`, and the new paths.
- [ ] Add `?type=caseCustomFields` to the `GET` call.
- [ ] Unwrap `data` on both responses, and check `errors`.
- [ ] Confirm the `Key` header is sent on both calls.
- [ ] Send `caseCustomProperties` values as arrays of strings.
- [ ] Store the case number from `dCNu` (string) rather than `caseNu` (integer).
- [ ] Check `hasMore` when reading custom fields.
- [ ] Remove any code that expects to read the submitted `title` back from the create response.


## Troubleshooting

| Symptom | Likely cause | Resolution |
|  --- | --- | --- |
| `401 Unauthorized` | Access token missing or expired, or `Key` header absent | Access tokens are valid for 30 days. Refresh the token and confirm both `Authorization` and `Key` are sent |
| `403 Forbidden` | The user lacks permission on the account | Verify the user's permissions and that `accountId` is one they can access |
| `400` on create | `title`, `email`, or `accountId` missing, or a malformed custom property | Send all three required fields and confirm custom property values are arrays of strings |
| `GET` returns unexpected content | `type` omitted or misspelled | Confirm the exact spelling `caseCustomFields` |
| A `POST` returned a custom field list | The request was retried or redirected as a `GET` | Both methods share one path. Assert on the response shape, not just the status code |
| Custom property silently ignored | The wrong identifier or value type was used | Use `id` (not `fieldName`) for the `_c_` key, and send values as arrays |
| Case number incorrect in JavaScript | `caseNu` exceeds safe integer precision | Use `dCNu`, the string form |
| A known custom field is missing from the response | The field is beyond those returned | Check `hasMore`, and contact Sprinklr Support if it is `true` |
| Error accessing `dateµcreatedTime` | The key contains a non-ASCII character | Use quoted or bracket property access and verify UTF-8 handling |


## Related

- [Support Ticket overview](https://dev.sprinklr.com/support-ticket)
- [Custom Fields](https://dev.sprinklr.com/custom-field)
- [API Overview](https://dev.sprinklr.com/api-overview)
- [API Key and Secret Generation](https://dev.sprinklr.com/api-key-and-secret-generation)