Relayers CLI
relayers is the terminal companion to the desktop app. It opens a webhook tunnel from any provider — Stripe, GitHub, anything — straight to your localhost, and lets you manage every part of your account: endpoints, routing rules, transformations, events, daemons and API tokens.
Install
On macOS or Linux, one line installs the latest relayers (amd64 or arm64, auto-detected) and verifies its checksum:
curl -fsSL https://dl.relayers.app/cli/install.sh | shIt installs to /usr/local/bin when writable, otherwise ~/.local/bin. Override with RELAYERS_INSTALL_DIR. Prefer to read before piping to a shell? Read install.sh first.
Or download a binary
Extract and put relayers on your PATH. On Windows, unzip and add relayers.exe. Checksums: checksums.txt.
Quickstart
Sign in, then point the tunnel at your local server:
relayers loginrelayers listen --port 3000Webhooks delivered to your Relayers endpoint now arrive at http://localhost:3000. The tunnel reconnects automatically and stays alive while idle — the same URL keeps working across restarts. Restrict a session to specific endpoints with --endpoints <slug-or-id>,….
Authentication
relayers login stores your session in the OS keychain (with an encrypted-file fallback). Check it anytime:
relayers statusNon-interactive auth (CI / scripts)
SetRELAYERS_TOKEN (a JWT or a wrk_ API key) to authenticate without logging in — it bypasses the stored session entirely. Point at a different environment with RELAYERS_SERVER.export RELAYERS_TOKEN="wrk_…" # from: relayers tokens create
export RELAYERS_SERVER="https://api.relayers.app" # optional
relayers endpoints listLog out and clear the stored session with relayers logout.
Endpoints
Endpoints are the URLs providers send webhooks to. Create one, and its public_id becomes your receive URL: https://api.relayers.app/v1/webhooks/<public_id>.
relayers endpoints list
relayers endpoints list --json # machine-readable (any command)
# create (a slug is generated from the name if you omit --slug)
relayers endpoints create --name "Stripe prod" --rate-limit 100
relayers endpoints get <endpointID>
relayers endpoints update <endpointID> --rate-limit 50 --active=false
relayers endpoints delete <endpointID>Routing rules
Rules decide where each event goes. A rule delivers to a public URL or down a tunnel, in priority order (lower runs first), and can apply a transformation.
relayers endpoints rules list <endpointID>
# deliver to your tunnel
relayers endpoints rules create <endpointID> \
--name to-localhost --destination-type tunnel --priority 1
# deliver to a public URL, applying a transformation
relayers endpoints rules create <endpointID> \
--name forward --destination-type public \
--destination-url https://example.com/hook \
--transform-id <transformID> --priority 2
relayers endpoints rules update <endpointID> <ruleID> --status paused
relayers endpoints rules reorder <endpointID> <ruleID2> <ruleID1>
relayers endpoints rules delete <endpointID> <ruleID>Filter which events a rule matches with --filter (a JQ/JSON object), e.g. --filter '{"type":"payment.succeeded"}'.
Events & deliveries
Every received webhook is an event; each rule it matches produces delivery attempts. Inspect and replay them:
relayers events list --limit 20
relayers events get <eventID>
relayers events deliveries <eventID> # per-rule attempts + response codes
relayers events retry <eventID> # re-run delivery
relayers logs # alias for a recent events feedTransformations
Reshape payloads before delivery. Types: jq, jsonata, javascript, go_template. Test an expression against sample input before saving it:
relayers transformations test \
--type jq --expression '{ id: .id, amount: .data.amount }' \
--input '{"id":"evt_1","data":{"amount":4200}}'
relayers transformations create \
--name flatten --type jq --expression '{ id: .id, amount: .data.amount }'
relayers transformations list
relayers transformations get <transformID>
relayers transformations update <transformID> --expression '.data'
relayers transformations delete <transformID>API tokens
API keys (wrk_-prefixed) authenticate scripts and the tunnel. The raw token is shown once at creation — copy it then.
relayers tokens create --name ci --scope read --scope write
# ⚠ Save this token now — it will not be shown again:
# wrk_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
relayers tokens list
relayers tokens revoke <tokenID>Daemons (remote tunnels)
Each running relayers listen registers a daemon. Manage them across machines:
relayers daemons list # status, host, OS, last-seen
relayers daemons get <daemonID>
relayers daemons rename <daemonID> "laptop"
relayers daemons ping <daemonID> # requires the daemon to be online
relayers daemons delete <daemonID>Stats, billing & account
relayers stats # 24h event totals + success rate
relayers billing usage
relayers billing subscription
relayers billing plans
relayers billing portal # opens the billing portal URL
relayers account export # GDPR/LGPD data export (JSON)
relayers account delete --yes # irreversible — requires --yesRun as a background service
Keep the tunnel up without a terminal open. install copies the binary to a stable location, saves the config, and registers a per-user service that starts automatically on login (no root required). Its flags mirror listen: --port, --host, --name, --endpoints.
relayers install --port 3000 # install + auto-start on login
relayers service status
relayers service stop
relayers service start
relayers service restart
relayers uninstall # remove the service
relayers uninstall --purge # also remove the binary, config and logsCheck the CLI build with relayers version, and generate shell completions with relayers completion <bash|zsh|fish>.
Global conventions
--json— every read command can emit JSON for piping intojqor scripts.--server <url>/RELAYERS_SERVER— target a specific environment.relayers <command> --help— full flags for any command.
Prefer a UI?
The desktop app does everything the CLI does — a live payload inspector, local forwarding rules, and a tray icon — on macOS, Windows, and Linux.
Download Relayers Desktop