Webhooks
FERAL exposes a webhook endpoint that lets any external service push events into your AI brain. Connect GitHub pushes, Stripe payments, IFTTT applets, Zapier zaps, or any service that can send HTTP POST requests.Creating a Webhook
Via API
Via CLI
Signature Verification
FERAL verifies webhook signatures to ensure requests are authentic. When you create a webhook with asecret, FERAL computes an HMAC-SHA256 signature and compares it to the incoming request’s signature header.
| Service | Signature Header | Algorithm |
|---|---|---|
| GitHub | X-Hub-Signature-256 | HMAC-SHA256 |
| Stripe | Stripe-Signature | HMAC-SHA256 (with timestamp) |
| IFTTT | (custom) | Bearer token |
| Zapier | X-Zapier-Signature | HMAC-SHA256 |
| Generic | X-Webhook-Signature | HMAC-SHA256 |
401 Unauthorized.
Connecting Services
GitHub
- Create a webhook in FERAL:
feral webhooks create --name github --action process - In your GitHub repo: Settings → Webhooks → Add webhook
- Set the Payload URL to your FERAL webhook URL (use a tunnel like ngrok for remote access)
- Set Content type to
application/json - Enter the same secret you used when creating the FERAL webhook
- Select events: Pushes, Pull requests, Issues, etc.
IFTTT
- Create a webhook in FERAL
- In IFTTT, use the Webhooks service as the action
- Set the URL to your FERAL webhook endpoint
- Set Method to
POSTand Content-Type toapplication/json - Map IFTTT ingredients to the JSON body
Zapier
- Create a webhook in FERAL
- In Zapier, add a Webhooks by Zapier action step
- Choose “POST” and enter your FERAL webhook URL
- Map your Zap’s data fields to the payload
Stripe
- Create a webhook in FERAL with a secret
- In the Stripe Dashboard: Developers → Webhooks → Add endpoint
- Enter your FERAL webhook URL
- Select events (e.g.,
payment_intent.succeeded,invoice.paid) - Copy the signing secret from Stripe and update your FERAL webhook
Action Mapping
Each webhook can map to an action that FERAL performs when the event arrives:| Action | Description |
|---|---|
notify | Send a notification to your preferred channel (push, Telegram, etc.) |
process | Feed the event to the Brain for intelligent processing and response |
log | Store the event in FERAL’s knowledge graph for later reference |
skill | Trigger a specific FERAL skill by name |
automation | Run a Home Assistant automation (requires HA integration) |
Managing Webhooks
Exposing to the Internet
By default, FERAL runs on localhost. To receive webhooks from external services, you need to expose the endpoint. Options:-
ngrok (recommended for development):
-
Cloudflare Tunnel (recommended for production):
-
Reverse proxy — configure Nginx/Caddy to forward
/v1/webhooks/*to FERAL
Security
- Always use a webhook
secretfor signature verification - Webhook secrets are stored in FERAL’s encrypted credentials file
- FERAL logs all webhook deliveries (with redacted payloads) for audit
- Rate limiting: 60 requests/minute per webhook by default
- IP allowlisting is available via
FERAL_WEBHOOK_ALLOWED_IPS
Troubleshooting
Webhook returns 401
Webhook returns 401
The signature doesn’t match. Verify that the secret in FERAL matches the secret configured in the external service. Check the signature header name.
External service can't reach FERAL
External service can't reach FERAL
FERAL runs on localhost by default. Use ngrok or a Cloudflare Tunnel to expose it. Verify your firewall allows inbound connections.
Events received but no action taken
Events received but no action taken
Check the webhook’s
action setting. Run feral webhooks get <id> to verify the configuration. Check FERAL logs for processing errors.