Skip to content

Asset Group API V3 — Developer Guide


1. Overview

An asset group is a grouping of entities in Sprinklr. For example, an Account Group is a grouping of multiple accounts created either by individually selecting accounts to add (static) or based on one or more properties (dynamic). Another example is a User Group, which comprises multiple users at the Workspace level. The Asset Group APIs let you perform CRUD operations on these groups programmatically.

Supported asset groups (V2 portal listing): Account Groups, User Groups, Topic Groups, Workspace Groups.

Asset Group V3 exposes full CRUD across two paths, differentiated by HTTP method:

OperationMethodPathoperationId
Create asset groupPOST/api/v3/asset-groupAssetGroupApiV3_createAssetGroup
Fetch asset group by idGET/api/v3/asset-group/{groupId}AssetGroupApiV3_getAssetGroup
Update asset groupPUT/api/v3/asset-group/{groupId}AssetGroupApiV3_updateAssetGroup
Delete asset groupDELETE/api/v3/asset-group/{groupId}AssetGroupApiV3_deleteAssetGroup

This is the central design change from V2, which used POST /api/v2/asset-group for creation and the same /api/v2/asset-group/{groupId} resource for read, update, and delete. In V3 the paths are identical in shape but sit under /api/v3, return the V3 response envelope, and are backed by formal request/response schemas.

1.1 The asset group data model

LayerObject / field groupWhat it holds
Identityid, name, descriptionGroup identity and label
MembershipassetIds[]The asset identifiers that belong to the group
ClassificationgroupType, assetTypeHow the group is populated, and what kind of asset it contains
Custom dataclientCustomFields / partnerCustomFields (request), clientCustomProperties / partnerCustomProperties (response)Client- and partner-level custom fields, each a map of key → list of string values
GovernanceassetPermissions[], subscribers[]Who can act on the assets, and who is subscribed to the group
SystemcreatedTime, modifiedTime, ownerUserId, spaceId, deletedServer-managed metadata

⚠️ Naming asymmetry. The request schema (AssetGroupRequest) uses clientCustomFields and partnerCustomFields. The response schema (AssetGroup) returns the same data as clientCustomProperties and partnerCustomProperties. Do not assume round-trip symmetry when mapping objects in your client code.

1.2 Addressing an asset group

An asset group is addressed by its Sprinklr identifier only:

  • Path parameter groupId — type String, required, described as "Group id" in the specification. Example from the V3 create response: 6a8d7eebb1f9c0f214fd4011.

There is no fetch-by-name, bulk-fetch, or search operation for asset groups in the V3 specification.


2. Base URLs and environments

All V3 API calls are sent to:

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

So the asset group resource is:

https://api3.sprinklr.com/{env}/api/v3/asset-group
https://api3.sprinklr.com/{env}/api/v3/asset-group/{groupId}

Replace {env} with your assigned environment identifier. The specification declares the env server variable with default prod and the following enumerated values:

prod, prod0, prod2, prod3, prod4, prod5, prod6, prod8, prod11, prod12, prod15, prod16, prod17, prod18, prod19, prod21, prod25

See APIs | Sprinklr Developer Portal for the published environment list [doc:turn1doc11].


3. Authentication and common headers

All Asset Group API calls are authenticated with OAuth 2.0.

HeaderValuePurposeRequired on
AuthorizationBearer {{accessToken}}Credential used by the API to authenticate a user with the server. For generating the authorization token, refer to the Authorize section on the developer portal.All requests
Key{{apiKey}}API key that authenticates the application with the server. For generating an API key, refer to the Getting Started guide.All requests
Content-Typeapplication/jsonRepresentation header that determines the type of data (media/resource) present in the request bodyPOST, PUT
Acceptapplication/jsonDetermines the acceptable response type from the serverAll requests

Permissions. AssetGroupApiV3 was updated to require MANAGE permission for create and edit. A caller without the required permission receives 403 Forbidden.

Sprinklr's API governance model inherits the calling user's roles and permissions: all permissions tied to a user are equally applied to that user's API key, so a 403 almost always indicates a governance gap rather than a malformed request [doc:turn1doc9].


4. Write operations

4.1 Create an asset group

POST /api/v3/asset-group

Creates an asset group. The response returns the group id and the other related objects.

Endpoint as documented in the V3 source document:

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

Request body — AssetGroupRequest

Required properties per the specification: name, groupType, assetType.

ParameterSub-parameterRequiredTypeDescription
nameRequiredStringName of the asset group
descriptionOptionalStringDescription of the asset group
clientIdRequired (per V3 doc)Integer (int64)Client id of the group — the client in which to make the changes
assetIdsRequired (per V3 doc)List[String]Asset ids in the group
assetIds[]RequiredStringUnique identifier of an asset to be added to the group
clientCustomFieldsOptionalObject (map of String → List[String])Client-level custom fields of the group
partnerCustomFieldsOptionalObject (map of String → List[String])Partner-level custom fields of the group
groupTypeRequiredString (GroupType)Type of group, for example DEFINED, DYNAMIC
assetTypeRequiredString (AssetType)Type of asset in the group. Enum: USER, BRAND, ACCOUNT, CLIENT
assetPermissionsOptionalList[Object] (AssetShareConfig)Asset permissions assigned to the group
typeRequiredStringType of entity receiving the permission, for example USER, GLOBAL, CLIENT
idsOptionalList[String]Ids based on the specified type
subscribersOptionalList[Object] (Subscriber)Subscribers of the group
typeRequiredStringType of subscriber, for example USER, GLOBAL, CLIENT
idsOptionalList[String]Ids based on the specified type

Required-field conflict. The OpenAPI schema marks only name, groupType, and assetType as required; the V3 source document marks clientId and assetIds as Required, and assetPermissions[].ids / subscribers[].ids as Required, while the schema marks the nested ids as optional. Treat the schema as authoritative for validation and see §10.

Request

curl --location 'https://api3.sprinklr.com/{env}/api/v3/asset-group/' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
  "name": "Santhosh Asset Group8",
  "description": "Asset Group created via V3 API",
  "clientId": 66000002,
  "assetIds": [
    "600054962"
  ],
  "groupType": "DEFINED",
  "assetType": "ACCOUNT",
  "assetPermissions": [
    {
      "type": "USER",
      "ids": [
        "600037831"
      ]
    }
  ],
  "subscribers": [
    {
      "type": "USER",
      "ids": [
        "600037831"
      ]
    }
  ]
}'

Response

{
  "data": {
    "id": "6a8d7eebb1f9c0f214fd4011",
    "name": "Santhosh Asset Group8",
    "description": "Asset Group created via V3 API",
    "assetIds": [
      "600054962"
    ],
    "createdTime": 1787657963670,
    "modifiedTime": 1787657963670,
    "ownerUserId": 66015421,
    "spaceId": 66001165,
    "deleted": false,
    "groupType": "DEFINED",
    "assetType": "ACCOUNT",
    "assetPermissions": [
      {
        "type": "USER",
        "ids": [
          "600037831"
        ]
      }
    ],
    "subscribers": [
      {
        "type": "USER",
        "ids": [
          "600037831"
        ]
      }
    ]
  },
  "errors": []
}

Response parameters

ParameterSub-parameterRequiredTypeDescription
dataRequiredObject (AssetGroup)Details of the created asset group
idRequiredStringUnique identifier of the asset group
nameRequiredStringName of the asset group
descriptionOptionalStringDescription of the asset group
assetIdsRequiredList[String]Identifiers of assets included in the asset group
assetIds[]RequiredStringUnique identifier of an asset included in the group
clientCustomPropertiesOptionalObject (map of String → List[String])Client-level custom fields of the group
partnerCustomPropertiesOptionalObject (map of String → List[String])Partner-level custom fields of the group
createdTimeRequiredLong (epoch ms)When the asset group was created
modifiedTimeRequiredLong (epoch ms)When the asset group was last modified
ownerUserIdRequiredLongIdentifier of the user who owns the asset group
spaceIdRequiredLongIdentifier of the space (client id) associated with the group
deletedRequiredBooleanWhether the asset group has been deleted
groupTypeRequiredStringType of asset group
assetTypeRequiredStringType of assets contained in the group
assetPermissionsOptionalList[Object]Permissions configured for the assets in the group
assetPermissions[].typeRequiredStringType of entity to which permissions are assigned
assetPermissions[].idsRequiredList[String]Identifiers of entities granted permissions
subscribersOptionalList[Object]Subscribers associated with the asset group
subscribers[].typeRequiredStringType of entity subscribed to the group
subscribers[].idsRequiredList[String]Identifiers of entities subscribed to the group
errorsRequiredList[Object]Errors encountered while processing the request. An empty array indicates no errors occurred.

Schema-required fields on AssetGroup are id, name, assetType.


4.2 Update an asset group

PUT /api/v3/asset-group/{groupId}

Updates an existing asset group and returns the updated objects.

Endpoint as documented in the V3 source document:

