protocol

# `s3_protocol`

S3-compatible client facade predicates.

Availability:
`logtalk_load(s3(loader))`
Author: Paulo Moura
Version: 1:0:0
Date: 2026-07-13
Compilation flags:
`static`
Dependencies:
(none)
Remarks:
(none)
Inherited public predicates:
(none)

## Public predicates

### `list_buckets/2`

Lists accessible buckets.

Compilation flags:
`static`
Template:
`list_buckets(Buckets,Options)`
Mode and number of proofs:
`list_buckets(-compound,+list(compound))` - `one_or_error`
Exceptions:
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
Credentials are missing or invalid:
`domain_error(s3_credentials,missing)`
The S3 service returned a non-success status or malformed XML body:
`domain_error(s3_http_status,Status)`
Remarks:

> - Option `credentials/1`: Required access credentials as `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`.

> - Option `session_token/1`: Optional session token for temporary credentials.

> - Option `region/1`: AWS region to use when `endpoint/1` is absent. Defaults to `us-east-1`.

> - Option `endpoint/1`: Optional custom S3-compatible endpoint URL.

> - Option `addressing_style/1`: Endpoint addressing style, either `virtual_hosted` or `path`. Defaults to `virtual_hosted`.

> - Option `headers/1`: Optional extra normalized HTTP request headers.

> - Option `version/1`: HTTP protocol version as `http(Major, Minor)`. Defaults to `http(1,1)`.

> - Option `properties/1`: Optional extra normalized HTTP request properties.

> - Option `connection_options/1`: Optional transport-specific HTTP client options.

> - Option `payload_hash_mode/1`: Payload signing mode, either `signed` or `unsigned`. Defaults to `signed`.

> - Option `request_time/1`: Optional explicit local request time as `date_time(Year, Month, Day, Hours, Minutes, Seconds)`.

> - Option `utc_offset_seconds/1`: UTC offset used to derive the signing time from the local clock. Defaults to `0`.

> - Option `amz_date/1`: Optional explicit AWS SigV4 timestamp overriding any derived request time.

### `head_bucket/3`

Returns response metadata for a bucket.

Compilation flags:
`static`
Template:
`head_bucket(Bucket,Metadata,Options)`
Mode and number of proofs:
`head_bucket(+atom,-compound,+list(compound))` - `one_or_error`
Exceptions:
`Bucket` is a variable:
`instantiation_error`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
The S3 service returned a non-success status:
`domain_error(s3_http_status,Status)`
Remarks:

> - Options: Supported options are the standard S3 request options: `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`, optional `session_token(Token)`, `region(Region)`, optional custom `endpoint(URL)`, `addressing_style(virtual_hosted|path)`, optional `headers(Headers)`, `version(http(Major, Minor))`, optional `properties(Properties)`, optional `connection_options(ConnectionOptions)`, `payload_hash_mode(signed|unsigned)`, optional `request_time(date_time(...))`, `utc_offset_seconds(OffsetSeconds)`, and optional explicit `amz_date(AmzDate)`.

### `list_objects_v2/4`

Lists bucket objects using the ListObjectsV2 API.

Compilation flags:
`static`
Template:
`list_objects_v2(Bucket,Request,Listing,Options)`
Mode and number of proofs:
`list_objects_v2(+atom,+compound,-compound,+list(compound))` - `one_or_error`
Exceptions:
`Bucket` is a variable:
`instantiation_error`
`Request` is a variable:
`instantiation_error`
An element `Option` of the request option list is a variable:
`instantiation_error`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
An element `Option` of the request option list is neither a variable nor a compound term:
`type_error(compound,Option)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
`Request` is not a valid ListObjectsV2 request term or option list:
`domain_error(s3_list_objects_request,Request)`
An element `Option` of the request option list is a compound term but not a valid ListObjectsV2 request option:
`domain_error(s3_list_objects_request_option,Option)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
The S3 service returned a non-success status or malformed XML body:
`domain_error(s3_http_status,Status)`
Remarks:

