Skip to main content

Official Python SDK for FreeCustom.Email — disposable inboxes, OTP extraction, real-time WebSocket delivery

Project description

🧪 FreeCustom.Email — Auth Flow Testing & OTP Debugging SDK

PyPI License

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)

Project details


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)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

freecustom_email-1.0.5-py3-none-any.whl (20.0 kB view details)

Uploaded Python 3

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

Hashes for freecustom_email-1.0.5.tar.gz
Algorithm Hash digest
SHA256 9e05ad330cb027db6d9e90e18b34f203e85414f848a5b431a19d6e8b48bf4bc0
MD5 c06897833c834cd118921f32613db0aa
BLAKE2b-256 58d404e55d7fcee09e7c38abcb2a32bbcf9052224dfd5ff97d6c24b3be26a9ad

See more details on using hashes here.

File details

Details for the file freecustom_email-1.0.5-py3-none-any.whl.

File metadata

File hashes

Hashes for freecustom_email-1.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 9f57670c955aa86893ef79103b5c68c191e7cbaad7ade548ab77624a01e1e3e9
MD5 259e38802b040c5061f5f954eca5f85a
BLAKE2b-256 58433cf286b418b9466ea24f4b63b162a21a7971cf7c0ee34188c8312c2de191

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page