Cloud Storage Service Public API
8x8 Cloud Storage Service Public API for listing, retrieving and managing call recordings and other stored media across regional storage tenants.
8x8 Cloud Storage Service Public API for listing, retrieving and managing call recordings and other stored media across regional storage tenants.
{
"openapi": "3.0.0",
"info": {
"version": "3.1.6",
"title": "Cloud Storage Service Public API",
"contact": { "name": "Recordings Team", "email": "ro-rec@8x8.com" },
"termsOfService": "https://www.8x8.com/terms-and-conditions",
"description": "8x8’s Cloud Storage Service (CSS) offers you a single point of access for Virtual Office PBX telephone, Virtual Contact Center call recordings, Virtual Contact Center screen recordings and Virtual Meetings. You can access and download these data objects for your further analysis and use. You can also embed your data in other interfaces without a requirement to copy or move the underlying data.\n\nFor example:\n* Make collected data available to customers in your client portal\n* Integrate call recording data into CRM applications to associate with customer interaction records\n* Enable deletion of media (and or metadata) to allow customers to meet internal requirements to cap data retention based on workflows, policies, or compliance needs\n\nYou can obtain your stored data by either:\n* Querying for, and then downloading individual data objects\n* Bulk downloading all of your data using a Zip file utility (Note that the limit on bulk file downloads is 2 GB.)\n***Note: This page is in the Beta stage. Contact your [8x8 representative](mailto:ro-rec@8x8.com) for more information on API use.***\n# **Authentication**\nYou can try out this API through request authentication using your client credentials. Refer to [Client Credentials](/analytics/docs/how-to-get-api-keys) on the [Getting Started](/tech-partner/docs/getting-started) page for more information.\n\nAll requests must be made over HTTPS - calls made over HTTP will fail.\n# **Regions**\nAPI resources are available for each geographical region in which they are provisioned. The base URLs for select regions are:\n<table> <tr> <td><b>URL</b></td> <td><b>Region</b></td> </tr> <tr> <td><b><a href='https://api.8x8.com/storage/us-west/v1'>https://api.8x8.com/storage/us-west/v1</a></b></td><td>Western US</td></tr><tr> <td><b><a href='https://api.8x8.com/storage/us-east/v1'>https://api.8x8.com/storage/us-east/v1</a></b></td><td>Eastern US</td></tr><tr> <td><b><a href='https://api.8x8.com/storage/uk/v1'>https://api.8x8.com/storage/uk/v1</a></b></td><td>United Kingdom</td></tr><tr> <td><b><a href='https://api.8x8.com/storage/ap/v1'>https://api.8x8.com/storage/ap/v1</a></b></td><td>Australia</td> </tr> <tr> <td><b><a href='https://api.8x8.com/storage/ca/v1'>https://api.8x8.com/storage/ca/v1</a></b></td><td>Canada</td> </tr> </table>"
},
"servers": [
{
"url": "https://api.8x8.com/storage/{region}/{apiversion}/",
"description": "The Storage API Gateway Endpoint",
"variables": {
"region": {
"enum": ["us-west", "us-east", "uk", "ap", "ca"],
"default": "us-west"
},
"apiversion": { "default": "v3" }
}
}
],
"tags": [
{ "name": "Objects", "description": "Manage objects" },
{ "name": "Bulk Downloads", "description": "Bulk content operations" },
{ "name": "Buckets", "description": "Manage buckets" }
],
"security": [{ "bearerAuth": [] }],
"paths": {
"/objects": {
"get": {
"x-publish-public": true,
"description": "\n**Tagging**\nThe CSS API features a generic tagging methodology. The tags on each object are determined either systematically or by customer definition. Systematic tags are generated by the underlying provider system. \nThe following object types are supported:\n\n* **`callrecording`**\n* **`callcenterrecording`**\n* **`screenrecording`**\n* **`meeting`**\n\nThe tag types vary depending on the provider. \n**`callrecording`**\n\n * **pbxname** The human readable name of the PBX system.\n * **extensionId** The machine readable ID of the telephone extension which generated the object.\n * **pbxId** The machine readable ID of the PBX system.\n * **callId** The ID which describes the voice interaction.\n * **direction** The direction of the interaction.\n * **relativePath** The relative path of the object in storage.\n * **callerId** The calling line ID generated by the telecom provider.\n * **startTime** The date/time stamp when the voice interaction was established.\n * **duration** The duration of the voice interaction in milliseconds.\n * **extensionNumber** The human readable PBX extension number.\n * **endTime** The date/time stamp when the voice interaction was terminated.\n\n**`callcenterrecording`**\n\n * **direction** The direction of the interaction.\n * **agentId** The agent identifier.\n * **callId** The call identifier.\n * **callSnippetId** The identification call for snippets.\n * **callerId** The caller's phone number.\n * **calleeId** The called phone number.\n * **callerName** The caller name.\n * **calleeName** The called name.\n * **address** The called phone number.\n * **queueNumber** The VCC queue number.\n * **queueName** The VCC queue name.\n * **channelName** The VCC channel name.\n * **transactionId** VCC transaction identifier.\n * **holdDuration** The hold duration.\n * **billingTelephoneNumber** The phone number used for billing (internal use).\n * **startTime** The interaction start time.\n * **duration** The duration of the voice interaction in seconds.\n * **ipbxid** The PBX name.\n * **agentName** The agent name.\n * **tenantId** The tenant identifier.\n * **extensionNumber** The agent extension number (e.g., 1000).\n * **mediaUrl** The NFS file name (internal use).\n * **branchId** The branch (site) identifier.\n\n**`screenrecording`**\n * **agentId** The agent identifier.\n * **callId** The call identifier.\n * **startTime** The call start time.\n * **tenantId** The tenant identifier.\n * **transactionId** The VCC transaction identifier.\n\n**`meeting`**\n\n * **duration** The duration of the meeting in milliseconds.\n * **meetingUrl** The URL which was used for the meeting.\n * **sessionId** The unique machine readable session ID of the meeting.",
"tags": ["Objects"],
"summary": "The list of all objects that meet the filter rule criteria.",
"operationId": "searchobject",
"parameters": [
{
"name": "Content-Type",
"in": "header",
"description": "This parameter indicates the type of content. Currently only `application/json` is supported.",
"required": true,
"style": "simple",
"explode": false,
"schema": { "type": "string", "example": "application/json" }
},
{
"name": "filter",
"in": "query",
"description": "\nThis API is designed with filtering capabilities using Feed Item Query Language (FIQL) filter expressions. <br> FIQL introduces simple and composite operators which can be used to build basic and complex queries. <br> If the *filter* is not specified, all objects are returned.\nThe following are basic FIQL operators:\n* **`==`** - Equal to\n* **`!=`** - Not equal to\n* **`=gt=`** - Greater than\n* **`=ge=`** - Greater or equal to\n* **`=lt=`** - Less than\n* **`=le=`** - Less or equal to\nThese six operators can be used to different types of simple queries. For example:\n* **`name==MyRecording**` - Finds all items with name **`MyRecording`**\n* **`type!=callrecording`** - Finds all items which are not **`callrecording`**\n* **`size=gt=1024`** - Finds all items with size bigger than 1024\n* **`size=le=1024`** - Finds all items with size smaller or equal with 1024\nFIQL joining operators consist of the following:\n* **`;`** = AND\n* **`,`** = OR\nThese two operators can be used to join simple queries and build more complex queries. For example:\n* **`name==MyRecording,name==YourRecording`** - Find all items with name **`MyRecording`** or with name **`YourRecording`**\n* **`type==callrecording;size=gt=1024`** - Find all **`callrecording`** items with size greather than 1024\n* **`type==callrecording;(name==MyRecording,name==YourRecording)`** - Find all **`callrecording`** items with name **`MyRecording`** or with name **`YourRecording`**\n",
"style": "form",
"explode": true,
"schema": { "type": "string", "example": "type!=callrecording" }
},
{
"name": "pageKey",
"in": "query",
"description": "This parameter indicates the page number to begin your query.",
"style": "form",
"explode": true,
"schema": { "type": "number", "format": "integer", "example": 1 }
},
{
"name": "limit",
"in": "query",
"description": "This parameter indicates the page size to begin your query with. A value between 1 and 100 is supported.",
"style": "form",
"explode": true,
"schema": { "type": "number", "format": "integer", "example": 10 }
},
{
"name": "sortField",
"in": "query",
"description": "The field used for sorting. Content and Tag fields are supported.",
"style": "form",
"explode": true,
"schema": { "type": "string", "example": "objectId" }
},
{
"name": "sortDirection",
"in": "query",
"description": "This field describes the sorting direction. Sorting can be specified as 'ASC' for ascending or 'DESC' for descending.",
"style": "form",
"explode": true,
"schema": { "type": "string", "example": "DESC" }
}
],
"responses": {
"200": {
"description": "Returns the filtered or unfiltered list of object metadata.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": { "$ref": "#/components/schemas/ResponsePage" }
}
}
}
},
"400": { "$ref": "#/components/responses/badRequest" },
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"405": { "$ref": "#/components/responses/methodNotAllowed" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/objects/{objectId}": {
"get": {
"x-publish-public": true,
"description": "Use this method to retrieve an object by its ID.",
"tags": ["Objects"],
"summary": "Find an object by it's ID.",
"operationId": "getobject",
"parameters": [
{
"name": "objectId",
"in": "path",
"description": "Use this parameter to specify the object ID to return.",
"required": true,
"schema": { "type": "string" }
}
],
"responses": {
"200": {
"description": "Returns the requested object record details",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/ObjectResponse" }
}
}
},
"400": { "$ref": "#/components/responses/badRequest" },
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"405": { "$ref": "#/components/responses/methodNotAllowed" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/objects/{objectId}/metadata": {
"get": {
"x-publish-public": true,
"description": "This method retrieves an object using the objectId specification for a given record.",
"tags": ["Objects"],
"summary": "Download content for the given metadata.",
"operationId": "downloadmetadata",
"parameters": [
{
"name": "objectId",
"in": "path",
"description": "This parameter obtains the ID for the returned object.",
"required": true,
"schema": {
"type": "string",
"example": "FKC4RF6OXNMGGUW4LIFSWVLEIVJ54JBTVAD3SQYKNFK2ATUQCMAA----"
}
}
],
"responses": {
"200": {
"description": "Returns the requested object record details.",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/ObjectResponse" }
}
}
},
"400": { "$ref": "#/components/responses/badRequest" },
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"405": { "$ref": "#/components/responses/methodNotAllowed" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/objects/{objectId}/content": {
"get": {
"x-publish-public": true,
"description": "This method retrieves an object using the **`objectId`** specification for a given record.",
"tags": ["Objects"],
"summary": "Download content for the given metadata.",
"operationId": "downloadobject",
"parameters": [
{
"name": "objectId",
"in": "path",
"description": "This parameter obtains the ID for the returned object.",
"required": true,
"schema": {
"type": "string",
"example": "FKC4RF6OXNMGGUW4LIFSWVLEIVJ54JBTVAD3SQYKNFK2ATUQCMAA----"
}
},
{
"name": "presignUrl",
"in": "query",
"description": "By specifying this parameter option, the object content which is associated with the metadata record is returned as a **`presignedUrl`** instead of a machine-readable ID.",
"required": false,
"schema": { "type": "boolean", "default": false }
}
],
"responses": {
"200": {
"description": "The object stream download.",
"content": {
"application/json": {
"schema": { "type": "string", "format": "byte" }
}
}
},
"400": { "$ref": "#/components/responses/badRequest" },
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"405": { "$ref": "#/components/responses/methodNotAllowed" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/bulk": {
"delete": {
"x-public-public": true,
"description": "This method enables you to bulk delete object metadata along with associated content.",
"tags": ["Bulk Downloads"],
"summary": "Remove existing objects.",
"operationId": "removecontent",
"responses": {
"200": { "description": "OK" },
"204": { "$ref": "#/components/responses/noContent" },
"400": { "$ref": "#/components/responses/badRequest" },
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"405": { "$ref": "#/components/responses/methodNotAllowed" },
"500": { "$ref": "#/components/responses/internalServerError" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false,
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "string",
"example": "3613ea7c-2033-11eb-adc1-0242ac120002"
}
}
}
},
"description": "Use this request to bulk remove metadata and content for the provided object IDs."
}
}
},
"/bulk/download/cancel/{zipName}": {
"post": {
"x-publish-public": true,
"description": "This method cancels a running bulk download job by the zip file name.",
"tags": ["Bulk Downloads"],
"summary": "Cancel a running bulk download job by zip file name.",
"operationId": "cancelbulkdownload",
"parameters": [
{
"name": "zipName",
"in": "path",
"description": "The zip archive name for bulk download cancellation.",
"required": true,
"schema": { "type": "string" }
}
],
"responses": {
"200": {
"description": "Cancelled a running bulk download by it's zip file name.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/downloadContentStatus"
}
}
}
}
},
"201": { "$ref": "#/components/responses/created" },
"204": { "$ref": "#/components/responses/noContent" },
"400": { "$ref": "#/components/responses/badRequest" },
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/bulk/download/clear": {
"put": {
"x-publish-public": true,
"description": "This method clears your task queue for bulk download requests.",
"tags": ["Bulk Downloads"],
"summary": "Removes tasks from a download request.",
"operationId": "cleardownloads",
"responses": {
"200": {
"description": "Cancel a running bulk download by it's zip file name.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/downloadContentStatus"
}
}
}
}
},
"201": { "$ref": "#/components/responses/created" },
"204": { "$ref": "#/components/responses/noContent" },
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/bulk/download/start": {
"post": {
"x-publish-public": true,
"description": "This method starts downloading multiple objects in bulk. The objects are zipped and transferred as one file.",
"tags": ["Bulk Downloads"],
"summary": "Start bulk download.",
"operationId": "startdownload",
"responses": {
"200": {
"description": "Start a bulk download.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/downloadContentStatus"
}
}
}
}
},
"201": { "$ref": "#/components/responses/created" },
"204": { "$ref": "#/components/responses/noContent" },
"400": { "$ref": "#/components/responses/badRequest" },
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false,
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"type": "string",
"example": "3613ea7c-2033-11eb-adc1-0242ac120002"
}
}
}
},
"description": "Use this request to start a bulk download job for the provided object IDs.",
"required": true
}
}
},
"/bulk/download/status": {
"get": {
"x-publish-public": true,
"description": "This method returns the status of all bulk download job requests.",
"tags": ["Bulk Downloads"],
"summary": "Returns the status of all bulk download job requests.",
"operationId": "downloadstatuses",
"responses": {
"200": {
"description": "Returns the bulk download task status.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/downloadContentStatus"
}
}
}
}
},
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/bulk/download/status/{zipName}": {
"get": {
"x-publish-public": true,
"description": "This method returns the status of a single bulk download job request by zip filename.",
"tags": ["Bulk Downloads"],
"summary": "Returns the status of a single bulk download job request by zip filename.",
"operationId": "downloadstatus",
"parameters": [
{
"name": "presignUrl",
"in": "query",
"description": "The pre-signed URL.",
"required": false,
"schema": { "type": "boolean", "default": false, "example": false }
},
{
"name": "zipName",
"in": "path",
"description": "This method returns the status details for the given .zip archive.",
"required": true,
"schema": { "type": "string", "example": "filename.zip" }
}
],
"responses": {
"200": {
"description": "The bulk download task status for a given .zip file name.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/downloadContentStatus"
}
}
}
}
},
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/bulk/download/{zipName}": {
"get": {
"x-publish-public": true,
"description": "This method enables access to a single zipped file that was generated from a bulk download request and is ready for retrieval.",
"tags": ["Bulk Downloads"],
"summary": "Request bulk download by .zip filename.",
"operationId": "downloadbulk",
"parameters": [
{
"name": "zipName",
"in": "path",
"description": "This operation specifies the .zip archive file name to download.",
"required": true,
"schema": { "type": "string", "example": "example.zip" }
}
],
"responses": {
"200": {
"description": "Retrieves the bulk download data for a given .zip file name.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/downloadContentStatus"
}
}
}
}
},
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/buckets": {
"get": {
"x-publish-public": true,
"description": "A bucket is a resource that is used to store data objects and their associated metadata. This method returns all content within existing buckets.",
"tags": ["Buckets"],
"summary": "Search all buckets.",
"operationId": "searchbucket",
"responses": {
"200": {
"description": "Returns a list of all of the objects inside accessible buckets.",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/BucketResponse" }
}
}
},
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"405": { "$ref": "#/components/responses/methodNotAllowed" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
},
"/buckets/{bucketId}": {
"get": {
"x-publish-public": true,
"description": "This method returns all of the contents contained within a specific bucket.",
"tags": ["Buckets"],
"summary": "Returns the content of a specified bucket.",
"operationId": "getbucket",
"parameters": [
{
"name": "bucketId",
"in": "path",
"description": "The ID for the specified bucket.",
"required": true,
"schema": { "type": "string", "example": "3314J06662K7SOEQD5" }
}
],
"responses": {
"200": {
"description": "Returns a list of all objects inside a specified bucket.",
"content": {
"application/json": {
"schema": { "$ref": "#/components/schemas/BucketResponse" }
}
}
},
"401": { "$ref": "#/components/responses/unauthorized" },
"403": { "$ref": "#/components/responses/forbidden" },
"404": { "$ref": "#/components/responses/notFound" },
"405": { "$ref": "#/components/responses/methodNotAllowed" },
"default": { "$ref": "#/components/responses/internalServerError" }
},
"deprecated": false
}
}
},
"components": {
"responses": {
"created": {
"description": "The response given when a resource is created. This response can vary depending on the request given."
},
"noContent": {
"description": "The response given when a successful request was completed, but did not have content to return."
},
"badRequest": {
"description": "The received request was malformed resulting in form validation errors."
},
"unauthorized": {
"description": "Unauthorized: Invalid or no authentication details were provided."
},
"forbidden": {
"description": "The authentication was successful, but the authenticated user does not have access to the resource."
},
"notFound": { "description": "The requested resource was not found." },
"methodNotAllowed": {
"description": "This method is not allowed or a validation exception has occurred."
},
"internalServerError": {
"description": "An internal server error has occurred. Please contact your 8x8 support resource."
}
},
"schemas": {
"BucketResponse": {
"type": "object",
"description": "Objects can be grouped into buckets. This is useful for records which may have many different types of objects which are associated.",
"properties": {
"createdTime": {
"type": "string",
"example": "2019-05-11T00:55:24",
"description": "The ISO 8601 timestamp for when the object record was created."
},
"customerId": {
"type": "string",
"description": "The unique 8x8 customer account identifier.",
"example": "0012J00002K7SOFQA3"
},
"bucketId": {
"type": "string",
"description": "The unique 8x8 system generated bucket ID.",
"example": "3314J06662K7SOEQD5"
},
"objectList": {
"type": "array",
"items": { "$ref": "#/components/schemas/ObjectResponse" }
},
"tags": {
"description": "Buckets enable you to create tags. You can create tags to describe objects or for filtering.",
"items": { "$ref": "#/components/schemas/TagResponse" }
},
"updatedTime": {
"type": "string",
"example": "2019-05-11T00:55:24",
"description": "The ISO 8601 timestamp when the object record was last updated."
},
"userId": {
"type": "string",
"example": "b4ZRdTEnToOh6vRAq79U_g",
"title": "Bucket Response."
}
}
},
"downloadContentStatus": {
"type": "object",
"description": "\nA detailed status is available for the data transfer. There are several different status messages which indicate to the user the progress of their download request.\n\nThe following status messages are available:\n\n| Status | Description |\n|--------------|-------------------------------------------------|\n| NOT_STARTED | No request has been made to transfer this file. |\n| IN_PROGRESS | The file transfer is in progress. |\n| DONE | The file transfer is complete. |\n| FAILED | The file transfer has failed. |\n| CANCELLED | The user has cancelled the transfer request. |\n| PARTIAL_DONE | A partial transfer request has been completed. |\n",
"properties": {
"content": {
"type": "array",
"description": "A list which contains the objectId and status for the file transfer request.",
"items": { "type": "string" }
},
"status": {
"type": "string",
"example": "DONE",
"enum": [
"NOT_STARTED",
"IN_PROGRESS",
"DONE",
"FAILED",
"CANCELLED",
"PARTIAL_DONE"
]
},
"url": {
"type": "string",
"description": "The presigned URL for content.",
"example": "https://api.8x8.com/storage/us-west/cloud-storage-service.s3.us-west-2.amazonaws.com/content/EPS/0011D00000LvBSaQAN/FGNEmsxXTQmuYMA2EtFUpA/ac46adbf-15cc-49bf-9d87-c0945c1ddd03?response-content-disposition =attachment%3B%20filename%3D%22%3D%3FUTF-8%3Fb%3FU25ha2VfUml2ZXJfKDVtYikuanBn%3F%3D%22&X-Amz-Security-Tok=AgoJb3JpZ2luX2VjELn%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJGMEQCIEf1S0SkgwFrQoR6D71p76zyHePbF5C2zFqSSnSwDMDuAiBA0suixm9m5baxo8Wye9WsGziPcgFBcw2%2BCjEFnwTx3SraAwhCEAAaDDA1NzY1NjM2Mzk4Ni IMGUzfDjk2xWj88d%2FPKrcDKHisme41JCS%2F4rwNXL Y2HK%2FtWrieubWvo9Hzu2BfHdpqrjbPNBuRo%2BFArxHQX6t1gtizv2NXhOZwALMU0OY6KWQy0JdIWSkvBZbn%2B2tmubsA3wCdCV8jqUJi0Lh5DjT8iaK3O63lrHTJjiCrYgqaBRH0J2qYz0fAUTJ%2BPWE8XRuPn3O50vY6CrRrHR60SdfBsxOAoaUZMz9tr SLZ7CpYXwDj7LITad7BfEuS4d2QUe0lVj42TFswW%2 BtsHEVQ%2Fff2ZjXnwSulXnw705Kb6e0QVYzzPSfQpFOYQ5myl
# --- truncated at 32 KB (38 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/8x8/refs/heads/main/openapi/8x8-analytics-cloud-storage-service-public-api.json