Composite trust & fraud risk check before a send
Orbit ships four independent fraud detectors, each answering its own slice of “is this destination about to cost me money”: SMS-pumping (artificial traffic) scoring, outbound URL reputation, Verify Fraud Guard on the OTP path, and Voice Biometrics anti-spoofing. Until now you had to query each one separately and reconcile four differently-banded numbers by hand.POST /api/v1/risk/score fuses them into one 0–100 composite verdict you can query before committing an SMS send, a campaign launch, or a call.
Everything on this page is advisory and read-only. Scoring never sends, routes, blocks, or modifies an outbound message — the Devotel softswitch remains the sole outbound path for every channel. The platform computes the verdict; the decision to act on it is yours.
1. Four siloed detectors, one composite
Each detector grew up behind its own surface with its own request and response shape:
The composite exists so a single pre-send check can see the whole picture. Two of the four components are always computed live for you — the SMS-pumping score and (when you supply a message body) the URL-reputation scan — because both are free, local lookups with no paid upstream call. The other two are accepted as pass-through scores (next section), because triggering them on your behalf would spend money or demand input you have not provided.
2. Request shape
Why the two pass-through fields exist instead of the endpoint querying those detectors itself: a Verify Fraud Guard evaluation spends a paid number-intelligence lookup, and a Voice Biometrics score requires a captured audio sample. Neither may be triggered silently on your behalf from a scoring endpoint. If you already ran either check this session, fold its score in here and get one composite decision; if you have not run one, omit the field — a missing channel contributes nothing rather than inventing risk.
The endpoint authenticates with the
messages:read or messages:write scope and is rate-limited to 120 requests per minute per tenant. A malformed body returns a 422 naming the offending field.
3. Interpreting the composite
Every response returns the same three top-level fields, plus a per-channel breakdown:score— the composite risk score, 0 (clean) to 100 (certain block). It is the maximum of the present channels — the worst signal wins. A message flagged on any single channel surfaces instead of being averaged back tolow, and a destination with no signal at all returns a clean 0 rather than a misleading average.band— the score bucketed: below 25low, 25–49elevated, 50–79high, 80+critical. These are the same cut-offs the standalone SMS-pumping scorer uses, so a band means the same thing onPOST /messages/risk-signalsand here.recommendation— the mapped advisory action:allowforlow/elevated,reviewforhigh,blockforcritical.channels— one entry per detector (sms_pumping,url_reputation,verify_fraud,voice_biometrics) withpresent, that channel’s ownscore, and its machine-readablereasons. The composite is never a black box: the entry driving it is the one withpresent: trueand the highest score.
present: false and contributes nothing.
4. Gate pattern — score the audience before a campaign dry-run
Use the composite before a launch, not after a bill. The natural gate combines two read-only calls: the launch dry-run tells you the audience and cost picture; the composite tells you whether the destinations in that audience are worth sending to. Worked pre-launch gate:- Dry-run the campaign —
POST /api/v1/campaigns/{id}/dry-runreturns the resolved audience size, the deliverable / suppressed / opted-out breakdown, projected cost against the wallet, and aready_to_launchverdict. It never mutates state and never touches the wallet. - Score a sample of the audience — call
POST /risk/scorefor each sampled destination with the campaign’s channel and message body. - Decide — launch only if the dry-run reports
ready_to_launch: trueand no sampled destination lands in your block threshold.
Node.js — pre-launch gate
recommendation, and only then dispatch. allow — proceed; review — queue for a human when the send is high-value; block — suppress the destination and log the decision. Enforcement always stays in your code; the endpoint only advises.
5. Channel examples
Thechannel value selects which velocity aggregate the SMS-pumping leg reads — set it to the channel you are actually about to use.
SMS (the default):
POST /verify/send:
6. Limits and caveats
- Read-only and advisory. The endpoint never dispatches, routes, or blocks anything. Outbound SMS and voice exit only through the Devotel softswitch; a
blockrecommendation suppresses nothing until your own send code acts on it. - Tenant-owned decision. Thresholds, sampling, and what
reviewmeans operationally are your configuration. If you want the platform to enforce a terminal allow / review / block decision, configure Fraud Shield on the messaging side or Fraud Guard on the Verify side — those are separate tenant-owned controls; this endpoint only scores. - No pass-through re-querying.
verify_signalandvoice_biometrics_signalare never re-evaluated server-side — supply scores you already hold from this session, or omit them. - Absent channel, no invented risk. A channel you did not supply (or a message body you did not send) reports
present: falseand counts as zero. An all-absent input returnsscore: 0, band: "low", not an error. - Score scope. The composite reflects the detectors listed above. A clean verdict is not a deliverability guarantee — it says nothing flagged on the fraud axes the platform measures.