Skip to content

S3 operations reference

The S3 data-plane client implements the S3 API surface that Lockwell supports. If you have used the AWS SDK, the operation names and option names will look familiar.

This page lists every operation in one place so you can see the full breadth at a glance. Each operation is available in the Go, Node, and Java SDKs with matching names.

For the JSON alternative (bearer tokens instead of SigV4, no XML), see the native data-plane API. For tenant and key management, see the Admin API.

Buckets

OperationPurposeKey options
CreateBucketCreate a private bucketObject Lock enabled at creation
HeadBucketCheck that a bucket exists and you can reach it
DeleteBucketDelete an empty bucket
PutBucketVersioningEnable or suspend versioningEnabled, Suspended
GetBucketVersioningRead the versioning state

Buckets are always private. There is no public-bucket or anonymous-access toggle.

A public-bucket or anonymous-access toggle is a deliberate non-goal. Share objects with a presigned GET URL or

a native signed URL instead. :::

Objects: write

OperationPurposeKey options
PutObjectWrite an object from a buffer or a streamcontent type, user metadata, idempotency key, checksum algorithm, SSE-S3, retention, legal hold
CopyObjectServer-side copy within or across bucketsmetadata directive (COPY or REPLACE), copy-source conditionals, SSE
DeleteObjectDelete one object or one versionversion id
DeleteObjectsDelete up to 1000 objects in one requestquiet mode, per-key errors with partial success

PutObject accepts a stream, so you can upload an object larger than memory without buffering it. See Upload & download.

Objects: read

OperationPurposeKey options
GetObjectStream an object bodybyte range, version id, part number, response header overrides
HeadObjectRead object metadata without the bodybyte range, version id, response header overrides

Listing

OperationPurposeKey options
ListObjectsV2List objects by prefix, token-pagedprefix, delimiter, start-after, continuation token, max keys
ListObjectsList objects, marker-paged (the v1 form)prefix, delimiter, marker, max keys
ListObjectVersionsList versions and delete markersprefix, delimiter, key marker, version-id marker, max keys
ListMultipartUploadsList in-progress multipart uploadsprefix, delimiter, key marker, upload-id marker, max uploads
ListPartsList the parts of one multipart uploadpart-number marker, max parts

Every listing operation has a paginator that follows the continuation tokens for you: ListObjectsV2Paginator, ListObjectVersionsPaginator, ListMultipartUploadsPaginator, and ListPartsPaginator. Each exposes HasMorePages() and NextPage(). See Listing & pagination.

Multipart uploads

OperationPurposeKey options
CreateMultipartUploadStart a multipart uploadsame write options as PutObject
UploadPartUpload one partper-part checksum
UploadPartCopyFill a part by server-side copy from another objectcopy-source range and conditionals
CompleteMultipartUploadAssemble the uploaded parts into one objectidempotency key
AbortMultipartUploadDiscard an upload and its parts

See Multipart uploads for a full large-file example.

Tagging

OperationPurposeKey options
PutObjectTaggingReplace the tag set on an objectversion id
GetObjectTaggingRead the tag setversion id
DeleteObjectTaggingRemove all tagsversion id

Versioning

Versioning is controlled with PutBucketVersioning and GetBucketVersioning (above). Once enabled, every write keeps the prior version, a delete writes a delete marker, and you can read or delete a specific versionId. List versions with ListObjectVersions. See Versioning.

Object Lock

OperationPurposeKey options
GetObjectRetentionRead the retention mode and retain-until dateversion id
GetObjectLegalHoldRead the legal-hold statusversion id

Retention and legal holds are set when you write the object, through the PutObject options (retention mode and retain-until date, legal hold on or off). Object Lock must be enabled when the bucket is created. Governance-mode bypass is not supported. See Object Lock.

Presigned URLs

OperationPurposeKey options
PresignGetObjectBuild a signed GET URL a browser can fetch directlyexpiry (capped by the server)

The Lockwell S3 service accepts query-SigV4 presigned GET, PUT, HEAD, and DELETE requests from compatible external clients. The first-party Go, Node, and Java S3 clients generate presigned GET, PUT, HEAD, and DELETE URLs. To let a browser upload directly with a first-party client, use a native signed PUT URL from the app kit or native client.

That is a deliberate split: presigned writes on the S3 surface stay off, and the native signed URL is the supported upload path.

Checksums and integrity

Request a checksum on any write with the checksum option, using CRC32, CRC32C, CRC64NVME, SHA-1, or SHA-256. The SDK computes the digest on the client, the server verifies it, and the value comes back on the response. Multipart uploads support a checksum per part. See Checksums & integrity.

Conditional writes and idempotency

The first-party S3 clients support create-only PutObject with If-None-Match: *. Overwrite-only If-Match: <etag> writes use the native client.

CopyObject does support copy-source conditionals (If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since evaluated against the source object). Set an idempotency key on a write so a retried request is applied once. See Conditional writes & idempotency.

Retries

Construct a client with a retry policy. The default policy makes three attempts with exponential backoff and jitter, and retries idempotent requests (GET, HEAD, DELETE) along with writes that carry an idempotency key. The disabled policy makes a single attempt. See Errors & retries.

Server-side encryption

Objects are encrypted at rest by default with a per-tenant data key. Request the SSE-S3 server-managed mode explicitly with the encryption option on a write. SSE-KMS is not supported. The S3 wire API supports SSE-C when at-rest encryption is enabled: callers provide the same AES-256 customer key and MD5 headers on every applicable write, read, copy, and multipart request. The first-party Go, Node, and Java S3 clients expose typed SSE-C and copy-source SSE-C helpers.

Reserved metadata isolation

User metadata is lossless, duplicate-preserving, and user-owned. The merged metadata remediation stores it separately from internal SSE-C and Object Lock state, including historical reserved names such as x-amz-meta-lockwell-sse-customer-key-md5. Caller-controlled metadata cannot manufacture an internal encryption marker; the same comma/equals/reserved-name round trips are covered through S3, native HTTP, and LNW/1. This does not make SSE-C available on native transports: use the S3 surface for genuine customer-provided keys.

What the S3 client does not do

These are deliberate non-goals. They are not roadmap gaps, and the SDK will not expose them:

  • Provider-specific POST policies or STS credentials. The typed S3 presigners cover GET, PUT, HEAD, and DELETE; the native client provides constrained GET/PUT URLs for browser-direct flows.
  • Public or anonymous buckets, public sharing, ACLs.
  • SSE-KMS. SSE-C and copy-source SSE-C are available on the S3 wire and through typed first-party SDK helpers.
  • IAM, STS, AssumeRole, and bucket policies (use Lockwell access keys and scopes).
  • Website hosting, S3 Select, Inventory, Intelligent-Tiering, Object Lambda, S3 Express.
  • Event notifications on the S3 client (configure them on the native client instead).

For the reasoning behind these boundaries, see the repository's final replacement contract.

Source-available under PolyForm Noncommercial 1.0.0; commercial use requires a written grant. License