Skip to main content
POST
Add a procedure

Authorizations

Authorization
string
header
required

An org API key (gh_live_…) from Settings → API keys in the console.

Path Parameters

agent_id
string
required

The agent’s id.

Body

application/json

A new procedure needs instructions (or body).

title
string
required
use_when
string
required
inputs
object[]
Maximum array length: 20
goal
string

What done looks like. Markdown. Links the agent’s tools as [[tool:<id or name>]] and its other procedures as [[procedure:<id or title>]] (kept by id, so renaming either keeps the link; a tool a procedure links is unlocked with it), and uses an input as {name}.

context
string

Background, policy, definitions and notes the steps rely on that aren’t steps themselves; the model reads it before the steps. Markdown. Links the agent’s tools as [[tool:<id or name>]] and its other procedures as [[procedure:<id or title>]] (kept by id, so renaming either keeps the link; a tool a procedure links is unlocked with it), and uses an input as {name}.

Maximum string length: 10000
instructions
string

The steps as one numbered Markdown list (steps is the same as a list). Sent instead of steps, it’s read into steps: one per item, sub-points under their step; prose before step 1 or after the last one joins context. Markdown. Links the agent’s tools as [[tool:<id or name>]] and its other procedures as [[procedure:<id or title>]] (kept by id, so renaming either keeps the link; a tool a procedure links is unlocked with it), and uses an input as {name}.

steps
(string | object)[]

The steps, in order: each its text, or { id, text } to keep a step’s id (as the procedure gives them back). A step sent as text keeps the id of a step it had with the same text, or of the step it replaces. Not with instructions or body. A step that links another procedure ([[procedure:<id or title>]]) calls it as a subprocedure.

Maximum array length: 100

The step’s text (Markdown).

checks
string

What to confirm before answering, as a list. Markdown. Links the agent’s tools as [[tool:<id or name>]] and its other procedures as [[procedure:<id or title>]] (kept by id, so renaming either keeps the link; a tool a procedure links is unlocked with it), and uses an input as {name}.

body
string

The whole text instead of its parts (not with them): split into them by its ## Inputs, ## Goal, ## Context, ## Instructions and ## Checks headings (or its trailing “Check:” lines), with tool names and quoted procedure titles linked. The parts together are up to 20,000 characters.

status
enum<string>
Available options:
active,
draft
kind
enum<string>
Available options:
browser,
desktop,
chat
tools
string[]

Up to 10 of the agent’s HTTP tools, by name (of its published version). Each stays locked in a task until the agent reads this procedure. The whole list: [] detaches them all.

Maximum array length: 10
approval
object | null

Ask a person in the conversation before a task follows this procedure. null or { "required": false } turns it off. The whole setting: fields left out take their defaults.

model
enum<string> | null

The model this procedure runs on instead of the agent's (one of the agent model values), or null for the agent's own. Once a chat reads the procedure, the rest of the conversation runs on this model; a browser or computer task that follows it does too. An eval run that tries the agent on models it picked keeps those. Changing it makes a new revision.

Available options:
claude-haiku-5-5,
claude-sonnet-5-5,
claude-opus-5-5,
claude-fable-5-1,
gpt-6-luna,
gpt-6.1-sol,
gpt-6-astra,
gemini-3.8-flash,
gemini-4-argon,
null
plan_mode
enum<string>

