ScamVerify™
Use Cases

Contact Center Compliance

Use the ScamVerify™ API for TCPA compliance, DNC list checking, lead quality scoring, and inbound call screening in contact center operations.

Contact centers face regulatory and fraud risks on both inbound and outbound calls. The ScamVerify™ API helps you screen leads before dialing, verify inbound callers, and maintain TCPA compliance with data from 2.79M+ FTC complaint records.

Use Cases

Outbound: Lead List Scoring

Before loading leads into your dialer, score every phone number to avoid calling numbers with active FTC complaints, known robocall associations, or disconnected lines.

Inbound: Caller Screening

When a call comes in, look up the caller's number to identify potential scam callers, spoofed numbers, or known bad actors before routing to an agent.

Compliance: DNC Cross-Reference

Cross-reference your dial lists against FTC Do Not Call complaint data. Numbers with active complaints carry higher regulatory risk.

Batch Processing for Lead Lists

Use the batch endpoint to score an entire lead list in a single request (up to 100 numbers per batch).

async function scoreLeadList(phoneNumbers) {
  const response = await fetch('https://scamverify.ai/api/v1/batch/phone', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.SCAMVERIFY_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      items: phoneNumbers.map(number => ({ phone_number: number })),
    }),
  });

  const result = await response.json();

  // Categorize leads by risk
  const approved = [];
  const flagged = [];
  const rejected = [];

  for (const item of result.results) {
    if (item.error) {
      flagged.push({ phone: item.phone_number, reason: item.error });
      continue;
    }

    if (item.risk_score >= 60) {
      rejected.push({
        phone: item.phone_number,
        score: item.risk_score,
        reason: item.explanation,
      });
    } else if (item.signals.ftc_complaints > 0 || item.signals.robocall_detected) {
      flagged.push({
        phone: item.phone_number,
        score: item.risk_score,
        ftcComplaints: item.signals.ftc_complaints,
      });
    } else {
      approved.push({
        phone: item.phone_number,
        score: item.risk_score,
        lineType: item.signals.line_type,
      });
    }
  }

  return { approved, flagged, rejected };
}

// Process a lead file in chunks of 50
async function processLeadFile(allNumbers) {
  const results = { approved: [], flagged: [], rejected: [] };

  for (let i = 0; i < allNumbers.length; i += 50) {
    const chunk = allNumbers.slice(i, i + 50);
    const chunkResults = await scoreLeadList(chunk);

    results.approved.push(...chunkResults.approved);
    results.flagged.push(...chunkResults.flagged);
    results.rejected.push(...chunkResults.rejected);
  }

  return results;
}
import requests
import os

def score_lead_list(phone_numbers: list[str]) -> dict:
    response = requests.post(
        "https://scamverify.ai/api/v1/batch/phone",
        headers={
            "Authorization": f"Bearer {os.environ['SCAMVERIFY_API_KEY']}",
            "Content-Type": "application/json",
        },
        json={
            "items": [{"phone_number": n} for n in phone_numbers]
        },
    )
    response.raise_for_status()
    result = response.json()

    approved, flagged, rejected = [], [], []

    for item in result["results"]:
        if "error" in item:
            flagged.append({"phone": item["phone_number"], "reason": item["error"]})
            continue

        if item["risk_score"] >= 60:
            rejected.append({
                "phone": item["phone_number"],
                "score": item["risk_score"],
                "reason": item["explanation"],
            })
        elif item["signals"]["ftc_complaints"] > 0 or item["signals"]["robocall_detected"]:
            flagged.append({
                "phone": item["phone_number"],
                "score": item["risk_score"],
                "ftc_complaints": item["signals"]["ftc_complaints"],
            })
        else:
            approved.append({
                "phone": item["phone_number"],
                "score": item["risk_score"],
                "line_type": item["signals"]["line_type"],
            })

    return {"approved": approved, "flagged": flagged, "rejected": rejected}

Inbound Call Screening

For real-time inbound screening, use the single phone lookup endpoint. Cached results return in under 100ms, so you can screen callers before routing.

async function screenInboundCall(callerNumber) {
  const response = await fetch('https://scamverify.ai/api/v1/phone/lookup', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.SCAMVERIFY_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ phone_number: callerNumber }),
  });

  const result = await response.json();

  return {
    shouldRoute: result.verdict !== 'critical' && result.verdict !== 'high_risk',
    riskLevel: result.verdict,
    score: result.risk_score,
    isRobocaller: result.signals.robocall_detected,
    carrier: result.signals.carrier,
    lineType: result.signals.line_type,
  };
}

Lead Quality Scoring Matrix

SignalQuality ImpactAction
line_type: "mobile"Best. Real person, likely reachable.Prioritize in dialer queue
line_type: "landline"Good. Residential or business line.Standard priority
line_type: "voip"Mixed. Could be legitimate or disposable.Check other signals before dialing
ftc_complaints > 0Risk. Number has regulatory complaint history.Remove from outbound lists
robocall_detectedHigh risk. Associated with automated calling.Do not dial
verdict: "critical"Confirmed bad actor or heavily reported number.Block and report to compliance

TCPA Compliance Considerations

ScamVerify™ data supplements but does not replace your DNC list obligations. You must still maintain your own internal DNC list, honor the National DNC Registry, and follow all TCPA requirements. The FTC complaint data in ScamVerify™ can help identify numbers with regulatory exposure, but it is not a substitute for full DNC compliance.

  • FTC complaint data is updated hourly. New complaints sync from the FTC Do Not Call Registry via automated feeds.
  • Numbers with FTC complaints carry higher regulatory risk. If someone has filed an FTC complaint about unwanted calls, contacting that number increases your exposure.
  • Log all screening decisions. Store the ScamVerify™ response alongside your call disposition records for compliance audits.

Quota Planning for Contact Centers

Contact centers typically process thousands of numbers daily. Choose a plan that matches your volume:

VolumeRecommended PlanMonthly Cost
Up to 1,000 lookups/monthStarter$149/mo
Up to 3,000 lookups/monthProfessional$499/mo
Up to 10,000 lookups/monthBusiness$1,499/mo
Up to 25,000 lookups/monthScale$2,999/mo
25,000+ lookups/monthEnterpriseCustom pricing

Cached lookups are free. If you look up the same number multiple times within 24 hours, subsequent lookups return cached data at no quota cost. This is especially useful for inbound screening where the same callers may call repeatedly.

On this page