Publish projects

Promotes a build output into a new release AND goes live with it — create+activate in one call, which is the 99% path.

POST /v1/projects/{slug}/publish

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

Promotes a build output into a new release AND goes live with it — create+activate in one call, which is the 99% path.

It is exactly the two halves in sequence with no extra semantics, so the staged flow and the one-shot flow can never drift apart: source is promoted under the same org-relative rule and the same guards CreateRelease applies, then the site's pointer is flipped to it, the public host is claimed and the edge is purged. Idempotent on unchanged bytes — same manifest, same release id, no copy, and so nothing more stored. Free, behind the same storage gate.

Scope: a validated principal is required (401 without one) and the site is resolved within that principal's org, so another tenant's slug is a 404.

Request

3 fields, body application/json (required).

FieldInTypeRequiredDescription
slugpathstringyesSlug is the site to publish, from the path.
slugbodystring—Slug is the site to publish, from the path.
sourcebodystring—Source is the build output to promote, as a path RELATIVE to your org's own storage space — never a URL and never a bucket.

Response

StatusBodyMeaning
200project.projectsReleaseok
defaultproblem-detailsrefused

200 body — 8 fields.

FieldInTypeAlwaysDescription
activebodyboolean—Active is whether this is the release the site is SERVING right now.
bytesbodyinteger (int64)—Bytes is their total size in bytes.
createdAtbodyinteger (int64)—CreatedAt is when the release was cut, as Unix seconds — not when it was last activated.
objectsbodyinteger (int64)—Objects is how many files the release holds.
releaseIdbodystring—ReleaseID is derived from a DIGEST of the release's own manifest, so identical content is the same release and a release can never be confused with another one.
slugbodystring—Slug is the site this release belongs to.
sourcebodystring—Source is what the release was cut from — the build output or upload it was promoted out of.
urlbodystring—URL is where the site serves.

Failure carries the platform error shape — see Errors.

Examples

hanzo projects publish <slug>
import { Configuration, ProjectApi } from 'hanzoai';

const api = new ProjectApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postProjectsBySlugPublish({ slug: 'slug', slug: "<slug>", source: "<source>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import ProjectApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = ProjectApi(client).post_projects_by_slug_publish(slug='slug', slug="<slug>", source="<source>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.ProjectAPI.PostProjectsBySlugPublish(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, project_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = project_api::post_projects_by_slug_publish(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.ProjectApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new ProjectApi(client).postProjectsBySlugPublish();

The method above is the one at the current release of the document. hanzoai@8.5.914 (npm) and hanzoai@8.5.914 (PyPI) were generated from an earlier release, where this operation carried a different id, so it spells the method differently — regenerating the clients is what makes the two agree. SDKs →

curl -X POST https://api.hanzo.ai/v1/projects/<slug>/publish \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "slug": "<slug>",
       "source": "<source>"
     }'

Tool project, op post_projects_by_slug_publish — POST the JSON-RPC envelope to https://api.hanzo.ai/v1/mcp.

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "project",
         "arguments": {
           "op": "post_projects_by_slug_publish",
           "input": {
             "slug": "<slug>",
             "source": "<source>"
           }
         }
       }
     }'

Project API · All Hanzo APIs · Interactive reference

Was this page useful?