Whether Eager runs this procedure without the agent's model: off (the model follows it), test (only in evals and test chats) or live (every conversation). A chat procedure is compiled into steps in the background when it's turned on or a new revision is saved; a browser procedure is recorded from the next run of it that works (its pages, clicks and typing, the procedure's inputs as blanks) and replayed after that, a small model reading the answer off the last screen. A step that needs judgement, or that can't be done for sure, hands the conversation (or the task) to the model from where it got to. Changing it doesn't make a new revision.

Available options:
off,
test,
live
category
string | null

The kind of request it's for, from the same set as the test cases' category (the eval charts group pass rates by it), or null for none. Spelled as a test case or procedure in the org already has it, whatever its capitals. Its test cases are always in it (a category sent for one is ignored), and move with it when it changes. Changing only the category makes no new revision. Up to 100 characters.

Maximum string length: 100
file_access
enum<string>

Whether the agent may create, change and delete its own files (write_file, edit_file, delete_file, and with Run code save_sandbox_file, which keeps a file its code made) while a conversation follows this procedure: the one it last read, found or ran on its steps, or a schedule's. read_only (the default) keeps them read-only, as everywhere else. Checked on every change, so turning it off holds at once. A test chat's or an eval's changes go to that conversation's own copy, never the real files. Every change keeps the version it replaced (GET /v1/agents/{agent_id}/file_revisions). Changing it doesn't make a new revision.

Available options:
read_only,
read_write

Response

The procedure.

object
any
id
string
Example:

"prc_…"

agent_id
string
title
string
Maximum string length: 120
use_when
string
Maximum string length: 500
inputs
object[]

Left out of lists.

Maximum array length: 20
goal
string

What done looks like. Markdown. Links the agent’s tools as [[tool:<id or name>]] and its other procedures as [[procedure:<id or title>]] (kept by id, so renaming either keeps the link; a tool a procedure links is unlocked with it), and uses an input as {name}. Left out of lists.

context
string

Background, policy, definitions and notes the steps rely on that aren’t steps themselves; the model reads it before the steps. Markdown. Links the agent’s tools as [[tool:<id or name>]] and its other procedures as [[procedure:<id or title>]] (kept by id, so renaming either keeps the link; a tool a procedure links is unlocked with it), and uses an input as {name}. Left out of lists.

Maximum string length: 10000
instructions
string

The steps as one numbered Markdown list (steps is the same as a list). Sent instead of steps, it’s read into steps: one per item, sub-points under their step; prose before step 1 or after the last one joins context. Markdown. Links the agent’s tools as [[tool:<id or name>]] and its other procedures as [[procedure:<id or title>]] (kept by id, so renaming either keeps the link; a tool a procedure links is unlocked with it), and uses an input as {name}. Left out of lists.

steps
object[]

The steps, in order, each with an id that stays with it when steps are added, moved or edited. A step that links another procedure calls it: a subprocedure, which runs as it’s set up (its own steps, model and Steps without AI) before the next step. Left out of lists.

checks
string

What to confirm before answering, as a list. Markdown. Links the agent’s tools as [[tool:<id or name>]] and its other procedures as [[procedure:<id or title>]] (kept by id, so renaming either keeps the link; a tool a procedure links is unlocked with it), and uses an input as {name}. Left out of lists.

body
string

The whole text as the agent reads it: its parts under ## headings, links as the tool’s name and the procedure’s title. Left out of lists.

Maximum string length: 20000
status
enum<string>
Available options:
active,
draft,
archived
kind
enum<string>

What it needs to run: a browser, a computer, or nothing beyond the chat.

Available options:
browser,
desktop,
chat
tools
string[]

The agent’s HTTP tools it unlocks, by name: each stays locked in a task until the agent reads this procedure. Kept when the agent no longer has one.

approval
object | null

Whether a person must approve in the conversation before a task follows this procedure; null when not. Changing it makes a new revision.

model
enum<string> | null

The model this procedure runs on instead of the agent's (one of the agent model values), or null for the agent's own. Once a chat reads the procedure, the rest of the conversation runs on this model; a browser or computer task that follows it does too. An eval run that tries the agent on models it picked keeps those. Changing it makes a new revision.

Available options:
claude-haiku-5-5,
claude-sonnet-5-5,
claude-opus-5-5,
claude-fable-5-1,
gpt-6-luna,
gpt-6.1-sol,
gpt-6-astra,
gemini-3.8-flash,
gemini-4-argon,
null
plan_mode
enum<string>

Whether Eager runs this procedure without the agent's model: off (the model follows it), test (only in evals and test chats) or live (every conversation). A chat procedure is compiled into steps in the background when it's turned on or a new revision is saved; a browser procedure is recorded from the next run of it that works (its pages, clicks and typing, the procedure's inputs as blanks) and replayed after that, a small model reading the answer off the last screen. A step that needs judgement, or that can't be done for sure, hands the conversation (or the task) to the model from where it got to. Changing it doesn't make a new revision.

Available options:
off,
test,
live
plan
object

The procedure's steps without AI (see plan_mode). The list of procedures gives steps_count; one procedure gives its steps (and a chat procedure's vars). A browser procedure's steps are recorded actions: type (open, click, double_click, type, keypress, scroll, drag, wait), with url, text (the inputs as {name} blanks), keys, page (the host and path it ran on), and target or focus (the control's role and label).

category
string | null

The kind of request it's for, from the same set as the test cases' category; null for none. Not versioned.

written_by
enum<string>
Available options:
person,
agent
source_task_id
string | null

For one the agent wrote: the task it learned from.

revision
integer
uses_30d
integer
last_used_at
string<date-time> | null
avg_run_cents_30d
number | null

What a run that used it cost on average in the last 30 days, in cents at list price (to a tenth of a cent): a conversation, or a task on its own, priced by its tasks and chat replies that got it. Finished runs only; null when there are none.

created_at
string<date-time>
updated_at
string<date-time>
evals
object

Its evals: the test cases tied to it (procedure_id), and its latest run of them (cold runs left out).

references
object[]

Left out of lists.

file_access
enum<string>

Whether the agent may create, change and delete its own files (write_file, edit_file, delete_file, and with Run code save_sandbox_file, which keeps a file its code made) while a conversation follows this procedure: the one it last read, found or ran on its steps, or a schedule's. read_only (the default) keeps them read-only, as everywhere else. Checked on every change, so turning it off holds at once. A test chat's or an eval's changes go to that conversation's own copy, never the real files. Every change keeps the version it replaced (GET /v1/agents/{agent_id}/file_revisions). Changing it doesn't make a new revision.

Available options:
read_only,
read_write