Inspiration
Outbound voice AI is racing ahead of the law. Platforms can place a call in seconds; statutory collection rules were written for human dialers and carry $500–$1,500 per violation under the TCPA, with FDCPA and Regulation F layered on top. Operators are liable when the agent gets it wrong, not the software vendor.
Three things pointed at the same gap:
skills/ledger-collections-call in the CALL-E repo lists consumer FDCPA / statutory debt-collection engines under When Not To Use. That is the missing layer: something that decides whether the call may happen at all. apps/python/consent-gate (ConsentGate) covers adjacent pre-flight checks but excludes financial content by design. Collections need a gate built for that domain, with live revocation and tamper-evident proof. CALL-E design principles say never infer timezone from a phone number. The API has no recipient_timezone field on plan_call, so every integrator rebuilds the hardest part. This project makes that logic explicit, testable, and portable as an Agent Skill. The goal is not another dialer. It is the precondition lenders need before they let AI scale outbound collections.
What it does
A consent-and-compliance gate for AI collection calls that refuses with a named reason when a call would be unlawful, honors "stop calling me" live, and emits a tamper-evident record proving each call was lawful or provably refused.
How we built it
CALL-E (plan_call, run_call, get_call_run) Python 3.11, FastAPI, pytest Node.js 20+ (Agent Skill scripts, no npm dependencies) Agent Skills format (skills/cleared-to-call/) Deployed on Vercel
Challenges we ran into
We were trying to make calls from our local line to make calls.
Accomplishments that we're proud of
Submitting lol
What we learned
plan_call has no timezone field — integrators rebuild recipient-local-time logic; DST errors are liability. No structured opt-out on get_call_run — COMPLETED looks the same whether the person opted out or paid. No platform suppression list — each integration keeps its own DNC store. Consent is invisible to the platform — nothing in the plan records why this number may be called. MCP vs REST payload shapes differ — structured_content vs JSON in content broke our first live runs. DECLINED with zero duration — carrier rejection reads like the callee hung up; dangerous for legal records. Transcript speaker labels are undocumented — opt-out detection depends on knowing which label is the recipient.
What's next for cleared to call
After result we would decide that, but let just say that this is something we can integrate to our solution .
Built With
- call-e
- python
- typescript
Log in or sign up for Devpost to join the conversation.