> - Options: `Options` accepts the standard S3 request options: `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`, optional `session_token(Token)`, `region(Region)`, optional custom `endpoint(URL)`, `addressing_style(virtual_hosted|path)`, optional `headers(Headers)`, `version(http(Major, Minor))`, optional `properties(Properties)`, optional `connection_options(ConnectionOptions)`, `payload_hash_mode(signed|unsigned)`, optional `request_time(date_time(...))`, `utc_offset_seconds(OffsetSeconds)`, and optional explicit `amz_date(AmzDate)`. The `Request` argument carries the ListObjectsV2-specific request options.

### `head_object/4`

Returns response metadata for an object.

Compilation flags:
`static`
Template:
`head_object(Bucket,Key,Metadata,Options)`
Mode and number of proofs:
`head_object(+atom,+atom,-compound,+list(compound))` - `one_or_error`
Exceptions:
`Bucket` is a variable:
`instantiation_error`
`Key` is a variable:
`instantiation_error`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
`Key` is neither a variable nor an atom:
`type_error(atom,Key)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
The S3 service returned a non-success status:
`domain_error(s3_http_status,Status)`
Remarks:

> - Options: Supported options are the standard S3 request options: `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`, optional `session_token(Token)`, `region(Region)`, optional custom `endpoint(URL)`, `addressing_style(virtual_hosted|path)`, optional `headers(Headers)`, `version(http(Major, Minor))`, optional `properties(Properties)`, optional `connection_options(ConnectionOptions)`, `payload_hash_mode(signed|unsigned)`, optional `request_time(date_time(...))`, `utc_offset_seconds(OffsetSeconds)`, and optional explicit `amz_date(AmzDate)`.

### `get_object/5`

Fetches an object into a local file path and returns its response metadata as a separate argument.

Compilation flags:
`static`
Template:
`get_object(Bucket,Key,File,Properties,Options)`
Mode and number of proofs:
`get_object(+atom,+atom,+atom,-compound,+list(compound))` - `one_or_error`
Exceptions:
`Bucket` is a variable:
`instantiation_error`
`Key` is a variable:
`instantiation_error`
`File` is a variable:
`instantiation_error`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
`Key` is neither a variable nor an atom:
`type_error(atom,Key)`
`File` is neither a variable nor an atom:
`type_error(atom,File)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
`File` exists but is not a writable file:
`domain_error(file([],[write]),File)`
The directory `Directory` exists but is not writable:
`domain_error(directory([write]),Directory)`
The directory `Directory` does not exist:
`existence_error(directory,Directory)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
The S3 service returned a non-success status:
`domain_error(s3_http_status,Status)`
Remarks:

> - Options: Supported options are: `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))` for access credentials; `session_token(Token)` for temporary credentials; `region(Region)` for the AWS region, defaulting to `us-east-1` when `endpoint/1` is absent; `endpoint(URL)` for a custom S3-compatible endpoint; `addressing_style(virtual_hosted|path)` for endpoint addressing, defaulting to `virtual_hosted`; `headers(Headers)` for extra normalized request headers; `version(http(Major, Minor))` for the HTTP protocol version, defaulting to `http(1,1)`; `properties(Properties)` for extra normalized HTTP request properties; `connection_options(ConnectionOptions)` for transport-specific HTTP client options; `payload_hash_mode(signed|unsigned)` for payload signing, defaulting to `signed`; `request_time(date_time(...))` for an explicit local request time; `utc_offset_seconds(OffsetSeconds)` for deriving UTC from the local clock, defaulting to `0`; and `amz_date(AmzDate)` for an explicit AWS SigV4 timestamp overriding time derivation.

### `put_object/6`

Uploads a local file path and returns the object ETag and response metadata as separate arguments.

Compilation flags:
`static`
Template:
`put_object(Bucket,Key,File,ETag,Properties,Options)`
Mode and number of proofs:
`put_object(+atom,+atom,+atom,-atom,-compound,+list(compound))` - `one_or_error`
Exceptions:
`Bucket` is a variable:
`instantiation_error`
`Key` is a variable:
`instantiation_error`
`File` is a variable:
`instantiation_error`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
`Key` is neither a variable nor an atom:
`type_error(atom,Key)`
`File` is neither a variable nor an atom:
`type_error(atom,File)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
`File` exists but is not a readable file:
`domain_error(file([],[read]),File)`
The file `File` does not exist:
`existence_error(file,File)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
The S3 service returned a non-success status:
`domain_error(s3_http_status,Status)`
Remarks:

> - Options: Supported options are the standard S3 request options: `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`, optional `session_token(Token)`, `region(Region)`, optional custom `endpoint(URL)`, `addressing_style(virtual_hosted|path)`, optional `headers(Headers)`, `version(http(Major, Minor))`, optional `properties(Properties)`, optional `connection_options(ConnectionOptions)`, `payload_hash_mode(signed|unsigned)`, optional `request_time(date_time(...))`, `utc_offset_seconds(OffsetSeconds)`, and optional explicit `amz_date(AmzDate)`.

### `delete_object/4`

Deletes an object, returning `delete_result(Properties)`.

Compilation flags:
`static`
Template:
`delete_object(Bucket,Key,Result,Options)`
Mode and number of proofs:
`delete_object(+atom,+atom,-compound,+list(compound))` - `one_or_error`
Exceptions:
`Bucket` is a variable:
`instantiation_error`
`Key` is a variable:
`instantiation_error`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
`Key` is neither a variable nor an atom:
`type_error(atom,Key)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
The S3 service returned a non-success status:
`domain_error(s3_http_status,Status)`
Remarks:

