Skip to content

Instantly share code, notes, and snippets.

@klaude
Created February 3, 2020 17:53
Show Gist options
  • Save klaude/6455cc28f1142940617e5006ae50afe7 to your computer and use it in GitHub Desktop.
Save klaude/6455cc28f1142940617e5006ae50afe7 to your computer and use it in GitHub Desktop.
Swagger specs for StackPath's object storage API
{
"swagger": "2.0",
"info": {
"title": "Object Storage",
"version": "1.0.0",
"contact": {
"name": "StackPath Support",
"url": "https://support.stackpath.com/"
}
},
"host": "gateway.stackpath.com",
"schemes": [
"https"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"paths": {
"/storage/v1/stacks/{stack_id}/buckets": {
"get": {
"summary": "Retrieve all buckets in the storage provider for a given stack",
"operationId": "GetBuckets",
"responses": {
"200": {
"description": "",
"schema": {
"type": "object",
"properties": {
"pageInfo": {
"type": "object",
"properties": {
"totalCount": {
"type": "string",
"description": "The total number of items in the dataset"
},
"hasPreviousPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not a previous page of data exists"
},
"hasNextPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not another page of data is available"
},
"startCursor": {
"type": "string",
"description": "The cursor for the first item in the set of data returned"
},
"endCursor": {
"type": "string",
"description": "The cursor for the last item in the set of data returned"
}
},
"description": "Information about a paginated response\n\nThis is modeled after the GraphQL Relay spec to support both cursor based pagination and traditional offset based pagination."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
},
"description": "The requested buckets"
}
},
"description": "The buckets for the given stack"
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack for which the buckets will be retrieved",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "page_request.first",
"description": "The number of items desired.",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "page_request.after",
"description": "The cursor value after which data will be returned.",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "page_request.filter",
"description": "SQL-style constraint filters.",
"in": "query",
"required": false,
"type": "string"
},
{
"name": "page_request.sort_by",
"description": "Sort the response by the given field.",
"in": "query",
"required": false,
"type": "string"
}
],
"tags": [
"Buckets"
]
},
"post": {
"summary": "Create a bucket under a stack",
"operationId": "CreateBucket",
"responses": {
"200": {
"description": "",
"schema": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "The bucket created"
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack on which the bucket will be created",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "The name of the bucket to be created"
},
"region": {
"type": "string",
"description": "The region where to create the bucket, defaults to us-east-1"
}
},
"title": ""
}
}
],
"tags": [
"Buckets"
]
}
},
"/storage/v1/stacks/{stack_id}/buckets/{bucket_id}": {
"get": {
"summary": "Retrieve a bucket in the storage provider for a given stack",
"operationId": "GetBucket",
"responses": {
"200": {
"description": "",
"schema": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "The bucket for the given stack"
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack for which the buckets will be retrieved",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "bucket_id",
"description": "The ID for the bucket to retrieve",
"in": "path",
"required": true,
"type": "string"
}
],
"tags": [
"Buckets"
]
},
"delete": {
"summary": "Delete a given bucket",
"operationId": "DeleteBucket",
"responses": {
"204": {
"description": "No content"
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack in which the bucket belongs",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "bucket_id",
"description": "The ID for the bucket to delete",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "force_delete",
"description": "Force bucket deletion even if there is contents inside it.",
"in": "query",
"required": false,
"type": "boolean",
"format": "boolean"
}
],
"tags": [
"Buckets"
]
},
"put": {
"summary": "Updates the name of a bucket",
"operationId": "UpdateBucket",
"responses": {
"200": {
"description": "",
"schema": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "A response of the updated bucket"
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack on which the bucket belongs to",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "bucket_id",
"description": "The ID for the bucket to update",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"type": "object",
"properties": {
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
}
},
"title": ""
}
}
],
"tags": [
"Buckets"
]
}
},
"/storage/v1/stacks/{stack_id}/buckets/{bucket_id}/metrics": {
"get": {
"summary": "Get all daily utilizations for specific bucket",
"description": "When the start & end dates are not provided, the metrics for the last day will be returned.\nThe date range used must be at least a day apart, and only beginning times are allowed (e.g. 2019-01-01T00:00:00)",
"operationId": "GetBucketMetrics",
"responses": {
"200": {
"description": "",
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"SUCCESS",
"ERROR"
],
"default": "SUCCESS",
"description": "A metrics query's resulting status"
},
"data": {
"type": "object",
"properties": {
"matrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"vector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
}
},
"description": "The data points in a metrics collection"
},
"errorType": {
"type": "string",
"description": "The type of error encountered when querying for metrics"
},
"error": {
"type": "string",
"description": "The error encountered when querying for metrics"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"description": "Warnings encountered when querying for metrics"
}
},
"description": "A collection of metrics"
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack on which the bucket belongs to",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "bucket_id",
"description": "The ID for the bucket to retrieve metrics for",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "start_time",
"description": "The start date for the range of metrics.",
"in": "query",
"required": false,
"type": "string",
"format": "date-time"
},
{
"name": "end_time",
"description": "The end date for the range of metrics.",
"in": "query",
"required": false,
"type": "string",
"format": "date-time"
}
],
"tags": [
"Metrics"
]
}
},
"/storage/v1/stacks/{stack_id}/metrics": {
"get": {
"summary": "Get all daily utilizations for all buckets on a stack",
"description": "When the start & end dates are not provided, the metrics for the last day will be returned.\nThe date range used must be at least a day apart, and only beginning times are allowed (e.g. 2019-01-01T00:00:00)",
"operationId": "GetStackMetrics",
"responses": {
"200": {
"description": "",
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"SUCCESS",
"ERROR"
],
"default": "SUCCESS",
"description": "A metrics query's resulting status"
},
"data": {
"type": "object",
"properties": {
"matrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"vector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
}
},
"description": "The data points in a metrics collection"
},
"errorType": {
"type": "string",
"description": "The type of error encountered when querying for metrics"
},
"error": {
"type": "string",
"description": "The error encountered when querying for metrics"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"description": "Warnings encountered when querying for metrics"
}
},
"description": "A collection of metrics"
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack to collect metrics on",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "start_time",
"description": "The start date for the range of metrics.",
"in": "query",
"required": false,
"type": "string",
"format": "date-time"
},
{
"name": "end_time",
"description": "The end date for the range of metrics.",
"in": "query",
"required": false,
"type": "string",
"format": "date-time"
}
],
"tags": [
"Metrics"
]
}
},
"/storage/v1/stacks/{stack_id}/users/{user_id}/credentials": {
"get": {
"summary": "Get credentials for a given user.",
"operationId": "GetCredentials",
"responses": {
"200": {
"description": "",
"schema": {
"type": "object",
"properties": {
"credentials": {
"type": "array",
"items": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
}
},
"description": "Storage credentials for a user"
},
"description": "The list of active credentials on account"
}
},
"description": "A response with new credentials"
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The stack's ID for which the user belongs to",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "user_id",
"description": "The user's ID for which the credentials belong to",
"in": "path",
"required": true,
"type": "string"
}
],
"tags": [
"User Credentials"
]
}
},
"/storage/v1/stacks/{stack_id}/users/{user_id}/credentials/generate": {
"post": {
"summary": "Generate storage credentials for the given user",
"description": "Generate storage credentials for the given user. Users can only have one set of credentials, so calling this method will generate a new set and invalidate any existing ones.",
"operationId": "GenerateCredentials",
"responses": {
"200": {
"description": "",
"schema": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
},
"secretKey": {
"type": "string",
"description": "The secret key used to sign requests"
}
},
"description": "A response with new credentials"
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The stack's ID for which the user belongs to",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "user_id",
"description": "The user's ID for which the credentials will be generated",
"in": "path",
"required": true,
"type": "string"
}
],
"tags": [
"User Credentials"
]
}
},
"/storage/v1/stacks/{stack_id}/users/{user_id}/credentials/{access_key}": {
"delete": {
"summary": "Delete provided storage access credentials for the given user",
"operationId": "DeleteCredential",
"responses": {
"204": {
"description": "No content"
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"500": {
"description": "Internal server error.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
},
"default": {
"description": "Default error structure.",
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The stack's ID for which the user belongs to",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "user_id",
"description": "The user's ID for which the credentials will be generated",
"in": "path",
"required": true,
"type": "string"
},
{
"name": "access_key",
"description": "The credentials access key to be removed",
"in": "path",
"required": true,
"type": "string"
}
],
"tags": [
"User Credentials"
]
}
}
},
"definitions": {
"DataMatrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"DataMatrixResult": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"DataValue": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"DataVector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
},
"DataVectorResult": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"GetCredentialsResponseCredential": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
}
},
"description": "Storage credentials for a user"
},
"MetricsData": {
"type": "object",
"properties": {
"matrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"vector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
}
},
"description": "The data points in a metrics collection"
},
"apiStatusDetail": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
},
"paginationPageInfo": {
"type": "object",
"properties": {
"totalCount": {
"type": "string",
"description": "The total number of items in the dataset"
},
"hasPreviousPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not a previous page of data exists"
},
"hasNextPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not another page of data is available"
},
"startCursor": {
"type": "string",
"description": "The cursor for the first item in the set of data returned"
},
"endCursor": {
"type": "string",
"description": "The cursor for the last item in the set of data returned"
}
},
"description": "Information about a paginated response\n\nThis is modeled after the GraphQL Relay spec to support both cursor based pagination and traditional offset based pagination."
},
"paginationPageRequest": {
"type": "object",
"properties": {
"first": {
"type": "string",
"description": "The number of items desired"
},
"after": {
"type": "string",
"description": "The cursor value after which data will be returned"
},
"filter": {
"type": "string",
"description": "SQL-style constraint filters"
},
"sortBy": {
"type": "string",
"description": "Sort the response by the given field"
}
},
"description": "Pagination request information\n\nThis is modeled after the GraphQL Relay spec to support both cursor based pagination and traditional offset based pagination."
},
"prometheusMetrics": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"SUCCESS",
"ERROR"
],
"default": "SUCCESS",
"description": "A metrics query's resulting status"
},
"data": {
"type": "object",
"properties": {
"matrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"vector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
}
},
"description": "The data points in a metrics collection"
},
"errorType": {
"type": "string",
"description": "The type of error encountered when querying for metrics"
},
"error": {
"type": "string",
"description": "The error encountered when querying for metrics"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"description": "Warnings encountered when querying for metrics"
}
},
"description": "A collection of metrics"
},
"prometheusMetricsStatus": {
"type": "string",
"enum": [
"SUCCESS",
"ERROR"
],
"default": "SUCCESS",
"description": "A metrics query's resulting status"
},
"stackpath.rpc.BadRequest": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
},
{
"type": "object",
"properties": {
"fieldViolations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
}
}
}
]
},
"stackpath.rpc.BadRequest.FieldViolation": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"description": {
"type": "string"
}
}
},
"stackpath.rpc.Help": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
},
{
"type": "object",
"properties": {
"links": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string"
},
"url": {
"type": "string"
}
}
}
}
}
}
]
},
"stackpath.rpc.Help.Link": {
"type": "object",
"properties": {
"description": {
"type": "string"
},
"url": {
"type": "string"
}
}
},
"stackpath.rpc.LocalizedMessage": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
},
{
"type": "object",
"properties": {
"locale": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
},
"stackpath.rpc.PreconditionFailure": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
},
{
"type": "object",
"properties": {
"violations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"subject": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
}
}
}
]
},
"stackpath.rpc.PreconditionFailure.Violation": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"subject": {
"type": "string"
},
"description": {
"type": "string"
}
}
},
"stackpath.rpc.QuotaFailure": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
},
{
"type": "object",
"properties": {
"violations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"subject": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
}
}
}
]
},
"stackpath.rpc.QuotaFailure.Violation": {
"type": "object",
"properties": {
"subject": {
"type": "string"
},
"description": {
"type": "string"
}
}
},
"stackpath.rpc.RequestInfo": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
},
{
"type": "object",
"properties": {
"requestId": {
"type": "string"
},
"servingData": {
"type": "string"
}
}
}
]
},
"stackpath.rpc.ResourceInfo": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
},
{
"type": "object",
"properties": {
"resourceType": {
"type": "string"
},
"resourceName": {
"type": "string"
},
"owner": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
]
},
"stackpath.rpc.RetryInfo": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
},
{
"type": "object",
"properties": {
"retryDelay": {
"type": "string"
}
}
}
]
},
"stackpathapiStatus": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": "@type"
}
}
}
},
"storageBucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
},
"storageBucketVisibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"storageCreateBucketRequest": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "The name of the bucket to be created"
},
"region": {
"type": "string",
"description": "The region where to create the bucket, defaults to us-east-1"
}
},
"title": ""
},
"storageCreateBucketResponse": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "The bucket created"
},
"storageGenerateCredentialsResponse": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
},
"secretKey": {
"type": "string",
"description": "The secret key used to sign requests"
}
},
"description": "A response with new credentials"
},
"storageGetBucketResponse": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "The bucket for the given stack"
},
"storageGetBucketsResponse": {
"type": "object",
"properties": {
"pageInfo": {
"type": "object",
"properties": {
"totalCount": {
"type": "string",
"description": "The total number of items in the dataset"
},
"hasPreviousPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not a previous page of data exists"
},
"hasNextPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not another page of data is available"
},
"startCursor": {
"type": "string",
"description": "The cursor for the first item in the set of data returned"
},
"endCursor": {
"type": "string",
"description": "The cursor for the last item in the set of data returned"
}
},
"description": "Information about a paginated response\n\nThis is modeled after the GraphQL Relay spec to support both cursor based pagination and traditional offset based pagination."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
},
"description": "The requested buckets"
}
},
"description": "The buckets for the given stack"
},
"storageGetCredentialsResponse": {
"type": "object",
"properties": {
"credentials": {
"type": "array",
"items": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
}
},
"description": "Storage credentials for a user"
},
"description": "The list of active credentials on account"
}
},
"description": "A response with new credentials"
},
"storageUpdateBucketRequest": {
"type": "object",
"properties": {
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
}
},
"title": ""
},
"storageUpdateBucketResponse": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "A response of the updated bucket"
}
},
"securityDefinitions": {
"oauth2": {
"type": "oauth2",
"flow": "application",
"tokenUrl": "https://gateway.stackpath.com/identity/v1/oauth2/token"
}
},
"security": [
{
"oauth2": []
}
],
"externalDocs": {
"description": "The StackPath API Reference",
"url": "https://stackpath.dev/reference"
},
"x-explorer-enabled": true,
"x-proxy-enabled": true,
"x-samples-enabled": true,
"x-samples-languages": [
"curl",
"node",
"ruby",
"javascript",
"python"
]
}
{
"openapi": "3.0.0",
"info": {
"title": "Object Storage",
"version": "1.0.0",
"contact": {
"name": "StackPath Support",
"url": "https://support.stackpath.com/"
}
},
"paths": {
"/storage/v1/stacks/{stack_id}/buckets": {
"get": {
"summary": "Retrieve all buckets in the storage provider for a given stack",
"operationId": "GetBuckets",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"pageInfo": {
"type": "object",
"properties": {
"totalCount": {
"type": "string",
"description": "The total number of items in the dataset"
},
"hasPreviousPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not a previous page of data exists"
},
"hasNextPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not another page of data is available"
},
"startCursor": {
"type": "string",
"description": "The cursor for the first item in the set of data returned"
},
"endCursor": {
"type": "string",
"description": "The cursor for the last item in the set of data returned"
}
},
"description": "Information about a paginated response\n\nThis is modeled after the GraphQL Relay spec to support both cursor based pagination and traditional offset based pagination."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
},
"description": "The requested buckets"
}
},
"description": "The buckets for the given stack"
}
}
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack for which the buckets will be retrieved",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "page_request.first",
"description": "The number of items desired.",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "page_request.after",
"description": "The cursor value after which data will be returned.",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "page_request.filter",
"description": "SQL-style constraint filters.",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "page_request.sort_by",
"description": "Sort the response by the given field.",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
}
],
"tags": [
"Buckets"
]
},
"post": {
"summary": "Create a bucket under a stack",
"operationId": "CreateBucket",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "The bucket created"
}
}
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack on which the bucket will be created",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "The name of the bucket to be created"
},
"region": {
"type": "string",
"description": "The region where to create the bucket, defaults to us-east-1"
}
},
"title": ""
}
}
},
"required": true
},
"tags": [
"Buckets"
]
}
},
"/storage/v1/stacks/{stack_id}/buckets/{bucket_id}": {
"get": {
"summary": "Retrieve a bucket in the storage provider for a given stack",
"operationId": "GetBucket",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "The bucket for the given stack"
}
}
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack for which the buckets will be retrieved",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "bucket_id",
"description": "The ID for the bucket to retrieve",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"tags": [
"Buckets"
]
},
"delete": {
"summary": "Delete a given bucket",
"operationId": "DeleteBucket",
"responses": {
"204": {
"description": "No content"
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack in which the bucket belongs",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "bucket_id",
"description": "The ID for the bucket to delete",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "force_delete",
"description": "Force bucket deletion even if there is contents inside it.",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"format": "boolean"
}
}
],
"tags": [
"Buckets"
]
},
"put": {
"summary": "Updates the name of a bucket",
"operationId": "UpdateBucket",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "A response of the updated bucket"
}
}
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack on which the bucket belongs to",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "bucket_id",
"description": "The ID for the bucket to update",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
}
},
"title": ""
}
}
},
"required": true
},
"tags": [
"Buckets"
]
}
},
"/storage/v1/stacks/{stack_id}/buckets/{bucket_id}/metrics": {
"get": {
"summary": "Get all daily utilizations for specific bucket",
"description": "When the start & end dates are not provided, the metrics for the last day will be returned.\nThe date range used must be at least a day apart, and only beginning times are allowed (e.g. 2019-01-01T00:00:00)",
"operationId": "GetBucketMetrics",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"SUCCESS",
"ERROR"
],
"default": "SUCCESS",
"description": "A metrics query's resulting status"
},
"data": {
"type": "object",
"properties": {
"matrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"vector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
}
},
"description": "The data points in a metrics collection"
},
"errorType": {
"type": "string",
"description": "The type of error encountered when querying for metrics"
},
"error": {
"type": "string",
"description": "The error encountered when querying for metrics"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"description": "Warnings encountered when querying for metrics"
}
},
"description": "A collection of metrics"
}
}
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack on which the bucket belongs to",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "bucket_id",
"description": "The ID for the bucket to retrieve metrics for",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "start_time",
"description": "The start date for the range of metrics.",
"in": "query",
"required": false,
"schema": {
"type": "string",
"format": "date-time"
}
},
{
"name": "end_time",
"description": "The end date for the range of metrics.",
"in": "query",
"required": false,
"schema": {
"type": "string",
"format": "date-time"
}
}
],
"tags": [
"Metrics"
]
}
},
"/storage/v1/stacks/{stack_id}/metrics": {
"get": {
"summary": "Get all daily utilizations for all buckets on a stack",
"description": "When the start & end dates are not provided, the metrics for the last day will be returned.\nThe date range used must be at least a day apart, and only beginning times are allowed (e.g. 2019-01-01T00:00:00)",
"operationId": "GetStackMetrics",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"SUCCESS",
"ERROR"
],
"default": "SUCCESS",
"description": "A metrics query's resulting status"
},
"data": {
"type": "object",
"properties": {
"matrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"vector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
}
},
"description": "The data points in a metrics collection"
},
"errorType": {
"type": "string",
"description": "The type of error encountered when querying for metrics"
},
"error": {
"type": "string",
"description": "The error encountered when querying for metrics"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"description": "Warnings encountered when querying for metrics"
}
},
"description": "A collection of metrics"
}
}
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The ID for the stack to collect metrics on",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "start_time",
"description": "The start date for the range of metrics.",
"in": "query",
"required": false,
"schema": {
"type": "string",
"format": "date-time"
}
},
{
"name": "end_time",
"description": "The end date for the range of metrics.",
"in": "query",
"required": false,
"schema": {
"type": "string",
"format": "date-time"
}
}
],
"tags": [
"Metrics"
]
}
},
"/storage/v1/stacks/{stack_id}/users/{user_id}/credentials": {
"get": {
"summary": "Get credentials for a given user.",
"operationId": "GetCredentials",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"credentials": {
"type": "array",
"items": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
}
},
"description": "Storage credentials for a user"
},
"description": "The list of active credentials on account"
}
},
"description": "A response with new credentials"
}
}
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The stack's ID for which the user belongs to",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "user_id",
"description": "The user's ID for which the credentials belong to",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"tags": [
"User Credentials"
]
}
},
"/storage/v1/stacks/{stack_id}/users/{user_id}/credentials/generate": {
"post": {
"summary": "Generate storage credentials for the given user",
"description": "Generate storage credentials for the given user. Users can only have one set of credentials, so calling this method will generate a new set and invalidate any existing ones.",
"operationId": "GenerateCredentials",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
},
"secretKey": {
"type": "string",
"description": "The secret key used to sign requests"
}
},
"description": "A response with new credentials"
}
}
}
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The stack's ID for which the user belongs to",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "user_id",
"description": "The user's ID for which the credentials will be generated",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"tags": [
"User Credentials"
]
}
},
"/storage/v1/stacks/{stack_id}/users/{user_id}/credentials/{access_key}": {
"delete": {
"summary": "Delete provided storage access credentials for the given user",
"operationId": "DeleteCredential",
"responses": {
"204": {
"description": "No content"
},
"401": {
"description": "Returned when an unauthorized request is attempted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
},
"default": {
"description": "Default error structure.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
}
}
}
}
},
"parameters": [
{
"name": "stack_id",
"description": "The stack's ID for which the user belongs to",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "user_id",
"description": "The user's ID for which the credentials will be generated",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "access_key",
"description": "The credentials access key to be removed",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"tags": [
"User Credentials"
]
}
}
},
"security": [
{
"oauth2": []
}
],
"externalDocs": {
"description": "The StackPath API Reference",
"url": "https://stackpath.dev/reference"
},
"x-explorer-enabled": true,
"x-proxy-enabled": true,
"x-samples-enabled": true,
"x-samples-languages": [
"curl",
"node",
"ruby",
"javascript",
"python"
],
"servers": [
{
"url": "https://gateway.stackpath.com"
}
],
"components": {
"securitySchemes": {
"oauth2": {
"type": "oauth2",
"flows": {
"clientCredentials": {
"tokenUrl": "https://gateway.stackpath.com/identity/v1/oauth2/token",
"scopes": {}
}
}
}
},
"schemas": {
"DataMatrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"DataMatrixResult": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"DataValue": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"DataVector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
},
"DataVectorResult": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"GetCredentialsResponseCredential": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
}
},
"description": "Storage credentials for a user"
},
"MetricsData": {
"type": "object",
"properties": {
"matrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"vector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
}
},
"description": "The data points in a metrics collection"
},
"apiStatusDetail": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
},
"paginationPageInfo": {
"type": "object",
"properties": {
"totalCount": {
"type": "string",
"description": "The total number of items in the dataset"
},
"hasPreviousPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not a previous page of data exists"
},
"hasNextPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not another page of data is available"
},
"startCursor": {
"type": "string",
"description": "The cursor for the first item in the set of data returned"
},
"endCursor": {
"type": "string",
"description": "The cursor for the last item in the set of data returned"
}
},
"description": "Information about a paginated response\n\nThis is modeled after the GraphQL Relay spec to support both cursor based pagination and traditional offset based pagination."
},
"paginationPageRequest": {
"type": "object",
"properties": {
"first": {
"type": "string",
"description": "The number of items desired"
},
"after": {
"type": "string",
"description": "The cursor value after which data will be returned"
},
"filter": {
"type": "string",
"description": "SQL-style constraint filters"
},
"sortBy": {
"type": "string",
"description": "Sort the response by the given field"
}
},
"description": "Pagination request information\n\nThis is modeled after the GraphQL Relay spec to support both cursor based pagination and traditional offset based pagination."
},
"prometheusMetrics": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"SUCCESS",
"ERROR"
],
"default": "SUCCESS",
"description": "A metrics query's resulting status"
},
"data": {
"type": "object",
"properties": {
"matrix": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"values": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
},
"description": "Time series data point values"
}
},
"description": "Time series containing a range of data points over time for each time series"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a range of data points over time for each time series"
},
"vector": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"metric": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "The data points' labels"
},
"value": {
"type": "object",
"properties": {
"unixTime": {
"type": "string",
"description": "The time that a data point was recorded"
},
"value": {
"type": "string",
"description": "A data point's value"
}
},
"description": "An individual metric data point"
}
},
"description": "Time series containing a single sample for each time series, all sharing the same timestamp"
},
"description": "A data point's value"
}
},
"description": "A set of time series containing a single sample for each time series, all sharing the same timestamp"
}
},
"description": "The data points in a metrics collection"
},
"errorType": {
"type": "string",
"description": "The type of error encountered when querying for metrics"
},
"error": {
"type": "string",
"description": "The error encountered when querying for metrics"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"description": "Warnings encountered when querying for metrics"
}
},
"description": "A collection of metrics"
},
"prometheusMetricsStatus": {
"type": "string",
"enum": [
"SUCCESS",
"ERROR"
],
"default": "SUCCESS",
"description": "A metrics query's resulting status"
},
"stackpath.rpc.BadRequest": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
},
{
"type": "object",
"properties": {
"fieldViolations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
}
}
}
]
},
"stackpath.rpc.BadRequest.FieldViolation": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"description": {
"type": "string"
}
}
},
"stackpath.rpc.Help": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
},
{
"type": "object",
"properties": {
"links": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string"
},
"url": {
"type": "string"
}
}
}
}
}
}
]
},
"stackpath.rpc.Help.Link": {
"type": "object",
"properties": {
"description": {
"type": "string"
},
"url": {
"type": "string"
}
}
},
"stackpath.rpc.LocalizedMessage": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
},
{
"type": "object",
"properties": {
"locale": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
]
},
"stackpath.rpc.PreconditionFailure": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
},
{
"type": "object",
"properties": {
"violations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"subject": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
}
}
}
]
},
"stackpath.rpc.PreconditionFailure.Violation": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"subject": {
"type": "string"
},
"description": {
"type": "string"
}
}
},
"stackpath.rpc.QuotaFailure": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
},
{
"type": "object",
"properties": {
"violations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"subject": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
}
}
}
]
},
"stackpath.rpc.QuotaFailure.Violation": {
"type": "object",
"properties": {
"subject": {
"type": "string"
},
"description": {
"type": "string"
}
}
},
"stackpath.rpc.RequestInfo": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
},
{
"type": "object",
"properties": {
"requestId": {
"type": "string"
},
"servingData": {
"type": "string"
}
}
}
]
},
"stackpath.rpc.ResourceInfo": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
},
{
"type": "object",
"properties": {
"resourceType": {
"type": "string"
},
"resourceName": {
"type": "string"
},
"owner": {
"type": "string"
},
"description": {
"type": "string"
}
}
}
]
},
"stackpath.rpc.RetryInfo": {
"allOf": [
{
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
},
{
"type": "object",
"properties": {
"retryDelay": {
"type": "string"
}
}
}
]
},
"stackpathapiStatus": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"format": "int32"
},
"error": {
"type": "string"
},
"details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"@type": {
"type": "string"
}
},
"required": [
"@type"
],
"discriminator": {
"propertyName": "@type"
}
}
}
}
},
"storageBucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
},
"storageBucketVisibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"storageCreateBucketRequest": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "The name of the bucket to be created"
},
"region": {
"type": "string",
"description": "The region where to create the bucket, defaults to us-east-1"
}
},
"title": ""
},
"storageCreateBucketResponse": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "The bucket created"
},
"storageGenerateCredentialsResponse": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
},
"secretKey": {
"type": "string",
"description": "The secret key used to sign requests"
}
},
"description": "A response with new credentials"
},
"storageGetBucketResponse": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "The bucket for the given stack"
},
"storageGetBucketsResponse": {
"type": "object",
"properties": {
"pageInfo": {
"type": "object",
"properties": {
"totalCount": {
"type": "string",
"description": "The total number of items in the dataset"
},
"hasPreviousPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not a previous page of data exists"
},
"hasNextPage": {
"type": "boolean",
"format": "boolean",
"description": "Whether or not another page of data is available"
},
"startCursor": {
"type": "string",
"description": "The cursor for the first item in the set of data returned"
},
"endCursor": {
"type": "string",
"description": "The cursor for the last item in the set of data returned"
}
},
"description": "Information about a paginated response\n\nThis is modeled after the GraphQL Relay spec to support both cursor based pagination and traditional offset based pagination."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
},
"description": "The requested buckets"
}
},
"description": "The buckets for the given stack"
},
"storageGetCredentialsResponse": {
"type": "object",
"properties": {
"credentials": {
"type": "array",
"items": {
"type": "object",
"properties": {
"accessKey": {
"type": "string",
"description": "The ID for the access key"
}
},
"description": "Storage credentials for a user"
},
"description": "The list of active credentials on account"
}
},
"description": "A response with new credentials"
},
"storageUpdateBucketRequest": {
"type": "object",
"properties": {
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
}
},
"title": ""
},
"storageUpdateBucketResponse": {
"type": "object",
"properties": {
"bucket": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID for the bucket"
},
"label": {
"type": "string",
"description": "The name of the bucket"
},
"endpointUrl": {
"type": "string",
"description": "The URL used to access the bucket"
},
"visibility": {
"type": "string",
"enum": [
"PRIVATE",
"PUBLIC"
],
"default": "PRIVATE",
"description": "- PRIVATE: The bucket is private and only accessibly with credentials\n - PUBLIC: The bucket is public and accessible over the internet"
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was created"
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "The date when the bucket was last updated"
},
"region": {
"type": "string",
"description": "The region in which the bucket is created. Available regions are: us-east-1, us-west-1, eu-central-1"
}
}
}
},
"description": "A response of the updated bucket"
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment