Most of this CLI is generated. Commands, flags, help text and validation all come from the tool catalog that also defines what a connected agent can do — so the console, your agent and your terminal are one API, and a new capability appears in all three at once rather than in whichever one someone remembered.
Which is also why this page is worth trusting: it is produced from that catalog rather than written alongside it.
Reading it
* marks a required flag.
- ⚠️ marks a command that asks before acting. That gate reads the tool’s own annotation, never the word “delete”:
hookie workflows delete only deactivates and an update undoes it, while hookie keys revoke destroys a credential and has no “delete” in its name.
- A flag name is the API field in kebab case, so
webhook_id is --webhook-id. Where two sibling routes spell the same field differently — create takes datasetFilter, update takes dataset_filter — the flag is the same on both and the CLI sends whichever spelling that route wants.
- An unknown flag is an error, with a suggestion.
--datset orders would otherwise be a successful call that quietly did the wrong thing.
Every command also takes the global flags: --url, --project, --json, --reveal, --redact, --yes, --quiet.
--project takes a slug or an id, and with neither it uses your workspace’s Default project. There is deliberately no --project-id: two ways to say the same thing, one of which silently 404s on a slug, is worse than one.
Hand-written commands
These are not single API calls, so they are not generated. Local development covers them in full.
Generated commands
datasets
deliveries
destinations
endpoints
events
keys
projects
records
rules
sources
submissions
triggers
views
workflows
workspace
Two that are narrower than they look
hookie workflows update is a full replace, not a patch — which is why --name, --entry-dataset and --steps are all required. Omitting one would drop it. Read the current definition first:
hookie endpoints update and hookie rules update only toggle enabled. An endpoint’s slug is the credential in its public URL, and its criteria and mappings define what it has already ingested — changing those in place would quietly reinterpret history. To change one, create the replacement and delete the old one.
JSON flags
A flag whose value is a list or an object takes JSON, or @file.json to read it from disk — which is how a workflow’s steps get past your shell’s quoting:
A list of plain strings also takes a comma-separated list, because '["orders","shipments"]' is a quoting puzzle with no upside: