Get a URL to upload one object directly
Returns a short-lived presigned PUT URL, with the method, the cleaned key and the seconds until it expires.
POST /v1/s3/buckets/{bucket}/objects
| Address | https://api.hanzo.ai/v1/s3/buckets/{bucket}/objects |
| Method | POST |
| Operation | post_s3_buckets_by_bucket_objects |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Returns a short-lived presigned PUT URL, with the method, the cleaned key and the seconds until it expires. The client uploads to that URL DIRECTLY — the bytes never pass through this API, and the storage credential never leaves the server.
The URL is signed against the public storage host and scoped to exactly one bucket and key, and it expires five minutes after it is issued. The key is path-cleaned before signing, so a traversal cannot escape the bucket. A deployment with no public storage endpoint answers 503, because there is no host to sign a browser-followable URL against.
A validated principal is required, and every bucket and key is resolved inside the caller's own org: physical bucket names are derived from the org, so a tenant cannot name another's storage. The operation is billed per call — the balance is checked BEFORE anything is touched, so an unfunded org is refused with nothing done, and the debit happens only after the work succeeds. Object storage that is not configured answers 503 under this subsystem's own name rather than falling through to another.
Request
1 field.
| Field | In | Type | Required | Description |
|---|---|---|---|---|
bucket | path | string | yes |
Response
The document declares no response body for this operation. It answers 200 on success and the platform error shape on failure — see Errors.
Examples
hanzo s3 buckets objects create <bucket>import { Configuration, S3Api } from 'hanzoai';
const api = new S3Api(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postS3BucketsByBucketObjects({ bucket: 'bucket' });from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import S3Api
client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = S3Api(client).post_s3_buckets_by_bucket_objects(bucket='bucket')cfg := cloud.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := cloud.NewAPIClient(cfg)
resp, _, err := client.S3API.PostS3BucketsByBucketObjects(context.Background()).Execute()
if err != nil {
return err
}use hanzo_cloud::apis::{configuration::Configuration, s3_api};
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();
let result = s3_api::post_s3_buckets_by_bucket_objects(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.S3Api;
ApiClient client = new ApiClient();
client.setRequestInterceptor(b -> b.header("Authorization", "Bearer " + System.getenv("HANZO_API_KEY")));
var result = new S3Api(client).postS3BucketsByBucketObjects();curl -X POST https://api.hanzo.ai/v1/s3/buckets/<bucket>/objects \
-H "Authorization: Bearer $HANZO_API_KEY"The door reaches s3 through the storage tool, which names its 8 operations with its own verbs — this one among them, under a name only the door declares. describe explains any of them:
curl -X POST https://api.hanzo.ai/v1/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "describe",
"arguments": {
"op": "list_s3_buckets"
}
}
}'How is this guide?