CLI
CLI commands
Learn what each Bannerify CLI command, option, and exit code does.
The Bannerify CLI has three commands: config, create, and whoami.
bannerify <command> [options]
Run bannerify --help, or bannerify <command> --help, to print the options of a command. Run bannerify with no arguments to start the guided setup when no key is saved and the terminal is interactive. In any other case it prints the help.
Global flags
| Flag | Description |
|---|---|
-v, --version |
Print the CLI version |
-h, --help |
Print help. It works on every subcommand |
config
Manage the settings that the CLI keeps between runs. The commands work like git config.
| Command | Description |
|---|---|
bannerify config set <key> [value] |
Save a value. Without value, the CLI asks for it in an interactive terminal and fails in a script |
bannerify config get <key> |
Print one value |
bannerify config list |
Print all saved values |
bannerify config delete <key> |
Remove a value. It exits with 1 when the value is not set |
Keys
| Key | Description |
|---|---|
apiKey |
The API key that the CLI sends |
baseUrl |
The API base URL. The default is https://api.bannerify.co/v1 |
defaultFormat |
The image format when --format is absent. The default is png |
outputDir |
The folder for the output file when --out is absent |
The CLI does not check a value when it saves it. A defaultFormat other than png, jpeg, or webp fails later, when you run create image.
get and list hide the middle of the apiKey, for example abcd****mnop. Add --show to print it in full:
bannerify config get apiKey --show
config set apiKey with no value asks for the key and hides what you type. Add --show to see it as you paste a long key:
bannerify config set apiKey
bannerify config set baseUrl https://api.bannerify.co/v1
bannerify config set defaultFormat webp
bannerify config set outputDir ./renders
bannerify config delete defaultFormat
get and list print the values to stdout, and list prints the path of the config file to stderr. The file is $XDG_CONFIG_HOME/bannerify/config.json, or ~/.config/bannerify/config.json, with 0600 permissions.
create
Generate an image or a PDF from a template.
bannerify create image <templateId> [options]
bannerify create pdf <templateId> [options]
Options
| Option | Description |
|---|---|
-o, --out <path> |
The output file. Use --out=- to write the file to stdout. The CLI creates missing folders in the path |
--format <format> |
The image format: png, jpeg, or webp. Images only. The default is png, or defaultFormat from the config |
--modifications '<json>' |
A JSON array of modifications. Use - to read it from stdin |
--modifications-file <path> |
Read the array from a JSON file. Use - for stdin |
--api-key <key> |
Use this API key for the command |
--base-url <url> |
Use this API base URL for the command |
--json |
Print the result as JSON on stdout |
-q, --quiet |
Hide every message except errors |
Without --out, the CLI writes <templateId>.<format> to the current folder, or to outputDir when you set it. A PDF gets the extension pdf.
Modifications
--modifications takes an array of objects. Each object names a layer with name and sets its fields. The object format that the MCP tools accept does not work here.
bannerify create image tpl_xxx -o out.png \
--modifications '[{"name":"title","text":"Hello world"}]'
If you pass both --modifications and --modifications-file, the CLI joins the two arrays, with the file first.
An unknown layer name is ignored without an error, so check the spelling if a value does not change. Modifications lists the fields of every layer type.
Examples
# WebP output with one text override
bannerify create image tpl_xxx --format webp -o out.webp \
--modifications '[{"name":"title","text":"Summer sale"}]'
# A PDF with the same layers
bannerify create pdf tpl_invoice -o invoice.pdf \
--modifications '[{"name":"total","text":"$29.00"}]'
# Image bytes on stdout, for the next command in a pipeline
bannerify create image tpl_xxx --out=- --quiet > out.png
# Modifications from a file
bannerify create image tpl_xxx -o out.png --modifications-file ./data.json
whoami
Check the API key and print the workspace that it belongs to.
bannerify whoami
| Option | Description |
|---|---|
--api-key <key> |
Check this key instead of the saved one |
--base-url <url> |
Use this API base URL |
--json |
Print the result as JSON on stdout |
+ Authenticated as Acme
project id: proj:xxxxxxxxxx
created: 2026-01-14T09:12:31.000Z
key source: config
key source is flag, env, or config. It tells you which key a script uses. Without --json, whoami prints this text to stderr, so read the result in a script with --json.
Run whoami first in a new environment. It reports a key problem before a long batch fails.
Use it from a script or an agent
The CLI never prompts when stdin or stdout is not a terminal, or when CI is set. A missing key fails at once and prints the commands that fix it.
| Behavior | Detail |
|---|---|
| Prompting | Only in an interactive terminal |
| stdout | Data only: the file bytes with --out=-, the JSON result with --json, and the output of config get and config list |
| stderr | Messages, progress, and errors |
| Key source | The --api-key flag, then BANNERIFY_API_KEY, then the config file |
JSON output
Add --json to read the result from a script. On success, create image prints one object:
{
"ok": true,
"command": "create image",
"templateId": "tpl_xxx",
"format": "png",
"path": "/home/dev/out.png",
"bytes": 80734
}
create pdf leaves out format. When you write the file to stdout, path is stdout. whoami prints the workspace and the key source:
{
"ok": true,
"project": {
"id": "proj:xxxxxxxxxx",
"name": "Acme",
"createdAt": "2026-01-14T09:12:31.000Z"
},
"keySource": "config"
}
When create fails, it prints the error object from the API and exits with a non-zero code:
{
"ok": false,
"error": {
"code": "NOT_FOUND",
"message": "template tpl_xxx not found",
"docs": "https://bannerify.co/docs/api-reference/errors/code/NOT_FOUND",
"requestId": "req:1a2b3c4d5e6f7a8b"
}
}
When whoami --json fails, error holds only a message.
Do not combine --out=- with --json. Both write to stdout, so the JSON line would follow the bytes of the file. Write the file to a path instead.
Exit codes
| Code | Meaning |
|---|---|
0 |
The command succeeded |
1 |
Any other error: a missing key, an unsupported format, invalid modifications, an unknown config key, or an error from the API |
2 |
An authentication error. create exits with 2 when the error code is 401, 403, UNAUTHORIZED, or FORBIDDEN. whoami exits with 2 when its key check fails |
The API reports an unknown key as BAD_REQUEST, so create exits with 1 for a wrong key. Run whoami to check a key: it exits with 2, or with 1 when you add --json.
bannerify create image tpl_xxx -o out.png --quiet || echo "generation failed with code $?"
Troubleshoot
| Symptom | Cause | Fix |
|---|---|---|
No API key found |
The session is not interactive and no key is set | Set BANNERIFY_API_KEY, pass --api-key, or run bannerify config set apiKey once |
whoami prints Project not found and exits with 2 |
The key does not exist, or someone deleted it | Create a key on the API Keys page and save it with bannerify config set apiKey |
Unsupported format |
--format or defaultFormat is not png, jpeg, or webp. SVG output is not available |
Use one of the three formats |
Invalid modifications |
The value is not valid JSON, is not an array, or the file path is wrong | Pass an array of objects, such as [{"name":"title","text":"Hi"}] |
Exit code 1 with NOT_FOUND |
The template id does not exist | Copy the id with Copy Template ID in the menu of the template card |
Exit code 1 with BAD_REQUEST |
The API key is wrong, or a modification has a value of the wrong type | The message names the cause. To test a key, run bannerify whoami |
Exit code 1 with USAGE_EXCEEDED |
The workspace reached its generation limit | See Quota and limits |
A stack trace that starts with TypeError: fetch failed |
create could not reach the API, for example because the network is down or baseUrl is wrong. The command exits with 1 |
Check your connection, and run bannerify config get baseUrl |
| A value does not change | The layer name does not match any layer, and Bannerify ignores it | Check the name against Modifications |
| Binary data fills the terminal | --out=- writes the file to stdout |
Redirect it, for example --out=- > out.png |