> - Options: Supported options are the standard S3 request options: `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`, optional `session_token(Token)`, `region(Region)`, optional custom `endpoint(URL)`, `addressing_style(virtual_hosted|path)`, optional `headers(Headers)`, `version(http(Major, Minor))`, optional `properties(Properties)`, optional `connection_options(ConnectionOptions)`, `payload_hash_mode(signed|unsigned)`, optional `request_time(date_time(...))`, `utc_offset_seconds(OffsetSeconds)`, and optional explicit `amz_date(AmzDate)`.

### `copy_object/5`

Copies an object from a source bucket/key into the destination bucket/key, returning `copy_result(ETag, Properties)`.

Compilation flags:
`static`
Template:
`copy_object(Source,Bucket,Key,Result,Options)`
Mode and number of proofs:
`copy_object(+compound,+atom,+atom,-compound,+list(compound))` - `one_or_error`
Exceptions:
`Source` is a variable:
`instantiation_error`
`Bucket` is a variable:
`instantiation_error`
`Key` is a variable:
`instantiation_error`
The version identifier in `Source` is a variable:
`instantiation_error`
`Source` is neither a variable nor a compound term:
`type_error(compound,Source)`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
`Key` is neither a variable nor an atom:
`type_error(atom,Key)`
The version identifier in `Source` is neither a variable nor an atom:
`type_error(atom,VersionId)`
`Source` is a compound term but not a valid copy source term:
`domain_error(s3_copy_source,Source)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
The version identifier in `Source` is an atom but not a valid version identifier:
`domain_error(s3_version_id,VersionId)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
The S3 service returned a non-success status or malformed XML body:
`domain_error(s3_http_status,Status)`
Remarks:

> - Options: Supported options are the standard S3 request options: `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`, optional `session_token(Token)`, `region(Region)`, optional custom `endpoint(URL)`, `addressing_style(virtual_hosted|path)`, optional `headers(Headers)`, `version(http(Major, Minor))`, optional `properties(Properties)`, optional `connection_options(ConnectionOptions)`, `payload_hash_mode(signed|unsigned)`, optional `request_time(date_time(...))`, `utc_offset_seconds(OffsetSeconds)`, and optional explicit `amz_date(AmzDate)`.

### `presigned_get_object/4`

Generates a presigned URL for downloading an object with an external HTTP client.

Compilation flags:
`static`
Template:
`presigned_get_object(Bucket,Key,URL,Options)`
Mode and number of proofs:
`presigned_get_object(+atom,+atom,-atom,+list(compound))` - `one_or_error`
Exceptions:
`Bucket` is a variable:
`instantiation_error`
`Key` is a variable:
`instantiation_error`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
`Key` is neither a variable nor an atom:
`type_error(atom,Key)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
Credentials are missing or invalid:
`domain_error(s3_credentials,missing)`
The expiration is invalid or outside the AWS SigV4 range:
`domain_error(s3_presign_expires,Expires)`
The payload hash is missing, invalid, or incompatible with unsigned mode:
`domain_error(s3_presign_payload_hash,Hash)`
Remarks:

> - Option `credentials/1`: Required access credentials as `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`.

> - Option `session_token/1`: Optional session token for temporary credentials.

> - Option `region/1`: AWS region to use when `endpoint/1` is absent. Defaults to `us-east-1`.

> - Option `endpoint/1`: Optional custom S3-compatible endpoint URL.

> - Option `addressing_style/1`: Endpoint addressing style, either `virtual_hosted` or `path`. Defaults to `virtual_hosted`.

> - Option `headers/1`: Optional extra normalized request headers. When present they are signed into the URL and must be reproduced by the eventual caller.

> - Option `payload_hash_mode/1`: Presigned URLs default to `payload_hash_mode(unsigned)`. Use `signed` together with `payload_hash/1` to sign a precomputed payload hash.

> - Option `payload_hash/1`: Precomputed hexadecimal SHA-256 payload hash required when `payload_hash_mode(signed)` is selected.

> - Option `request_time/1`: Optional explicit local request time as `date_time(Year, Month, Day, Hours, Minutes, Seconds)`.

> - Option `utc_offset_seconds/1`: UTC offset used to derive the signing time from the local clock. Defaults to `0`.

> - Option `amz_date/1`: Optional explicit AWS SigV4 timestamp overriding any derived request time.

> - Option `expires/1`: Presigned URL lifetime in seconds. Defaults to `900` and must not exceed `604800`.

### `presigned_put_object/4`

Generates a presigned URL for uploading an object with an external HTTP client.

Compilation flags:
`static`
Template:
`presigned_put_object(Bucket,Key,URL,Options)`
Mode and number of proofs:
`presigned_put_object(+atom,+atom,-atom,+list(compound))` - `one_or_error`
Exceptions:
`Bucket` is a variable:
`instantiation_error`
`Key` is a variable:
`instantiation_error`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
`Key` is neither a variable nor an atom:
`type_error(atom,Key)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
Credentials are missing or invalid:
`domain_error(s3_credentials,missing)`
The expiration is invalid or outside the AWS SigV4 range:
`domain_error(s3_presign_expires,Expires)`
The payload hash is missing, invalid, or incompatible with unsigned mode:
`domain_error(s3_presign_payload_hash,Hash)`
Remarks:

> - Option `credentials/1`: Required access credentials as `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`.

> - Option `session_token/1`: Optional session token for temporary credentials.

> - Option `region/1`: AWS region to use when `endpoint/1` is absent. Defaults to `us-east-1`.

> - Option `endpoint/1`: Optional custom S3-compatible endpoint URL.

> - Option `addressing_style/1`: Endpoint addressing style, either `virtual_hosted` or `path`. Defaults to `virtual_hosted`.

> - Option `headers/1`: Optional extra normalized request headers. When present they are signed into the URL and must be reproduced by the eventual caller.

