Hanzo
OpenapiProjects

Upload a built site as one archive and serve it

Takes a built site live at `https://<slug>.hanzo.app` in one call.

POST /v1/projects/{slug}/deploy

Addresshttps://api.hanzo.ai/v1/projects/{slug}/deploy
MethodPOST
Operationpost_projects_by_slug_deploy
AuthAuthorization: Bearer $HANZO_API_KEY

Takes a built site live at https://<slug>.hanzo.app in one call. The body is the site itself — a zip or tar.gz holding index.html at its root (or a single wrapper directory that does), sent raw or as a multipart file part. It is unpacked to the site's own storage prefix and served immediately, answering the finished deployment.

It is bounded by the edge body limit (16 MiB by default), and that bound is the whole reason the other path exists: an oversized POST is refused by the server BEFORE any handler runs and surfaces as an opaque 400 Error when parsing request that reads like a malformed payload rather than a size cap. A site too large for one archive opens a deployment with POST /v1/projects/{slug}/deployments instead and writes its files straight to storage against the scoped grant that answers with — no body limit, and no bytes through this API at all.

Billing is fail-closed and fails FIRST: the hosting gate runs before anything is parsed or uploaded, so an unfunded org is 402 and an unreachable commerce is 503 with nothing written. The debit lands only on success — a failed upload is never billed and never flips the live site — and a redeploy answers the SAME URL, because slug and apex are stable.

Scope: a validated principal is required (403 without one) and the site is resolved within that principal's org, so another tenant's slug is a 404. Object storage must be configured (503); an archive that does not walk is a 400 and one over the size cap is a 413.

Request

2 fields, body application/octet-stream.

FieldInTypeRequiredDescription
slugpathstringyes
(body)bodystring (binary)yes

Response

StatusBodyMeaning
2XXprojectsDeploymentSuccess

2XX body — 21 fields.

FieldInTypeAlwaysDescription
bucketbodystringBucket is the object-store bucket its files were written to.
bytesbodyintegerBytes is their total size in bytes.
commitbodystringCommit is the revision that was built, for a deployment that came from a repository.
createdAtbodyintegerCreatedAt is when the deployment was queued, as Unix seconds.
filesbodyintegerFiles is how many objects the deployment published.
idbodystringID identifies this one deployment attempt, and is what CI quotes back to complete it.
liveUrlbodystringLiveURL is where this deployment serves, once it is live.
messagebodystringMessage is what happened, in words — the build's own note, or on a failure why it failed.
prefixbodystringPrefix is the key prefix within that bucket holding EXACTLY this deployment's objects — the unit an upload grant is scoped to, so a grant for one deployment…
projectIdbodystringProjectID is the project this deployment belongs to.
sourcebodystringSource is what caused the deployment — a git push, an uploaded artifact, a generated site.
statusbodystringStatus is where the attempt got to — queued, live, or failed.
updatedAtbodyintegerUpdatedAt is when it last changed state, as Unix seconds — so the gap between the two is how long the build took.
uploadbodyprojectsUploadGrant
upload.expiresAtbodyintegerExpiresAt is when the grant stops being accepted, as Unix seconds.
upload.fieldsbodyobjectFields are form values every POST must carry VERBATIM, alongside key and file.
upload.fields.*bodystring
upload.maxBytesbodyintegerMaxBytes bounds ONE object, not the upload as a whole.
upload.prefixbodystringPrefix is the only place this grant can write: the deployment's own key prefix.
upload.urlbodystringURL is the address to POST each object to.
versionbodyintegerVersion counts deployments of this project from 1, so the history reads as an ordered sequence rather than by timestamp.

Failure carries the platform error shape — see Errors.

Examples

hanzo projects deploy <slug>

Projects API · All Hanzo APIs · Interactive reference

How is this guide?

On this page