Webhooks — Universal Event Entry
Webhooks — Universal Event Entry — easy-to-understand guide based on official docs
Imagine your front door only opened when you personally turned the key—no package deliveries, no guests while you’re away. That’s how most software works until you add webhooks: a universal doorbell that lets any outside service ring in and trigger your agent to act.
What’s a Webhook, Really?
A webhook is just an HTTP POST request sent to a URL when something happens. GitHub says “a PR was opened,” Stripe says “a payment failed,” JIRA says “a ticket moved.” Your Hermes Agent listens on that URL, validates the request is genuine, turns the event into a prompt, and then your agent decides what to do—comment on the PR, send a Telegram message, or just log the result.
Quick Start in Three Steps
- Enable the gateway — run
hermes gateway setupand follow the prompts, or add these lines to~/.hermes/.env:WEBHOOK_ENABLED=true WEBHOOK_PORT=8644 WEBHOOK_SECRET=your-global-secret - Define a route — either in
config.yamlunderplatforms.webhook.extra.routes, or dynamically withhermes webhook subscribe. - Point your service at
http://your-server:8644/webhooks/<route-name>.
Verify it’s alive with:
curl http://localhost:8644/health
You should see {"status": "ok", "platform": "webhook"}.
Anatomy of a Route
Each route is a named entry in your config. The most important property is secret—it’s required and used for HMAC signature validation. Never skip it in production. (The "INSECURE_NO_AUTH" value is for local testing only.)
You can also add a prompt template to shape how the payload becomes an agent instruction. For example, {pull_request.title} pulls just the PR title into the prompt. If you omit it, the full JSON payload is dumped in—useful but noisy.
Filters Keep You Sane
Use filters to ignore events you don’t care about. For instance, only act when action == "opened" and pull_request.base.ref == "main". This saves agent runs and tokens.
A Word of Caution
The docs say it plainly: authenticated does not mean trusted. Even with a valid HMAC signature, the payload content comes from an external party. Never put payload fields directly into shell commands or SQL queries. Treat them as untrusted input.
Final Tip
Start with one route and one event type. Get that working end-to-end, then expand. And always set a per-route secret—it’s the difference between a doorbell and an open gate.
📖 Official Docs
This article is based on the official Hermes Agent documentation:Official docs › user-guide/messaging/webhooks