Skip to content

Native data-plane API ​

The native JSON data-plane API lives at /api/v1/ on the public listener: the same host:port as the S3 API, a different path prefix. No SigV4 signing, no XML. JSON in, JSON out.

It is a new transport and auth layer over the same domain pipeline the S3 handler uses (the same object coordinator, encryption, dedup, checksums, versioning, object-lock, scope enforcement, quota, and audit). A native write is encrypted-at-rest, deduped, quota-checked, and retention-gated exactly like an S3 write.

This page documents the legacy HTTP/JSON surface. Existing integrations can use Go's explicit compatibility client, Node, or Java. New Go applications should use the direct binary LNW/1 client.

Authentication ​

The native API does not use SigV4 on data calls. A caller exchanges its existing S3 access key for a short-lived native bearer token.

Mint a token: POST /api/v1/auth/token ​

OAuth client-credentials style. Present your S3 access-key id plus secret either as HTTP Basic (Authorization: Basic base64(accessKeyId:secretKey)) or a JSON body {"accessKeyId": "...", "secretKey": "..."}. On success you get a short-lived bearer token:

text
lwtk_<base64url(payloadJSON)>.<base64url(HMAC-SHA256(payloadB64, signingKey))>
  • TTL is security.native_api_token_ttl (default 1h). Keep it short: a leaked token is replayable until it expires.
  • The token is stateless and signed (HMAC under a per-deployment key derived from the at-rest master key), so the hot path verifies it with no per-request DB lookup for the token itself.
  • Revoking or expiring the underlying access key (or disabling the tenant) invalidates outstanding tokens promptly. The verify path re-checks revocation on every request, so a token can never outlive or out-scope the key it points at.
  • This endpoint accepts the secret once, so it must run behind TLS. It is rate-limited per access-key id and audited (success and failure).

Send the token on every subsequent call as Authorization: Bearer <token>. The SDKs cache it until shortly before expiry, refresh transparently, and re-mint once on a 401.

The bearer token is replayable until it expires. Keep its TTL short and always mint it over TLS, since

auth/token accepts the secret in the clear. :::

Signed-URL auth (no bearer token) ​

GET|PUT /api/v1/signed/{bucket}/{key...}?token=… is authorized solely by the query token: an HMAC-signed, expiring URL token (lwurl_…) minted by POST /api/v1/sign-url, under a separate per-deployment key.

At access time the handler re-checks the underlying key's revocation, re-runs the per-operation scope and bucket-policy gates against the current scope, and enforces that the request method and bucket/key match the signed token. A tampered, expired, wrong-method, wrong-resource, revoked, or scope-exceeding URL is rejected (401/403). See signed URLs.

Browser preflight for signed URLs uses OPTIONS /api/v1/signed/{bucket}/{key...}?token=…. The token still has to authorize the requested method and resource, and the bucket's stored CORS rules still have to match the origin and requested headers. CORS never grants object access by itself.

Routes ​

