Batch-upsert preference records for multiple users.

Rate Limits

  • 3000 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.

PUT

/v1/preferences

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.

application/json

recordsarray<object>(required)
The list of user preferences records to update.
skipWorkflowTriggersbooleandefault:false
Whether to skip triggering workflows associated with the purpose change event.

Request Body Examples

Query for upserting user preferences, identifiers and triggering associated workflows:

{
  "records": [
    {
      "partition": "ea3a0845-694e-4820-9d51-50c7d0a23467",
      "timestamp": "2023-05-11T19:32:31.707Z",
      "identifiers": [
        {
          "name": "email",
          "value": "no-track@example.com"
        },
        {
          "name": "phone",
          "value": "+11234567890"
        }
      ],
      "purposes": [
        {
          "purpose": "Advertising",
          "enabled": true
        },
        {
          "purpose": "Analytics",
          "enabled": false
        },
        {
          "purpose": "ProductUpdates",
          "enabled": true,
          "preferences": [
            {
              "topic": "Frequency",
              "choice": {
                "selectValue": "Weekly"
              }
            },
            {
              "topic": "Channel",
              "choice": {
                "selectValues": [
                  "Email",
                  "Sms"
                ]
              }
            },
            {
              "topic": "Unsubscribe",
              "choice": {
                "booleanValue": true
              }
            }
          ],
          "workflowSettings": {
            "isSilent": true,
            "attributes": [
              {
                "key": "Source",
                "values": [
                  "Mobile iOS App"
                ]
              }
            ]
          }
        }
      ],
      "metadata": [
        {
          "key": "version",
          "value": "1.0.0"
        }
      ]
    },
    {
      "partition": "ea3a0845-694e-4820-9d51-50c7d0a2346",
      "timestamp": "2023-05-11T19:32:31.707Z",
      "identifiers": [
        {
          "name": "email",
          "value": "no-track-pls@example.com"
        }
      ],
      "purposes": [
        {
          "purpose": "Advertising",
          "enabled": true
        },
        {
          "purpose": "Analytics",
          "enabled": true
        },
        {
          "purpose": "ProductUpdates",
          "enabled": false
        }
      ],
      "metadata": [
        {
          "key": "version",
          "value": "1.0.0"
        }
      ]
    }
  ],
  "skipWorkflowTriggers": false
}

Query for upserting IAB US Privacy string (similar for IAB GPP and IAB TCF):

{
  "records": [
    {
      "identifiers": [
        {
          "name": "email",
          "value": "no-track@example.com"
        }
      ],
      "partition": "ea3a0845-694e-4820-9d51-50c7d0a23467",
      "timestamp": "2023-05-11T19:32:31.707Z",
      "purposes": [
        {
          "purpose": "Advertising",
          "enabled": true
        },
        {
          "purpose": "Analytics",
          "enabled": true
        }
      ]
    },
    {
      "identifiers": [
        {
          "name": "email",
          "value": "no-track-pls@example.com"
        }
      ],
      "partition": "ea3a0845-694e-4820-9d51-50c7d0a2346",
      "timestamp": "2023-05-11T19:32:31.707Z",
      "purposes": [
        {
          "purpose": "Advertising",
          "enabled": true
        },
        {
          "purpose": "Analytics",
          "enabled": true
        }
      ],
      "consentManagement": {
        "usp": "1YYN"
      }
    }
  ]
}

Query for upserting purposes with attribute/custom fields tags:

{
  "records": [
    {
      "identifiers": [
        {
          "name": "email",
          "value": "no-track@example.com"
        }
      ],
      "partition": "ea3a0845-694e-4820-9d51-50c7d0a23467",
      "timestamp": "2023-05-11T19:32:31.707Z",
      "purposes": [
        {
          "purpose": "Advertising",
          "enabled": true,
          "workflowSettings": {
            "attributes": [
              {
                "key": "Source",
                "values": [
                  "Mobile iOS App"
                ]
              }
            ]
          }
        },
        {
          "purpose": "Marketing",
          "enabled": true,
          "workflowSettings": {
            "attributes": [
              {
                "key": "Source",
                "values": [
                  "Mobile iOS App"
                ]
              }
            ]
          }
        }
      ]
    }
  ]
}

