Get real-time notifications when things happen in Alfred. Subscribe to events, and we'll POST JSON payloads to your endpoints instantly.
Complete list of webhook events with descriptions and example payloads.
agent.created
Fired when a new agent is created.
{
"id": "evt_d5de32be887a9b82fe75ed48",
"event": "agent.created",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"agent_id": "agt_abc123",
"name": "Customer Support Bot",
"model": "gpt-4o",
"created_by": 42
}
}
agent.deployed
Fired when an agent deploys to production.
{
"id": "evt_774673f7b7336f9d9a32107f",
"event": "agent.deployed",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"agent_id": "agt_abc123",
"name": "Customer Support Bot",
"environment": "production",
"version": 3
}
}
agent.error
Fired when an agent encounters a runtime error.
{
"id": "evt_e5297cd2c84f28f8b91b9bf1",
"event": "agent.error",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"agent_id": "agt_abc123",
"error_type": "rate_limit",
"message": "API rate limit exceeded",
"severity": "warning"
}
}
agent.status_changed
Fired when an agent changes status (online/offline/maintenance).
{
"id": "evt_cf4a88b86f4b7a0c4d99d2df",
"event": "agent.status_changed",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"agent_id": "agt_abc123",
"old_status": "online",
"new_status": "maintenance"
}
}
call.started
Fired when a voice call begins.
{
"id": "evt_91b0e108460906bc3a192b2d",
"event": "call.started",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"call_id": "call_xyz789",
"agent_id": "agt_abc123",
"from": "+15551234567",
"to": "+15559876543",
"direction": "inbound"
}
}
call.ended
Fired when a voice call completes, includes duration and summary.
{
"id": "evt_62b9a5830f6c5aee8b29dcfd",
"event": "call.ended",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"call_id": "call_xyz789",
"agent_id": "agt_abc123",
"duration_s": 142,
"end_reason": "completed",
"summary": "Customer inquired about billing. Issue resolved."
}
}
call.transferred
Fired when a call is transferred to another agent or number.
{
"id": "evt_98d4a48e89fab19ab40ddd51",
"event": "call.transferred",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"call_id": "call_xyz789",
"from_agent": "agt_abc123",
"to_number": "+15552223344",
"reason": "escalation"
}
}
call.recorded
Fired when a call recording is available.
{
"id": "evt_0ee8d0065120201843bfaa3f",
"event": "call.recorded",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"call_id": "call_xyz789",
"recording_url": "https://storage.gositeme.com/recordings/call_xyz789.mp3",
"duration_s": 142
}
}
fleet.deployed
Fired when a fleet configuration is deployed.
{
"id": "evt_b66651c71ca4efb8ce901225",
"event": "fleet.deployed",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"fleet_id": "flt_001",
"name": "Support Fleet",
"agent_count": 5,
"version": 2
}
}
fleet.alert
Fired on fleet-level alerts (capacity, errors, performance).
{
"id": "evt_2f869a37ee09f78f6b2d040a",
"event": "fleet.alert",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"fleet_id": "flt_001",
"alert_type": "high_error_rate",
"message": "Error rate exceeded 5% threshold",
"severity": "critical"
}
}
fleet.agent_joined
Fired when an agent is added to a fleet.
{
"id": "evt_da81900a41de5febebe313c6",
"event": "fleet.agent_joined",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"fleet_id": "flt_001",
"agent_id": "agt_abc123"
}
}
fleet.agent_left
Fired when an agent is removed from a fleet.
{
"id": "evt_689e815d68792aaefba5f75c",
"event": "fleet.agent_left",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"fleet_id": "flt_001",
"agent_id": "agt_abc123",
"reason": "removed"
}
}
tool.executed
Fired when an agent executes a tool.
{
"id": "evt_96c2401c55fcdafbf2af7c8f",
"event": "tool.executed",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"tool_id": "weather_lookup",
"agent_id": "agt_abc123",
"duration_ms": 320,
"success": true
}
}
tool.error
Fired when a tool execution fails.
{
"id": "evt_312ad0fb2e4a2ebfb3157c01",
"event": "tool.error",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"tool_id": "weather_lookup",
"agent_id": "agt_abc123",
"error": "Upstream API timeout"
}
}
tool.rate_limited
Fired when a tool call is rate-limited.
{
"id": "evt_daac8d097ba99d339cce6f75",
"event": "tool.rate_limited",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"tool_id": "weather_lookup",
"agent_id": "agt_abc123",
"limit": 100,
"window": "1m"
}
}
marketplace.published
Fired when you publish an extension to the marketplace.
{
"id": "evt_8ac6a685891039546832d297",
"event": "marketplace.published",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"extension_id": "ext_555",
"name": "My Custom Tool",
"version": "1.0.0"
}
}
marketplace.purchased
Fired when someone purchases your marketplace extension.
{
"id": "evt_2a5ee6b0f0aa204311965291",
"event": "marketplace.purchased",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"extension_id": "ext_555",
"buyer_id": 99,
"price": 9.99,
"currency": "USD"
}
}
marketplace.review
Fired when your extension receives a review.
{
"id": "evt_3df8f7131f7cc5a7f31fd5c5",
"event": "marketplace.review",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"extension_id": "ext_555",
"rating": 5,
"review": "Great tool!"
}
}
billing.payment_succeeded
Fired on successful payment processing.
{
"id": "evt_eeaf778083bea16bc9650e95",
"event": "billing.payment_succeeded",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"invoice_id": "inv_12345",
"amount": 49,
"currency": "USD"
}
}
billing.payment_failed
Fired when a payment attempt fails.
{
"id": "evt_cfd27986eb7f891798efa5e8",
"event": "billing.payment_failed",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"invoice_id": "inv_12345",
"amount": 49,
"reason": "card_declined"
}
}
billing.usage_alert
Fired when usage approaches or exceeds thresholds.
{
"id": "evt_22b468b406512fa0ec9fab33",
"event": "billing.usage_alert",
"timestamp": "2026-03-04T12:00:00+00:00",
"data": {
"resource": "api_calls",
"current": 9500,
"limit": 10000,
"percentage": 95
}
}
Every webhook includes an X-Alfred-Signature header. Verify it to ensure authenticity.
const crypto = require('crypto');
function verifyWebhookSignature(payload, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// Express middleware
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['x-alfred-signature'];
if (!verifyWebhookSignature(req.body, sig, process.env.WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(req.body);
console.log('Event:', event.event, event.data);
res.status(200).send('OK');
});
import hmac, hashlib
def verify_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = 'sha256=' + hmac.new(
secret.encode(), payload, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
# Flask example
from flask import Flask, request, abort
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
sig = request.headers.get('X-Alfred-Signature', '')
if not verify_signature(request.data, sig, WEBHOOK_SECRET):
abort(401)
event = request.json
print(f"Event: {event['event']}", event['data'])
return 'OK', 200
<?php
function verifySignature(string $payload, string $signature, string $secret): bool {
$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);
return hash_equals($expected, $signature);
}
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_ALFRED_SIGNATURE'] ?? '';
$secret = getenv('WEBHOOK_SECRET');
if (!verifySignature($payload, $signature, $secret)) {
http_response_code(401);
die('Invalid signature');
}
$event = json_decode($payload, true);
error_log("Event: " . $event['event']);
http_response_code(200);
echo 'OK';
Create a free Alfred account to register webhook endpoints and start receiving real-time event notifications.
Get Started Free
Someone from somewhere
just launched website.com
Just now