home / api reference
Basalt speaks the S3 REST API. Anything that talks to AWS S3 talks to Basalt with one
changed line. Version v1, last updated 2026-06-11.
| Endpoint | https://ru1.niteatmos.ovh |
| Region | eu-north-1 |
| Addressing | path-style and virtual-hosted |
| Signature | AWS SigV4 |
| TLS | 1.2 / 1.3, HTTP/2 |
AccessDenied. Expected: the root is not a website.Create scoped key pairs in the console under Access keys. A key can be limited to a bucket prefix and to a set of operations.
# verify credentials, list buckets aws --endpoint-url https://ru1.niteatmos.ovh s3 ls # presign a 15 minute download link aws --endpoint-url https://ru1.niteatmos.ovh \ s3 presign s3://media/reel.mp4 --expires-in 900
| Operation | Request | Notes |
|---|---|---|
| ListBuckets | GET / | authenticated only |
| ListObjectsV2 | GET /{bucket} | prefix, delimiter, continuation-token |
| GetObject | GET /{bucket}/{key} | Range, If-None-Match, If-Modified-Since |
| HeadObject | HEAD /{bucket}/{key} | ETag, size, storage class |
| PutObject | PUT /{bucket}/{key} | up to 5 GiB single-shot |
| CreateMultipartUpload | POST ?uploads | 10 000 parts, 5 TiB total |
| UploadPart | PUT ?partNumber | 5 MiB minimum except the last part |
| CompleteMultipartUpload | POST ?uploadId | composite ETag |
| DeleteObjects | POST ?delete | 1 000 keys per call |
| PutBucketLifecycle | PUT ?lifecycle | expiration, abort-incomplete |
Errors are S3-shaped XML with application/xml, whatever the key looks like.
Keep the RequestId — support asks for it first.
HTTP/2 404 content-type: application/xml x-amz-request-id: 8f2b1c6d4a9e0731 <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>NoSuchKey</Code> <Message>The specified key does not exist.</Message> <Key>2026/dataset.tar.zst</Key> <RequestId>8f2b1c6d4a9e0731</RequestId> </Error>
| Limit | Value |
|---|---|
| Max object size | 5 TiB |
| Max single-shot PUT | 5 GiB |
| Parts per multipart upload | 10 000 |
| Buckets per account | 1 000 |
| Keys per DeleteObjects call | 1 000 |
| Anonymous egress | 2 MiB/s per connection |
| Anonymous concurrency | 32 connections |
| Presigned URL max TTL | 7 days |
| Path | Returns |
|---|---|
| /health | liveness JSON, no auth |
| /status.json | node counters, component state, 24 h history |