Skip to content

REST API ​

The console is built on a JSON REST API at https://zenavo.app/api. Anything you can do in the console, you can do with it.

Authentication ​

Send an API key as a bearer token:

sh
curl -H "Authorization: Bearer $ZENAVO_API_KEY" https://zenavo.app/api/auth/me

Requests from a browser session also need the header X-Zenavo-Request: 1 on anything other than GET; requests with a bearer token do not.

Conventions ​

  • Bodies are JSON. Times are Unix seconds.
  • IDs are prefixed: team_, srv_, proj_, job_, bak_, tok_.
  • Errors return a status code and {"detail": …}. Validation errors (422) list each field.
  • Long operations (deploy, restart, backup) return a job: {"id": "job_…"}. Poll GET /api/jobs/{id} for status (queued, running, succeeded, failed), log and per-service progress.

Endpoints ​

Account ​

MethodPath
GET/api/auth/meThe signed-in user and their teams
PATCH/api/accountName and avatar
GET POST/api/account/tokensList or create API keys (browser session only)
DELETE/api/account/tokens/{id}Delete an API key
GET/api/account/sessionsSigned-in sessions

Teams ​

MethodPath
GET POST/api/teamsList or create teams
PATCH/api/teams/{tid}Rename
GET/api/teams/{tid}/membersMembers
PATCH DELETE/api/teams/{tid}/members/{uid}Change a role, remove a member
GET POST/api/teams/{tid}/invitesInvitations

Servers ​

MethodPath
GET/api/servers?team_id=List servers
POST/api/servers?team_id=Add a server: {name, host, port, user, password | private_key}
GET PATCH/api/servers/{sid}Read, rename
POST/api/servers/{sid}/bootstrapRun setup again
GET/api/servers/{sid}/usage?hours=CPU, memory and disk history
GET/api/servers/{sid}/systemPlatform components
GET/api/servers/{sid}/portsPort checks
GET/api/servers/{sid}/jobsSetup and other jobs
POST/api/servers/{sid}/deleteRemove: {confirmation: "<server name>"}

Projects ​

MethodPath
GET/api/projects?team_id=List projects
POST/api/projectsCreate: {team_id, server_id, manifest}
GET/api/projects/{pid}Summary, services and status
GET/api/projects/{pid}/manifestThe full configuration, with variables
PUT/api/projects/{pid}Save the configuration: {manifest, server_id, revision}
POST/api/projects/{pid}/deployDeploy all services (returns a job)
POST/api/projects/{pid}/rollback{target_job}
POST/api/projects/{pid}/restart /stopRestart or stop every service
GET/api/projects/{pid}/runtimeLive state of each service
POST/api/projects/{pid}/clone /transferCopy, or move to another team
POST/api/projects/{pid}/delete{confirmation: "<project name>"}

Services ​

MethodPath
POST/api/projects/{pid}/services/{name}/deployDeploy this service only; the others stay as deployed (returns a job)
POST/api/projects/{pid}/services/{name}/restart /suspend /resume
POST/api/projects/{pid}/services/{name}/execRun a command in the container
GET/api/projects/{pid}/services/{name}/usage?hours=CPU and memory history
GET/api/projects/{pid}/logs/{service}Recent runtime logs
GET/api/projects/{pid}/logs/{service}/streamLive runtime logs (Server-Sent Events)
POST/api/projects/{pid}/services/{name}/domainsGenerate a domain
DELETE/api/projects/{pid}/domains/{domain}Remove a generated domain

Backups ​

MethodPath
GET/api/backups?project_id=List backups
POST/api/projects/{pid}/backupsBack up a service: {service, engine}
GET/api/backups/{bid}/downloadDownload
POST/api/backups/{bid}/restoreRestore: {confirmation}, as typed in the console

Git and GitHub ​

MethodPath
POST/api/git/refsBranches and tags of a public repository: {url}
POST/api/git/planBuild plan preview: {team_id, url, ref, context}
GET/api/github/repos?team_id=Repositories the team's GitHub installations can read
GET/api/github/branches?team_id=&repo=Branches of one of them

Templates ​

MethodPath
POST/api/imports/previewCheck a Zeabur template or Zenavo export: {text, team_id, variables}
POST/api/imports/{did}/commitCreate the project: {server_id}

Example: deploy and wait ​

sh
JOB=$(curl -s -X POST -H "Authorization: Bearer $ZENAVO_API_KEY" \
  -H "Content-Type: application/json" -d '{}' \
  https://zenavo.app/api/projects/$PROJECT/deploy | jq -r .id)

until curl -s -H "Authorization: Bearer $ZENAVO_API_KEY" https://zenavo.app/api/jobs/$JOB \
  | jq -e '.status == "succeeded" or .status == "failed"' >/dev/null; do sleep 5; done

Not affiliated with Zeabur.