Skip to main content
Every endpoint on this page requires either a Clerk-issued JWT (Authorization: Bearer <token>) or an organization API key (x-api-key: pk_…). Anonymous calls return 401 Unauthorized. See Authentication for the full setup.
Agntix delivers webhooks via Svix. Configure endpoints from the dashboard’s Developer section — see Webhooks overview. Voice and chat sessions emit two events today: session.created (when the call/conversation starts) and session.ended (when it closes, with the full post-call analysis attached). The other events on this page are on the roadmap — documented so you can design against them, but not delivered as webhooks yet.
Available now: session.created and session.ended. Every event marked Planned below is not emitted to webhook endpoints yet — don’t build hard dependencies on it. session.updated and knowledge_store.updated currently exist only as in-app real-time (SSE) signals, not as webhooks.
Treat the top-level id (session UUID) as the idempotency key. Don’t double-process the same id. Webhooks may be retried on non-2xx responses — respond 2xx once you’ve durably enqueued the event.

session.created Available

Fired when a session is initiated — for outbound voice calls, this is before pickup. Use it to lock the originating task as “in-flight”.
id
string
The session id (UUID). Use as idempotency key.
eventType
string
Constant: "session.created".
type
enum
VOICE, CHAT.
platform
enum
PHONE, WEB, WHATSAPP.
direction
enum
INBOUND, OUTBOUND.
state
enum
Session state at emission (OPEN for session.created).
agentId
string
The agent id (UUID).
createdAt
string
RFC 3339 UTC timestamp.
metadata
object
Channel and session metadata. Includes customerPhoneNumber, roomName, and sessionVariables — see below.
metadata.sessionVariables
object
The session_variables you passed at trigger time, echoed back verbatim — regardless of whether the prompt referenced them. Use these as your correlation IDs (e.g. crmContactId, taskId, campaignId).
{
  "id": "4981804c-2658-4893-84ff-9c2fa90fb3c2",
  "eventType": "session.created",
  "type": "VOICE",
  "platform": "PHONE",
  "direction": "OUTBOUND",
  "state": "OPEN",
  "agentId": "40235145-aa3d-443e-9d0c-841dd0716a2f",
  "createdAt": "2026-04-08T05:00:01.130Z",
  "metadata": {
    "customerPhoneNumber": "+971501234567",
    "roomName": "outbound_sip_40235145-aa3d-443e-9d0c-841dd0716a2f^__^7yoamyb",
    "sessionVariables": {
      "crmContactId": "CRM-7728",
      "customerName": "Alex Morgan"
    }
  }
}

session.ended Available

Fired once when a session closes (manually, via timeout, on call hangup, or on ttl expiry). Carries the full post-call analysis block — see Post-call analysis for what each field means.
id
string
The session id (UUID). Same as in session.created.
eventType
string
Constant: "session.ended".
state
enum
CLOSED.
createdAt
string
Session start time.
lastActivityAt
string
Most recent activity timestamp.
endedAt
string
When the session closed.
metadata
object
Same shape as session.created. metadata.sessionVariables is echoed verbatim.
analysis.summary
string
One-paragraph summary of the call.
analysis.intent
object
Best-fit intent classification — conversation.intent, confidence, explanation. Present only when Intent Recognition is enabled on the agent.
analysis.resolution
object
classification (RESOLVED / PARTIALLY_RESOLVED / UNRESOLVED / NOT_APPLICABLE), confidenceScore, satisfiedChecklistItems, evidence, explanation. Present only when Resolution Analysis is enabled.
analysis.sentiment
object
conversation.sentiment (POSITIVE / NEUTRAL / NEGATIVE), score (-1.0 to +1.0), detectedLanguage. Present only when Sentiment is enabled.
analysis.extractedData
object
Map of { <fieldName>: <value> } for every field defined in the agent’s Data Extraction schema.
recordingUrl
string
Link into the dashboard to play back the call recording.
{
  "id": "4981804c-2658-4893-84ff-9c2fa90fb3c2",
  "eventType": "session.ended",
  "type": "VOICE",
  "platform": "PHONE",
  "direction": "OUTBOUND",
  "state": "CLOSED",
  "agentId": "40235145-aa3d-443e-9d0c-841dd0716a2f",

  "createdAt": "2026-04-08T05:00:01.130Z",
  "lastActivityAt": "2026-04-08T05:00:01.130Z",
  "endedAt": "2026-04-08T05:00:10.546Z",
  "updatedAt": "2026-04-08T05:00:01.130Z",

  "metadata": {
    "customerPhoneNumber": "+971501234567",
    "roomName": "outbound_sip_40235145-aa3d-443e-9d0c-841dd0716a2f^__^7yoamyb",
    "sessionVariables": {
      "crmContactId": "CRM-7728",
      "customerName": "Alex Morgan"
    }
  },

  "analysis": {
    "summary": "Customer confirmed delivery slot for Wednesday afternoon.",
    "intent": {
      "conversation": { "intent": "Slot-Confirmed", "confidence": 0.92, "explanation": "…" },
      "message":      { "intent": null, "confidence": 0, "explanation": "…" }
    },
    "resolution": {
      "classification": "RESOLVED",
      "confidenceScore": 0.88,
      "status": "Completed",
      "satisfiedChecklistItems": ["delivery_slot_agreed"],
      "evidence": ["Customer: yes Wednesday afternoon works."],
      "explanation": "Customer agreed to a specific slot."
    },
    "sentiment": {
      "conversation": { "sentiment": "POSITIVE", "score": 0.4, "detectedLanguage": "en", "explanation": "…" },
      "message":      { "sentiment": null, "score": 0, "detectedLanguage": "N/A", "explanation": "…" }
    },
    "extractedData": {
      "slotConfirmed": true,
      "preferredDay": "Wednesday",
      "preferredTimeWindow": "Afternoon",
      "callbackRequested": false,
      "callOutcome": "Confirmed"
    }
  },

  "recordingUrl": "https://app.agntix.ai/en/logs-history?opened=4981804c-2658-4893-84ff-9c2fa90fb3c2"
}
The webhook is summary-grade, not transcript-grade. The full message-by-message transcript is not included, and some long-call fields may be truncated. For the complete picture, pull from GET /api/v1/chat/sessions/{id}/messages.

