{"openapi":"3.1.0","info":{"title":"Numspot Public Object Storage API","description":"Numspot Public Object Storage API","termsOfService":"https://numspot.com/","contact":{"name":"Numspot","url":"https://numspot.com/contact/","email":"support@numspot.eu"},"license":{"name":"BSD 3 Clause","url":"https://opensource.org/licenses/BSD-3-Clause"},"version":"2026-10-13T12:46:29Z"},"paths":{"/spaces/{spaceId}":{"get":{"summary":"List buckets","operationId":"ListBuckets","description":"Returns a list of all buckets owned by the authenticated sender of the request.","parameters":[{"$ref":"#/components/parameters/SpaceId"}],"responses":{"200":{"$ref":"#/components/responses/ListBuckets200Response"}},"security":[{"AwsSigV4":[]}],"tags":["Object Storage"]}},"/spaces/{spaceId}/{bucket}":{"get":{"summary":"List objects","operationId":"ListObjects","description":"Returns some or all (up to 1,000) of the objects in a bucket with each request. When the `uploads` query parameter is present, this operation lists the in-progress multipart uploads of the bucket instead (ListMultipartUploads), paginated with `key-marker` / `upload-id-marker` and limited by `max-uploads`; the response is then a `ListMultipartUploadsResult` XML document.","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"},{"$ref":"#/components/parameters/Delimiter"},{"$ref":"#/components/parameters/EncodingType"},{"$ref":"#/components/parameters/Marker"},{"$ref":"#/components/parameters/MaxKeys"},{"$ref":"#/components/parameters/Prefix"},{"$ref":"#/components/parameters/ContinuationToken"},{"$ref":"#/components/parameters/UploadsQueryParam"},{"$ref":"#/components/parameters/KeyMarker"},{"$ref":"#/components/parameters/UploadIdMarker"},{"$ref":"#/components/parameters/MaxUploads"}],"responses":{"200":{"$ref":"#/components/responses/ListObjects200Response"},"404":{"description":"NoSuchBucket","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/NoSuchBucket"}}}}},"security":[{"AwsSigV4":[]}],"tags":["Object Storage"]},"put":{"summary":"Create bucket","operationId":"CreateBucket","description":"Creates a new bucket.","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"}],"responses":{"201":{"$ref":"#/components/responses/CreateBucket201Response"},"409":{"description":"BucketAlreadyExists or BucketAlreadyOwnedByYou (S3 XML error envelope, discriminator: the `Code` element)","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/S3Error"}}}}},"security":[{"AwsSigV4":[]}],"tags":["Object Storage"]},"delete":{"summary":"Delete bucket","operationId":"DeleteBucket","description":"Deletes a bucket.","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"}],"responses":{"204":{"description":"Success"}},"security":[{"AwsSigV4":[]}],"tags":["Object Storage"]},"head":{"security":[{"AwsSigV4":[]}],"tags":["Object Storage"],"operationId":"HeadBucket","description":"Determine if a bucket exists and if you have permission to access it.","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"}],"responses":{"200":{"description":"Success"},"400":{"description":"BadRequest","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/BadRequest"}}}},"403":{"description":"AccessDenied or ForbiddenResource or SignatureDoesNotMatch (S3 XML error envelope, discriminator: the `Code` element)","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/S3Error"}}}},"404":{"description":"NoSuchBucket","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/NoSuchBucket"}}}}}},"post":{"summary":"Delete objects (batch)","operationId":"DeleteObjects","description":"Deletes multiple objects from a bucket in a single request (up to 1000 objects). When the request has the `delete` query parameter, this operation deletes the batch and expects the `Delete` XML manifest as body (Object / Key entries and an optional `Quiet` flag); the response is the `DeleteResult` XML document listing the deleted keys and any per-key errors. When `Quiet` is true, `\u003cDeleted\u003e` entries are omitted from the response. The same key may appear several times with distinct `VersionId`s (each version is deleted and echoed in the result). An empty manifest or a manifest with more than 1000 Object entries is rejected with `MalformedXML`. Without the `delete` query parameter, the request is invalid.","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"},{"$ref":"#/components/parameters/DeleteQueryParam"}],"requestBody":{"$ref":"#/components/requestBodies/DeleteObjectsRequest"},"responses":{"200":{"$ref":"#/components/responses/DeleteObjects200Response"},"400":{"description":"BadRequest (missing `delete` query parameter), MalformedXML (malformed XML, empty manifest, more than 1000 Object entries), InvalidRequest (missing `Content-MD5` header), InvalidDigest (`Content-MD5` header is not valid base64) or BadDigest (`Content-MD5` does not match the request body) (S3 XML error envelope, discriminator: the `Code` element)","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/S3Error"}}}},"403":{"description":"Forbidden","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/Forbidden"}}}},"404":{"description":"NoSuchBucket","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/NoSuchBucket"}}}},"413":{"description":"PayloadTooLarge","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/PayloadTooLarge"}}}}},"security":[{"AwsSigV4":[]}],"tags":["Object Storage"]}},"/spaces/{spaceId}/{bucket}/{key...}":{"get":{"summary":"Get object","operationId":"GetObject","description":"Retrieves an object or corresponding presigned URL. When the `uploadId` query parameter is present, this operation lists the parts already uploaded for that multipart upload instead (ListParts), paginated with `part-number-marker` and limited by `max-parts`; the response is then a `ListPartsResult` XML document.","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"},{"$ref":"#/components/parameters/ObjectKeyPath"},{"$ref":"#/components/parameters/IfMatch"},{"$ref":"#/components/parameters/IfNoneMatch"},{"$ref":"#/components/parameters/VersionId"},{"$ref":"#/components/parameters/PresignedAlgorithm"},{"$ref":"#/components/parameters/PresignedCredential"},{"$ref":"#/components/parameters/PresignedDate"},{"$ref":"#/components/parameters/PresignedExpires"},{"$ref":"#/components/parameters/PresignedSignedHeaders"},{"$ref":"#/components/parameters/PresignedSignature"},{"$ref":"#/components/parameters/Range"},{"$ref":"#/components/parameters/UploadId"},{"$ref":"#/components/parameters/MaxParts"},{"$ref":"#/components/parameters/PartNumberMarker"}],"responses":{"200":{"$ref":"#/components/responses/GetObject200Response"},"206":{"$ref":"#/components/responses/GetObject206Response"},"304":{"$ref":"#/components/responses/GetObject304Response"},"404":{"description":"NoSuchKey or NoSuchUpload (S3 XML error envelope, discriminator: the `Code` element)","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/S3Error"}}}},"412":{"description":"PreconditionFailed — If-Match did not match the current ETag (S3 XML error envelope, discriminator: the `Code` element)","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/S3Error"}}}},"416":{"description":"InvalidRange — the requested range is beyond the object size (S3 XML error envelope, discriminator: the `Code` element)","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/S3Error"}}}}},"security":[{"AwsSigV4":[]},{"AwsSigV4Presigned":[]}],"tags":["Object Storage"]},"head":{"security":[{"AwsSigV4":[]}],"tags":["Object Storage"],"operationId":"HeadObject","description":"Get an object metadata from a bucket","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"},{"$ref":"#/components/parameters/ObjectKeyPath"},{"$ref":"#/components/parameters/IfModifiedSince"},{"$ref":"#/components/parameters/Range"}],"responses":{"200":{"$ref":"#/components/responses/HeadObject200Response"},"304":{"description":"NotModified","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/NotModified"}}}},"400":{"description":"BadRequest","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/BadRequest"}}}},"404":{"description":"NoSuchBucket or NoSuchKey (S3 XML error envelope, discriminator: the `Code` element)","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/S3Error"}}}},"405":{"description":"MethodNotAllowed","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/MethodNotAllowed"}}}}}},"put":{"summary":"Put object","operationId":"PutObject","description":"Adds an object to a bucket.","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"},{"$ref":"#/components/parameters/ObjectKeyPath"},{"$ref":"#/components/parameters/ContentType"},{"$ref":"#/components/parameters/ContentLength"},{"$ref":"#/components/parameters/UploadId"},{"$ref":"#/components/parameters/PartNumber"},{"$ref":"#/components/parameters/ExpectHeader"},{"$ref":"#/components/parameters/VersionId"},{"$ref":"#/components/parameters/PresignedAlgorithm"},{"$ref":"#/components/parameters/PresignedCredential"},{"$ref":"#/components/parameters/PresignedDate"},{"$ref":"#/components/parameters/PresignedExpires"},{"$ref":"#/components/parameters/PresignedSignedHeaders"},{"$ref":"#/components/parameters/PresignedSignature"},{"$ref":"#/components/parameters/IfNoneMatch"}],"responses":{"200":{"$ref":"#/components/responses/PutObject200Response"},"400":{"description":"BadRequest","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/BadRequest"}}}},"403":{"description":"Forbidden","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/Forbidden"}}}},"404":{"description":"NoSuchKey","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/NoSuchKey"}}}},"412":{"description":"PreconditionFailed","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/PreconditionFailed"}}}},"413":{"description":"PayloadTooLarge","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/PayloadTooLarge"}}}}},"security":[{"AwsSigV4":[]},{"AwsSigV4Presigned":[]}],"tags":["Object Storage"]},"delete":{"summary":"Delete object","operationId":"DeleteObject","description":"Removes an object from a bucket. When the `uploadId` query parameter is present, this operation aborts the multipart upload identified by `uploadId` instead (AbortMultipartUpload) and returns `204 No Content`.","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"},{"$ref":"#/components/parameters/ObjectKeyPath"},{"$ref":"#/components/parameters/VersionId"},{"$ref":"#/components/parameters/UploadId"},{"$ref":"#/components/parameters/PresignedAlgorithm"},{"$ref":"#/components/parameters/PresignedCredential"},{"$ref":"#/components/parameters/PresignedDate"},{"$ref":"#/components/parameters/PresignedExpires"},{"$ref":"#/components/parameters/PresignedSignedHeaders"},{"$ref":"#/components/parameters/PresignedSignature"}],"responses":{"204":{"$ref":"#/components/responses/DeleteObject204Response"},"404":{"description":"NoSuchKey or NoSuchUpload (S3 XML error envelope, discriminator: the `Code` element)","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/S3Error"}}}}},"security":[{"AwsSigV4":[]},{"AwsSigV4Presigned":[]}],"tags":["Object Storage"]}},"/spaces/{spaceId}/{bucket}/{multipartKey...}":{"post":{"summary":"Create multipart upload","operationId":"CreateMultipartUpload","description":"This action initiates a multipart upload and returns an upload ID. On the same route, a POST with the `uploadId` query parameter (and no `uploads`) completes the multipart upload instead (CompleteMultipartUpload): the request body is a `CompleteMultipartUpload` XML manifest (Part / PartNumber / ETag) and the response is a `CompleteMultipartUploadResult` XML document. A POST with the `uploads` query parameter is the create dispatch and sends no body, so the request body is optional at the operation level; a POST with neither parameter falls back to GetObject behavior.","parameters":[{"$ref":"#/components/parameters/SpaceId"},{"$ref":"#/components/parameters/BucketName"},{"$ref":"#/components/parameters/ObjectKeyPath"},{"$ref":"#/components/parameters/MultipartKeyPath"},{"$ref":"#/components/parameters/UploadsQueryParam"},{"$ref":"#/components/parameters/UploadId"},{"$ref":"#/components/parameters/ContentType"}],"requestBody":{"$ref":"#/components/requestBodies/CompleteMultipartUploadRequest"},"responses":{"200":{"$ref":"#/components/responses/CompleteMultipartUpload200Response"},"201":{"$ref":"#/components/responses/CreateMultipartUpload201Response"},"400":{"description":"BadRequest, MalformedXML or InvalidArgument (S3 XML error envelope, discriminator: the `Code` element)","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/S3Error"}}}},"404":{"description":"NoSuchUpload","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/NoSuchUpload"}}}}},"security":[{"AwsSigV4":[]}],"tags":["Object Storage"]}}},"components":{"schemas":{"NotModified":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"NotModified"},"CompleteMultipartInput":{"type":"object","properties":{"completeMultipartUpload":{"type":"object","properties":{"parts":{"allOf":[{"$ref":"#/components/schemas/CompletedPartList"},{"xml":{"name":"Part"}}]}}}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"CompleteMultipartInput"},"NoSuchUpload":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"NoSuchUpload"},"CompleteMultipartUploadOutput":{"type":"object","properties":{"location":{"$ref":"#/components/schemas/ObjectLocation"},"bucket":{"$ref":"#/components/schemas/BucketName"},"key":{"$ref":"#/components/schemas/ObjectKey"},"eTag":{"$ref":"#/components/schemas/ETag"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"CompleteMultipartUploadOutput","xml":{"name":"CompleteMultipartUploadResult"}},"CompletedPartList":{"type":"array","items":{"$ref":"#/components/schemas/CompletedPart"},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"CompletedPartList","xml":{}},"CreateBucketOutput":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","examples":[{"Object":{"Location":"/examplebucket"}}],"title":"CreateBucketOutput"},"S3Error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","xml":{"name":"Code"},"description":"S3 error code identifying the failure (e.g. BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchKey, NoSuchUpload)"},"message":{"type":"string","xml":{"name":"Message"}},"resource":{"type":"string","xml":{"name":"Resource"}},"requestId":{"type":"string","xml":{"name":"RequestId"}}},"xml":{"name":"Error"},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"S3Error"},"CreateMultipartUploadOutput":{"type":"object","properties":{"bucket":{"$ref":"#/components/schemas/BucketName"},"key":{"$ref":"#/components/schemas/ObjectKey"},"uploadId":{"$ref":"#/components/schemas/MultipartUploadId"}},"$schema":"https://json-schema.org/draft/2020-12/schema","examples":[{"Object":{"Bucket":"examplebucket","Key":"largeobject","UploadId":"ibZBv_75gd9r8lH_gqXatLdxMVpAlj6ZQjEs.OwyF3953YdwbcQnMA2BLGn8Lx12fQNICtMw5KyteFeHw.Sjng--"}}],"title":"CreateMultipartUploadOutput"},"Delete":{"type":"object","properties":{"objects":{"type":"array","items":{"$ref":"#/components/schemas/DeleteObjectEntry"},"xml":{"name":"Object"}},"quiet":{"type":"boolean","xml":{"name":"Quiet"}}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Delete","xml":{"name":"Delete"}},"DeleteObjectEntry":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/ObjectKey"},"versionId":{"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"DeleteObjectEntry","xml":{"name":"Object"}},"DeleteResult":{"type":"object","properties":{"deleted":{"type":"array","items":{"$ref":"#/components/schemas/DeletedObject"},"xml":{"name":"Deleted"}},"errors":{"type":"array","items":{"$ref":"#/components/schemas/DeletedError"},"xml":{"name":"Error"}}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"DeleteResult","xml":{"name":"DeleteResult"}},"DeletedObject":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/ObjectKey"},"versionId":{"type":"string"},"deleteMarker":{"type":"boolean"},"deleteMarkerVersionId":{"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"DeletedObject","xml":{"name":"Deleted"}},"DeletedError":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/ObjectKey"},"code":{"type":"string"},"message":{"type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"DeletedError","xml":{"name":"Error"}},"BadRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"BadRequest"},"Forbidden":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Forbidden"},"NoSuchKey":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"NoSuchKey"},"PreconditionFailed":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"PreconditionFailed"},"MethodNotAllowed":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"MethodNotAllowed"},"PayloadTooLarge":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"PayloadTooLarge"},"NoSuchBucket":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"NoSuchBucket"},"ListBucketsOutput":{"type":"object","properties":{"buckets":{"$ref":"#/components/schemas/Buckets"}},"$schema":"https://json-schema.org/draft/2020-12/schema","examples":[{"Buckets":[{"CreationDate":"2012-02-15T21:03:02.000Z","Name":"examplebucket"},{"CreationDate":"2011-07-24T19:33:50.000Z","Name":"examplebucket2"},{"CreationDate":"2010-12-17T00:56:49.000Z","Name":"examplebucket3"}]}],"title":"ListBucketsOutput"},"ListObjectsOutput":{"type":"object","properties":{"isTruncated":{"$ref":"#/components/schemas/IsTruncated"},"marker":{"$ref":"#/components/schemas/Marker"},"nextMarker":{"$ref":"#/components/schemas/NextMarker"},"contents":{"$ref":"#/components/schemas/ObjectList"},"name":{"$ref":"#/components/schemas/BucketName"},"prefix":{"$ref":"#/components/schemas/Prefix"},"delimiter":{"$ref":"#/components/schemas/Delimiter"},"maxKeys":{"$ref":"#/components/schemas/MaxKeys"},"commonPrefixes":{"$ref":"#/components/schemas/CommonPrefixList"},"encodingType":{"$ref":"#/components/schemas/EncodingType"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"ListObjectOutput"},"HeadObjectOutput":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","title":"HeadObjectOutput"},"PutObjectOutput":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","examples":[{"Object":null,"ETag":"\"6805f2cfc46c0f04559748bb039d69ae\"","VersionId":"Kirh.unyZwjQ69YxcQLA8z4F5j3kJJKr"}],"title":"PutObjectOutput"},"ObjectKey":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","minLength":1,"title":"ObjectKey"},"MultipartUploadId":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"MultipartUploadId"},"Prefix":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"Prefix"},"CreationDate":{"type":"string","format":"date-time","$schema":"https://json-schema.org/draft/2020-12/schema","title":"CreationDate"},"Bucket":{"type":"object","properties":{"name":{"$ref":"#/components/schemas/BucketName"},"creationDate":{"$ref":"#/components/schemas/CreationDate"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Bucket"},"Buckets":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Bucket"},{"xml":{"name":"Bucket"}}]},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Buckets"},"ChecksumCRC32":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"ChecksumCRC32"},"ChecksumCRC32C":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"ChecksumCRC32C"},"ChecksumSHA1":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"ChecksumSHA1"},"ChecksumSHA256":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"ChecksumSHA256"},"ChecksumAlgorithm":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","enum":["CRC32","CRC32C","SHA1","SHA256"],"title":"ChecksumAlgorithm"},"ChecksumAlgorithmList":{"type":"array","items":{"$ref":"#/components/schemas/ChecksumAlgorithm"},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"ChecksumAlgorithmList","xml":{}},"CommonPrefix":{"type":"object","properties":{"prefix":{"$ref":"#/components/schemas/Prefix"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"CommonPrefix"},"CommonPrefixList":{"type":"array","items":{"$ref":"#/components/schemas/CommonPrefix"},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"CommonPrefixList","xml":{}},"ObjectLocation":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"Location"},"ETag":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"ETag"},"PartNumber":{"type":"integer","$schema":"https://json-schema.org/draft/2020-12/schema","title":"PartNumber"},"CompletedPart":{"type":"object","properties":{"eTag":{"$ref":"#/components/schemas/ETag"},"checksumCRC32":{"$ref":"#/components/schemas/ChecksumCRC32"},"checksumCRC32C":{"$ref":"#/components/schemas/ChecksumCRC32C"},"checksumSHA1":{"$ref":"#/components/schemas/ChecksumSHA1"},"checksumSHA256":{"$ref":"#/components/schemas/ChecksumSHA256"},"partNumber":{"$ref":"#/components/schemas/PartNumber"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"CompletedPart"},"LastModified":{"type":"string","format":"date-time","$schema":"https://json-schema.org/draft/2020-12/schema","title":"LastModified"},"Delimiter":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"Delimiter"},"EncodingType":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","enum":["url"],"title":"EncodingType"},"IsTruncated":{"type":"boolean","$schema":"https://json-schema.org/draft/2020-12/schema","title":"IsTruncated"},"IsRestoreInProgress":{"type":"boolean","$schema":"https://json-schema.org/draft/2020-12/schema","title":"IsRestoreInProgress"},"MaxKeys":{"type":"integer","$schema":"https://json-schema.org/draft/2020-12/schema","title":"MaxKeys"},"Marker":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"Marker"},"NextMarker":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","title":"NextMarker"},"ObjectList":{"type":"array","items":{"$ref":"#/components/schemas/Object"},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"ObjectList","xml":{}},"Size":{"type":"integer","$schema":"https://json-schema.org/draft/2020-12/schema","title":"Size"},"ObjectStorageClass":{"type":"string","$schema":"https://json-schema.org/draft/2020-12/schema","enum":["STANDARD","REDUCED_REDUNDANCY","GLACIER","STANDARD_IA","ONEZONE_IA","INTELLIGENT_TIERING","DEEP_ARCHIVE","OUTPOSTS","GLACIER_IR","SNOW"],"title":"ObjectStorageClass"},"RestoreStatus":{"type":"object","properties":{"isRestoreInProgress":{"$ref":"#/components/schemas/IsRestoreInProgress"},"restoreExpiryDate":{"$ref":"#/components/schemas/RestoreExpiryDate"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"RestoreStatus"},"Object":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/ObjectKey"},"lastModified":{"$ref":"#/components/schemas/LastModified"},"eTag":{"$ref":"#/components/schemas/ETag"},"checksumAlgorithm":{"$ref":"#/components/schemas/ChecksumAlgorithmList"},"size":{"$ref":"#/components/schemas/Size"},"storageClass":{"$ref":"#/components/schemas/ObjectStorageClass"},"restoreStatus":{"$ref":"#/components/schemas/RestoreStatus"}},"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Object"},"RestoreExpiryDate":{"type":"string","format":"date-time","$schema":"https://json-schema.org/draft/2020-12/schema","title":"RestoreExpiryDate"},"BucketName":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"BucketName","description":"A generic S3-like bucket name. Must be 3-63 characters long; consist of lowercase letters, numbers, dots (.), and hyphens (-); start and end with a letter or number; not be an IP address; and not have adjacent periods.","type":"string","minLength":3,"maxLength":63,"pattern":"^(?!(\\d{1,3}\\.){3}\\d{1,3}$)(?!.*\\.\\.)[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$","examples":["my-awesome-bucket","0123-bucket.with.dots-4567","abc","a1-b2.c3"]},"HttpDate":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"HttpDate","description":"A timestamp formatted according to RFC 7231","type":"string","pattern":"^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), \\d{2} (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\d{4} \\d{2}:\\d{2}:\\d{2} GMT$","examples":["Fri, 21 Mar 2025 00:00:00 GMT","Mon, 01 Jan 2024 12:34:56 GMT"]}},"responses":{"ListBuckets200Response":{"description":"Success","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/ListBucketsOutput"}}}},"CreateBucket201Response":{"description":"Success","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/CreateBucketOutput"}}}},"ListObjects200Response":{"description":"Success","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/ListObjectsOutput"}}}},"DeleteObject204Response":{"description":"Success"},"DeleteObjects200Response":{"description":"Success","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/DeleteResult"}}}},"GetObject200Response":{"description":"Success. The response body is the raw object bytes, not XML. User object metadata is returned as `x-amz-meta-*` headers.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"Content-Length":{"$ref":"#/components/headers/ContentLength"},"Content-Range":{"$ref":"#/components/headers/ContentRange"},"Accept-Ranges":{"$ref":"#/components/headers/AcceptRanges"},"Content-Type":{"$ref":"#/components/headers/ContentType"},"Last-Modified":{"$ref":"#/components/headers/LastModified"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Content-Disposition":{"$ref":"#/components/headers/ContentDisposition"},"Content-Encoding":{"$ref":"#/components/headers/ContentEncoding"},"Content-Language":{"$ref":"#/components/headers/ContentLanguage"},"Expires":{"$ref":"#/components/headers/Expires"}},"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"GetObject206Response":{"description":"Partial content for the requested byte range (RFC 7233). The response body is the raw object bytes, not XML.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"Content-Range":{"$ref":"#/components/headers/ContentRange"},"Content-Length":{"$ref":"#/components/headers/ContentLength"},"Accept-Ranges":{"$ref":"#/components/headers/AcceptRanges"},"Content-Type":{"$ref":"#/components/headers/ContentType"},"Last-Modified":{"$ref":"#/components/headers/LastModified"}},"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"GetObject304Response":{"description":"Not modified (RFC 7232). The condition matched, so the response is body-less; the validators ETag and Last-Modified and the caching hints Cache-Control and Expires are returned as headers.","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"Last-Modified":{"$ref":"#/components/headers/LastModified"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Expires":{"$ref":"#/components/headers/Expires"}}},"HeadObject200Response":{"description":"Success","headers":{"ETag":{"$ref":"#/components/headers/ETag"},"Content-Length":{"$ref":"#/components/headers/ContentLength"},"Accept-Ranges":{"$ref":"#/components/headers/AcceptRanges"},"Content-Type":{"$ref":"#/components/headers/ContentType"},"Last-Modified":{"$ref":"#/components/headers/LastModified"}},"content":{"text/xml":{"schema":{"$ref":"#/components/schemas/HeadObjectOutput"}}}},"PutObject200Response":{"description":"Success","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/PutObjectOutput"}}}},"CreateMultipartUpload201Response":{"description":"Success","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/CreateMultipartUploadOutput"}}}},"CompleteMultipartUpload200Response":{"description":"Success","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/CompleteMultipartUploadOutput"}}}}},"parameters":{"ContentLength":{"name":"Content-Length","in":"header","required":true,"description":"The exact size of the object or part being uploaded in bytes. Required for all upload operations, it must match the actual payload size.","schema":{"type":"integer","format":"int64","maximum":5497558138880,"minimum":1},"examples":{"smallFile":{"value":1048576,"summary":"1MB file upload"},"largeFile":{"value":5368709120,"summary":"5GB multipart chunk"}}},"ContentType":{"name":"Content-Type","in":"header","required":false,"description":"A standard MIME type describing the format of the object data.\n- Defaults to 'binary/octet-stream' if omitted (AWS S3 compliant)\n- Accepted values include, but are not limited to: application/octet-stream, binary/octet-stream, text/plain, image/jpeg, application/json\n- CompleteMultipartUpload requests use text/xml\n","schema":{"type":"string"},"examples":{"jpegImage":{"value":"image/jpeg"},"jsonData":{"value":"application/json"},"binaryDefault":{"value":"binary/octet-stream"},"multipartComplete":{"value":"text/xml"}}},"ContinuationToken":{"name":"continuation-token","in":"query","schema":{"type":"string"},"description":"Pagination token for v2 API"},"DeleteQueryParam":{"name":"delete","in":"query","required":false,"description":"Performs a batch delete of objects when present.","schema":{"type":"string","example":"","enum":["","true"]}},"Delimiter":{"name":"delimiter","in":"query","schema":{"type":"string"},"description":"Character used to group keys (e.g., '/' for folder grouping)"},"EncodingType":{"name":"encoding-type","in":"query","schema":{"type":"string","enum":["url"]},"description":"Encoding type for keys (typically 'url')"},"ExpectHeader":{"name":"Expect","in":"header","required":false,"description":"Enables optimisation for large payloads. Client may wait for `100 Continue` response before sending body.","schema":{"type":"string","enum":["100-continue"]}},"IfMatch":{"name":"If-Match","in":"header","required":false,"description":"Return 412 if the ETag doesn't match (RFC 7232). Accepts a single quoted ETag, a comma-separated list of quoted ETags, or `*` (any existing object).","schema":{"type":"string","example":"\"d8c2eafd90c266e19ab9dcacc479f8af\"","pattern":"^(\"[^\"]+\"(,\\s*\"[^\"]+\")*|\\*)$"}},"IfModifiedSince":{"name":"If-Modified-Since","in":"header","required":false,"description":"Return 304 if object unchanged since this timestamp (RFC 7232)","schema":{"$ref":"#/components/schemas/HttpDate"}},"IfNoneMatch":{"name":"If-None-Match","in":"header","required":false,"description":"Return 304 if the ETag matches (RFC 7232). Accepts a single quoted ETag, a comma-separated list of quoted ETags, or `*` (any existing object).","schema":{"type":"string","pattern":"^(\"[^\"]+\"(,\\s*\"[^\"]+\")*|\\*)$"}},"KeyMarker":{"name":"key-marker","in":"query","schema":{"type":"string"},"description":"Pagination token for multipart uploads"},"Marker":{"name":"marker","in":"query","schema":{"type":"string"},"description":"Pagination token for v2 API"},"MaxKeys":{"name":"max-keys","in":"query","schema":{"type":"integer","default":1000,"maximum":1000,"minimum":1},"description":"Maximum objects to return (1-1000)"},"MaxParts":{"name":"max-parts","in":"query","schema":{"type":"integer","default":1000,"minimum":1},"description":"Maximum parts to list (1-1000)"},"MaxUploads":{"name":"max-uploads","in":"query","schema":{"type":"integer","default":1000,"minimum":1},"description":"Maximum multipart uploads to list"},"MultipartKeyPath":{"name":"multipartKey...","in":"path","required":true,"description":"The object key for multipart upload operations, supporting path segments. The trailing ellipsis (...) indicates this key may contain slashes (/) to represent nested paths (e.g., 'large-files/backup.tar.gz').","schema":{"type":"string","example":"projects/annual-report.pdf","maxLength":1024,"minLength":1,"pattern":"^[^\\x00-\\x1F\\x7F]+$"}},"ObjectKeyPath":{"name":"key...","in":"path","required":true,"description":"The object key (name) with support for path segments. The trailing ellipsis (...) indicates the key may contain slashes (/)to represen t nested paths (e.g., 'folder/subfolder/file.txt').","schema":{"type":"string","example":"reports/2023/Q1/sales.pdf","maxLength":1024,"minLength":1,"pattern":"^[^\\x00-\\x1F\\x7F]+$"}},"PartNumber":{"name":"partNumber","in":"query","schema":{"type":"integer","maximum":10000,"minimum":1},"description":"Part number in multipart upload (1-10000)"},"PartNumberMarker":{"name":"part-number-marker","in":"query","schema":{"type":"string"},"description":"Pagination token for parts listing"},"Prefix":{"name":"prefix","in":"query","schema":{"type":"string"},"description":"Filters results to keys beginning with prefix"},"Range":{"name":"Range","in":"header","required":false,"description":"Check byte range availability (RFC 7233)","schema":{"type":"string","example":"bytes=0-499","pattern":"^bytes=\\d+-\\d*$"}},"UploadId":{"name":"uploadId","in":"query","required":false,"schema":{"type":"string"},"description":"Multipart upload ID"},"UploadIdMarker":{"name":"upload-id-marker","in":"query","schema":{"type":"string"},"description":"Pagination token for upload IDs"},"UploadsQueryParam":{"name":"uploads","in":"query","required":false,"description":"Initiates a multipart upload when present.","schema":{"type":"string","example":"","enum":["","true","initiate"]}},"VersionId":{"name":"versionId","in":"query","required":false,"description":"Object version ID for versioned buckets","schema":{"type":"string","example":"3L4kqtJl40Nr8X8gdRQBfuiopreWMME","maxLength":1024,"minLength":1,"pattern":"^[A-Za-z0-9\\-_]+$"}},"PresignedAlgorithm":{"name":"X-Amz-Algorithm","in":"query","description":"The algorithm used for signing (only for presigned URL requests).","required":false,"schema":{"type":"string","example":"AWS4-HMAC-SHA256"}},"PresignedCredential":{"name":"X-Amz-Credential","in":"query","description":"The access key and the associated policy (only for presigned URL requests).","required":false,"schema":{"type":"string","example":"AKIAIOSFODNN7EXAMPLE/20260421/eu-west-1/s3/aws4_request"}},"PresignedDate":{"name":"X-Amz-Date","in":"query","description":"The timestamp of the request (only for presigned URL requests).","required":false,"schema":{"type":"string","pattern":"^[0-9]{8}T[0-9]{6}Z$","example":"20260421T163349Z"}},"PresignedExpires":{"name":"X-Amz-Expires","in":"query","description":"Presigned URL validity in seconds (only for presigned URL requests). Maximum: 604800 (7 days).","required":false,"schema":{"type":"integer","maximum":604800}},"PresignedSignedHeaders":{"name":"X-Amz-SignedHeaders","in":"query","description":"The headers included in the signature (only for presigned URL requests).","required":false,"schema":{"type":"string","example":"host;x-amz-content-sha256"}},"PresignedSignature":{"name":"X-Amz-Signature","in":"query","description":"The signature (only for presigned URL requests).","required":false,"schema":{"type":"string","example":"aeeb918a4b68d84c455fd85e75fdd47e8c3a8a4e3d3e3e3e3e3e3e3e3e3e3e3e"}},"SpaceId":{"name":"spaceId","description":"Identifier of the Space","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"BucketName":{"name":"bucket","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"pattern":"^(?!(\\d{1,3}\\.){3}\\d{1,3}$)(?!.*\\.\\.)[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$"}}},"requestBodies":{"CompleteMultipartUploadRequest":{"description":"Complete multipart upload manifest; required only for the CompleteMultipartUpload dispatch (`uploadId` query parameter), absent from the body-less `?uploads` create dispatch","content":{"text/xml":{"schema":{"$ref":"#/components/schemas/CompleteMultipartInput"}}}},"DeleteObjectsRequest":{"description":"Batch delete request. The `Content-MD5` header (base64-encoded MD5 of the request body) is required and must match the body.","required":true,"content":{"text/xml":{"schema":{"$ref":"#/components/schemas/Delete"}}}}},"headers":{"ETag":{"description":"Entity tag for the object (RFC 7232)","required":true,"schema":{"type":"string","example":"\"33a64df551425fcc55e4d42a148795d9f25f89d4\"","pattern":"^\"[^\"]+\"$"},"example":"\"33a64df551425fcc55e4d42a148795d9f25f89d4\""},"AcceptRanges":{"description":"Indicates range request support (RFC 7233)","schema":{"type":"string","example":"bytes","enum":["bytes","none"]},"example":"bytes"},"ContentType":{"description":"MIME type of the object","schema":{"type":"string","example":"application/json","pattern":"^[a-z]+/[a-z0-9.+-]+$"},"example":"application/json"},"ContentRange":{"description":"Byte range of the returned partial content (RFC 7233)","required":true,"schema":{"type":"string","example":"bytes 0-499/12345"},"example":"bytes 0-499/12345"},"ContentLength":{"description":"Size of the object in bytes","required":true,"schema":{"type":"integer","format":"int64","example":512,"minimum":0},"example":512},"LastModified":{"description":"Last modification timestamp (RFC 7231)","schema":{"$ref":"#/components/schemas/HttpDate"}},"CacheControl":{"description":"Cache control directives for the object (RFC 7234)","schema":{"type":"string","example":"max-age=3600"},"example":"max-age=3600"},"Expires":{"description":"Expiration date and time of the object (RFC 7231)","schema":{"type":"string","example":"Wed, 21 Oct 2026 07:28:00 GMT"},"example":"Wed, 21 Oct 2026 07:28:00 GMT"},"ContentDisposition":{"description":"Presentation style of the object (RFC 6266)","schema":{"type":"string","example":"attachment; filename=\"report.pdf\""},"example":"attachment; filename=\"report.pdf\""},"ContentEncoding":{"description":"Content codings applied to the object (RFC 9110)","schema":{"type":"string","example":"gzip"},"example":"gzip"},"ContentLanguage":{"description":"Languages of the object content (RFC 9110)","schema":{"type":"string","example":"fr-FR"},"example":"fr-FR"}},"securitySchemes":{"AwsSigV4":{"type":"apiKey","in":"header","name":"Authorization","description":"AWS V4 signature authorization header"},"AwsSigV4Presigned":{"type":"apiKey","in":"query","name":"X-Amz-Signature","description":"Presigned-URL authentication via the X-Amz-* query parameters (X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders and X-Amz-Signature). The signature parameter is not re-verified server-side; credential ownership is validated instead (see docs/presign-flow-comparison.md)."}}},"tags":[{"name":"Object Storage","description":"Object Storage public API"}]}