Batch update identifiers on preference records.
This endpoint updates identifiers on preference records and does not trigger DSR workflows.
Use mergeRecordOnConflict to control merging behavior and returnIdentifiers to include identifiers in the response.

Rate Limits

  • 100 requests per organization per minute (default).
  • This limit can be increased upon request.

Rate Limiting Headers

  • X-RateLimit-Limit: The maximum number of requests allowed in the current window.
  • X-RateLimit-Remaining: The number of requests remaining in the current window.
  • X-RateLimit-Reset: The time at which the current rate limit window resets in ISO 8601 format.
  • Retry-After: (on 429) The number of seconds to wait before making a new request.

POST

/v1/preferences/{partition}/update-identifiers

In your request headers, pass authorization: Bearer <<token>>.

If you're self-hosting Sombra, also add the request header x-sombra-authorization: Bearer <<sombraInternalKey>>. You can read more about request authorization here.

Requires scope:

Modify User Stored Preferences

authorizationstring
An API key generated from the Transcend dashboard: https://app.transcend.io/infrastructure/api-keys.
x-sombra-authorizationstring
The Sombra internal key. This header is only needed for self-hosted Sombra gateways. See https://docs.transcend.io/docs/dsr-automation/api-integration/authentication#authenticating-to-sombra
content-typestring
Specify content-type: application/json for a JSON response from the Transcend API.
partitionstring
The ID of the partition in the Preference Store.

application/json

recordsarray<object>(required)
List of identifier update operations to apply in a single batch. Max 10 records.

Request Body Examples

Update phone number for xyz@foo.com:

{
  "records": [
    {
      "anchorIdentifier": {
        "name": "email",
        "value": "xyz@foo.com"
      },
      "update": {
        "name": "phone",
        "oldValue": "+1231231234",
        "newValue": "+1231231235"
      },
      "timestamp": "2025-11-26T17:33:13.515Z"
    }
  ]
}

Update phone number for xyz@foo.com and get full identifiers in response:

{
  "records": [
    {
      "anchorIdentifier": {
        "name": "email",
        "value": "xyz@foo.com"
      },
      "update": {
        "name": "phone",
        "oldValue": "+1231231234",
        "newValue": "+1231231235"
      },
      "timestamp": "2025-11-26T17:33:13.515Z",
      "options": {
        "returnIdentifiers": true
      }
    }
  ]
}

Update phone number for xyz@foo.com and return error when +1231231235 already exists on another record:

{
  "records": [
    {
      "anchorIdentifier": {
        "name": "email",
        "value": "xyz@foo.com"
      },
      "update": {
        "name": "phone",
        "oldValue": "+1231231234",
        "newValue": "+1231231235"
      },
      "timestamp": "2025-11-26T17:33:13.515Z",
      "options": {
        "mergeRecordOnConflict": false
      }
    }
  ]
}

Batch update identifiers on multiple records:

{
  "records": [
    {
      "anchorIdentifier": {
        "name": "email",
        "value": "user1@example.com"
      },
      "update": {
        "name": "phone",
        "oldValue": "+15551234567",
        "newValue": "+15557654321"
      },
      "timestamp": "2025-11-26T17:33:13.515Z"
    },
    {
      "anchorIdentifier": {
        "name": "phone",
        "value": "+15557654321"
      },
      "update": {
        "name": "email",
        "oldValue": "old@example.com",
        "newValue": "new@example.com"
      },
      "timestamp": "2025-11-26T17:34:00.000Z"
    }
  ]
}

200 (OK)

application/json

The response includes the result of each update operation in the records array, along with any partial failures in `failures` and batch failures in `errors`. Note: When the response includes failures, clients can only retry the failed items from the original request after addressing the reported errors. When the response includes errors, clients should retry the entire batch after addressing the reported errors.

Response Body

recordsarray<object>
Per-record results for each input operation. Order matches the input `records` array.
failuresarray<object>
List of failed operations within the batch. Use `index` to map back to the input record.
errorsarray<string>
Top-level errors that caused the entire batch to fail. If present, clients should retry the request.

Response Body Examples

Successful batch update:

{
  "records": [
    {
      "success": true
    },
    {
      "success": true
    }
  ],
  "failures": [],
  "errors": []
}

Successful update with identifiers returned:

{
  "records": [
    {
      "identifiers": [
        {
          "name": "email",
          "value": "user1@example.com"
        },
        {
          "name": "phone",
          "value": "+15557654321"
        }
      ],
      "success": true,
      "errorMessage": null
    }
  ],
  "failures": [],
  "errors": []
}

Partial Success:

{
  "records": [
    {
      "success": false,
      "identifiers": [
        {
          "name": "email",
          "value": "user1@example.com"
        }
      ],
      "errorMessage": "The oldValue identifier \"+1231231234\" for identifier name \"phone\" is not linked to the preference record"
    },
    {
      "identifiers": [
        {
          "name": "email",
          "value": "xyz123@foo.com"
        }
      ],
      "success": true
    }
  ],
  "failures": [
    {
      "index": 0,
      "error": "The oldValue identifier \"+1231231234\" for identifier name \"phone\" is not linked to the preference record"
    }
  ],
  "errors": []
}

400 (Bad Request)

application/json

Bad Request

Response Body

errorsarray<string>

401 (Unauthorized)

application/json

There was a problem authenticating your request. This may be an issue with the Transcend API key ("authorization" header), or the Sombra API key ("x-sombra-authorization" header used for self-hosted gateways only).

413 (Request Entity Too Large)

application/json

The request body is too large. JSON and raw bodies must be less than 50MB. URL encoded bodies must be less than 30MB.

429 (Too Many Requests)

application/json

You are sending requests too quickly and have hit our rate limit. If you hit this, you'll need to throttle your request velocity or try again later.

Response Headers

Retry-Afterinteger
X-RateLimit-Limitinteger
X-RateLimit-Remaininginteger
X-RateLimit-Resetinteger

500 (Internal Server Error)

application/json

A 5xx error means there is either an issue with your self-hosted gateway, or a Transcend server is having issues. You check our system status at status.transcend.io. Please reach out to Transcend support if you're experiencing this error.

502 (Bad Gateway)

application/json

An upstream service on Transcend's side is having issues. You check our system status at status.transcend.io. Please reach out to Transcend support if you're experiencing this error.