Ir para o conteúdo
NimbusNexus

Object storage

NimbusNexus Object Storage exposes the AWS S3 API. Existing tools and libraries — aws s3 CLI, boto3, the official Java/Go/Node SDKs, every framework that talks S3 — work unchanged after pointing them at our endpoint and dropping in our credentials.

What's S3-compatible, what's not

We implement the operations 90% of S3 callers use:

  • Bucket CRUD (PutBucket, GetBucket, DeleteBucket)
  • Object CRUD (PutObject, GetObject, DeleteObject, HeadObject, ListObjects/ListObjectsV2)
  • Multipart upload (CreateMultipartUpload, UploadPart, CompleteMultipartUpload)
  • Pre-signed URLs (sig v4)
  • Object metadata, content-type, custom headers
  • Server-side encryption (always-on, AES-256)

We don't implement:

  • AWS-specific IAM (we have our own — use the Authentication bearer-token model for the management API; S3 credentials are issued separately).
  • S3 Object Lock / WORM compliance (planned for 2026 Q4).
  • S3 Select (server-side query).
  • Cross-region replication via S3 API (we expose it via the management API instead, with cleaner pricing).

If your app uses an S3 feature that's not in the supported list, it'll get a 501 Not Implemented with the operation name in error.code. Switch to the supported equivalent or open a feature request.

Storage classes

Three classes, picked at object-put time (or per-bucket default):

ClassPer-GB-monthFirst-byte latencyMin storage durationWhen to use
standard$0.013<50 msNoneHot data — web assets, frequent reads, anything served live.
ia$0.007<50 ms30 days"Infrequent access" — accessed sometimes, but you want it fast when you do. Same retrieval performance as Standard, half the storage rate, a per-GB retrieval fee.
cold$0.0041–60 minutes90 daysArchive — backups, raw logs, compliance retention. Cheaper to keep, slower to retrieve.

Minimum-storage-duration means: if you delete an object before the minimum window, you pay the per-GB rate for the rest of the window. That's the "infrequent" in IA: it's cheap if you let objects sit, expensive if you churn them.

For pure archive needs where you almost never read the data, see Cold storage — a dedicated archive product with even cheaper rates ($0.004/GB-month flat, plus retrieval fees).

Egress, the actually-different thing

The single biggest difference from AWS S3 is how egress is priced:

  • VM ↔ object storage in the same region: free, always. This is the load path for most workloads — your VMs talk to your buckets — and we don't bill it. Effective egress for production traffic that stays inside one region: $0.
  • Public internet egress: $0.009/GB, with the first 1 TB free per month per project. For comparison, AWS S3 charges $0.09/GB for the first 10 TB.
  • Cross-region egress: $0.005/GB. Lower than public-internet egress because the path is on our backbone, not the open internet.

The "free in-region transfer to VMs" line on the marketing page is a real architectural commitment, not a promotion. The point is to make multi-tier architectures (object storage as the source-of-truth, fronted by VMs that read and serve) economical.

Bucket naming

Bucket names are globally unique across all NimbusNexus tenants — same rule as AWS. DNS-compatible: lower-case, 3–63 chars, no underscores, no leading/trailing dashes. Bucket-name squatting is the main reason claim early for important names.

Bucket names appear in the URL: https://<bucket>.s3.us-east-1.nimbusnexus.net/<key> or path-style at https://s3.us-east-1.nimbusnexus.net/<bucket>/<key>. Both styles work; SDK clients pick one based on their config.

Listing, paging, performance

ListObjectsV2 returns up to 1,000 keys per request, sorted lexicographically by key. Beyond 1,000, paginate with continuation_token — same as S3.

For very wide buckets (millions of keys), use delimited listing: pass delimiter=/ to get directory-style listing where keys are grouped by prefix. Listing a "directory" with a delimiter scans only its immediate children, not the whole bucket.

Cold-class objects in a list response are returned identically to Standard / IA — listing doesn't trigger retrieval, only GetObject does. You can scan a 100M-object Cold bucket for free; restoring an object out of Cold has its own per-GB charge.

What's next

  • Authentication — bearer-token auth for the management API. S3 credentials (access key + secret key) are issued separately via the management API.
  • Block storage — when you want a filesystem rather than a key-value store, or you need POSIX semantics.
  • Mosaic editor — browser-based editor for YAML/JSON/Markdown files inside your buckets. Free with every Storage account.

Reference

GET/api/v1/object_storage/

List Containers

Lists the containers owned by the calling project together with their size and object counts.

Parameters

NameInRequiredDescription
limitquerynoMaximum number of containers to return
markerquerynoMarker for pagination
end_markerquerynoEnd marker for pagination
prefixquerynoFilter containers by prefix

Responses

  • 200Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/

POST/api/v1/object_storage/

Create Container

