Skip to main content
GET
Get 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.

procedure_id
string
required

Response

The procedure, with its steps.

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