https://api3.sprinklr.com/{env}/api/v3/asset-group/id={{assetGroupId}}

Path parameters

ParameterRequired/OptionalDescriptionType
groupIdRequiredId of the groupString

Request body — AssetGroupRequest

PUT takes the same AssetGroupRequest schema as POST. The V3 source document lists the following required/optional split for the update body:

ParameterRequired/OptionalDescriptionType
nameRequiredName of the asset groupString
descriptionRequired (per V3 doc; Optional in schema)Description of the asset groupString
clientIdRequiredThe client id in which to make the changesString (per V3 doc; Integer int64 in schema)
assetIdsRequiredAsset ids to be included in the groupArray of String
groupTypeRequiredType of the group. Example: DEFINED.String
assetTypeRequiredAsset type of the group. Example: ACCOUNT.String
assetPermissionsOptionalAsset permissions assigned to the groupArray of Object
assetPermissions[].typeRequiredType of entity receiving the asset permission. Example: USER, GLOBAL, CLIENT.String
assetPermissions[].idsOptionalIds based on the specified typeArray of String
subscribersOptionalSubscribers of the asset groupArray of Object
subscribers[].typeRequiredType of subscriber. Example: USER, GLOBAL, CLIENT.String
subscribers[].idsOptionalIds based on the specified typeArray of String

Request

curl --location --request PUT 'https://api3.sprinklr.com/{env}/api/v3/asset-group/id={{assetGroupId}}' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Content-Type: application/json' \
--data '{
  "name": "Santhosh Asset Group7 Updated",
  "description": "Asset Group updated via V3 API",
  "clientId": 66000002,
  "assetIds": ["600054962"],
  "groupType": "DEFINED",
  "assetType": "ACCOUNT",
  "assetPermissions": [
    {
      "type": "USER",
      "ids": ["600037831"]
    }
  ],
  "subscribers": [
    {
      "type": "USER",
      "ids": ["600037831"]
    }
  ]
}'

Response

204 No Content

PUT replaces — it does not merge

PUT sends the full AssetGroupRequest document. There is no PATCH operation for asset groups in V3, so any field you omit from the body is at risk of being cleared. Read the group with GET first, apply your changes to the returned object, and send the complete document back.


4.3 Delete an asset group

DELETE /api/v3/asset-group/{groupId}

Deletes an asset group by group id.

https://api3.sprinklr.com/{env}/api/v3/asset-group/{groupId}

Path parameters

ParameterRequired/OptionalDescriptionType
groupIdRequiredId of the groupString

Request

curl --location --request DELETE 'https://api3.sprinklr.com/{env}/api/v3/asset-group/{groupId}' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}' \
--header 'Accept: application/json'

Response

HTTP Status: 204 No Content

5. Read operations

5.1 Fetch an asset group by id

GET /api/v3/asset-group/{groupId}

Fetches an asset group's details and all related objects, using the group id.

https://api3.sprinklr.com/{env}/api/v3/asset-group/{groupId}

Request parameters

ParameterRequired/OptionalDescriptionType
groupIdRequiredUnique identifier of the asset group whose details are being retrieved. (The V3 source document names this parameter assetGroupId in its parameter table; the specification and URL template name it groupId.)String

Request

curl --location 'https://api3.sprinklr.com/{env}/api/v3/asset-group/{groupId}' \
--header 'Authorization: Bearer {{accessToken}}' \
--header 'Key: {{apiKey}}'

Response

{
  "data": [
    {
      "id": "6a8d8262b1f9c0f214fd420f",
      "name": "Santhosh Asset Group9",
      "description": "Asset Group created via V3 API",
      "assetIds": [
        "600054962"
      ],
      "createdTime": 1787658850242,
      "modifiedTime": 1787658850242,
      "ownerUserId": 66015421,
      "spaceId": 66001165,
      "deleted": false,
      "groupType": "DEFINED",
      "assetType": "ACCOUNT"
    }
  ],
  "errors": []
}

Response parameters

ParameterRequiredTypeDescription
dataRequiredList[Object]List of asset groups returned by the API
data[].idRequiredStringUnique identifier of the asset group
data[].nameRequiredStringName of the asset group
data[].descriptionOptionalStringDescription of the asset group
data[].assetIdsRequiredList[String]Identifiers of assets included in the asset group
data[].assetIds[]RequiredStringUnique identifier of an asset included in the group
data[].createdTimeRequiredLong (epoch ms)When the asset group was created
data[].modifiedTimeRequiredLong (epoch ms)When the asset group was last modified
data[].ownerUserIdRequiredLongIdentifier of the user who owns the asset group
data[].spaceIdRequiredLongIdentifier of the space associated with the asset group
data[].deletedRequiredBooleanWhether the asset group has been deleted
data[].groupTypeRequiredStringType of asset group
data[].assetTypeRequiredStringType of assets contained in the asset group
errorsRequiredList[Object]Errors encountered while processing the request. An empty array indicates no errors occurred.

