# Respond to an access request (JSON bulk upload) (/docs/api-reference/custom-integration/post-v1-data-silo)

When responding to an access request, use this POST method. You can upload to many datapoints at once when the files uploaded to each Datapoint is valid JSON.

## POST /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 access request (JSON bulk upload)",
    "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": {}
            }
          }
        }
      }
    },
    "operationId": "post-v1-data-silo",
    "security": [
      {
        "Transcend_API_Key": [
          "API Key must be associated to this integration"
        ]
      }
    ],
    "requestBody": {
      "content": {
        "application/json": {
          "schema": {
            "description": "",
            "type": "object",
            "properties": {
              "profiles": {
                "type": "array",
                "uniqueItems": true,
                "minItems": 0,
                "maxItems": 1,
                "description": "An array of profiles found. Typically this of length 1, but if your system finds multiple profiles (or accounts) for this user, you can upload multiple profiles with this array. Or zero!",
                "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. When passing a list of length 1, 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."
                    },
                    "profileData": {
                      "type": "object",
                      "description": "Arbitrary JSON data. Each key should match the datapoint name which you can define on the integration. This field can be left empty when status is passed, but must be provided otherwise."
                    }
                  }
                }
              },
              "status": {
                "type": "string",
                "description": "Override the integration to be in a specific state. Any unreported datapoints will be marked as \"no data\" when status is \"READY\", \"RESOLVED\", or \"ACTION_REQUIRED\". Any unreported datapoints will be marked as \"skipped\" when status is \"SKIPPED\" or \"SKIPPED_DUE_TO_EXCEPTION\". When status is \"WAITING\", unreported datapoints will not have their statuses changed. Typically this isn't needed, since the integration automatically becomes \"ready\" once all datapoints have been reported. When responding to indicate that an async job is still in progress, use profileStatus: \"WAITING\" and include your pollId (an external job ID that Transcend will pass back on the next invocation, so your integration can look up the status of the async job) and a retryAfterDate. For async jobs, reserve the top-level status field for terminal outcomes only (READY, RESOLVED, SKIPPED).",
                "enum": [
                  "READY",
                  "RESOLVED",
                  "SKIPPED",
                  "SKIPPED_DUE_TO_EXCEPTION",
                  "ACTION_REQUIRED",
                  "WAITING"
                ]
              },
              "profileStatus": {
                "type": "string",
                "description": "Override the profile datapoints that have profileData set to be in a specific state. Any unreported datapoints will be updated according to the `status` field instead of this field. ",
                "enum": [
                  "RESOLVED",
                  "SKIPPED",
                  "SKIPPED_DUE_TO_EXCEPTION",
                  "WAITING",
                  "ERROR"
                ]
              }
            }
          },
          "examples": {
            "Upload to the datapoints \"name\" and \"favorite food\". And denote that processing is done.": {
              "value": {
                "profiles": [
                  {
                    "profileData": {
                      "name": "Ben Farrell",
                      "favoriteFood": [
                        "pie",
                        "fries"
                      ],
                      "address": null
                    }
                  }
                ],
                "status": "READY"
              }
            },
            "Upload some of the datapoints \"name\", but denote more data to come": {
              "value": {
                "profiles": [
                  {
                    "profileData": {
                      "name": "Ben Farrell"
                    }
                  }
                ]
              }
            },
            "Could not find user": {
              "value": {
                "status": "READY"
              }
            }
          }
        }
      },
      "description": "For the integration to be considered \"ready\" for the user to download, Transcend expects each Datapoint of an integration to receive data, or otherwise be reported as having no data found.\n\nIn a JSON bulk upload, you can indicate that a datapoint was not found by returning null, undefined, [], {}, or None. Check out the example to see what that looks like.\n\nYou can also override the integration to be \"ready\" by passing the status: \"READY\" option."
    },
    "parameters": [
      {
        "$ref": "#/components/parameters/x-transcend-nonce"
      },
      {
        "$ref": "#/components/parameters/authorization"
      },
      {
        "$ref": "#/components/parameters/x-sombra-authorization"
      },
      {
        "$ref": "#/components/parameters/content-type-application-json"
      }
    ],
    "tags": [
      "Custom integration"
    ],
    "description": "When responding to an access request, use this POST method. You can upload to many datapoints at once when the files uploaded to each Datapoint is valid JSON."
  }
}
```