Skip to content

API documentation

OpenAPI spec →

Build scam detection into your app. 450+ signals, 50ms scoring, 99.5% uptime.

Try it live

suss.API SandboxFree tier: 100 req/month, no key needed

Authentication

Include your API key in the x-api-key header. The free tier (100 req/month) works without a key for testing.

curl https://suss-api-353192091596.us-central1.run.app/api/score \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{"text": "Is this a scam?"}'
Security: Never expose your API key in client-side code. Make API calls from your backend.

Endpoints

POST/api/score

Score text for scam probability with full intelligence (signals, guidance, company/domain reputation)

Parameters

NameTypeRequiredDescription
textstringrequiredMessage text to analyze (max 10,000 chars)
urlstringoptionalURL for domain reputation analysis
channelstringoptionalScoring channel: sms, email, marketplace, social, chat (adjusts thresholds)
image_urlstringoptionalImage URL for OCR + visual intelligence
titlestringoptionalListing/email title (scored alongside text)
profilestringoptionalProtection profile: relaxed, balanced, maximum, family, seller
conversation_contextobjectoptionalMulti-turn context for DM/chat scoring

Request

{
  "text": "Congratulations! You've won a $1000 gift card. Click here to claim: bit.ly/free-prize",
  "url": "https://example.com/listing",
  "channel": "marketplace"
}

Response

{
  "score": 0.92,
  "bucket": "HIGH",
  "reasons": [
    "lottery_prize_scam",
    "urgency_language",
    "suspicious_url"
  ],
  "category": "consumer_fraud",
  "ml_prob": 0.89,
  "confidence": "high",
  "detected_language": "en",
  "guidance": {
    "primary_concern": "This is a prize/lottery scam",
    "main_action": "Do not click any links or provide personal information"
  },
  "contextual_guidance": {
    "what": "Someone is trying to lure you with a fake prize",
    "so_what": "Prize scams collected $301M from victims in 2024 (FTC data)",
    "now_what": [
      "Do not click the link",
      "Block the sender",
      "Report to FTC at reportfraud.ftc.gov"
    ],
    "verdict_summary": "This is very likely a scam — you cannot win a lottery you did not enter"
  },
  "embedding_signals": {
    "risk_signals": [
      "lottery_prize_scam",
      "urgency_language"
    ],
    "legitimacy_signals": []
  }
}
POST/api/score/batch

Score up to 25 items in one request. Returns array of results.

Parameters

NameTypeRequiredDescription
itemsarrayrequiredArray of objects, each with text (required) + optional url, channel, title

Request

{
  "items": [
    {
      "text": "Hey, I'm selling a PS5 for $100. Venmo only."
    },
    {
      "text": "Your package is ready for pickup at the post office."
    }
  ]
}

Response

{
  "results": [
    {
      "score": 0.78,
      "bucket": "HIGH",
      "reasons": [
        "too_good_to_be_true",
        "unprotected_payment"
      ]
    },
    {
      "score": 0.08,
      "bucket": "LOW",
      "reasons": []
    }
  ]
}
GET/api/domain/quick/{domain}

Quick domain trust check — WHOIS age, registrar, Tranco rank, risk signals

Parameters

NameTypeRequiredDescription
domainpathrequiredDomain name to check (e.g., example.com)

Response

{
  "domain": "sketchy-deals.xyz",
  "age_days": 5,
  "registrar": "NameCheap",
  "risk_level": "high",
  "tranco_rank": null,
  "signals": [
    "new_domain",
    "privacy_protected",
    "suspicious_tld"
  ]
}
POST/feedback

Submit user feedback on a score result (thumbs up/down). Feeds active learning pipeline.

Parameters

NameTypeRequiredDescription
submission_idstringrequiredThe submission ID from a /score response
votestringrequired"up" (correct) or "down" (incorrect)
reasonstringoptionalFeedback reason: false_positive, false_negative, wrong_category
notesstringoptionalFree-text notes

Request

{
  "submission_id": "abc-123-def",
  "vote": "down",
  "reason": "false_positive",
  "notes": "This was a legitimate newsletter"
}

Response

{
  "status": "ok",
  "message": "Feedback recorded"
}
POST/ocr

Upload an image for OCR text extraction + scam scoring. Supports JPEG, PNG, WebP.

Parameters

NameTypeRequiredDescription
filefilerequiredImage file (multipart/form-data)

Request

multipart/form-data with 'file' field (image/jpeg, image/png, image/webp, max 10MB)

Response

{
  "text": "URGENT: Your account has been compromised. Call 1-800-SCAM-NOW",
  "score": 0.85,
  "bucket": "HIGH",
  "signals": [
    "tech_support_callback_scam",
    "urgency_language"
  ]
}

Channel-aware scoring

Pass a channel field for optimized detection thresholds. Each channel adjusts sensitivity for its context.

ChannelThresholdUse case
sms0.25Short messages, high scam prevalence
email0.35Email with more context
marketplace0.40Listings mixed with legit commerce
social0.30Social media DMs
chat0.30Real-time messaging (WhatsApp, Messenger)
checkout0.40Checkout/payment pages

Webhooks

Register a webhook URL to receive real-time notifications instead of polling. All webhooks are signed with HMAC-SHA256 for authenticity verification.

Events

EventDescription
enrichment.completeFull analysis complete (image, domain, company intelligence)
score.high_riskA HIGH-risk score was detected
visual_match.foundKnown scam image matched via pHash
feedback.receivedUser submitted feedback on a score

Payload example

{
  "event": "score.high_risk",
  "timestamp": "2026-02-21T12:00:00Z",
  "data": {
    "submission_id": "abc-123",
    "score": 0.92,
    "bucket": "HIGH",
    "signals": [
      "ceo_urgent_wire",
      "wire_transfer_pressure"
    ],
    "category": "enterprise_fraud"
  }
}

Verifying signatures

import hmac, hashlib

def verify_webhook(payload: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(
        secret.encode(), payload, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(f"sha256={expected}", signature)

Pricing tiers

Free
$0
100 requests/month
10/min rate limit
Core scoring, 450+ signals
Starter
$29/mo
1,000 requests/month
30/min rate limit
+ batch scoring, webhooks
Growth
$99/mo
10,000 requests/month
60/min rate limit
+ image intelligence, priority support
Scale
$299/mo
100,000 requests/month
120/min rate limit
+ SLA, dedicated support, custom signals

Error codes

StatusMeaningResolution
200Success-
400Bad requestCheck request body format
401UnauthorizedCheck your API key
429Rate limitedWait and retry, or upgrade tier
500Server errorRetry with exponential backoff
Get your API keyFree tier: 100 requests/month, no credit card required