# Respond to an erasure/opt out/opt in request (/docs/api-reference/custom-integration/put-v1-data-silo)

When responding to an erasure request, use this PUT method to confirm completion of an erasure in your system.

## PUT /v1/data-silo

```json
{
  "servers": [
    {
      "url": "https://multi-tenant.sombra.transcend.io",
      "description": "Multi-tenant (EU)"
    },
    {
      "url": "https://multi-tenant.sombra.us.transcend.io",
      "description": "Multi-tenant (US)"
    },
    {
      "description": "Self-hosted",
      "url": "https://_yourOrganizationSombraURL_.com"
    },
    {
      "description": "Preference Store in Europe",
      "url": "https://consent.transcend.io"
    },
    {
      "description": "Preference Store in the U.S.",
      "url": "https://consent.us.transcend.io"
    },
    {
      "description": "Rules Automation webhook ingestion (EU)",
      "url": "https://rule-automation.transcend.io"
    },
    {
      "description": "Rules Automation webhook ingestion (US)",
      "url": "https://rule-automation.us.transcend.io"
    }
  ],
  "security": [
    {
      "Transcend_API_Key": [],
      "Sombra_Token": [],
      "Transcend_API_Key_If_Multitenant": []
    }
  ],
  "operation": {
    "summary": "Respond to an erasure/opt out/opt in request",
    "operationId": "put-v1-data-silo",
    "security": [
      {
        "Transcend_API_Key": []
      }
    ],
    "requestBody": {
      "content": {
        "application/json": {
          "schema": {
            "description": "",
            "type": "object",
            "properties": {
              "profiles": {
                "type": "array",
                "uniqueItems": true,
                "minItems": 1,
                "description": "[DEPRECATED] An array of each of the profiles that were erased. You should not set this value if you are using multi tenant Sombra or have a Sombra version at or above 7.199.0. For recent versions of Sombra, the profile identifier is pulled from the nonce, which means you can pass an empty body.",
                "items": {
                  "type": "object",
                  "properties": {
                    "profileId": {
                      "type": "string",
                      "minLength": 1,
                      "deprecated": true,
                      "description": "[DEPRECATED] A unique name for this profile (or account), such as a username or user ID. You should not set this value if you are using multi tenant Sombra or have a Sombra version at or above 7.199.0. For recent versions of Sombra, the profile identifier is pulled from the nonce. You should pass an empty body."
                    }
                  }
                }
              },
              "status": {
                "type": "string",
                "description": "Override the integration to be in a specific state. If `status` is set to \"READY\" or \"RESOLVED\", this will also mark all specified profiles as resolved. ",
                "enum": [
                  "READY",
                  "RESOLVED",
                  "SKIPPED",
                  "SKIPPED_DUE_TO_EXCEPTION",
                  "ACTION_REQUIRED",
                  "WAITING"
                ]
              },
              "profileStatus": {
                "type": "string",
                "description": "Override the specified profiles to be in a specific state.",
                "enum": [
                  "RESOLVED",
                  "SKIPPED",
                  "SKIPPED_DUE_TO_EXCEPTION",
                  "WAITING",
                  "ERROR"
                ]
              },
              "pollId": {
                "type": "string",
                "description": "If this DSR is in a polling state, this field will contain the ID of the async job that is polling for the DSR. You can use this ID to check the status of the DSR in your system."
              },
              "message": {
                "type": "string",
                "description": "A message to include in the response to provide an update about the response. This is displayed in the Transcend dashboard. This can be an error message or a description about the current state of the request job."
              },
              "retryAfterDate": {
                "type": "string",
                "format": "date-time",
                "description": "A date in the future that indicates when the user can retry the request. This is used for workflows that are asynchronous or to indicate when an error should be retried."
              }
            }
          },
          "examples": {
            "Update the profile specified in the nonce as resolved and denote that processing is done.": {
              "value": {}
            },
            "Update the profile specified in the nonce as resolved and denote that no data was found.": {
              "value": {
                "status": "SKIPPED"
              }
            },
            "Update the profile specified in the nonce as skipped and denote more data to come": {
              "value": {
                "status": "WAITING",
                "profileStatus": "SKIPPED"
              }
            },
            "Report back that an error occurred while processing the request": {
              "value": {
                "message": "Something went wrong! Please reach out to Bobby.",
                "profileStatus": "ERROR"
              }
            },
            "Report back that an asynchronous job is polling for the DSR": {
              "value": {
                "message": "The request has started processing and is polling for the DSR.",
                "pollId": "async-job-id-123",
                "profileStatus": "WAITING"
              }
            },
            "Report back that an asynchronous job is polling for the DSR, retry at a specific time": {
              "value": {
                "message": "The request has started processing and is polling for the DSR.",
                "pollId": "async-job-id-123",
                "profileStatus": "WAITING",
                "retryAfterDate": "2025-06-07T00:00:00.000Z"
              }
            },
            "(DEPRECATED) Update the profile \"12345\" as resolved and denote that processing is done.": {
              "value": {
                "profiles": [
                  {
                    "profileId": "12345"
                  }
                ],
                "status": "RESOLVED"
              }
            },
            "(DEPRECATED) Update the profile \"12345\" as skipped and denote more data to come": {
              "value": {
                "profiles": [
                  {
                    "profileId": "12345"
                  }
                ],
                "status": "WAITING",
                "profileStatus": "SKIPPED"
              }
            }
          }
        }
      },
      "description": "Unlike the POST method for access requests, Transcend does not require profileData. Transcend only requires the "
    },
    "parameters": [
      {
        "$ref": "#/components/parameters/x-transcend-nonce"
      },
      {
        "$ref": "#/components/parameters/authorization"
      },
      {
        "$ref": "#/components/parameters/x-sombra-authorization"
      },
      {
        "$ref": "#/components/parameters/content-type-application-json"
      }
    ],
    "description": "When responding to an erasure request, use this PUT method to confirm completion of an erasure in your system.",
    "responses": {
      "200": {
        "description": "Your request was received without an issue.",
        "headers": {},
        "content": {
          "application/json": {
            "schema": {
              "description": "",
              "type": "object"
            }
          }
        }
      },
      "400": {
        "description": "While this request passed authentication, the input is malformed. Please double-check that your code conforms to our API specification.",
        "headers": {},
        "content": {
          "application/json": {
            "schema": {
              "description": "",
              "type": "object",
              "properties": {}
            }
          }
        }
      },
      "401": {
        "description": "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).",
        "headers": {},
        "content": {
          "application/json": {
            "schema": {
              "description": "",
              "type": "object",
              "properties": {}
            }
          }
        }
      },
      "409": {
        "description": "The data subject request is not in a status where it can be modified. This endpoint can only run while the request is still active. Once it is completed, canceled, or otherwise no longer active, further calls return HTTP 409 with: `This DSR is not in a status where it can be modified. It may have already been sent to the data subject.` This is expected after a successful callback — the prior opt-out or erasure is unchanged. Treat 409 as non-retryable. If the job already received HTTP 200, stop there.",
        "headers": {},
        "content": {
          "application/json": {
            "schema": {
              "description": "",
              "type": "object",
              "properties": {}
            }
          }
        }
      },
      "413": {
        "description": "The request body is too large. JSON and raw bodies must be less than 50MB. URL encoded bodies must be less than 30MB.",
        "headers": {},
        "content": {
          "application/json": {
            "schema": {
              "description": "",
              "type": "object",
              "properties": {}
            }
          }
        }
      },
      "429": {
        "description": "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.",
        "headers": {
          "Retry-After": {
            "description": "The number of seconds to wait before retrying.",
            "schema": {
              "type": "integer"
            }
          },
          "X-RateLimit-Limit": {
            "description": "The maximum number of requests allowed in the time window.",
            "schema": {
              "type": "integer"
            }
          },
          "X-RateLimit-Remaining": {
            "description": "The number of requests remaining in the time window.",
            "schema": {
              "type": "integer"
            }
          },
          "X-RateLimit-Reset": {
            "description": "The time at which the rate limit will reset.",
            "schema": {
              "type": "integer"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "description": "",
              "type": "object",
              "properties": {}
            }
          }
        }
      },
      "500": {
        "description": "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.",
        "headers": {},
        "content": {
          "application/json": {
            "schema": {
              "description": "",
              "type": "object",
              "properties": {}
            }
          }
        }
      },
      "502": {
        "description": "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.",
        "headers": {},
        "content": {
          "application/json": {
            "schema": {
              "description": "",
              "type": "object",
              "properties": {}
            }
          }
        }
      }
    },
    "tags": [
      "Custom integration"
    ]
  }
}
```