All routes except /healthz, /openapi.json, and /auth/token require a valid bearer token. The tenant is taken from the signed token, never the request path, so cross-tenant access is structurally impossible (another tenant's bucket returns 404, never a leak).

Buckets ​

Method + pathPurpose
GET /bucketslist the tenant's buckets
POST /bucketscreate a private bucket (versioning / object-lock options)
GET /buckets/{bucket}get a bucket
DELETE /buckets/{bucket}delete an empty bucket
GET|PUT /buckets/{bucket}/versioningread / set versioning state
GET|PUT|DELETE /buckets/{bucket}/corsread / set / clear browser CORS rules

Objects ​

Method + pathPurpose
PUT /buckets/{bucket}/objects/{key...}streaming upload
GET /buckets/{bucket}/objects/{key...}streaming download (Range supported)
HEAD /buckets/{bucket}/objects/{key...}metadata only
DELETE /buckets/{bucket}/objects/{key...}delete (delete marker in a versioned bucket)
GET /buckets/{bucket}/objectslist (prefix / delimiter / maxKeys / continuationToken)
POST /buckets/{bucket}/objects:batchDeletebatch delete, per-key results
POST /buckets/{bucket}/object-copy/{key...}same-tenant server-side copy

The upload supports several controls:

  • An Idempotency-Key header, mapped onto the same idempotency store the S3 X-Lockwell-Idempotency-Key path uses.
  • Native conditional writes (If-Match / If-None-Match).
  • Optional server-side checksum verification (X-Lockwell-Checksum-<alg> for CRC32, CRC32C, CRC64NVME, SHA1, SHA256). A bad digest is rejected before any bytes are committed.

The copy source is the JSON body ({sourceBucket, sourceKey, sourceVersionId?, metadataDirective?, …, requireAbsent?, requireMatchEtag?}). Cross-tenant copy is impossible, since the source resolves under the token's tenant.

Versions, tags, and per-object WORM ​

Method + pathPurpose
GET /buckets/{bucket}/versionslist versions and delete markers (prefix / keyMarker / versionIdMarker)
GET|PUT|DELETE /buckets/{bucket}/object-tags/{key...}get / replace / clear the JSON tag set
GET|PUT /buckets/{bucket}/object-retention/{key...}per-object retention ({mode: GOVERNANCE|COMPLIANCE, retainUntil})
GET|PUT /buckets/{bucket}/object-legal-hold/{key...}legal-hold status ({status: ON|OFF})

These four sub-resources use a distinct path prefix (not a suffix on /objects/{key...}) so the key wildcard preserves embedded slashes.

Retention can be extended but never shortened. There is no governance bypass on the native path, a deliberate

non-goal that stays closed. :::

Multipart ​

Method + pathPurpose
POST /buckets/{bucket}/multipart/{key...}create an upload
PUT /buckets/{bucket}/multipart/{uploadId}/parts/{partNumber}/{key...}upload a part
GET /buckets/{bucket}/multipart/{uploadId}/parts/{key...}list parts
POST /buckets/{bucket}/multipart/{uploadId}/complete/{key...}complete
DELETE /buckets/{bucket}/multipart/{uploadId}/{key...}abort
GET /buckets/{bucket}/multipartlist in-progress uploads

Signed URLs ​

  • POST /sign-url (bearer): mint a method-, resource-, and scope-bounded signed URL.
  • GET|PUT /signed/{bucket}/{key...}?token=... (no bearer): use a signed URL.

method is GET (download) or PUT (upload): the native API supports signed write URLs. The TTL is clamped to security.max_presign_ttl, and the URL can never exceed the minting key's live scope (a read-only key minting a PUT URL is 403).

POST /sign-url accepts

text
{method, bucket, key|keyPrefix, ttlSeconds?, contentType?, contentLengthMax?, checksumAlg?, checksumVal?,
 idempotencyKey?, responseContentType?, responseContentDisposition?, reason?}

PUT constraints (contentType, contentLengthMax, checksum*, idempotencyKey, keyPrefix), GET response overrides (responseContentType, responseContentDisposition), and the optional audit reason are HMAC-covered and enforced or recorded at dispatch; cross-method fields are rejected.

Bucket CORS ​

Method + pathPurpose
GET /buckets/{bucket}/corsget browser CORS rules
PUT /buckets/{bucket}/corsset browser CORS rules
DELETE /buckets/{bucket}/corsclear browser CORS rules
OPTIONS /signed/{bucket}/{key...}signed-URL browser preflight (no bearer)

The native shape is camelCase JSON:

json
{
  "rules": [
    {
      "id": "browser-direct",
      "allowedOrigins": ["https://app.example.com"],
      "allowedMethods": ["GET", "HEAD", "PUT"],
      "allowedHeaders": ["content-type"],
      "exposeHeaders": ["ETag", "X-Lockwell-Version-Id"],
      "maxAgeSeconds": 600
    }
  ]
}

PUT /buckets/{bucket}/cors validates through the same CORS validator and bucket-config store as the S3 ?cors XML route. It is an admin-scoped bucket operation; ordinary data keys cannot change browser policy. Matching authenticated or signed URL object responses emit Access-Control-* headers, but the normal bearer/signed-token, scope, bucket-policy, quota, object-lock, and audit gates still run.

Bucket event notifications ​

Method + pathPurpose
GET /buckets/{bucket}/notificationsget the configuration
PUT /buckets/{bucket}/notificationsset it (an empty configs list clears it)
DELETE /buckets/{bucket}/notificationsclear it

Only the webhook target is supported. An sns/sqs/lambda target is 501. A new config ID returns the server-generated signingSecret exactly once; it is sealed at rest and omitted from GET and same-ID updates, which carry only hasSecret. See webhooks.

Native fields surfaced ​

Object reads surface Lockwell-native details S3 XML hides: native checksums (CRC32/CRC32C/CRC64NVME/SHA1/SHA256), encryption and compression status, storage class, version id, retention and legal-hold, and content length. They come back as JSON fields and X-Lockwell-* response headers.

Error shape (problem+json) ​

Failures return an application/problem+json body:

json
{
  "code": "not_found",
  "message": "bucket \"reports\" not found",
  "status": 404,
  "requestId": "req_01HXY…"
}

code is a stable machine-readable string. requestId correlates the failure with its server-side audit row (also echoed in the X-Request-Id header). Status mapping:

StatusMeaning
401missing/invalid/expired bearer token, or a revoked access key
403access-key scope or bucket-policy denial
404bucket/key not found
409bucket already exists
412conditional-write or copy-source precondition not met
501unsupported notification target (SNS/SQS/Lambda)
507tenant storage quota exceeded

Security parity ​

The native API is private by default and never served anonymously. Every control the S3 path enforces is enforced identically here, through the same domain services:

  • Tenant isolation (from the token, never the path).
  • Per-operation read/write/delete/admin plus bucket/prefix scope enforcement.
  • Explicit-deny bucket policies.
  • Encryption, dedup, quota, object-lock, retention, and legal-hold.
  • Audit on every request, including denials.

It does not relax any S3 control or enable any public/anonymous access. See tenancy and auth.

OpenAPI ​

The full machine-readable contract is an OpenAPI 3 document, available two ways:

  • Served live at GET /api/v1/openapi.json (unauthenticated, since you need the contract before you hold a token).
  • Committed at internal/nativeapi/openapi.json (the canonical source; the served document is the same bytes).

Each operation carries a unique operationId (putObject, listObjects, signURL, setBucketNotifications, …), so you can generate a client in any language with openapi-generator (make codegen produces TypeScript/Python/Go clients for both the native and admin specs). Prefer the first-party SDKs for Go, Node, and Java; codegen is the path for every other language.

If the deployment selects the binary transport, read the separate Native Wire reference and /native-wire-v1.json. LNW/1 is not an alternate JSON encoding: it has its own 40-byte frame, TLV/document rules, handshake, capability mask, and stable error registry. The HTTP OpenAPI document does not describe that listener.

Interactive reference ​

Every native operation below is generated from that OpenAPI document, so it always matches the shipped server. Expand an operation for its path and query parameters, request and response schemas, and copy-paste curl / fetch samples. The example host is a placeholder; swap in your own deployment.

First-class native JSON/HTTP data-plane API for Lockwell, mounted at /api/v1/ on the public (S3) listener. It is a new transport + auth over the same domain pipeline the S3 compatibility handler uses (object coordinator, object service, metastore, storage, policy, audit). Authentication is a short-lived native bearer token minted from an existing S3 access key (POST /auth/token); per-operation authorization reuses the same access-key scopes and bucket policies, so it never relaxes any S3 security control. The tenant is taken from the signed token, never the path.

Servers​

https://objects.your-lockwell-host.com/api/v1Your Lockwell deployment (replace with your own host)

system​

Liveness and contract endpoints.


Liveness probe​

GET
/healthz

Responses​

ok

Playground​

Samples​


This OpenAPI document​

GET
/openapi.json

Responses​

OpenAPI 3 document

Playground​

Samples​


auth​

Native bearer token + signed-URL minting.


Mint a native bearer token from an S3 access key​

POST
/auth/token

OAuth client-credentials style. Present the access-key id + secret via HTTP Basic over TLS, or a JSON body {accessKeyId, secretKey}. Returns a short-lived bearer token. Rate-limited and audited.

Responses​

Token issued

Playground​

Samples​


Mint a short-lived, scoped, signed native URL​

POST
/sign-url

Issues a time-limited HMAC-signed URL for an unauthenticated GET (download) or PUT (upload) of a single object. The URL is method-bound and resource-bound (exact key, or a PUT-only keyPrefix), TTL-clamped to security.max_presign_ttl, and can never exceed the minting key's scope (the live scope + bucket policy are re-checked here and again at access time). Optional constraints are HMAC-covered and enforced at dispatch: PUT accepts contentType (pins stored Content-Type), contentLengthMax (rejects larger uploads), checksumAlg/checksumVal (verifies the body), idempotencyKey (collapses retries), and keyPrefix (browser chooses the suffix); GET accepts responseContentType and responseContentDisposition (predictable browser download headers). Optional reason is caller-owned audit context stored on the signed-URL mint/use audit rows and HMAC-covered in the URL token. Body: {method, bucket, key|keyPrefix, ttlSeconds?, contentType?, contentLengthMax?, checksumAlg?, checksumVal?, idempotencyKey?, responseContentType?, responseContentDisposition?, reason?}.

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Responses​

Signed URL issued

Playground​

Authorization

Samples​


signed​

Unauthenticated access via a signed URL token.


Download via a signed URL (no bearer token)​

GET
/signed/{bucket}/*

Public object download authorized by the token query parameter (a method/resource-bound, short-lived, HMAC-signed URL token). Revocation and the per-operation scope/bucket-policy gates are re-checked at access time, so it grants nothing the minting key lacks.

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Object body

Playground​

Variables
Key
Value

Samples​


Upload via a signed URL (no bearer token)​

PUT
/signed/{bucket}/*

Public object upload authorized by the token query parameter. Only minted when the key's scope permits PutObject on the resource; revocation + scope/policy are re-checked at access time.

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Stored

Playground​

Variables
Key
Value

Samples​


CORS preflight for a signed URL​

OPTIONS
/signed/{bucket}/*

Resolves browser CORS preflight for a native signed URL. The signed URL token still has to be valid, method-bound, resource-bound, unexpired, unrevoked, in scope, and allowed by the bucket policy; then the stored bucket CORS rules decide whether to emit CORS grant headers. CORS grants no object access by itself.

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

CORS preflight allowed; response carries Access-Control-* headers

Playground​

Variables
Key
Value

Samples​


List the tenant's buckets​

GET
/buckets

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Responses​

Bucket list

Playground​

Authorization

Samples​


Create a private bucket​

POST
/buckets

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Responses​

Bucket created

Playground​

Authorization

Samples​


Get a bucket​

GET
/buckets/{bucket}

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Bucket

Playground​

Authorization
Variables
Key
Value

Samples​


Delete a bucket​

DELETE
/buckets/{bucket}

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Deleted

Playground​

Authorization
Variables
Key
Value

Samples​


Get bucket versioning state​

GET
/buckets/{bucket}/versioning

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Versioning state

Playground​

Authorization
Variables
Key
Value

Samples​


Set bucket versioning state​

PUT
/buckets/{bucket}/versioning

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Versioning state

Playground​

Authorization
Variables
Key
Value

Samples​


Get the bucket's browser CORS configuration​

GET
/buckets/{bucket}/cors

Returns the native JSON view of the same bucket CORS configuration used by the S3 ?cors XML route. CORS is only a browser policy and never authorizes object access.

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

CORS configuration

application/json
JSON
{
  
"rules": [
  
  
{
  
  
  
"id": "string",
  
  
  
"allowedOrigins": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"allowedMethods": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"allowedHeaders": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"exposeHeaders": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"maxAgeSeconds": 0
  
  
}
  
]
}

Playground​

Authorization
Variables
Key
Value

Samples​


Set the bucket's browser CORS configuration​

PUT
/buckets/{bucket}/cors

Stores a validated CORS configuration through the shared bucket-config framework. Allowed methods are GET, HEAD, PUT, POST, and DELETE. This route requires an admin-scoped bucket key; ordinary data keys cannot change browser policy.

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Request Body​

application/json
JSON
{
  
"rules": [
  
  
{
  
  
  
"id": "string",
  
  
  
"allowedOrigins": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"allowedMethods": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"allowedHeaders": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"exposeHeaders": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"maxAgeSeconds": 0
  
  
}
  
]
}

Responses​

CORS configuration stored

application/json
JSON
{
  
"rules": [
  
  
{
  
  
  
"id": "string",
  
  
  
"allowedOrigins": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"allowedMethods": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"allowedHeaders": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"exposeHeaders": [
  
  
  
  
"string"
  
  
  
],
  
  
  
"maxAgeSeconds": 0
  
  
}
  
]
}

Playground​

Authorization
Variables
Key
Value
Body

Samples​


Clear the bucket's browser CORS configuration​

DELETE
/buckets/{bucket}/cors

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Cleared

Playground​

Authorization
Variables
Key
Value

Samples​


notifications​

Bucket event-notification configuration (signed webhook delivery).


Get the bucket's event-notification configuration​

GET
/buckets/{bucket}/notifications

Returns the stored webhook notification configuration without the per-config signing secret (only hasSecret acknowledges one exists). A signingSecret is returned exactly once by PUT when a new config ID is created, never by GET. Reuses the same notification domain store the S3 GetBucketNotificationConfiguration path reads; an unset config returns an empty configs list (not 404).

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Notification configuration (hasSecret only; signingSecret omitted)

Playground​

Authorization
Variables
Key
Value

Samples​


Set the bucket's event-notification configuration​

PUT
/buckets/{bucket}/notifications

Sets the bucket's webhook notification configuration (webhook target URL, subscribed event types e.g. object-created/object-removed, optional prefix/suffix filters). Validated and stored through the SAME notification validator + bucket-config store the S3 PutBucketNotificationConfiguration path uses. The per-config signing secret is generated server-side (crypto/rand), returned exactly once as signingSecret for each new config ID, and then sealed at rest; GET and same-ID updates omit it. An empty configs list clears the configuration. SNS/SQS/Lambda targets are not implemented (501); webhook is the only supported target.

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Configuration stored or cleared; each new config ID returns signingSecret exactly once

Playground​

Authorization
Variables
Key
Value

Samples​


Clear the bucket's event-notification configuration​

DELETE
/buckets/{bucket}/notifications

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Cleared

Playground​

Authorization
Variables
Key
Value

Samples​


List objects (prefix/delimiter/continuation pagination)​

GET
/buckets/{bucket}/objects

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Object listing

Playground​

Authorization
Variables
Key
Value

Samples​


Batch delete objects​

POST
/buckets/{bucket}/objects:batchDelete

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Per-key delete results

Playground​

Authorization
Variables
Key
Value

Samples​


List object versions and delete markers (keyMarker/versionIdMarker pagination)​

GET
/buckets/{bucket}/versions

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Version listing

Playground​

Authorization
Variables
Key
Value

Samples​


Server-side copy an object (same-tenant)​

POST
/buckets/{bucket}/object-copy/*

Destination is the path bucket/key; the source is the native body {sourceBucket, sourceKey, sourceVersionId?, metadataDirective?, contentType?, metadata?, ifMatch?, ifNoneMatch?, ifModifiedSince?, ifUnmodifiedSince?, requireAbsent?, requireMatchEtag?}. Reuses the S3 copy coordinator path; cross-tenant copy is impossible.

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Copied

Playground​

Authorization
Variables
Key
Value

Samples​


Download an object (Range supported)​

GET
/buckets/{bucket}/objects/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Object body

Playground​

Authorization
Variables
Key
Value

Samples​


Upload an object (streaming, conditional, idempotent, server-side checksum)​

PUT
/buckets/{bucket}/objects/*

An Idempotency-Key header makes the PUT replay-safe and REQUIRES at least one X-Lockwell-Checksum-<alg> header: the key is bound to the body digest plus content length and user metadata, so a same-key replay with a different body is rejected. Idempotency-Key with no checksum fails with 400.

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Stored

Playground​

Authorization
Variables
Key
Value

Samples​


Delete an object​

DELETE
/buckets/{bucket}/objects/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Delete marker created

Playground​

Authorization
Variables
Key
Value

Samples​


Object metadata only​

HEAD
/buckets/{bucket}/objects/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Metadata headers

Playground​

Authorization
Variables
Key
Value

Samples​


Get an object's tag set​

GET
/buckets/{bucket}/object-tags/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Tag set

Playground​

Authorization
Variables
Key
Value

Samples​


Replace an object's tag set​

PUT
/buckets/{bucket}/object-tags/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Tag set stored

Playground​

Authorization
Variables
Key
Value

Samples​


Delete an object's tag set​

DELETE
/buckets/{bucket}/object-tags/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Deleted

Playground​

Authorization
Variables
Key
Value

Samples​


Get an object version's retention​

GET
/buckets/{bucket}/object-retention/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Retention (mode + retainUntil)

Playground​

Authorization
Variables
Key
Value

Samples​


Set an object version's retention (GOVERNANCE or COMPLIANCE)​

PUT
/buckets/{bucket}/object-retention/*

Reuses the same WORM gate as S3 PutObjectRetention. There is no governance bypass on the native path (a non-goal).

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Retention set

Playground​

Authorization
Variables
Key
Value

Samples​


Get an object version's legal-hold status​

GET
/buckets/{bucket}/object-legal-hold/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Legal-hold status (ON/OFF)

Playground​

Authorization
Variables
Key
Value

Samples​


Set an object version's legal-hold status (ON/OFF)​

PUT
/buckets/{bucket}/object-legal-hold/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Legal-hold set

Playground​

Authorization
Variables
Key
Value

Samples​


List in-progress multipart uploads​

GET
/buckets/{bucket}/multipart

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Upload list

Playground​

Authorization
Variables
Key
Value

Samples​


Create a multipart upload​

POST
/buckets/{bucket}/multipart/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required

Responses​

Upload created

Playground​

Authorization
Variables
Key
Value

Samples​


Upload a part​

PUT
/buckets/{bucket}/multipart/{uploadId}/parts/{partNumber}/*

Optionally send one or more X-Lockwell-Checksum- headers (CRC32, CRC32C, CRC64NVME, SHA1, or SHA256) containing base64 digests. Lockwell streams the body into a bounded temporary spool, verifies every supplied digest before creating a part/blob record, and rejects malformed, unsupported, or mismatched checksums with 400. Omitting checksum headers remains supported. The response returns the part's persisted checksums.

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required
uploadId*

Multipart upload id.

Type
string
Required
partNumber*

Multipart part number (1-based).

Type
integer
Required

Responses​

Part stored, including persisted checksum values

application/json
JSON
{
  
"partNumber": 0,
  
"etag": "string",
  
"size": 0,
  
"checksums": {
  
  
"additionalProperties": "string"
  
}
}

Playground​

Authorization
Variables
Key
Value

Samples​


List uploaded parts​

GET
/buckets/{bucket}/multipart/{uploadId}/parts/*

Each part includes its persisted checksums. Values supplied through X-Lockwell-Checksum- were verified before the part was committed; SHA-256 is also retained as multipart integrity metadata.

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required
uploadId*

Multipart upload id.

Type
string
Required

Responses​

Part list; every part includes persisted checksums when available

Playground​

Authorization
Variables
Key
Value

Samples​


Complete a multipart upload​

POST
/buckets/{bucket}/multipart/{uploadId}/complete/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required
uploadId*

Multipart upload id.

Type
string
Required

Request Body​

application/json
JSON
{
  
"parts": [
  
  
{
  
  
  
"partNumber": 0,
  
  
  
"etag": "string"
  
  
}
  
]
}

Responses​

Object assembled

Playground​

Authorization
Variables
Key
Value
Body

Samples​


Abort a multipart upload​

DELETE
/buckets/{bucket}/multipart/{uploadId}/*

Authorizations​

nativeToken

Native data-plane bearer token (lwtk_...) minted at POST /auth/token. Stateless, HMAC-signed under a per-deployment key derived from the at-rest master key; short-lived (default 1h). Revoking the underlying access key invalidates outstanding tokens promptly.

Type
HTTP (bearer)

Parameters​

Path Parameters

bucket*

Bucket name.

Type
string
Required
uploadId*

Multipart upload id.

Type
string
Required

Responses​

Aborted

Playground​

Authorization
Variables
Key
Value

Samples​


Powered by VitePress OpenAPI

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