Webhooks CLI is a monitoring and debugging developer tool for Flute webhooks.
It is a command-line and terminal UI application that can display call statuses, inspect delivery logs, manage endpoints, and forward live webhook payloads. The tool can initiate and test webhook calls, including creating new webhooks and using existing ones. It supports all Flute webhook endpoints.
Download and install the application for your platform. It does not require a global installation and runs from any directory.
macOS / Linux (curl)
curl -LsSf https://github.com/getflute/flute-webhooks-cli/releases/latest/download/flute-webhooks-cli-installer.sh | shmacOS / Linux (Homebrew)
brew install getflute/flute-webhooks-cli/flute-webhooks-cliWindows (x64, PowerShell)
irm https://github.com/getflute/flute-webhooks-cli/releases/latest/download/flute-webhooks-cli-installer.ps1 | iexWhen launched, the application automatically checks for a newer version. When a newer version exists, a non-blocking notice displays.
To update, run:
flute-webhooks-cli updateThen launch the application again.
An optional configuration file is automatically created at ~/.flute/config.toml.
| Setting | Default | Description |
|---|---|---|
default_profile | sandbox | Default environment profile. Valid values: sandbox or production. |
auto_update_check | true | Checks for updates on each launch, at most once every 24 hours. |
poll_interval_seconds | 5 | Polling interval in seconds. Valid range: 5 to 60. Out-of-range values fall back to 5 with a warning. |
| Profile | API Base URL | OAuth URL |
|---|---|---|
sandbox (default) | https://sandbox.api.flute.com | https://sandbox.oauth.api.flute.com/oauth2/token |
production (alias prod) | https://api.flute.com | https://oauth.api.flute.com/oauth2/token |
Use --profile to select a profile (global flag, accepted before or after the subcommand). The active profile is shown in the dashboard title.
flute-webhooks-cli auth loginYou will be prompted for your client_id and client_secret. The secret prompt is hidden. Credentials are stored in your OS keychain and never written to disk in plaintext.
By default, credentials are stored for the sandbox profile. To set up production:
flute-webhooks-cli --profile production auth loginTo print the current bearer token (useful for curl smoke tests):
flute-webhooks-cli auth tokenWebhooks CLI runs in two modes: TUI (terminal user interface) and command line.
The TUI is an interactive interface that runs in a terminal window. Use arrow keys to navigate rows, expand items, and toggle checkboxes.

To start the TUI:
flute-webhooks-cli tui| Context | Controls |
|---|---|
| Top level | Tab switch tabs, q quit, Ctrl-C quit anywhere |
| Endpoints tab | ↑↓ / jk navigate, c create, e / Enter edit, d delete, p ping |
| Delivery Logs tab | ↑↓ / jk navigate, PgUp / PgDn / Home / End jump, v / Enter view details, t trigger forward, r retry (failed only), l listener config, 1 cycle endpoint filter, 2 cycle event-type filter, 3 cycle status filter, s toggle sort, x clear filters |
| Form modal (create/edit) | Tab / ↑↓ move between fields, ←→ swap Cancel/Submit, Space / Enter toggle controls, PgUp / PgDn scroll event list, Esc cancel |
| Listener modal | Tab / ↑↓ move between fields, type the URL, Space toggle Enabled, Enter activate, Esc cancel |
| Delete confirm | y / Enter delete, n / Esc cancel |
| Details modal | ↑↓ / jk scroll, PgUp / PgDn page, Esc / Enter / q close |
| Error modal | Enter / Esc dismiss |
| Update-available modal | Enter / Esc dismiss |
While typing in a text field (URL or Name), single-character keys such as q, c, d, e, p, r, l, and t are treated as literal characters and will not trigger TUI commands.
The CLI mode issues instructions through the terminal and is scriptable. For example:
flute-webhooks-cli webhooks endpoints list
flute-webhooks-cli --output json webhooks deliveries list --limit 15 | jqEndpoints
flute-webhooks-cli webhooks endpoints list
flute-webhooks-cli webhooks endpoints get <id>
flute-webhooks-cli webhooks endpoints create --url https://… --events transaction.card.captured,refund.completed [--name "My Hook"]
flute-webhooks-cli webhooks endpoints update <id> [--url …] [--events …] [--name …] [--status active|inactive]
flute-webhooks-cli webhooks endpoints delete <id> --yes
flute-webhooks-cli webhooks endpoints ping <id>Event types
flute-webhooks-cli webhooks event-types listDelivery logs
flute-webhooks-cli webhooks deliveries list [--endpoint-id <id>] [--status success|failed] [--limit 50]
flute-webhooks-cli webhooks deliveries get <id>
flute-webhooks-cli webhooks deliveries retry <id>Headless listener
Forwards every new successful delivery's headers and body to a local URL. Runs in the foreground until Ctrl-C.
flute-webhooks-cli listen --forward-to http://127.0.0.1:3000/webhookGlobal flags (accepted on every subcommand)
--profile <sandbox|production>
--debug
--output table|json--output json works on every CLI subcommand, producing pretty-printed JSON for piping into jq. Use --output json >> output.json to save output to a file.
Every documented Webhook API call is reachable from both TUI and CLI:
| Action | TUI | CLI |
|---|---|---|
| List endpoints | Endpoints tab | webhooks endpoints list |
| Get one endpoint | implicit (table shows all fields) | webhooks endpoints get <id> |
| Create endpoint | c → form modal | webhooks endpoints create |
| Update endpoint | e / Enter → form modal | webhooks endpoints update <id> |
| Delete endpoint | d → confirm modal | webhooks endpoints delete <id> --yes |
| Ping endpoint | p (toast on result) | webhooks endpoints ping <id> |
| List event types | used to populate the form | webhooks event-types list |
| List delivery logs | Delivery Logs tab | webhooks deliveries list |
| Get delivery log detail | v / Enter → details modal | webhooks deliveries get <id> |
| Retry failed delivery | r on a failed row | webhooks deliveries retry <id> |
| Listen and forward locally | l → listener modal | flute-webhooks-cli listen --forward-to <url> |
| Manual one-shot forward | t on a successful row | (listen covers it; manual one-shot deferred) |
Pass --debug to log every HTTP request and response (status, URL, body):
flute-webhooks-cli --debug auth token # traces print to stdout
flute-webhooks-cli --debug tui # traces go to ~/.flute/flute-webhooks-cli.logFor non-TUI commands, traces print to stdout so you can pipe them through jq or grep. For the TUI, stdout is owned by the terminal renderer, so traces are appended to ~/.flute/flute-webhooks-cli.log. Open a second terminal and run tail -f ~/.flute/flute-webhooks-cli.log to watch live.
Response bodies are logged in full with no truncation, so server stack traces are captured intact. The bearer token is never logged.
Without --debug, default tracing is INFO/WARN. Non-TUI commands write to stderr; the TUI writes to the log file.
| Issue | Resolution |
|---|---|
| No credentials for the sandbox | Run flute-webhooks-cli auth login. |
| Terminal looks broken after a crash | The panic hook should restore it automatically. If it did not, run reset or stty sane. |
| Busy: "try again in a moment" | The action queue is briefly saturated by an in-flight API call. The next keypress will go through. |
| Polling cadence seems slow after an error | This is exponential backoff. On consecutive 401, 403, 404, or 5xx failures the poll interval doubles each time, capped at 30 seconds. The counter resets on the first successful poll. |
| Token refresh | Bearer tokens are cached in memory and proactively refreshed 60 seconds before expiry. If the server returns a 401 anyway, the client invalidates the cache, fetches a fresh token, and retries the original request once. Only requests that fail twice in a row are surfaced as errors. |
MIT.