6. Response format and status codes

6.1 The V3 envelope

Asset Group V3 responses use the standard V3 envelope:

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

The error envelope (ErrorResponse) used by all 4xx responses is:

FieldTypeDescription
dataObject, nullableNull on error
errorsArray[Error]One entry per error
errors[].idString24-character hex ObjectId (required)
errors[].codeIntegerError code (required)
errors[].messageStringDotted error key, for example account.not.found (required)
metadataObjectResponse metadata

6.2 Response codes

HTTP CodeDeclared byScenarioDescription
200 OKOpenAPI spec (all four operations)SuccessPOST and GET return the AssetGroup object; PUT and DELETE declare a string body
204 No ContentV3 source documents (PUT, DELETE)SuccessOperation succeeded; no response body returned
400 Bad RequestOpenAPI specBad requestMalformed request or invalid parameters. Body: ErrorResponse
401 UnauthorizedOpenAPI specMissing or invalid authenticationInvalid or missing Authorization token or Key. Body: ErrorResponse
403 ForbiddenOpenAPI specInsufficient permissionsCaller lacks the required permission (MANAGE for create and edit). Body: ErrorResponse
404 Not FoundOpenAPI specResource not foundNo asset group exists for the supplied groupId. Body: ErrorResponse

7. V2 → V3 migration

7.1 Endpoint mapping

V2V3
POST /api/v2/asset-group (create) [doc:turn1doc8]POST /api/v3/asset-group
GET /api/v2/asset-group/{groupId} (read)GET /api/v3/asset-group/{groupId}
PUT /api/v2/asset-group/{groupId} (update)PUT /api/v3/asset-group/{groupId}
DELETE /api/v2/asset-group/{groupId} (delete)DELETE /api/v3/asset-group/{groupId}

The four V2 endpoints listed above are the exact set named as the parity scope for V3.

The path shapes are unchanged. The migration work is in the base path, the response envelope, the field names, and the enum surface — not in the routing.

7.2 Field and behaviour mapping

AspectAPI V2API V3Impact
Base path/api/v2/asset-group/api/v3/asset-groupUpdate base URL only; resource paths are identical
Response structureFlat asset group object at the response root [doc:turn1doc8]{"data": ..., "errors": []} envelopeAccess the group via response.data, not the root
Error handlingHTTP status onlyStructured errors[] array with id, code, messageParse errors[] for granular failure reasons
Custom fields on readclientCustomFields, partnerCustomFields in the V2 response [doc:turn1doc8]clientCustomProperties, partnerCustomProperties in the V3 AssetGroup responseRename on the read path. Request-side names (clientCustomFields, partnerCustomFields) are unchanged.
Client id on readV2 response example includes clientId [doc:turn1doc8]V3 AssetGroup exposes spaceId (described as "Client id of the group"); clientId remains a request fieldMap spaceId → your V2 clientId consumer
assetType enumUSER, BRAND, ACCOUNT, CLIENT, BENCHMARKING_ACCOUNT [doc:turn1doc8]USER, BRAND, ACCOUNT, CLIENTBENCHMARKING_ACCOUNT is not in the V3 enum. Audit existing groups before cutover — see §10.
groupTypeDocumented as "Type of the group (Static/Dynamic)" [doc:turn1doc8]; V2 example uses DYNAMICFree-form string; spec description "Type of group e.g. DEFINED, DYNAMIC"; V3 examples use DEFINEDNot a closed enum in V3. Verify accepted values with the API owner.
descriptionRequired [doc:turn1doc8]Optional in the AssetGroupRequest schemaExisting payloads remain valid
Required request fieldsname, description, clientId, assetId, groupType, assetType [doc:turn1doc8]name, groupType, assetType (schema)Fewer schema-mandated fields; see the conflict note in §4.1
PermissionsGoverned by the calling user's roles [doc:turn1doc9]Create and edit explicitly require MANAGEA key that worked on V2 writes may return 403 on V3
Success status on PUT/DELETENot specified in the V2 reference204 No Content observed; 200 declared in the specAccept both

7.3 Migration steps

  1. Update the base URL. Point at https://api3.sprinklr.com/{env}/api/v3/asset-group.
  2. Unwrap the envelope. Read the group from response.data instead of the response root, and tolerate data being an object (POST) or a single-element array (GET).
  3. Handle the new error format. Inspect response.errors[] and log errors[].code and errors[].message.
  4. Rename read-side custom fields. clientCustomFields → clientCustomProperties, partnerCustomFields → partnerCustomProperties. Leave the request-side names as-is.
  5. Remap clientId on read to spaceId.
  6. Audit assetType values. Any integration that sends or expects BENCHMARKING_ACCOUNT must be resolved before cutover.
  7. Confirm groupType values. V2 documentation says Static/Dynamic; V2 examples use DYNAMIC; V3 examples use DEFINED.
  8. Grant MANAGE permission to the API user used for create and update calls.
  9. Accept both 200 and 204 as success on PUT and DELETE, and do not assume a JSON body.
  10. Read-modify-write on updates. V3 has no PATCH; send the complete document on every PUT.

8. Reference — enums and reusable objects

8.1 AssetType

ValueNotes
USERUser assets
BRANDBrand assets
ACCOUNTAccount assets — used in all V3 examples
CLIENTClient assets

BENCHMARKING_ACCOUNT, present in the V2 documentation [doc:turn1doc8], is not part of the V3 AssetType enum.

8.2 GroupType

Typed as a plain string in the specification, described as "Type of Group" (request-side description: "Type of group e.g. DEFINED, DYNAMIC"). It is not a closed enum in V3. Values seen in documented examples: DEFINED (V3), DYNAMIC (V2).

8.3 AssetShareConfig (used by assetPermissions[])

FieldRequiredTypeDescription
typeRequiredStringType, for example USER, GLOBAL, CLIENT
idsOptionalList[String]Ids based on type

8.4 Subscriber (used by subscribers[])

FieldRequiredTypeDescription
typeRequiredStringType, for example USER, GLOBAL, CLIENT
idsOptionalList[String]Ids based on type

Both objects are structurally identical but are separate components in the specification. There is also an unrelated AssetPermission component (holding shareConfigs[] and grants[]) that is not referenced by any asset group operation — do not confuse it with the assetPermissions array on AssetGroup/AssetGroupRequest.


9. Use cases and best practices

9.1 Create an account group for a campaign

POST /api/v3/asset-group with assetType: "ACCOUNT", groupType: "DEFINED", and the account ids in assetIds[]. Grant access at creation time via assetPermissions[] and notify owners via subscribers[].

9.2 Add an asset to an existing group

There is no incremental-add operation. Call GET /api/v3/asset-group/{groupId}, append the new id to assetIds[] from the returned object, and send the complete document back with PUT.

9.3 Reconcile groups from an external system of record

Where your external system is authoritative, PUT is the correct verb — it replaces the whole document, so removals in the source system propagate. Where it is not authoritative, always read first.

9.4 Decommission a group

DELETE /api/v3/asset-group/{groupId}. Expect 204 No Content (or 200 per the spec) and no body — do not attempt to parse the response as JSON.

Best practices

Identifiers

  • groupId is a String (24-character hex ObjectId in all documented examples, for example 6a8d8262b1f9c0f214fd420f). Do not coerce it to a number.
  • assetIds[], assetPermissions[].ids[], and subscribers[].ids[] are arrays of strings, even when the underlying ids are numeric ("600054962").
  • clientId on the request is an integer (int64, for example 66000002), while the corresponding response field spaceId is also a Long. The V3 update document describes clientId as String — the schema types it as an integer.

Updates

  • V3 has no PATCH for asset groups. Every update is a full replace.
  • Do not rely on the ?id= query parameter shown in the update document; the specification defines only the path parameter.

Enums and casing

  • assetType values are uppercase and case-sensitive: USER, BRAND, ACCOUNT, CLIENT.
  • type values inside assetPermissions[] and subscribers[] are documented as USER, GLOBAL, CLIENT.

Timestamps

  • createdTime and modifiedTime are epoch milliseconds as 64-bit integers (for example 1787657963670). Do not parse them as seconds.

Permissions

  • Provision MANAGE for the API user before migrating write traffic; a 403 on V3 where V2 succeeded is the expected symptom of a missing grant.

Error handling

  • Always inspect the errors array even on a 2xx response — the envelope carries errors on success responses too (empty in the documented examples).

Credentials

  • All tokens and keys in this guide are placeholders ({{accessToken}}, {{apiKey}}). Never commit or log real keys.