ScamVerify

API Reference

Complete reference for all ScamVerify™ API endpoints with interactive playground.

The ScamVerify™ API provides 10 endpoints across 6 verification channels, plus batch processing and account management.

Every endpoint below includes request/response schemas, code examples in multiple languages, and an interactive playground where you can test with your API key.

Authentication

All endpoints except /status require a Bearer token:

Authorization: Bearer sv_live_your_api_key_here

Verification Endpoints

QR Codes

There are two ways to analyze a QR code:

Option 1: Upload the image directly (recommended). Send the QR code image to the dedicated QR endpoint. The server handles decoding and runs the full URL verification pipeline automatically.

curl -X POST https://scamverify.ai/api/v1/qr/analyze \
  -H "Authorization: Bearer sv_live_your_key" \
  -F "file=@qr-code.png"

Option 2: Decode locally and use URL Lookup. If you already have the decoded URL (e.g., from a camera SDK), you can skip the QR endpoint and send the URL directly.

# Python example: decode QR code locally and check the URL
import cv2
from pyzbar.pyzbar import decode
import requests

# Decode QR code from image
image = cv2.imread("qr-code.png")
decoded = decode(image)
url = decoded[0].data.decode("utf-8")

# Send to URL Lookup endpoint
response = requests.post(
    "https://scamverify.ai/api/v1/url/lookup",
    headers={"Authorization": "Bearer sv_live_your_key"},
    json={"url": url}
)
print(response.json()["verdict"])  # "dangerous", "high_risk", etc.
// Node.js example: decode QR code locally and check the URL
import jsQR from 'jsqr';
import sharp from 'sharp';

// Decode QR code from image file
const { data, info } = await sharp('qr-code.png')
  .ensureAlpha()
  .raw()
  .toBuffer({ resolveWithObject: true });

const qr = jsQR(new Uint8ClampedArray(data), info.width, info.height);
const url = qr?.data;

// Send to URL Lookup endpoint
const res = await fetch('https://scamverify.ai/api/v1/url/lookup', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer sv_live_your_key',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ url }),
});
const result = await res.json();
console.log(result.verdict); // "dangerous", "high_risk", etc.

Both options consume 1 URL quota when a URL is analyzed. Non-URL QR codes (phone numbers, email addresses, vCards) are decoded and returned without consuming quota.

Batch Endpoints

Account Endpoints

Response Format

All endpoints return JSON. Successful lookups include:

FieldDescription
risk_score0-100 integer (0 = safe, 100 = confirmed scam)
verdictsafe, low_risk, medium_risk, high_risk, or scam
confidence0.0 to 1.0 confidence level
explanationAI-generated plain-English risk assessment
signalsDetailed per-source signal breakdown
cachedWhether the result was served from cache

Error Format

All errors follow a consistent structure:

{
  "error": {
    "code": "validation_error",
    "message": "Invalid request body",
    "details": { "issues": [{ "field": "phone_number", "message": "Required" }] }
  }
}

See the Error Handling guide for all error codes and retry strategies.

On this page