Creates a new object storage container, optionally marking it publicly readable.

Request body

JSON body required.

Responses

  • 201Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/

POST/api/v1/object_storage/credentials

Mint Storage Credential

Mints a short-lived, project-scoped object-storage credential (a Keystone trust) for the caller's current project and returns its trust_id. A standalone editor presents that id via the X-Trust-Id header on subsequent object-storage calls, reaching this project's storage without holding the user's full token or any durable secret.

Request body

JSON body required.

Responses

  • 201Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/credentials

DELETE/api/v1/object_storage/credentials/{trust_id}

Revoke Storage Credential

Revokes a previously minted object-storage credential (trust).

Parameters

NameInRequiredDescription
trust_idpathyes—

Responses

  • 204Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/credentials/{trust_id}

GET/api/v1/object_storage/{container_name}

Get Container Metadata

Returns the metadata headers describing the given container.

Parameters

NameInRequiredDescription
container_namepathyes—

Responses

  • 200Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}

PATCH/api/v1/object_storage/{container_name}

Update Container Metadata

Updates the metadata headers attached to the given container.

Parameters

NameInRequiredDescription
container_namepathyes—

Request body

JSON body required.

Responses

  • 200Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}

DELETE/api/v1/object_storage/{container_name}

Delete Container

Deletes the named container, rejecting the request if it still holds objects.

Parameters

NameInRequiredDescription
container_namepathyes—

Responses

  • 204Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}

GET/api/v1/object_storage/{container_name}/objects

List Objects

Lists the objects stored within the given container.

Parameters

NameInRequiredDescription
container_namepathyes—
limitquerynoMaximum number of objects to return
markerquerynoMarker for pagination
end_markerquerynoEnd marker for pagination
prefixquerynoFilter objects by prefix
delimiterquerynoDelimiter for hierarchical listing
version_markerquerynoVersion marker for versioned objects
pathquerynoPath within container
full_listingquerynoReturn all objects, paginating automatically
query_stringquerynoAdditional query parameters

Responses

  • 200Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}/objects

POST/api/v1/object_storage/{container_name}/objects

Upload Object

Uploads a new object into the given container from a multipart file upload.

Parameters

NameInRequiredDescription
container_namepathyes—

Request body

JSON body required.

Responses

  • 201Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}/objects

GET/api/v1/object_storage/{container_name}/objects/{object_name}

Get Object Metadata

Returns the metadata headers describing the named object.

Parameters

NameInRequiredDescription
container_namepathyes—
object_namepathyes—

Responses

  • 200Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}/objects/{object_name}

PATCH/api/v1/object_storage/{container_name}/objects/{object_name}

Update Object Metadata

Updates the metadata headers attached to the named object.

Parameters

NameInRequiredDescription
container_namepathyes—
object_namepathyes—

Request body

JSON body required.

Responses

  • 200Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}/objects/{object_name}

DELETE/api/v1/object_storage/{container_name}/objects/{object_name}

Delete Object

Deletes the named object from its container.

Parameters

NameInRequiredDescription
container_namepathyes—
object_namepathyes—

Responses

  • 204Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}/objects/{object_name}

GET/api/v1/object_storage/{container_name}/objects/{object_name}/content

Get Object Content

Downloads the body of an object, decoding it as UTF-8 text or base64 when binary.

Parameters

NameInRequiredDescription
container_namepathyes—
object_namepathyes—

Responses

  • 200Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}/objects/{object_name}/content

PUT/api/v1/object_storage/{container_name}/objects/{object_name}/content

Put Object Content

Replaces the body of an existing object at the given path with the uploaded content.

Parameters

NameInRequiredDescription
container_namepathyes—
object_namepathyes—

Request body

JSON body required.

Responses

  • 200Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}/objects/{object_name}/content

POST/api/v1/object_storage/{container_name}/objects/{object_name}/copy

Copy Object

Copies an object to a new name or path and returns where the copy landed. `destination` is relative to the source container; prefix it with '/' to name another container, which alone keeps the source object's name.

Parameters

NameInRequiredDescription
container_namepathyes—
object_namepathyes—

Request body

JSON body required.

Responses

  • 201Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}/objects/{object_name}/copy

POST/api/v1/object_storage/{container_name}/objects/{object_name}/move

Move Object

Moves an object to a new container or name by copying it and deleting the source, and returns where it ended up.

Parameters

NameInRequiredDescription
container_namepathyes—
object_namepathyes—

Request body

JSON body required.

Responses

  • 200Successful Response
  • 400Bad Request
  • 401Unauthorized
  • 403Forbidden
  • 404Not Found
  • 409Conflict
  • 422Validation error
  • 429Too Many Requests
  • 500Internal Server Error

https://api.nimbusnexus.net/api/v1/object_storage/{container_name}/objects/{object_name}/move

Need to make a real call? Try these endpoints in the live Swagger UI →