Observed since 21 Oct, 11:11 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Landline Scrubber core library - phone verification and DNC checking
Core Python library for Landline Scrubber -- phone number verification, line-type detection, DNC registry checking, and bulk processing with caching.
| Role | Document |
|---|---|
| Agent context and architecture constraints | CLAUDE.md |
| CI pipeline and shipping workflow | CLAUDE.md ("CI pipeline" / "Shipping a change") |
| Compliance overrides | .github/.ai-compliance.yaml |
Reports are published to GitHub Pages when a push to
maincuts a release.
| Report | Link |
|---|---|
| API Documentation | pdoc reference |
| Test Coverage | HTML coverage report |
| Test Results | Unit test results |
| Security Scans | Bandit, pip-audit |
| License Compliance | Dependency license report |
| PyPI Package | pypi.org/project/ai-lls-lib |
This project uses AI-assisted development. You do not need to memorize git commands or CI configuration -- your AI agent handles that.
git clone https://github.com/Augmenting-Integrations/ai-lls-lib.git
cd ai-lls-lib
uv sync --all-extras
uv run pytest -m "not integration" -v # Unit tests
uv run pre-commit run --all-files # Lint + format + type check
uv run mypy src/ # Type checking
Contributions are made through AI agents (Claude Code, Copilot, etc.). You describe what you want changed in plain language; the agent handles branching, coding, testing, and submitting a pull request.
main through a PR.main, the pipeline runs integration tests against the
persistent ai-lls-lib-test stack, then semantic-release cuts a version
from the commit messages. A release publishes the package to PyPI and
deploys documentation to GitHub Pages.main is the only branch with an active deploy trigger --
.github/workflows/publish.yaml runs on: push: branches: [main], and
there is no dev branch in this repo today.
| Push to | Always deploys | Deploys on release only |
|---|---|---|
main | Redeploys the persistent ai-lls-lib-test SAM stack (test infrastructure) and re-runs integration tests. | Publishes the package to PyPI and deploys API docs / coverage / security / compliance reports to GitHub Pages, but only when semantic-release determines the commits warrant a version bump. |
There is no separate staging branch or environment.
from ai_lls_lib import PhoneVerifier, DynamoDBCache
cache = DynamoDBCache(table_name="phone-cache")
verifier = PhoneVerifier(cache)
result = verifier.verify("+15551234567")
print(f"Line type: {result.line_type}") # mobile, landline, voip, unknown
print(f"DNC: {result.dnc}") # True/False
print(f"Litigator: {result.known_litigator}") # True/False (known TCPA litigator)
print(f"Cached: {result.cached}") # True/False
from ai_lls_lib import BulkProcessor, PhoneVerifier, DynamoDBCache
cache = DynamoDBCache(table_name="phone-cache")
verifier = PhoneVerifier(cache)
processor = BulkProcessor(verifier)
csv_text = "name,phone\nJohn,+15551234567\nJane,+15551234568"
results = processor.process_csv(csv_text)
results_csv = processor.generate_results_csv(csv_text, results)
ai-lls verify phone +15551234567 --stack landline-api
ai-lls verify bulk input.csv -o output.csv --stack landline-api
ai-lls cache stats --stack landline-api
ai-lls admin user-credits user123 --add 100
ai-lls admin api-keys --user user123
The library reads these variables only when the corresponding constructor
argument is omitted (LANDLINE_REMOVER_API_KEY has no constructor argument
and is always read from the environment). ai-lls-api sets them in its
template.yaml.
| Variable | Read by | Description |
|---|---|---|
LANDLINE_REMOVER_API_KEY | ExternalAPIProvider | landlineremover.com API key |
AWS_REGION | CLI AWSClient, boto3 | AWS region (default: us-east-1) |
CREDITS_TABLE | CreditManager, AdminService | DynamoDB credits table |
API_KEYS_TABLE | LegacyApiKeyService | DynamoDB legacy API-key table |
MANAGED_API_KEYS_TABLE | ManagedApiKeyService | DynamoDB managed API-key table |
FILES_TABLE | FileService | DynamoDB file-metadata table |
USER_POOL_ID | AdminService | Cognito user pool |
STRIPE_SECRET_KEY | StripeManager | Stripe secret key |
ENVIRONMENT | StripeManager | Deployment name, staging or prod (default: staging) |
LLS_BULK_MAX_WORKERS | BulkProcessor | Worker threads for bulk verification (default: 10) |
LLS_PROVIDER_MAX_RETRIES | ExternalAPIProvider | Retries per vendor call (default: 3) |
LLS_PROVIDER_RETRY_AFTER_CAP_SECONDS | ExternalAPIProvider | Longest wait a vendor Retry-After header can impose (default: 60) |
LLS_PROVIDER_RATE_LIMIT_PER_SECOND | ExternalAPIProvider | Outbound rate limit; 0 disables (default: 0) |
LLS_PROVIDER_BREAKER_THRESHOLD | ExternalAPIProvider | Consecutive failures that open the circuit (default: 5) |
src/ai_lls_lib/
├── __init__.py # Public exports, version
├── common.py # DecimalEncoder, extract_area_code
├── key_management.py # Managed API-key hashing and generation helpers
├── core/ # PhoneVerifier, BulkProcessor, DynamoDBCache, models
├── auth/ # API Gateway authorizer-context parsers
├── apikeys/ # ManagedApiKeyService, LegacyApiKeyService
├── files/ # FileService
├── payment/ # StripeManager, CreditManager
├── admin/ # AdminService
├── providers/ # ExternalAPIProvider (landlineremover.com)
└── cli/ # ai-lls command-line interface
scripts/ at the repo root holds manual operator scripts. They are not part
of the package and are never run from CI.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 3.18.5 | 2 Oct 2026 | 24 |
This describes our collected data; it is not a security assessment.
Observed since 21 Oct, 11:11 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:df48af715f4ab2fb6288eb22bd48e8a55cb673b36e6790102d47b7a7d593b86e