Spam + Robocall Mitigation: CallSphere vs Vapi Reputation Systems
STIR/SHAKEN, branded calling, opt-in lists, carrier reputation. How CallSphere builds outbound trust vs Vapi defaults. Real-world spam-flag remediation.
TL;DR
If your outbound calls show "Spam Likely" on the recipient's screen, your campaign is dead before the agent says hello. Vapi delegates STIR/SHAKEN attestation and reputation to your underlying telephony provider — workable, but you wear the strategy. CallSphere runs a layered outbound trust pipeline: STIR/SHAKEN A-attestation through Twilio, branded calling enrollment with Hiya/First Orion/TNS, opt-in list hygiene, dial pacing per number, and a reputation feedback loop that retires "burned" caller IDs.
This is the playbook every voice AI vendor should be running but most aren't.
Why Spam Flags Happen
Carriers flag your calls based on:
- Reputation score — Hiya, First Orion, TNS, YouMail each maintain their own; they look at call volume, complaint rate, answer rate, call duration, and pattern velocity
- STIR/SHAKEN attestation level — A (full), B (partial), C (gateway). Calls with C attestation or no attestation get treated harshly
- Carrier blocklists — outbound dialers that exceed certain volumes from a single number get added to dynamic blocklists
- Recipient feedback — "Report Spam" buttons feed real-time reputation updates
- Number-type mismatches — calling consumer phones from a number registered as commercial enterprise
A single weekend of careless dialing can burn a number's reputation for weeks.
Vapi Robocall Mitigation Approach
Vapi provisions phone numbers via Twilio (default) or BYO. You inherit:
- Twilio's STIR/SHAKEN A-attestation if the number is verified
- Whatever reputation each number has accumulated
Vapi does not, as a platform feature:
- Enroll your numbers in branded calling networks
- Track per-number reputation across calls
- Auto-rotate burned numbers
- Pace dial rate to maintain reputation
You can do all of this yourself; Vapi just hosts the assistant logic.
CallSphere Outbound Trust Pipeline
CallSphere ships outbound trust as a first-class platform feature. Components:
1. STIR/SHAKEN A-Attestation
Every outbound number is verified through Twilio's CNAM and STIR/SHAKEN flow. A-attestation requires:
- The CallSphere tenant owns or controls the number
- The number is associated with a verified business
- The call is being placed from infrastructure with cryptographic identity
async def provision_number(tenant_id: str, area_code: str):
number = await twilio.incoming_phone_numbers.create(
area_code=area_code,
sms_application_sid=tenant.sms_app_sid,
voice_application_sid=tenant.voice_app_sid,
)
# Set up A-attestation
await twilio.trusted_communications.business_profiles.create(
business_name=tenant.legal_name,
ein=tenant.ein,
...
)
await twilio.trusted_communications.cnam_registrations.create(
phone_number=number.phone_number,
cnam_value=tenant.display_name,
)
return number
2. Branded Calling Enrollment
CallSphere enrolls numbers with three reputation networks:
- Hiya Connect — covers AT&T, T-Mobile, Sprint
- First Orion ENGAGE — covers Verizon, US Cellular
- TNS Verified Calls — covers some US Cellular variants
Each enrollment delivers branded display ("CallSphere — Healthcare Reminder") on the recipient's lock screen, dramatically lifting answer rates.
See AI Voice Agents Handle Real Calls
Book a free demo or calculate how much you can save with AI voice automation.
async def enroll_branded(number: str, brand: BrandConfig):
await hiya.brands.create(number=number, brand=brand)
await first_orion.engage.register(number=number, brand=brand)
await tns.verified_calls.enroll(number=number, brand=brand)
Initial enrollment takes 5-10 business days; after that, branded display is live and refreshed nightly.
3. Opt-In List Hygiene
Before any number is dialed, CallSphere's outbound system verifies:
- The recipient is on the tenant's opt-in list with a timestamped consent record
- The recipient is not on the FTC DNC registry (refreshed daily)
- The recipient is not on the tenant's internal suppression list (post-call opt-outs)
- The call falls within TCPA-permitted hours for the recipient's timezone
async def can_dial(lead: Lead, campaign: Campaign) -> tuple[bool, str | None]:
if not lead.has_opt_in_for(campaign.purpose):
return False, "no_opt_in"
if await ftc_dnc.is_listed(lead.phone):
return False, "ftc_dnc"
if await tenant_suppression.is_listed(lead.phone, campaign.tenant_id):
return False, "tenant_suppression"
local = lead.local_time()
if not (8 <= local.hour < 21):
return False, "outside_tcpa_hours"
return True, None
4. Dial Pacing per Number
Each outbound number has a pacing budget. Default in the Sales platform is 5 concurrent calls and 40 calls per hour per number. Above this, the system rotates to the next number in the pool.
This is the single biggest reputation lever — carriers flag burst dialers, not steady ones.
5. Reputation Feedback Loop
Every 30 minutes, CallSphere polls Hiya / First Orion / TNS APIs for reputation status of active outbound numbers. If a number is flagged:
- Mark as quarantined
- Drop pacing to 0 immediately
- Open a remediation ticket
- Provision a backup number from the warm pool
- Investigate the burn pattern (volume spike? complaint cluster?)
async def reputation_sync():
while True:
for number in active_outbound_numbers():
score = await fetch_reputation(number)
if score.status == "flagged":
await quarantine(number)
await notify_oncall(number, score.reason)
await activate_backup_from_pool(number.tenant_id)
await asyncio.sleep(30 * 60)
6. Automatic Number Rotation
CallSphere maintains a warm pool of provisioned but lightly-used numbers per tenant. When a primary number quarantines, a warm pool number takes over within 60 seconds — the campaign continues without manual intervention.
Vapi vs CallSphere Spam Mitigation Comparison
| Dimension | Vapi | CallSphere |
|---|---|---|
| STIR/SHAKEN attestation | Inherited from Twilio | Verified A-attestation |
| Branded calling | DIY | Hiya + First Orion + TNS |
| Opt-in list verification | DIY | Built-in TCPA + DNC |
| Dial pacing | DIY | Built-in 5 concurrent / 40 per hour |
| Reputation polling | None | Every 30 min, 3 networks |
| Auto-quarantine | None | Yes |
| Warm pool rotation | None | Yes, 60s failover |
| Per-tenant suppression | DIY | Built-in |
| Remediation tooling | External | Internal ticket + dashboard |
Outbound Trust Pipeline
graph TB
Lead[Lead in campaign] --> OptIn{Opt-in valid?}
OptIn -->|no| Skip[Skip and log]
OptIn -->|yes| DNC{FTC DNC?}
DNC -->|yes| Skip
DNC -->|no| Hours{TCPA hours?}
Hours -->|no| Defer[Defer to next window]
Hours -->|yes| Pace{Number pace OK?}
Pace -->|no| Rotate[Rotate to next number]
Pace -->|yes| Pick[Pick number from active pool]
Rotate --> Pick
Pick --> Dial[Dial via Twilio]
Dial --> AMD[AMD cascade]
AMD --> Live[Live conversation or VM]
Live --> Outcome{Outcome}
Outcome -->|complaint| Suppress[Add to tenant suppression]
Outcome -->|opt_out| Suppress
Outcome -->|booked| Success[Log success]
RepLoop[Reputation poll<br/>every 30 min] -->|flagged| Quarantine[Quarantine number]
Quarantine --> Backup[Activate warm pool backup]
Backup --> Pick
Real Remediation Story
A Sales platform tenant ran 4000 outbound dials in 48 hours from a single number, hit a Hiya flag, and saw answer rates collapse from 22% to 4%. The CallSphere reputation loop caught it within 30 minutes:
- Quarantine triggered, pacing dropped to 0
- Warm pool backup activated, campaign resumed within 90s
- Investigation showed pacing config was overridden manually for that campaign
- Pacing config locked, alert sent to tenant admin
- Original number entered remediation: pace at 5/hour for two weeks while reputation recovered
- Hiya score recovered after 12 days; number returned to active pool
Total impact on the campaign: ~90 seconds of paused dialing, no campaign-level damage.
Practical Tips
- Never run more than 40 calls/hour from a single number. Even if you have permission and good lists.
- Enroll for branded calling before your first dial. Retro-enrolling a burned number is much harder.
- Maintain a warm pool of 3 numbers per active number. That ratio absorbs most flags.
- Refresh DNC daily. Stale DNC data is a fast track to TCPA litigation.
- Log every "Press 9 to opt out" press. That is your strongest legal defense.
FAQ
Can I bring my own numbers to CallSphere?
Yes — BYO numbers are supported. CallSphere will register them with branded calling and STIR/SHAKEN, but you must maintain ownership of the underlying number.
How long does branded calling enrollment take?
5-10 business days for first-time enrollment. Existing brands re-using a number with a new tenant can be ~2 days.
Does this cover international outbound?
US/CA today. UK and EU are on the roadmap; the trust networks differ by region (e.g., UK uses CLI Verification rather than STIR/SHAKEN).
What is the cost overhead of branded calling?
Roughly $5-15/month per number per network. Three networks ≈ $30/month per outbound number.
Does a quarantined number ever come back?
Usually yes — quarantined numbers run at 5/hour for 2 weeks while reputation recovers, then re-enter active pool. Severely-flagged numbers are retired permanently.
Is there a way to test reputation before going live?
Yes — CallSphere ships a reputation_check CLI that queries all three networks for a given number and returns the current score breakdown.
Run a Trust-First Campaign
The /features page documents every layer of the outbound trust pipeline, and /demo lets you simulate an outbound campaign with real reputation data on test numbers.
Try CallSphere AI Voice Agents
See how AI voice agents work for your industry. Live demo available -- no signup required.