manifest.json lives at the root of every agent’s workspace. It controls identity, lifecycle scripts, secrets, skills, routes, channels, scheduled tasks, and (for templates) marketplace metadata. This page documents every field at the version 1 schema.
The schema is published at:
$schema line so editors can autocomplete and validate:
Top-level fields
agent
Defines the agent’s identity. All fields are written into the workspace (mostly IDENTITY.md) at deploy time.
model
A single default model identifier in <provider>/<model> form:
secrets
Declares the secrets this agent needs. These are env-var names - the actual values come from the Secrets Vault at attach time.
skills
Up to 10 skills. Each entry is an object with a name plus either a clawhub_slug (resolves to the latest published version) or a cid (byte-stable, pinned to a specific upload).
Each attached skill is unpacked under
workspace/skills/<skill-name>/. See Skills.
tasks
Scheduled prompts. Up to 20 per agent. Full reference in Tasks.
at (one-shot ISO timestamp), every (everyMs interval, optional staggerMs), cron (expr with optional tz).
Payload kinds: agentTurn (chat message; supports model, thinking, timeoutSeconds) or systemEvent (system trigger; provide message).
Delivery modes: none (default), announce (to a channel - set channel and to), or webhook (set to to a URL). bestEffort: true swallows delivery failures.
sessionTarget is main or isolated. wakeMode is now or next-heartbeat.
scripts
Lifecycle hooks. Both fields are shell commands run by the agent’s runner.
If
build fails, start does not run. If start crashes, the agent is still healthy - only the user-defined process exits.
Retry the lifecycle: POST /v0/agents/{agentId}/scripts/retry (or the action on the Danger tab).
Bind servers to 0.0.0.0, not localhost, so the gateway can reach them. See Routes.
routes
Port-forwarding rules. Up to 10. Each entry maps an external path prefix to a container port.
For custom domains, register them through the UI or the Domains API - they aren’t declared in
manifest.json.
channels
Configures the messaging channels for this agent. Tokens are usually injected from secrets to avoid leaking into the manifest.
Use
env:VAR_NAME to read from an environment variable instead of embedding a literal token.
template
Only used when the manifest is the source for a marketplace template. Ignored for direct deploys.
Validation
manifest.json is different from engine runtime config - see Concepts → manifest vs runtime config. The /v0/agents/{agentId}/config/validate endpoint validates runtime config, not manifest.json.manifest.json ahead of committing, run it through the template validator (which checks manifest.json + README.md + workspace/):
{ valid: boolean, errors: string[], manifest, readme, files } — any problems with the manifest show up in the errors array.
Schema constraints to keep in mind while authoring:
See Errors for the full HTTP status code reference.
Minimal Example
The smallest valid manifest:openclaw engine with no skills, no scripts, and no routes - just a workspace and a chat interface.