> - Option `payload_hash_mode/1`: Presigned URLs default to `payload_hash_mode(unsigned)`. Use `signed` together with `payload_hash/1` to sign a precomputed payload hash.

> - Option `payload_hash/1`: Precomputed hexadecimal SHA-256 payload hash required when `payload_hash_mode(signed)` is selected.

> - Option `request_time/1`: Optional explicit local request time as `date_time(Year, Month, Day, Hours, Minutes, Seconds)`.

> - Option `utc_offset_seconds/1`: UTC offset used to derive the signing time from the local clock. Defaults to `0`.

> - Option `amz_date/1`: Optional explicit AWS SigV4 timestamp overriding any derived request time.

> - Option `expires/1`: Presigned URL lifetime in seconds. Defaults to `900` and must not exceed `604800`.

### `presigned_post_object/4`

Generates a presigned URL for a POST request to an object with an external HTTP client.

Compilation flags:
`static`
Template:
`presigned_post_object(Bucket,Key,URL,Options)`
Mode and number of proofs:
`presigned_post_object(+atom,+atom,-atom,+list(compound))` - `one_or_error`
Exceptions:
`Bucket` is a variable:
`instantiation_error`
`Key` is a variable:
`instantiation_error`
`Bucket` is neither a variable nor an atom:
`type_error(atom,Bucket)`
`Key` is neither a variable nor an atom:
`type_error(atom,Key)`
`Bucket` is an atom but not a valid S3 bucket:
`domain_error(s3_bucket,Bucket)`
`Options` is a variable:
`instantiation_error`
`Options` is neither a variable nor a list:
`type_error(list,Options)`
An element `Option` of the list `Options` is a variable:
`instantiation_error`
An element `Option` of the list `Options` is neither a variable nor a compound term:
`type_error(compound,Option)`
An element `Option` of the list `Options` is a compound term but not a valid option:
`domain_error(option,Option)`
`Options` contains an invalid S3 client option:
`domain_error(s3_client_option,Option)`
Credentials are missing or invalid:
`domain_error(s3_credentials,missing)`
The expiration is invalid or outside the AWS SigV4 range:
`domain_error(s3_presign_expires,Expires)`
The payload hash is missing, invalid, or incompatible with unsigned mode:
`domain_error(s3_presign_payload_hash,Hash)`
Remarks:

> - Option `credentials/1`: Required access credentials as `credentials(access_key_id(AccessKeyId), secret_access_key(SecretAccessKey))`.

> - Option `session_token/1`: Optional session token for temporary credentials.

> - Option `region/1`: AWS region to use when `endpoint/1` is absent. Defaults to `us-east-1`.

> - Option `endpoint/1`: Optional custom S3-compatible endpoint URL.

> - Option `addressing_style/1`: Endpoint addressing style, either `virtual_hosted` or `path`. Defaults to `virtual_hosted`.

> - Option `headers/1`: Optional extra normalized request headers. When present they are signed into the URL and must be reproduced by the eventual caller.

> - Option `payload_hash_mode/1`: Presigned URLs default to `payload_hash_mode(unsigned)`. Use `signed` together with `payload_hash/1` to sign a precomputed payload hash.

> - Option `payload_hash/1`: Precomputed hexadecimal SHA-256 payload hash required when `payload_hash_mode(signed)` is selected.

> - Option `request_time/1`: Optional explicit local request time as `date_time(Year, Month, Day, Hours, Minutes, Seconds)`.

> - Option `utc_offset_seconds/1`: UTC offset used to derive the signing time from the local clock. Defaults to `0`.

> - Option `amz_date/1`: Optional explicit AWS SigV4 timestamp overriding any derived request time.

> - Option `expires/1`: Presigned URL lifetime in seconds. Defaults to `900` and must not exceed `604800`.

## Protected predicates

(none)

## Private predicates

(none)

## Operators

(none)