DEV Community

Dishant Singh
Dishant Singh

Posted on

I Built the First Official CLI for a Disposable Email Service — Here's Why and How to Use It

The problem: email verification is the last manual step in automated pipelines

If you have ever tried to automate a signup flow in CI/CD, you know the pain. You can automate everything — provisioning, building, deploying, testing — but the moment your app sends a verification email, you are stuck. You either:

  • Keep a shared test inbox that becomes a mess of race conditions when tests run in parallel
  • Mock the email step and quietly stop testing the actual delivery pipeline
  • Write fragile regex against a third-party API and break every time the email format changes
  • Just... click through it manually in staging

None of those are good. So I built fce.


What is fce?

fce is the official CLI for FreeCustom.Email — a disposable inbox API. It lets you create temporary inboxes, stream incoming emails in real time via WebSocket, and extract OTP codes automatically, all from your terminal.

As far as I can tell, it is the only official CLI tool for any disposable or temporary email service in the world. Every other provider — Mailinator, Guerrilla Mail, Temp-Mail — stops at a REST API at best. No one else ships an installable binary.

The source is fully open on GitHub: github.com/DishIs/fce-cli, MIT licensed, written in Go, available for macOS, Linux, and Windows.


Install in one line

curl -fsSL freecustom.email/install.sh | sh
Enter fullscreen mode Exit fullscreen mode

Or pick your package manager:

# macOS / Linux — Homebrew
brew tap DishIs/homebrew-tap
brew install fce

# Windows — Scoop
scoop bucket add fce https://github.com/DishIs/scoop-bucket
scoop install fce

# Windows — Chocolatey
choco install fce

# All platforms — npm
npm install -g fcemail@latest

# All platforms — Go
go install github.com/DishIs/fce-cli@latest
Enter fullscreen mode Exit fullscreen mode

Latest release is always at github.com/DishIs/fce-cli/releases. You can also update in-place at any time:

fce update
Enter fullscreen mode Exit fullscreen mode

Login — browser-based, keychain-backed

Authentication opens your browser and saves a key to your OS keychain automatically. No manual API key copying, no environment variable setup for local use, no tokens expiring mid-test.

fce login
Enter fullscreen mode Exit fullscreen mode
  [1/3]  Opening browser…
  [2/3]  Waiting for authentication…
  [3/3]  Saving credentials…

  ✓  Logged in successfully!
  ·  Run `fce status` to see your account details.
Enter fullscreen mode Exit fullscreen mode

Keys live in macOS Keychain, Windows Credential Manager, or Linux Secret Service (libsecret). They automatically reflect your current plan — upgrade your plan, the CLI picks it up instantly with no extra steps.


fce dev — the command I use every single day

This is the one that changed my workflow. fce dev combines inbox creation and real-time watching into a single command:

fce dev
Enter fullscreen mode Exit fullscreen mode
  ·  Temporary inbox: dev-fy8x@ditcloud.info
  ✓  Watching for emails...

  ✓  Watching dev-fy8x@ditcloud.info   GROWTH
  ·  Waiting for emails… (press Ctrl+C to stop)

────────────────────────────────────────────────────
  ID    JpW3DImT3
  FROM  "Dishant Singh" <dishupandey57@gmail.com>
  SUBJ  Your OTP for FCE: 212342
  TIME  20:19:54
────────────────────────────────────────────────────
Enter fullscreen mode Exit fullscreen mode

Fresh disposable address, WebSocket connection open, emails arriving in real time — all in one command. When I am building a signup flow locally, I open one terminal pane with fce dev and trigger the flow in another. The email shows up in under 200ms.

Before this existed, the equivalent was: open browser, go to a temp mail site, copy the address, paste it into the app, switch tabs, wait for the page to refresh, manually copy the OTP. That is six manual steps for something that should be zero steps.


fce otp — no regex required

Once you have an inbox and an email has arrived, extracting the OTP is one command:

fce otp dev-fy8x@ditcloud.info
Enter fullscreen mode Exit fullscreen mode
────────────────────────────────────────────────
  OTP
────────────────────────────────────────────────

  OTP   ·  212342
  From  ·  "Dishant Singh" <dishupandey57@gmail.com>
  Subj  ·  Your OTP for FCE: 212342
  Time  ·  20:19:54
Enter fullscreen mode Exit fullscreen mode

In a script, capture just the code:

OTP=$(fce otp dev-fy8x@ditcloud.info | grep "OTP   ·" | awk '{print $NF}')
echo "$OTP"
# 212342
Enter fullscreen mode Exit fullscreen mode

