🧪 FreeCustom.Email — Auth Flow Testing & OTP Debugging SDK
Test, debug, and automate signup, OTP, and email-based authentication flows — with real-time observability.
FreeCustom.Email is an API-first platform for developers and QA teams to:
- ✅ Create inboxes programmatically
- ✅ Receive emails in real-time
- ✅ Extract OTPs and verification links automatically
- ✅ Debug full auth flows with timeline + latency insights
⚡ Why this exists
Testing auth flows is painful:
- ❌ Flaky email delivery
- ❌ Polling delays
- ❌ OTP parsing issues
- ❌ No visibility into failures
FreeCustom.Email solves this by giving you: 👉 real-time auth flow debugging.
📦 Installation
pip install freecustom-email
🚀 Quick Start (Auth Flow Testing)
import asyncio
from freecustom_email import FreeCustomEmail
async def main():
client = FreeCustomEmail(api_key="fce_your_api_key_here")
email = "test@ditube.info"
# 1. Create inbox (pass `is_testing=True` for zero-latency testing mode)
await client.inboxes.register(email, is_testing=True)
# 2. Start test run (NEW - Groups events in your timeline)
await client.inboxes.start_test(email, "signup-test-1")
# 3. Trigger your app (e.g. using httpx or playwright)
# await httpx.post("https://yourapp.com/api/send-otp", json={"email": email})
# 4. Wait for OTP
otp = await client.otp.wait_for(email)
print(f"OTP: {otp}")
# 5. Debug the full flow
timeline = await client.inboxes.get_timeline(email, "signup-test-1")
print(timeline)
if __name__ == "__main__":
asyncio.run(main())
🔥 Debug Your Auth Flow
Timeline (see what actually happened)
timeline = await client.inboxes.get_timeline(email)
print(timeline)
# [
# { "type": "smtp_rcpt_received", "time": 820 },
# { "type": "email_received", "time": 830 },
# { "type": "otp_extracted", "time": 835 },
# { "type": "websocket_sent", "time": 840 }
# ]
Insights (why your test failed)
insights = await client.inboxes.get_insights(email)
print(insights)
# [
# { "type": "slow_delivery", "message": "Email took >3s" },
# { "type": "multiple_detected", "message": "Multiple emails detected" }
# ]
Test Runs (group your flows)
await client.inboxes.start_test(email, "signup-test-1")
timeline = await client.inboxes.get_timeline(email, "signup-test-1")
⚡ Real-time Debugging (WebSocket)
import asyncio
from freecustom_email import FreeCustomEmail
async def main():
client = FreeCustomEmail(api_key="fce_...")
ws = client.realtime(mailbox="test@ditube.info")
@ws.on("email")
async def on_email(email):
print(f"Flow update! OTP: {email.otp}")
await ws.connect()
await ws.wait()
asyncio.run(main())
🧪 Full Playwright Example
import pytest
from playwright.async_api import Page
from freecustom_email import FreeCustomEmail
import os
client = FreeCustomEmail(api_key=os.getenv("FCE_API_KEY"))
@pytest.mark.asyncio
async def test_signup_flow(page: Page):
email = "test@ditube.info"
await client.inboxes.register(email, is_testing=True)
await client.inboxes.start_test(email, "e2e-signup")
await page.goto("https://yourapp.com/signup")
await page.fill("#email", email)
await page.click("button[type='submit']")
# Automatically waits for the email and extracts the code
otp = await client.otp.wait_for(email)
await page.fill("#otp", otp)
await page.click("#verify")
# Debugging: View exactly how long delivery took
timeline = await client.inboxes.get_timeline(email, "e2e-signup")
print("Delivery Timeline:", timeline)
🔁 Old vs New Mental Model
| Old (Temp Mail) | New (FreeCustom.Email) |
|---|---|
| receive emails | test auth flows |
| read inbox | debug flows |
| parse OTP manually | auto extract + analyze |
| polling | real-time events |
📊 Plans (Updated Meaning)
| Plan | What you get |
|---|---|
| Free | basic inbox |
| Startup | real-time emails |
| Growth | OTP + debugging |
| Enterprise | full observability |
🔥 Most Important Methods (for devs)
await client.inboxes.start_test(email, test_id)await client.otp.wait_for(email)await client.inboxes.get_timeline(email, test_id)await client.inboxes.get_insights(email)
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
freecustom_email-1.0.5.tar.gz
(14.8 kB
view details)
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 freecustom_email-1.0.5.tar.gz.
File metadata
- Download URL: freecustom_email-1.0.5.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e05ad330cb027db6d9e90e18b34f203e85414f848a5b431a19d6e8b48bf4bc0
|
|
| MD5 |
c06897833c834cd118921f32613db0aa
|
|
| BLAKE2b-256 |
58d404e55d7fcee09e7c38abcb2a32bbcf9052224dfd5ff97d6c24b3be26a9ad
|
File details
Details for the file freecustom_email-1.0.5-py3-none-any.whl.
File metadata
- Download URL: freecustom_email-1.0.5-py3-none-any.whl
- Upload date:
- Size: 20.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f57670c955aa86893ef79103b5c68c191e7cbaad7ade548ab77624a01e1e3e9
|
|
| MD5 |
259e38802b040c5061f5f954eca5f85a
|
|
| BLAKE2b-256 |
58433cf286b418b9466ea24f4b63b162a21a7971cf7c0ee34188c8312c2de191
|