Webhooks
Subscribe to events. Build on top.
AresGen sends HMAC-signed webhooks for every meaningful event. Retried with exponential backoff, ordered per workspace, and replayable from your dashboard.
Signing
Verify every request.
Each request includes an Aresgen-Signature and a Aresgen-Timestamp. Recompute the HMAC with your endpoint secret and reject anything that does not match or is older than five minutes.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verify(req: Request, secret: string): boolean {
const signature = req.headers.get("aresgen-signature") ?? "";
const timestamp = req.headers.get("aresgen-timestamp") ?? "";
const body = await req.text();
const expected = createHmac("sha256", secret)
.update(`${timestamp}.${body}`)
.digest("hex");
const a = Buffer.from(signature, "hex");
const b = Buffer.from(expected, "hex");
return a.length === b.length && timingSafeEqual(a, b);
}Delivery
Retries, ordering, replays.
At-least-once
We deliver every event. Use event.id for idempotency on your side.
Retries
Up to 24 attempts over 72 hours with exponential backoff (10s → 6h).
Ordered per workspace
Events fire in workspace-order; cross-workspace order is not guaranteed.
Replay
Re-deliver any event from the dashboard or POST /v1/webhooks/replay.
Filter by type
Subscribe to one event, a wildcard (e.g. chatbot.*), or all events.
Inspect
Last 30 days of deliveries with status, response code, and payload.
Sample payload
What hits your endpoint.
{
"id": "evt_01HZ8PJYTM6N9X7QWXAYBVS3J5",
"type": "workflow.run.completed",
"created": "2026-05-11T08:14:22.184Z",
"workspace_id": "ws_main",
"data": {
"workflow_id": "wf_publish",
"run_id": "run_01HZ8PJYTM6N9X7QWXAYBVS3J5",
"status": "success",
"duration_ms": 4218,
"cost_usd": 0.0382
}
}Events
10 events- Chat
chat.message.createdPayload keys
thread_id, message_id, role, content, model, voice_id
A new chat message is created in any thread.
- Documents
document.publishedPayload keys
document_id, published_at, author, project_id
A document is marked published or set to public.
- Brand Voice
voice.trainedPayload keys
voice_id, sample_word_count, sliders, banned_phrases
A new brand voice finishes training.
- Chatbots
chatbot.conversation.escalatedPayload keys
conversation_id, intent, transcript_url, requested_agent
A visitor is handed off to a human.
chatbot.csat.receivedPayload keys
conversation_id, score, comment, language
A visitor rates a chatbot conversation.
- Workflows
workflow.run.completedPayload keys
workflow_id, run_id, status, duration_ms, cost_usd
A workflow run finishes (success or failure).
workflow.run.approval_requiredPayload keys
workflow_id, run_id, step_id, approval_url
A workflow blocks on a human-approval gate.
- Workspace
workspace.member.addedPayload keys
user_id, email, role, scim_source
A new user joins the workspace.
workspace.member.removedPayload keys
user_id, removed_at, removed_by
A user is removed from the workspace.
- Audit
audit.policy.violationPayload keys
rule_id, project_id, user_id, blocked_at, reason
An output is blocked by a brand-voice or compliance rule.
Get started today.
Free for 7 days. No credit card. Bring your team — or just your first prompt.