session.updated Planned chat

Emitted for chat sessions when state, agent assignment, intelligence summary, or analytics records change mid-session. Voice/outbound calls do not emit this event — they go straight from session.created to session.ended.
Today this fires only as an in-app real-time (SSE) signal for live dashboards. It is not yet delivered to webhook endpoints.
id
string
Session id (UUID).
eventType
string
Constant: "session.updated".
changedFields
string[]
Which fields changed (e.g. ["state", "intelligence"]).
state
enum
OPEN, CLOSED, EXPIRED.
{
  "id": "ses_01J2K…",
  "eventType": "session.updated",
  "createdAt": "2026-04-28T11:43:00Z",
  "changedFields": ["intelligence"],
  "state": "OPEN"
}

message.added Planned

A user, assistant, or tool message was appended to a session.
Not emitted to webhook endpoints yet. Until it ships, poll GET /api/v1/chat/sessions/{id}/messages or consume the in-app real-time stream.
data.sessionId
string
data.messageId
string
The message id (msg_…).
data.role
enum
USER, ASSISTANT, TOOL, SYSTEM.
data.content
string
The text content (may be empty for tool calls).
data.toolCall
object
Present only for TOOL role.
{
  "id": "evt_2dQs…",
  "type": "message.added",
  "createdAt": "2026-04-28T11:42:13Z",
  "data": {
    "sessionId": "ses_01J2K…",
    "messageId": "msg_01J2L…",
    "role": "ASSISTANT",
    "content": "Your order 1234 shipped this morning."
  }
}

usage.updated Planned

Aggregate usage metrics for the org changed (rolled up every 60s).
Not emitted to webhook endpoints yet.
data.period
object
{ "start": ISO, "end": ISO }.
data.metrics
object
{ "chat_messages": number, "voice_seconds": number, "knowledge_chunks": number }.

subscription.updated Planned

Plan change, payment method update, cancel, or resume.
Not emitted to webhook endpoints yet.
data.subscriptionId
string
data.status
enum
active, past_due, canceled, paused.
data.currentPlan
string
e.g. growth.

knowledge_store.updated Planned

A document finished processing (chunked + embedded + indexed).
Today this fires only as an in-app real-time (SSE) signal (named knowledge.store.updated). It is not yet delivered to webhook endpoints.
data.knowledgeStoreId
string
data.documentId
string
data.status
enum
UPSERTED, FAILED.

Delivery semantics

  • At-least-once. Always idempotent on the top-level id.
  • Order is not guaranteed. Use createdAt if you need to sort.
  • Retries: exponential backoff up to 24h. After 24h the event is dead-lettered (visible in the dashboard).
  • Timeout: your endpoint must respond 2xx within 15 seconds.
See Verifying signatures for how to authenticate incoming requests.