Skip to main content
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:
Add a $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:
Provider must match a connected provider in the Secrets Vault. If a task or session specifies a model that isn’t enabled on the agent, the request falls back to this default.

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.
Schedule kinds: 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.
To validate manifest.json ahead of committing, run it through the template validator (which checks manifest.json + README.md + workspace/):
The response is { 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:
This boots the default openclaw engine with no skills, no scripts, and no routes - just a workspace and a chat interface.