A REST endpoint that classifies a call transcript (or SMS body) for scam/fraud signals. Powers Voipy Shield's in-house receptionist and is now available as a metered API for carriers, banks, and senior-care platforms integrating scam-screening into their own call flows.
Paste a call transcript (or pick an example) and hit Classify. No signup; IP-rate-limited 5/min.
https://voipy.app
Every request must carry a Bearer token in the Authorization header. Keys are issued per customer and look like shd_ + 64 hex chars.
Authorization: Bearer shd_c1d5ce39197944eb56eeef956062cba01e77c593adc16c1239530b0bc0927bd2
| Per key | 60 requests / minute |
|---|---|
| Burst | Soft — exceed briefly, expect 429 beyond the sustained cap |
| On overflow | HTTP 429 + Retry-After header (seconds). Rate-limited calls are NOT billable. |
Higher limits available on request.
POST /api/shield/classify
{
"text": "This is the IRS. Your Social Security number has been suspended."
}
| text | string · required · the caller's speech or SMS body |
|---|
{
"signals": [],
"decision": {
"final_action": "BLOCK_AND_TERMINATE",
"confidence": 0.97,
"claimed_organization": "IRS",
"claimed_identity": "",
"claimed_relationship": "",
"purpose_of_contact": "collect back taxes",
"request_type": "payment",
"money_request": true,
"payment_method_requested": "wire",
"urgency_level": 0.85,
"secrecy_request": false,
"intimidation_or_legal_threat": true,
"impersonation_suspicion": 0.95,
"deepfake_or_synthetic_suspicion": 0.0,
"asks_for_sensitive_info": ["ssn"],
"reasons": ["impersonation:IRS", "intimidation", "ssn_request"],
"channel": "voice"
}
}
The top-level response is {signals, decision}. The
decision object is where action lives.
| final_action | one of ALLOW, HOLD_FOR_STAFF_REVIEW, QUARANTINE_SMS, BLOCK_AND_TERMINATE |
|---|---|
| confidence | float 0-1 · model's confidence in final_action |
| reasons | array · short tags that drove the decision |
| claimed_* | string · what the caller claimed to be / know |
| request_type | string · normalized intent tag (e.g. payment, appointment_confirm, information) |
| money_request | bool · did the caller explicitly request payment |
| urgency_level | float 0-1 · how urgent the ask was framed |
| impersonation_suspicion | float 0-1 · likelihood the caller is impersonating someone |
| deepfake_or_synthetic_suspicion | float 0-1 · TTS/cloning heuristics |
| asks_for_sensitive_info | array · kinds of info requested (ssn, card, password, …) |
| channel | string · voice or sms (inferred) |
| 400 | Missing text or malformed JSON |
|---|---|
| 401 | Missing / invalid / revoked API key |
| 429 | Per-key rate limit exceeded. See Retry-After. |
| 502 | Upstream classifier unavailable. Retry with backoff. |
| 500 | Something broke on our side. Not billed. |
Usage is metered per successful request and billed monthly. Errors on our side (5xx) and rate-limited (429) calls are excluded. We invoice by calendar month; detailed daily breakdowns are available in your account manager's dashboard.
| Availability | 99.9% (rolling 30d) |
|---|---|
| p50 latency | < 400ms |
| p99 latency | < 1.2s |