Risk API
The Risk API fuses the anti-fraud detectors already running across your Orbit account into one composite verdict you can query before committing spend on an SMS send or a call. It answers a single question — “is this destination safe to reach right now?” — without you having to call each detector yourself and reconcile the scores.- Live SMS-pumping / artificial-traffic score — always computed from destination-prefix patterns, recent send velocity, delivery-conversion rate, and geo-spread.
- URL/link-reputation score — computed automatically whenever you pass a
message_body, by scanning every URL in it. - Verify Fraud Guard and Voice Biometrics scores — optional pass-through inputs from your own session-level checks, folded into the composite when supplied.
/api/v1/risk
Authentication: API key (X-API-Key) or session JWT.
Rate limit: 120 requests/minute per tenant.
When to call it
Call/api/v1/risk/score at the point you’d otherwise commit spend:
- Before an outbound SMS/WhatsApp send to a destination you haven’t messaged before.
- Before dialing a destination that has flagged in your delivery reports.
- Alongside a Verify OTP send, passing along the Fraud Guard score you already computed for that session so it’s folded into one number.
- Alongside a Voice Biometrics challenge, passing its score the same way.
Request body
score in either pass-through object is an integer 0-100; reasons is up to 20 short
strings (≤200 chars each), echoed back inside the channel breakdown.
Scenario 1 — score-only lookup
The smallest useful call: a destination and a channel, nothing else. The SMS-pumping detector is the only signal present unless you supply more, so the composite equals that detector’s score.-
score— 0-100 composite, always the worst present channel score (never averaged down, so one bad signal can’t be diluted by clean ones). Here onlysms_pumpingwas present, so the composite equals its 8. -
band— coarse read of the score. The cutoffs are the same ones the SMS-pumping scorer uses, so a band means the same thing on this composite as it does on the single-channel signals: -
recommendation— advisory only:allow,review, orblock. Onlyhighandcriticalmove it offallow. -
channels— full transparency breakdown, always in the same four-entry order. A channel withpresent: falsecontributed ascoreof0— it never invents risk for a signal you didn’t supply. -
meta.request_id— echo this in support tickets; it ties the verdict to the exact signals that produced it.
Scenario 2 — pre-send guard with Verify and Voice signals
When you’ve already run a Verify Fraud Guard check or a Voice Biometrics challenge for this session, pass their scores through instead of reconciling four numbers yourself. The composite takes the worst present signal — supply a high Verify score and the recommendation flips.allow to review:
Without pass-through signals (destination + channel only):
verify_signal and voice_biometrics_signal supplied:
max(channel scores), not an average — the low
voice_biometrics 12 doesn’t pull the 62 down — and your reasons strings come back
verbatim on the channel entry, so drill-down views can attribute the flip to Fraud Guard
without a second call.
Scenario 3 — message-body URL scan
Passmessage_body and every URL in it is reputation-scanned live — the body-level score is
the worst-scoring URL, and that score enters the composite as a fourth channel. A body with
two links scans both; the clean one can’t dilute the bad one.
url_reputation entry carries the per-URL view: score is the worst URL’s score and
reasons is that URL’s finding codes — here the scanner fired on a brand token
(royalmail) that isn’t the URL’s actual registrable domain, a commonly-abused .top TLD,
plain http://, and smishing lure keywords (verify, confirm, customs, delivery).
At 85 the composite crosses the 80+ critical cutoff and the recommendation becomes
block. The second, legitimate royalmail.com link scored clean — both URLs were scanned,
and the worst one wins.
Bodies cap at 25 distinct URLs per scan and every URL in the body counts; URL-scoring
has weight against phishing/smishing patterns specifically, so run this check whenever your
send template includes user-supplied links.
Acting on a band: hold or block recommendation
The verdict is yours to enforce — Risk returns a recommendation only. Treat recommendation: "block" (80+, or high if you prefer caution) as “hold this send / call for review” in your
own send flow. Common follow-ups:
- Hold and re-check later — SMS-pumping velocity spikes decay; re-query the same destination after a quieter window rather than dropping the recipient permanently.
- Route through Frequency Caps — your tenant-owned per-recipient send caps keep review-queue destinations from receiving anything until you release them.
- Add the destination to Message Suppression — your tenant-owned opt-out/block list, when a recipient should stop receiving traffic entirely.
- Check Number Intelligence — per-number reputation/fraud lookups outside the send path, when you want more context than the composite gives.
See also
- Verify API — OTP fraud-guard scoring you can pass in as
verify_signal - Voice Biometrics — caller-verification scoring you can pass in as
voice_biometrics_signal - Number Intelligence — per-number reputation/fraud lookups outside the send path