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
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.
pip install freecustom-email
import asyncio from freecustom_email import FreeCustomEmail async def main(): client = FreeCustomEmail(api_key="fce_your_api_key_here") email = "[email protected]" # 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())
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 = await client.inboxes.get_insights(email) print(insights) # [ # { "type": "slow_delivery", "message": "Email took >3s" }, # { "type": "multiple_detected", "message": "Multiple emails detected" } # ]
await client.inboxes.start_test(email, "signup-test-1") timeline = await client.inboxes.get_timeline(email, "signup-test-1")
import asyncio from freecustom_email import FreeCustomEmail async def main(): client = FreeCustomEmail(api_key="fce_...") ws = client.realtime(mailbox="[email protected]") @ws.on("email") async def on_email(email): print(f"Flow update! OTP: {email.otp}") await ws.connect() await ws.wait() asyncio.run(main())
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 = "[email protected]" 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 (Temp Mail) | New (FreeCustom.Email) |
|---|---|
| receive emails | test auth flows |
| read inbox | debug flows |
| parse OTP manually | auto extract + analyze |
| polling | real-time events |
| Plan | What you get |
|---|---|
| Free | basic inbox |
| Startup | real-time emails |
| Growth | OTP + debugging |
| Enterprise | full observability |
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)