Deploy apps

Deploys the app — building it first if it comes from git.

POST /v1/platform/projects/{project}/apps/{app}/deploy

Addresshttps://api.hanzo.ai/v1/platform/projects/{project}/apps/{app}/deploy
MethodPOST
Operationpost_platform_projects_by_project_apps_by_app_deploy
AuthAuthorization: Bearer $HANZO_API_KEY

Deploys the app — building it first if it comes from git.

It starts a new, monotonically versioned deployment of the app and answers 202 with the deployment record. A 202 is an ACCEPTED deployment, not a live one.

An IMAGE app deploys the tag you name (falling back to the app's tag, then latest) by writing its operator Service CR; the operator reconciles it to running. A GIT app launches an in-cluster BuildKit Job at commit — or the app's branch — and comes back in building; the Service CR is applied later, by the reconciler, once the Job succeeds. The reconciler is restart-safe, so a build in flight survives a cloud restart.

Deploys are bounded per org: over the concurrent-deploy cap is 429 and NOTHING is recorded, so a rejected deploy leaves no phantom in the history. An unreachable cluster is 503 but still records an honest error deployment, because a deploy that was attempted and failed must not be indistinguishable from one never made. Every other failure is likewise recorded in its real terminal state.

This is metered work: a git build is billed to the org's ledger in wall-clock build minutes once the Job finishes, and the running deployment is billed for its compute per tick for as long as it stays live. Requires a validated principal; 401 without one, and everything is written into that org's own tenant-<org> namespace.

Request

6 fields, body application/json (required).

FieldInTypeRequiredDescription
projectpathstringyesProject is the project the application lives under, from the path.
apppathstringyesApp is the application's slug, from the path.
appbodystring—App is the application's slug, from the path.
commitbodystring—Commit is the git commit or ref to build, for a git-source app.
projectbodystring—Project is the project the application lives under, from the path.
tagbodystring—Tag is the image tag to deploy, for an image-source app.

Response

StatusBodyMeaning
202platform.deploymentViewaccepted
defaultproblem-detailsrefused

202 body — 12 fields.

FieldInTypeAlwaysDescription
applicationIdbodystring—ApplicationID is the app this deployed — the app's id, not its slug.
buildIdbodystring—BuildID is the build record behind a git deploy, whose logs and status live at /v1/platform/builds.
commitbodystring—Commit is the git ref this built — the commit a deploy or a push named, else the app's branch.
createdAtbodyinteger (int64)—CreatedAt is when the attempt was recorded, unix seconds.
idbodystring—ID is the deployment's id (dep_…), minted when the attempt is recorded.
imagebodystring—Image is the full repo:tag this deployment put in the CR.
messagebodystring—Message is why this attempt is not live: the failure, or the note that a newer deployment went live before this build finished.
orgbodystring—Org is the tenant the deployment belongs to, from the validated identity.
sourcebodystring—Source is which lane produced it: git (built from the repo) or image (an already-built ref deployed as-is, including promote and rollback).
statusbodystring—Status is where the attempt got to: building while its image is being built, deploying once its CR reached the cluster — which is the terminal success state, the app's own status is what turns live — error with the reason in Message, or superseded when a newer version went live first.
updatedAtbodyinteger (int64)—UpdatedAt is its last transition, unix seconds — so for a terminal deployment it is when it reached that state.
versionbodyinteger (int64)—Version counts this app's deployments, from 1 and monotonically.

Failure carries the platform error shape — see Errors.

Examples

hanzo platform projects apps deploy <project> <app>
import { Configuration, PlatformApi } from 'hanzoai';

const api = new PlatformApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postPlatformProjectsByProjectAppsByAppDeploy({ project: 'project', app: 'app', app: "<app>", commit: "<commit>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import PlatformApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = PlatformApi(client).post_platform_projects_by_project_apps_by_app_deploy(project='project', app='app', app="<app>", commit="<commit>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

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

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

let result = platform_api::post_platform_projects_by_project_apps_by_app_deploy(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.PlatformApi;

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

var result = new PlatformApi(client).postPlatformProjectsByProjectAppsByAppDeploy();
curl -X POST https://api.hanzo.ai/v1/platform/projects/<project>/apps/<app>/deploy \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "app": "<app>",
       "commit": "<commit>"
     }'

MCP reaches platform through the platform tool, which names its 38 operations with its own verbs — this one among them, under a name only MCP 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": "get_build"
         }
       }
     }'

Platform API · All Hanzo APIs · Interactive reference

Was this page useful?