The extraction engine handles numeric codes, alphanumeric tokens, magic links, and multi-part MIME emails. It has been tested across hundreds of different email service formats. If the email format changes, the extraction does not break — it is not regex-based.

fce otp requires the Growth plan. fce watch (WebSocket streaming) requires Startup. All other commands work on the free tier.


CI/CD — use FCE_API_KEY for headless environments

For CI runners where there is no browser, grab your API key from the FreeCustom.Email dashboard after logging in locally and set it as a secret:

# .github/workflows/email-test.yml
- name: E2E email verification
  env:
    FCE_API_KEY: ${{ secrets.FCE_API_KEY }}
  run: |
    curl -fsSL freecustom.email/install.sh | sh

    INBOX=$(fce inbox add random | tr -d '[:space:]')
    echo "Inbox: $INBOX"

    curl -s -X POST https://staging.myapp.com/api/signup \
      -H "Content-Type: application/json" \
      -d "{\"email\": \"$INBOX\"}"

    OTP=$(fce otp "$INBOX" | grep "OTP   ·" | awk '{print $NF}')
    echo "OTP: $OTP"

    curl -s -f -X POST https://staging.myapp.com/api/verify \
      -H "Content-Type: application/json" \
      -d "{\"email\": \"$INBOX\", \"otp\": \"$OTP\"}"
Enter fullscreen mode Exit fullscreen mode

Fresh inbox per run, real OTP extraction, no shared state. Five parallel test jobs each get their own inbox with zero interference.


The full command surface

Here is everything fce can do today:

Command Description Plan
fce login Browser-based auth, keychain-backed Any
fce logout Remove stored credentials Any
fce dev Create temp inbox + watch instantly Any
`fce watch [inbox\ random]` Stream emails via WebSocket
fce otp <inbox> Extract latest OTP Growth+
fce status Account info, plan, inbox counts Any
fce inbox list List registered inboxes Any
fce inbox add <addr> Register a new inbox Any
fce inbox add random Register a random inbox Any
fce inbox remove <addr> Unregister an inbox Any
fce messages <inbox> [id] List or view messages Any
fce domains List available domains Any
fce usage Credit consumption this period Any
fce update Update CLI to latest version Any
fce uninstall Remove all local config + credentials Any
fce version Show version info Any

It also has a full REST API and official SDKs

The CLI is the terminal face of FreeCustom.Email's API. If you prefer to work in code directly, there are official SDKs:

JavaScript / TypeScript

npm install freecustom-email
Enter fullscreen mode Exit fullscreen mode
import { FreecustomEmailClient } from 'freecustom-email';

const client = new FreecustomEmailClient({ apiKey: process.env.FCE_API_KEY });
await client.inboxes.register('test@ditmail.info');
const otp = await client.otp.waitFor('test@ditmail.info');
console.log(otp); // '212342'
Enter fullscreen mode Exit fullscreen mode

Python

pip install freecustom-email
Enter fullscreen mode Exit fullscreen mode
from freecustom_email import FreeCustomEmail
import asyncio, os

client = FreeCustomEmail(api_key=os.environ["FCE_API_KEY"])

async def main():
    await client.inboxes.register("test@ditmail.info")
    otp = await client.otp.wait_for("test@ditmail.info")
    print(otp)  # '212342'

asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

Automation — AI agents, n8n, Make, Zapier

One thing I am particularly excited about: because fce is a proper CLI, it works with any AI agent that can run shell commands. With OpenClaw (or Claude, GPT-4o, etc.) you can just describe what you want:

"Create a random inbox, watch it, and return the next OTP that arrives"

The agent runs fce dev, watches the WebSocket output, calls fce otp, and returns the result. No glue code.

For visual workflow automation, it works out of the box with n8n via Execute Command nodes. Native Make and Zapier integrations are coming in Q2 2026.

Full automation docs: freecustom.email/api/automation


Pricing

The CLI works with every plan. The free tier is genuinely useful for local development:

Plan Price Req/month WebSocket (watch) OTP (otp)
Free $0 5,000
Developer $7/mo 100,000
Startup $19/mo 500,000
Growth $49/mo 2,000,000
Enterprise $149/mo 10,000,000

No credit card required for the free tier. Full pricing at freecustom.email/api/pricing.


Links


If you have ever lost time to the "wait for the verification email" step in a test suite, give fce a try. The free tier is zero commitment and fce dev alone is worth the two-minute install.

Happy to answer questions in the comments — what email verification patterns are you dealing with in your projects?

Top comments (0)