Query for performing a double opt-in in french:

{
  "records": [
    {
      "identifiers": [
        {
          "name": "email",
          "value": "no-track@example.com"
        }
      ],
      "partition": "ea3a0845-694e-4820-9d51-50c7d0a23467",
      "timestamp": "2023-05-11T19:32:31.707Z",
      "locale": "fr-FR",
      "purposes": [
        {
          "purpose": "Marketing",
          "enabled": true,
          "workflowSettings": {
            "attributes": [
              {
                "key": "Double Opt-In",
                "values": [
                  "true"
                ]
              }
            ]
          }
        }
      ]
    }
  ]
}

200 (OK)

application/json

Returns whether the operation was successful and the upserted records

Response Body

successboolean
Whether the preferences were updated successfully
nodesarray<object>
User's preference records

Response Body Example

Success Response:

{
  "success": true,
  "nodes": [
    {
      "partition": "ee1a0845-694e-4820-9d51-50c7d0a23467",
      "timestamp": "2023-04-11T15:09:28.403Z",
      "identifiers": [
        {
          "name": "email",
          "value": "no-track@example.com"
        },
        {
          "name": "phone",
          "value": "+11234567890"
        }
      ],
      "purposes": [
        {
          "purpose": "Advertising",
          "enabled": true
        },
        {
          "purpose": "Analytics",
          "enabled": true
        },
        {
          "purpose": "ProductUpdates",
          "enabled": true,
          "preferences": [
            {
              "topic": "Frequency",
              "choice": {
                "selectValue": "Weekly"
              }
            },
            {
              "topic": "Channel",
              "choice": {
                "selectValues": [
                  "Email",
                  "Sms"
                ]
              }
            },
            {
              "topic": "Unsubscribe",
              "choice": {
                "booleanValue": true
              }
            }
          ]
        }
      ],
      "consentManagement": {
        "usp": null,
        "gpp": null,
        "tcf": null,
        "airgapVersion": null
      },
      "system": {
        "updatedAt": "2023-06-13T08:02:21.793Z",
        "decryptionStatus": "DECRYPTED"
      },
      "metadata": [
        {
          "key": "version",
          "value": "1.0.0"
        }
      ],
      "metadataTimestamp": "2023-06-13T08:02:21.793Z"
    },
    {
      "partition": "ee1a0845-694e-4820-9d51-50c7d0a23467",
      "timestamp": "2023-05-11T15:09:28.403Z",
      "identifiers": [
        {
          "name": "email",
          "value": "no-track-pls@transcend.io"
        },
        {
          "name": "phone",
          "value": "+11334567891"
        }
      ],
      "purposes": [
        {
          "purpose": "Advertising",
          "enabled": true
        },
        {
          "purpose": "Analytics",
          "enabled": true
        },
        {
          "purpose": "ProductUpdates",
          "enabled": false
        }
      ],
      "consentManagement": {
        "gpp": null,
        "tcf": null,
        "airgapVersion": null,
        "usp": "1YYN"
      },
      "system": {
        "updatedAt": "2023-06-13T08:02:21.793Z",
        "decryptionStatus": "DECRYPTED"
      },
      "metadata": [
        {
          "key": "version",
          "value": "1.0.0"
        }
      ],
      "metadataTimestamp": "2023-06-13T08:02:21.793Z"
    }
  ]
}

400 (Bad Request)

application/json

Bad Request

Response Body

errorsarray<string>
Examples:
  • No Preference records were provided. Please provide at least one record to update.
  • Invalid partitions provided.
  • Cannot update more than 10 preference records at once using Admin API with "skipWorkflowTriggers" set to false.
  • Cannot update more than 100 preference records at once using Admin API.
  • Duplicate records found in the update request. Ensure that you only provide 1 update for each partition/identifier combination.
  • Payload does not conform to the expected schema

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
Retry-Afterinteger
X-RateLimit-Limitinteger
X-RateLimit-Remaininginteger
X-RateLimit-Resetinteger
Retry-Afterinteger
X-RateLimit-Limitinteger
X-RateLimit-Remaininginteger
X-RateLimit-Resetinteger
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.