1. Verdicts
CallerAPI Documentation
  • Quickstart
  • Use cases
    • For carriers (MNOs/MVNOs)
    • CPaaS platforms
    • Cloud communications providers
    • SIP trunking providers
    • PBX/Cloud PBX
    • UCaaS vendors
  • Account
    • Balance and email
      GET
  • Spam protection
    • Voice firewall
      • Get started
      • Quickstart
        • What you get
        • Before you start
        • Test with a recording
        • Connect your switch
        • Switch notes
        • Twilio and Telnyx
        • Send text instead of audio
      • Verdicts
        • Read a verdict
        • What to do with a verdict
        • Block a caller
        • Events and webhooks
      • Honeypot
        • Hand a call over
        • Audio, events, and limits
      • Reference
        • Endpoints
        • Errors
        • Limits and thresholds
        • Production checklist
      • REST
        • What this deployment can do
        • List the verdict categories
        • List the honeypot personas
        • Score a transcript or a recording
        • List your recent sessions
        • Get one session with verdict and intel
        • Twilio voice URL for a screened number
        • Preview the Twilio TwiML
        • Telnyx voice URL for a screened number
        • Twilio voice URL for a honeypot number
        • Telnyx voice URL for a honeypot number
      • WebSocket
        • Live scam filter stream
        • Honeypot stream
    • Daily spam reports
      • Webhook
        • Subscribe to daily reports
        • Unsubscribe from daily reports
        • List webhook subscriptions
        • Manual dispatch of reports
        • Test webhook
      • REST
        • Fetch daily spam reports
    • 15 days spam CSV snapshot
      GET
    • Spam score + HLR
      GET
  • Mobile SDK
    • Get started
    • Quickstart
      • What you get
      • Get your keys
      • Android
      • iOS
      • Flutter
      • React Native
      • Check it works
    • Call screening
      • What each platform can do
      • Android call screening
      • iOS prerequisites
      • iOS add the extension
      • iOS test on device
    • Reference
      • Methods
      • Errors
      • Limits and billing
      • Troubleshooting
  • Data partners
    • Partner tems & docs
    • Upload spam reports
    • Upload contacts
  • Fraud prevention
    • Ported date
    • Porting history
    • Online presence
    • KYC user identity
  • Schemas
    • Spam protection
      • Spam score request
      • Business info
      • Carrier info
      • Complaint (without number)
      • Daily spam reports request
      • Complaint (with phone)
  1. Verdicts

Events and webhooks

One event shape serves the socket and the webhook. On the plain WebSocket protocol you receive every event as a JSON text frame. On Twilio and Telnyx streams you receive events on the webhook only.

Common fields#

FieldMeaning
typeEvent type. See below.
session_idThe session. Use it with Get one session.
kindfilter or honeypot.
call_idYour call_id, the Twilio CallSid, the Telnyx call control id, or the SIP Call-ID.
from, toE.164 numbers when known.
atRFC 3339 time.

Event types#

typeWhenExtra fieldsSocketWebhook
session.startedThe start message was accepted.persona (honeypot only)yesyes
transcript.lineOne utterance is final.speaker, textyesno
verdictThe score or category changed enough to matter.verdictyesyes
session.errorHoneypot only. Speech synthesis failed.error, textyesyes
session.endedThe call ended and the final analysis is done.verdict, intel, transcript, duration_seconds, reported, reported_numbersyesyes
speaker is caller, callee, or the persona's name.
session.error ends a honeypot session when the greeting could not be spoken. In every other case it is advisory and the session continues. The filter never sends it.

When a verdict event is sent#

The filter scores the caller's text after every final utterance with the rule engine. It also runs the model every 30 seconds when at least 120 new characters arrived. A verdict event is sent when:
The first score reaches 0.3 or more.
The level changes.
The category changes.
The score moves by 0.15 or more.
A rules-only score below 0.5 is never sent. A rules-only score never lowers a score the model produced. Expect zero events on a clean call and two to five on a scam call.

Examples#

verdict:
{
  "type": "verdict",
  "session_id": "7463336c-c965-450f-b188-e6908e969395",
  "kind": "filter",
  "call_id": "your-call-id",
  "from": "+15559990000",
  "to": "+15551234567",
  "at": "2026-09-13T15:04:11Z",
  "verdict": {
    "score": 0.72,
    "level": "likely_scam",
    "category": "Advance Fee Loan",
    "tactics": ["untraceable_payment", "urgency"],
    "signals": ["pitches a loan", "asks for money before a loan"],
    "source": "heuristic"
  }
}
session.ended:
{
  "type": "session.ended",
  "session_id": "7463336c-c965-450f-b188-e6908e969395",
  "kind": "filter",
  "call_id": "your-call-id",
  "from": "+15559990000",
  "to": "+15551234567",
  "at": "2026-09-13T15:07:52Z",
  "verdict": {
    "score": 0.94,
    "level": "scam",
    "category": "Advance Fee Loan",
    "tactics": ["callback_pressure", "untraceable_payment", "urgency"],
    "signals": ["pay us up front, and then we would give you the loan", "send us a payment right now to +19998887766"],
    "summary": "Caller offers a $10,000 loan and demands an upfront payment to a phone number within the hour.",
    "source": "combined"
  },
  "intel": {
    "names": ["Dmitry"],
    "organizations": ["Bankloans.com"],
    "callback_numbers": ["+19998887766"],
    "amounts": ["$10,000"]
  },
  "transcript": "caller: Hi, this is Dmitry from Bankloans.com...\n",
  "duration_seconds": 221,
  "reported": true,
  "reported_numbers": 2
}

Webhook delivery#

Set webhook to an HTTPS URL. HTTP URLs are ignored. The server posts every event except transcript.line.
HeaderValue
Content-Typeapplication/json
X-Voice-EventThe event type.
X-Voice-Signaturesha256=<hex>. HMAC-SHA256 of the raw request body. The key is your API key.
Rules:
1.
Answer with a 2xx status within 5 seconds. The server does not wait longer.
2.
There is no retry. Store the session_id and read Get one session when a post is missing.
3.
Events for one session may arrive out of order under load. Use at to order them.
4.
Do not depend on a fixed source IP. Verify the signature instead.
5.
Compute the HMAC over the raw bytes of the body, before any JSON parsing.

Verify the signature#

Python:
Node.js:
The verdict object is described on Read a verdict.
Modified at 2026-09-18 16:57:01
Previous
Block a caller
Next
Hand a call over
Built with