Skip to main content
A deployment runs an agent on a schedule. Each scheduled fire wakes the durable runtime, starts a fresh session, runs it to idle, and stops — all within a per-run budget you set. A deployment is just a recurring session factory: everything you already know about sessions (events, files, budgets, outcomes) applies to each fire.

Create a deployment

Scheduled agents are the canonical loose use case: an agent that starts at midnight and delivers at nine has no reason to pay the immediate tariff. See Completion window.

How a fire flows

Every fire is a normal session. It shows up in vetta session list, streams the same events, writes to the same Files API, and is subject to the same budgets. The only difference is that it carries a deployment_id — and, if the deployment sets one, the identity_id of the persona it speaks as.

The schedule’s card on the board

If the agent is seated on a team board, every fire runs against one standing card for that schedule — not one card per fire. The card is created on the schedule’s first fire, titled Recurring: and the first line of the prompt, and from then on each fire re-opens the same card: moved to doing, assigned to the agent, and named in the message the run starts with, so the run reads its own history before it works and comments what it did before it finishes. That is how scheduled work becomes visible. A card per fire would be a board row per run — a daily schedule alone is seven a week, a crew’s template is dozens — and a board nobody can read is a board nobody uses. One card means the owner sees a schedule, with its runs as comments under it, rather than a list that has to be scrolled past to find the work a person actually assigned.
  • The card is on the board the agent is seated on, the one its owner reads. A schedule never opens a board of its own.
  • The card is claimed by the fire before the session starts, so the board’s own clock never starts a second session for it.
  • An organization whose agents sit on no board sees no cards, and its schedules fire exactly as they did before.
  • A board write that fails is logged and the fire runs anyway. The schedule is the work; the card is where it is shown, and the second must never be able to stop the first.

Receiving results

There are three ways to collect what a scheduled run produced. Use the webhook for push; use listing/polling for pull; use published files for the actual artifacts.
1

Push — subscribe to the run finishing

Set on_idle on the deployment (or a session.idle webhook filtered by deployment_id). When a fire goes idle, Vetta POSTs a signed, enveloped payload:
Read the machine-readable result straight off data.structured_output — no transcript to scrape — when the agent (or deployment) has an output schema set; it is null otherwise. Fetch the deliverables by ID from the Files API. The outcome_evaluations[] array matches the outcomes shape on the session — one { outcome_id, result } per attached outcome.on_idle is a webhook endpoint. Setting it creates one for that URL, so these pushes get the same signing, retries, auto-disable and delivery log as any subscription. It appears in vetta webhook list / GET /v1/webhooks alongside your own, with events: ["deployment.on_idle"] — it is pushed by the deployment rather than subscribed, so it never also receives every other session’s session.idle.
Change on_idle to move the endpoint’s URL (which also re-enables it if a dead target had disabled it); set it to null to stop pushing.
2

Pull — list the runs a deployment produced

Each fire is a session tagged with the deployment_id.
3

Read the artifacts and the transcript

The durable outputs are the files a run published, its typed structured_output, and its event history.
Scheduled runs go idle, not terminated — so their files, events, and outcome scores persist and are retrievable long after the fire. Nothing is lost between the cron tick and when you read it.

Manage runs

CLI
If a run would exceed the deployment budget, its calls are refused exactly as with any budget — the run goes idle early with stop_reason: "budget_paused" and still reports whatever it completed.

Configuration reference

string
required
The agent to run on each fire.
string
required
A standard 5-field cron expression, evaluated in UTC.
number
required
Per-run budget ceiling. Each fire gets a fresh allowance.
string
The instruction sent to each scheduled session.
string
Override the completion window for scheduled runs — loose is often ideal for overnight jobs.
string
The persona every fire speaks as — an idn_ id or the persona’s name, the same value session create --identity takes. The agent must already hold a grant to it. Without one a scheduled fire runs as no persona, which is rarely what you want for an agent that owns an inbox.
string
A webhook URL POSTed when each fire goes idle, carrying an enveloped session.idle event whose data holds the run’s session_id, stop_reason, deployment_id and typed structured_output. Setting it provisions a webhook endpoint for that URL — rotate it for the signing secret, and read its delivery log like any other.
object
A JSON Schema the run’s final result must conform to, exposed as structured_output on each fire’s idle session and webhook payload. Overrides the agent’s default schema.
string
An outcome to grade every fire against a rubric.
object
Arbitrary key-value pairs copied onto each session this deployment creates.

Next: webhooks

The full event catalog, delivery, retries, and signature verification.