Official BillionVerify Python SDK for email verification
Project description
billionverify
Official BillionVerify Python SDK for email verification.
Documentation: https://billionverify.com/docs
Installation
pip install billionverify
Quick Start
from billionverify import BillionVerify
client = BillionVerify(api_key="your-api-key")
# Verify a single email
result = client.verify("user@example.com")
print(result.status) # 'valid', 'invalid', 'unknown', 'risky', 'disposable', 'catchall', 'role'
print(result.is_deliverable) # True or False
Configuration
client = BillionVerify(
api_key="your-api-key", # Required
base_url="https://api.billionverify.com/v1", # Optional
timeout=30.0, # Optional: Request timeout in seconds (default: 30)
retries=3, # Optional: Number of retries (default: 3)
)
Single Email Verification
Uses the /verify/single endpoint:
result = client.verify(
email="user@example.com",
check_smtp=True, # Optional: Perform SMTP verification (default: True)
)
# Flat response structure
print(result.email) # 'user@example.com'
print(result.status) # 'valid', 'invalid', 'unknown', 'risky', 'disposable', 'catchall', 'role'
print(result.score) # 0.95
print(result.is_deliverable) # True
print(result.is_disposable) # False
print(result.is_catchall) # False
print(result.is_role) # False
print(result.is_free) # True
print(result.domain) # 'example.com'
print(result.reason) # 'Valid email address'
print(result.smtp_check) # True (whether SMTP was performed)
print(result.credits_used) # 1
Bulk Email Verification (Synchronous)
Verify up to 50 emails synchronously using verify_bulk():
# Synchronous bulk verification (max 50 emails)
response = client.verify_bulk(
emails=["user1@example.com", "user2@example.com", "user3@example.com"],
check_smtp=True, # Optional
)
# Returns BulkVerifyResponse directly
print(f"Total: {response.total}")
print(f"Credits used: {response.credits_used}")
for result in response.results:
print(f"{result.email}: {result.status}")
print(f" Deliverable: {result.is_deliverable}")
print(f" Disposable: {result.is_disposable}")
print(f" Catchall: {result.is_catchall}")
print(f" Role: {result.is_role}")
File Upload (Async Verification)
For large lists, use upload_file() for asynchronous file verification:
# Upload a file for async verification
job = client.upload_file(
file_path="emails.csv",
check_smtp=True,
email_column="email", # Column name for CSV files
preserve_original=True, # Keep original columns in results
)
print(f"Job ID: {job.job_id}")
print(f"Status: {job.status}")
# Get job status (with optional long-polling)
status = client.get_file_job_status(
job_id=job.job_id,
timeout=60, # Long-poll for up to 60 seconds (0-300)
)
print(f"Progress: {status.progress_percent}%")
# Wait for completion (polling)
completed = client.wait_for_file_job(
job_id=job.job_id,
poll_interval=5.0, # seconds
max_wait=600.0, # seconds
)
# Get results with filter options
results = client.get_file_job_results(
job_id=job.job_id,
limit=100,
offset=0,
valid=True, # Include valid emails
invalid=True, # Include invalid emails
unknown=True, # Include unknown emails
risky=True, # Include risky emails
disposable=True, # Include disposable emails
catchall=True, # Include catch-all emails
role=True, # Include role-based emails
)
for item in results.results:
print(f"{item.email}: {item.status}")
Async Support
import asyncio
from billionverify import AsyncBillionVerify
async def main():
async with AsyncBillionVerify(api_key="your-api-key") as client:
# Single verification
result = await client.verify("user@example.com")
print(result.status)
# Bulk verification
response = await client.verify_bulk([
"user1@example.com",
"user2@example.com"
])
for r in response.results:
print(f"{r.email}: {r.status}")
asyncio.run(main())
Health Check
Check API health status (no authentication required):
health = client.health_check()
print(health.status) # 'ok'
print(health.version) # API version
Credits
credits = client.get_credits()
print(credits.credits_balance) # Available credits
print(credits.credits_consumed) # Credits used
print(credits.credits_added) # Total credits added
print(credits.api_key_name) # API key name
Webhooks
Webhooks support events: file.completed, file.failed
# Create a webhook
webhook = client.create_webhook(
url="https://your-app.com/webhooks/billionverify",
events=["file.completed", "file.failed"],
)
print(f"Webhook ID: {webhook.id}")
print(f"Secret: {webhook.secret}") # Save this for signature verification
# List webhooks
webhooks = client.list_webhooks()
for wh in webhooks:
print(f"{wh.id}: {wh.url}")
# Delete a webhook
client.delete_webhook(webhook.id)
# Verify webhook signature
from billionverify import BillionVerify
is_valid = BillionVerify.verify_webhook_signature(
payload=raw_body,
signature=signature_header,
secret="your-webhook-secret",
)
Error Handling
from billionverify import (
BillionVerify,
AuthenticationError,
RateLimitError,
ValidationError,
InsufficientCreditsError,
NotFoundError,
TimeoutError,
)
try:
result = client.verify("user@example.com")
except AuthenticationError:
print("Invalid API key")
except RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after} seconds")
except ValidationError as e:
print(f"Invalid input: {e.message}")
except InsufficientCreditsError:
print("Not enough credits")
except NotFoundError:
print("Resource not found")
except TimeoutError:
print("Request timed out")
Context Manager
with BillionVerify(api_key="your-api-key") as client:
result = client.verify("user@example.com")
print(result.status)
# Connection is automatically closed
Type Hints
This SDK includes full type annotations for IDE support and type checking.
from billionverify import (
VerificationResult,
BulkVerifyResponse,
FileJobResponse,
CreditsResponse,
VerificationStatus,
)
def process_result(result: VerificationResult) -> None:
if result.status == "valid":
print(f"Email {result.email} is valid")
if result.is_deliverable and not result.is_disposable:
print("Safe to send to this email")
Status Values
The verification status can be one of:
valid- Email is valid and deliverableinvalid- Email is invalid or does not existunknown- Could not determine statusrisky- Email exists but may have delivery issuesdisposable- Temporary/disposable email addresscatchall- Domain accepts all emails (catch-all)role- Role-based email (e.g., info@, support@)
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file billionverify-1.0.0.tar.gz.
File metadata
- Download URL: billionverify-1.0.0.tar.gz
- Upload date:
- Size: 18.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e23283e0965d0ffcebc5979ba5722523a006fc8cfa2e0ab354ac93779efd71ec
|
|
| MD5 |
d37def3d82aafeb7f78b2b44d46e2c19
|
|
| BLAKE2b-256 |
7c6e710e22aaa0b59be9b920db95dc03f38e2603ef505866044c73471f3dcab1
|
File details
Details for the file billionverify-1.0.0-py3-none-any.whl.
File metadata
- Download URL: billionverify-1.0.0-py3-none-any.whl
- Upload date:
- Size: 11.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
420832e4c06aad13bcc4bdc07a87d3b44e0b0503b394617853b01d2f531ccf74
|
|
| MD5 |
fac053b1d970fb8ecc6bc427fe083b32
|
|
| BLAKE2b-256 |
48bc79d884bfd5db05aa594a548f704bff78c27b355071900934fc26b3937de0
|