<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.signitize.io/blog</id>
    <title>Signitize blog</title>
    <updated>2026-10-27T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.signitize.io/blog"/>
    <subtitle>Stopping fake, duplicate and throwaway signups.</subtitle>
    <rights>© 2026 Signitize</rights>
    <entry>
        <title type="html"><![CDATA[How to block disposable email addresses at signup (Node.js, Python, PHP)]]></title>
        <id>https://www.signitize.io/blog/block-disposable-emails-at-signup</id>
        <link href="https://www.signitize.io/blog/block-disposable-emails-at-signup"/>
        <updated>2026-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Reject temporary and throwaway emails like yopmail and mailinator in your signup form, with Node.js, Python and PHP code that never blocks real users.]]></summary>
        <content type="html"><![CDATA[<p>Disposable email services (yopmail, mailinator, temp-mail and hundreds of others) give anyone a working inbox in one click, with no account. They are handy for privacy, and they are the favorite tool of anyone farming your free tier: a new address for every new trial.</p>
<p>This post shows how to reject them at signup with one server-side call, in Node.js, Python and PHP, without breaking your signup when the check fails.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-check">Where to check<a href="https://www.signitize.io/blog/block-disposable-emails-at-signup#where-to-check" class="hash-link" aria-label="Direct link to Where to check" title="Direct link to Where to check" translate="no">​</a></h2>
<p>Check on your <strong>backend</strong>, in the signup handler, before you create the account. A check in the browser can be skipped by anyone who calls your API directly, and it would expose your API key.</p>
<p>The flow:</p>
<ol>
<li class="">The user submits the form.</li>
<li class="">Your backend sends the typed address to <code>POST https://api.signitize.io/v1/check</code>.</li>
<li class="">If <code>disposable</code> is <code>true</code>, reject with a clear message. Otherwise continue with your normal signup.</li>
</ol>
<p>The response also tells you whether the address can receive mail at all, and gives a canonical email for <a class="" href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts">duplicate detection</a>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#00797a">"email"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">"abc@yopmail.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#00797a">"disposable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#00797a">"deliverable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Disposable domains are <code>deliverable: true</code>: they do receive mail, which is what makes them useful for abuse. Check <code>disposable</code>, not <code>deliverable</code>, to catch them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nodejs">Node.js<a href="https://www.signitize.io/blog/block-disposable-emails-at-signup#nodejs" class="hash-link" aria-label="Direct link to Node.js" title="Direct link to Node.js" translate="no">​</a></h2>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">checkEmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> response </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">'https://api.signitize.io/v1/check'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#00797a">method</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'POST'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#00797a">headers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token literal-property property" style="color:#00797a">Authorization</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#b8105a">`</span><span class="token template-string string" style="color:#b8105a">Bearer </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">env</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation constant" style="color:#00797a">SIGNITIZE_API_KEY</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#b8105a">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string-property property" style="color:#00797a">'Content-Type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'application/json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#00797a">body</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> email </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#00797a">signal</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">AbortSignal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">timeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#00797a">5000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">ok</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#00797a">400</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#00797a">invalid</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#6b6b5e;font-style:italic">// timeout or network error: fall through</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token plain"> </span><span class="token comment" style="color:#6b6b5e;font-style:italic">// unknown: don't block the user</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">checkEmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">body</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">invalid</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#00797a">422</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#00797a">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'Enter a valid email address.'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">disposable</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#00797a">422</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#00797a">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'Please use a permanent email address.'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">deliverable</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#00797a">422</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#00797a">error</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'This email address cannot receive mail.'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="python">Python<a href="https://www.signitize.io/blog/block-disposable-emails-at-signup#python" class="hash-link" aria-label="Direct link to Python" title="Direct link to Python" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> os</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> requests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">check_email</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">try</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        response </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#b8105a">"https://api.signitize.io/v1/check"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            headers</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#b8105a">"Authorization"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#b8105a">f"Bearer </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">os</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">environ</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">[</span><span class="token string-interpolation interpolation string" style="color:#b8105a">'SIGNITIZE_API_KEY'</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">]</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#b8105a">"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            json</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#b8105a">"email"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            timeout</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#00797a">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">except</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">RequestException</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">None</span><span class="token plain">  </span><span class="token comment" style="color:#6b6b5e;font-style:italic"># unknown: don't block the user</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ok</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">status_code </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#00797a">400</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#b8105a">"invalid"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">True</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> check_email</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">typed_email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> result </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">"invalid"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> ValueError</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">"Enter a valid email address."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> result </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#b8105a">"disposable"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> ValueError</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">"Please use a permanent email address."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> result </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#b8105a">"deliverable"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> ValueError</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">"This email address cannot receive mail."</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="php">PHP<a href="https://www.signitize.io/blog/block-disposable-emails-at-signup#php" class="hash-link" aria-label="Direct link to PHP" title="Direct link to PHP" translate="no">​</a></h2>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:#c02d3c">checkEmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword type-hint" style="color:#00009f">string</span><span class="token plain"> </span><span class="token variable" style="color:#00797a">$email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token keyword return-type" style="color:#00009f">array</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#00797a">$curl</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">curl_init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string single-quoted-string" style="color:#b8105a">'https://api.signitize.io/v1/check'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#c02d3c">curl_setopt_array</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$curl</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token constant" style="color:#00797a">CURLOPT_POST</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:#00797a">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token constant" style="color:#00797a">CURLOPT_RETURNTRANSFER</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:#00797a">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token constant" style="color:#00797a">CURLOPT_TIMEOUT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token number" style="color:#00797a">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token constant" style="color:#00797a">CURLOPT_HTTPHEADER</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string single-quoted-string" style="color:#b8105a">'Authorization: Bearer '</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">.</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">getenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string single-quoted-string" style="color:#b8105a">'SIGNITIZE_API_KEY'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string single-quoted-string" style="color:#b8105a">'Content-Type: application/json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token constant" style="color:#00797a">CURLOPT_POSTFIELDS</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">json_encode</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string single-quoted-string" style="color:#b8105a">'email'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token variable" style="color:#00797a">$email</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#00797a">$body</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">curl_exec</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$curl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#00797a">$status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">curl_getinfo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$curl</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant" style="color:#00797a">CURLINFO_RESPONSE_CODE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$body</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token constant boolean" style="color:#00797a">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token constant" style="color:#00797a">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#6b6b5e;font-style:italic">// timeout or network error: don't block the user</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#00797a">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">json_decode</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$body</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token constant boolean" style="color:#00797a">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#00797a">400</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string single-quoted-string" style="color:#b8105a">'invalid'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:#00797a">true</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token constant" style="color:#00797a">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#00797a">$result</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">checkEmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$_POST</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string single-quoted-string" style="color:#b8105a">'email'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$result</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">empty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$result</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string single-quoted-string" style="color:#b8105a">'invalid'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">exit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string single-quoted-string" style="color:#b8105a">'Enter a valid email address.'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$result</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token variable" style="color:#00797a">$result</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string single-quoted-string" style="color:#b8105a">'disposable'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">exit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string single-quoted-string" style="color:#b8105a">'Please use a permanent email address.'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#00797a">$result</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token variable" style="color:#00797a">$result</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string single-quoted-string" style="color:#b8105a">'deliverable'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">exit</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string single-quoted-string" style="color:#b8105a">'This email address cannot receive mail.'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Using Laravel or Django? The <a class="" href="https://www.signitize.io/docs/integrations">integration guides</a> have a validation rule for each.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-rule-that-matters-most-fail-open">The rule that matters most: fail open<a href="https://www.signitize.io/blog/block-disposable-emails-at-signup#the-rule-that-matters-most-fail-open" class="hash-link" aria-label="Direct link to The rule that matters most: fail open" title="Direct link to The rule that matters most: fail open" translate="no">​</a></h2>
<p>Every example above returns "unknown" when the check doesn't answer, and the signup continues. That is on purpose. If an email check can stop your signup, then any outage or network problem between your server and the API takes your signup form down with it.</p>
<p>Failing open doesn't mean skipping the check. Create those accounts as <code>pending</code>, recheck them a few minutes later, and hold back the free credits until they pass. <a class="" href="https://www.signitize.io/docs/handling-failures">Never block a signup</a> has the full pattern, including the recheck job.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-not-a-blocklist-file">Why not a blocklist file?<a href="https://www.signitize.io/blog/block-disposable-emails-at-signup#why-not-a-blocklist-file" class="hash-link" aria-label="Direct link to Why not a blocklist file?" title="Direct link to Why not a blocklist file?" translate="no">​</a></h2>
<p>You can download a list of disposable domains from GitHub and check against it. It works on day one and gets worse every week, because throwaway services register new domains constantly. We wrote about this in <a class="" href="https://www.signitize.io/blog/disposable-email-blocklists-go-stale">why disposable email blocklists go out of date</a>.</p>
<p>Signitize combines a list with DNS signals, so a domain registered yesterday can still be caught, and every newly detected domain is remembered for the next check. The details are in <a class="" href="https://www.signitize.io/docs/detection">Detection</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="write-a-helpful-error-message">Write a helpful error message<a href="https://www.signitize.io/blog/block-disposable-emails-at-signup#write-a-helpful-error-message" class="hash-link" aria-label="Direct link to Write a helpful error message" title="Direct link to Write a helpful error message" translate="no">​</a></h2>
<p>The person behind a disposable address may be a real user who just wants privacy. Tell them what to do:</p>
<blockquote>
<p>Disposable email addresses are not allowed. Please use a permanent email address.</p>
</blockquote>
<p>If you want to keep privacy-minded users, note that relay services such as Firefox Relay, DuckDuckGo Email Protection and Apple's Hide My Email forward to a real inbox. Signitize returns <code>disposable: false</code> for them. Whether to block disposable emails at all is a real trade-off; we cover it in <a class="" href="https://www.signitize.io/blog/should-you-block-disposable-emails">Should you block disposable emails?</a></p>
<p><a class="" href="https://www.signitize.io/pricing">Get a free API key</a>: 2,500 checks a month, no credit card.</p>]]></content>
        <author>
            <name>Signitize</name>
            <uri>https://www.signitize.io</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Why disposable email blocklists go out of date (and how to detect new domains)]]></title>
        <id>https://www.signitize.io/blog/disposable-email-blocklists-go-stale</id>
        <link href="https://www.signitize.io/blog/disposable-email-blocklists-go-stale"/>
        <updated>2026-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Temp-mail services rotate domains faster than blocklists update. How DNS signals and shared mail servers reveal new throwaway domains before any list has them.]]></summary>
        <content type="html"><![CDATA[<p>The first thing most teams try against throwaway signups is a blocklist: a file of a few thousand disposable domains from GitHub, checked at signup. It works for a week. Then the fake signups start again, from domains that aren't on the list.</p>
<p>This post explains why lists fall behind, and what a domain's DNS records reveal about it even when nobody has listed it yet.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-lists-fall-behind">Why lists fall behind<a href="https://www.signitize.io/blog/disposable-email-blocklists-go-stale#why-lists-fall-behind" class="hash-link" aria-label="Direct link to Why lists fall behind" title="Direct link to Why lists fall behind" translate="no">​</a></h2>
<p><strong>Domains are cheap.</strong> Many top-level domains cost a dollar or two for the first year. A temp-mail service can register dozens at once and switch to new ones whenever the old ones get blocked.</p>
<p><strong>Services rotate on purpose.</strong> Popular temp-mail sites offer a domain picker or change their default domain regularly, precisely because their users want addresses that sites still accept.</p>
<p><strong>Lists are updated by people.</strong> Open-source lists depend on someone noticing a new domain and opening a pull request, then on you updating your copy. Each step adds days or weeks.</p>
<p><strong>Lists can't see private services.</strong> Someone running a throwaway setup on their own domains never appears on a public list.</p>
<p>The result: a list stops the domains everyone already knows, and lets through exactly the new ones that people are actively using.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-dns-reveals-about-a-new-domain">What DNS reveals about a new domain<a href="https://www.signitize.io/blog/disposable-email-blocklists-go-stale#what-dns-reveals-about-a-new-domain" class="hash-link" aria-label="Direct link to What DNS reveals about a new domain" title="Direct link to What DNS reveals about a new domain" translate="no">​</a></h2>
<p>A domain built only to receive throwaway mail is set up differently from a real company's domain. Its public DNS records show it:</p>
<table><thead><tr><th>Signal</th><th>A real company domain</th><th>A cheap throwaway domain</th></tr></thead><tbody><tr><td>Website</td><td><code>company.com</code> or <code>www.company.com</code> resolves</td><td>Often nothing: the domain exists only to receive mail</td></tr><tr><td>SPF record</td><td>Authorizes the servers that send its mail</td><td>Missing, or a placeholder that authorizes nobody</td></tr><tr><td>DMARC record</td><td>Usually present</td><td>Usually missing</td></tr><tr><td>Reverse DNS on the mail server</td><td>Always set: mail servers without it struggle to deliver</td><td>Often missing: the server only receives</td></tr><tr><td>Mail server</td><td>Their own, or a mainstream provider</td><td>Often shared with dozens of other throwaway domains</td></tr></tbody></table>
<p>No single signal proves anything. Plenty of small legitimate domains have no DMARC record. But a domain with no website, no real SPF and a mail server without reverse DNS is very unlikely to belong to someone's real inbox. Scoring several signals together gives a useful answer for domains no list has seen.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-strongest-signal-shared-mail-servers">The strongest signal: shared mail servers<a href="https://www.signitize.io/blog/disposable-email-blocklists-go-stale#the-strongest-signal-shared-mail-servers" class="hash-link" aria-label="Direct link to The strongest signal: shared mail servers" title="Direct link to The strongest signal: shared mail servers" translate="no">​</a></h2>
<p>Throwaway services rotate domains, but running mail servers is more work, so many domains point at the same few servers. Once one domain is identified as disposable, its mail server becomes a clue for the next one.</p>
<p>That is how Signitize learns:</p>
<ol>
<li class=""><code>abc@new-burner.xyz</code> is detected by its DNS signals. The domain and its mail server are remembered.</li>
<li class="">The next address at <code>new-burner.xyz</code> is caught immediately, without a DNS lookup.</li>
<li class="">A sibling domain on the same mail server starts with a head start in its score, so it needs fewer other signals to be caught.</li>
</ol>
<p>Two safety rules matter here. A learned server alone is never enough to flag a domain, so one wrong guess can't block a legitimate business. And mail servers of shared providers (Google, Microsoft, Zoho and others) are never learned, so one bad domain hosted there can't affect anyone else.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-still-gets-through">What still gets through<a href="https://www.signitize.io/blog/disposable-email-blocklists-go-stale#what-still-gets-through" class="hash-link" aria-label="Direct link to What still gets through" title="Direct link to What still gets through" translate="no">​</a></h2>
<p>Being honest about limits:</p>
<ul>
<li class="">A temp-mail service with a real website, proper SPF and reverse DNS looks legitimate to DNS checks until it is listed or one of its domains trips the signals.</li>
<li class="">Catch-all custom domains (any address <code>@someones-domain.com</code> arrives in one inbox) are real domains owned by real people. They can't be detected from the address.</li>
<li class="">When DNS lookups fail, a careful checker answers "not disposable" rather than guessing, so real users aren't blocked by a network hiccup.</li>
</ul>
<p>That is why the email check should be one layer: combine it with <a class="" href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts">duplicate detection by canonical email</a> and hold back free perks until the email is verified.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it">Try it<a href="https://www.signitize.io/blog/disposable-email-blocklists-go-stale#try-it" class="hash-link" aria-label="Direct link to Try it" title="Direct link to Try it" translate="no">​</a></h2>
<p><a class="" href="https://www.signitize.io/docs/detection">Detection</a> documents every step, signal and score Signitize uses. The Free plan includes 2,500 checks a month: <a class="" href="https://www.signitize.io/pricing">get a free API key</a> and send it the newest throwaway domain you've seen.</p>]]></content>
        <author>
            <name>Signitize</name>
            <uri>https://www.signitize.io</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Email typos at signup: catch gmial.com before your welcome email bounces]]></title>
        <id>https://www.signitize.io/blog/email-typos-at-signup</id>
        <link href="https://www.signitize.io/blog/email-typos-at-signup"/>
        <updated>2026-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Mistyped signup emails lose you real users and hurt your sender reputation. Three layers that catch them, with a small "did you mean" helper in JavaScript.]]></summary>
        <content type="html"><![CDATA[<p>A user types <code>maria@gmial.com</code>, clicks <strong>Sign up</strong> and waits for a verification email that never arrives. They don't come back. You lose a real user, and the bounce counts against your sender reputation.</p>
<p>Typos are the most common bad address at signup, and unlike fake addresses, the person behind them actually wants your product. Catching them is pure gain.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-three-kinds-of-typo">The three kinds of typo<a href="https://www.signitize.io/blog/email-typos-at-signup#the-three-kinds-of-typo" class="hash-link" aria-label="Direct link to The three kinds of typo" title="Direct link to The three kinds of typo" translate="no">​</a></h2>
<table><thead><tr><th>Typo</th><th>Example</th><th>What happens</th></tr></thead><tbody><tr><td>Misspelled domain that doesn't exist</td><td><code>maria@gmaill.con</code></td><td>Hard bounce</td></tr><tr><td>Misspelled domain that <strong>does</strong> exist</td><td><code>maria@gmial.com</code></td><td>Mail may go to a stranger's server, or bounce</td></tr><tr><td>Misspelled username</td><td><code>mraia@gmail.com</code></td><td>Reaches someone else, or bounces</td></tr></tbody></table>
<p>Each needs a different tool, so the answer is three layers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="layer-1-did-you-mean-in-the-browser">Layer 1: "Did you mean" in the browser<a href="https://www.signitize.io/blog/email-typos-at-signup#layer-1-did-you-mean-in-the-browser" class="hash-link" aria-label="Direct link to Layer 1: &quot;Did you mean&quot; in the browser" title="Direct link to Layer 1: &quot;Did you mean&quot; in the browser" translate="no">​</a></h2>
<p>The fastest fix is a suggestion while the user is still on the form: <em>Did you mean <a href="mailto:maria@gmail.com" target="_blank" rel="noopener noreferrer" class="">maria@gmail.com</a>?</em> A small list of popular domains covers most typos:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token constant" style="color:#00797a">DOMAINS</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#b8105a">'gmail.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'yahoo.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'outlook.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'hotmail.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'icloud.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'aol.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'proton.me'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">distance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">a</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> b</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> row </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Array</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword module" style="color:#00009f">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#00797a">length</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#00797a">1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">_</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#00797a">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> previous </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#00797a">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#00797a">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> i</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> j </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#00797a">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> j </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> j</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> current </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">j</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">j</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">j</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#00797a">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">j </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#00797a">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#00797a">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> previous </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#00797a">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">j </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#00797a">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#00797a">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#00797a">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            previous </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> current</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">b</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">suggestEmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">local</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> domain</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">toLowerCase</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">'@'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">local </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">domain </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token constant" style="color:#00797a">DOMAINS</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domain</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> match </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token constant" style="color:#00797a">DOMAINS</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">find</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">known</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">distance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domain</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> known</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#00797a">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> match </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#b8105a">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">local</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#b8105a">@</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">match</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#b8105a">`</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#c02d3c">suggestEmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">'maria@gmial.com'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#6b6b5e;font-style:italic">// 'maria@gmail.com'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#c02d3c">suggestEmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">'maria@takla.com'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#6b6b5e;font-style:italic">// null</span><br></div></code></pre></div></div>
<p>Show the suggestion as a link the user can click; never change the address silently. Someone whose address really is at a similar-looking domain must be able to keep it. Use your own signup data to extend the list with the providers your users actually have.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="layer-2-reject-addresses-that-can-never-receive-mail">Layer 2: reject addresses that can never receive mail<a href="https://www.signitize.io/blog/email-typos-at-signup#layer-2-reject-addresses-that-can-never-receive-mail" class="hash-link" aria-label="Direct link to Layer 2: reject addresses that can never receive mail" title="Direct link to Layer 2: reject addresses that can never receive mail" translate="no">​</a></h2>
<p>On the server, reject what can't possibly work:</p>
<ul>
<li class="">the domain doesn't exist (<code>gmaill.con</code>);</li>
<li class="">the domain publishes a "null MX", meaning it accepts no mail;</li>
<li class="">no mail server resolves for the domain;</li>
<li class="">the username breaks the provider's rules, such as <code>_maria@gmail.com</code> (Gmail only allows letters, numbers and periods) or a three-letter Gmail username.</li>
</ul>
<p>Signitize returns <code>deliverable: false</code> in all these cases, in the same call that checks for <a class="" href="https://www.signitize.io/blog/block-disposable-emails-at-signup">disposable domains</a> and <a class="" href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts">duplicate aliases</a>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#00797a">"email"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">"maria@gmaill.con"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#00797a">"disposable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#00797a">"deliverable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Reject with a message that points at the fix:</p>
<blockquote>
<p>This email address cannot receive mail. Please check it for typos.</p>
</blockquote>
<p>What this layer does <strong>not</strong> catch: typo domains that exist and accept mail. Some common misspellings of big providers are registered by third parties and have mail servers, so they look deliverable. That is why layer 1 matters, and why layer 3 is still required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="layer-3-the-verification-email">Layer 3: the verification email<a href="https://www.signitize.io/blog/email-typos-at-signup#layer-3-the-verification-email" class="hash-link" aria-label="Direct link to Layer 3: the verification email" title="Direct link to Layer 3: the verification email" translate="no">​</a></h2>
<p>Only a verification email proves that the mailbox exists and belongs to the person. It also catches username typos (<code>mraia@gmail.com</code>), which no check can recognize: the address is valid, it just belongs to someone else.</p>
<p>Make it easy to recover from a typo here too:</p>
<ul>
<li class="">show the address on the "check your inbox" page, with a <strong>Change email</strong> link;</li>
<li class="">let users resend the email, with a short cooldown;</li>
<li class="">don't unlock free credits or trial perks until the link is clicked.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-not-ask-mail-servers-if-the-mailbox-exists">Why not ask mail servers if the mailbox exists?<a href="https://www.signitize.io/blog/email-typos-at-signup#why-not-ask-mail-servers-if-the-mailbox-exists" class="hash-link" aria-label="Direct link to Why not ask mail servers if the mailbox exists?" title="Direct link to Why not ask mail servers if the mailbox exists?" translate="no">​</a></h2>
<p>Some validators connect to the mail server and ask whether <code>maria@</code> exists without sending a message. It looks attractive and works poorly at signup: Gmail, Outlook and Yahoo accept every address at that stage, many servers deliberately answer "yes" to everything, and servers that do this repeatedly get blocked. Signitize does not probe mailboxes; the verification email is the reliable test.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://www.signitize.io/blog/email-typos-at-signup#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<ol>
<li class="">Suggest corrections in the browser for common provider typos.</li>
<li class="">Reject addresses that can never receive mail on the server.</li>
<li class="">Verify by email, and make changing the address easy.</li>
</ol>
<p>Layer 2 takes one API call. <a class="" href="https://www.signitize.io/pricing">Get a free API key</a> (2,500 checks a month) and see the <a class="" href="https://www.signitize.io/docs">Quickstart</a>.</p>]]></content>
        <author>
            <name>Signitize</name>
            <uri>https://www.signitize.io</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Free trial abuse: 7 ways people farm your free tier and how to stop each]]></title>
        <id>https://www.signitize.io/blog/free-trial-abuse</id>
        <link href="https://www.signitize.io/blog/free-trial-abuse"/>
        <updated>2026-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How users abuse free trials and free credits with email aliases, disposable inboxes, scripts and referral loops, and practical ways to stop each one.]]></summary>
        <content type="html"><![CDATA[<p>A free tier is a marketing budget. Every account costs you something: compute for an AI tool, seats for a SaaS, a coupon for a shop. Most people use it as intended. A few create dozens of accounts, and for products with expensive free credits, those few can cost more than everyone else combined.</p>
<p>Here are the seven tricks we see most, what each one costs to stop, and which ones an email check can and can't solve.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-email-aliases">1. Email aliases<a href="https://www.signitize.io/blog/free-trial-abuse#1-email-aliases" class="hash-link" aria-label="Direct link to 1. Email aliases" title="Direct link to 1. Email aliases" translate="no">​</a></h2>
<p><strong>The trick:</strong> one Gmail inbox, many addresses: <code>john+1@gmail.com</code>, <code>j.o.h.n@gmail.com</code>, <code>john@googlemail.com</code>. Each one looks new to your database.</p>
<p><strong>The fix:</strong> store a canonical version of every email in a unique column, so all aliases of one inbox collide. The rules differ per provider (dots matter at Outlook, not at Gmail), so this needs care: see <a class="" href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts">How to stop users creating multiple accounts with Gmail aliases</a>.</p>
<p><strong>Cost to you:</strong> one column and one lookup. This is the cheapest win on the list.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-disposable-inboxes">2. Disposable inboxes<a href="https://www.signitize.io/blog/free-trial-abuse#2-disposable-inboxes" class="hash-link" aria-label="Direct link to 2. Disposable inboxes" title="Direct link to 2. Disposable inboxes" translate="no">​</a></h2>
<p><strong>The trick:</strong> a temporary inbox from yopmail, mailinator or one of hundreds of similar services. No account, no phone, a new address every time.</p>
<p><strong>The fix:</strong> check the domain at signup and reject throwaway domains. A static list goes stale quickly, so use a check that also detects new domains. See <a class="" href="https://www.signitize.io/blog/block-disposable-emails-at-signup">How to block disposable email addresses at signup</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-made-up-addresses">3. Made-up addresses<a href="https://www.signitize.io/blog/free-trial-abuse#3-made-up-addresses" class="hash-link" aria-label="Direct link to 3. Made-up addresses" title="Direct link to 3. Made-up addresses" translate="no">​</a></h2>
<p><strong>The trick:</strong> signing up with <code>asdf@asdf.com</code> or an address on a domain that doesn't exist, because your product works before the email is verified.</p>
<p><strong>The fix:</strong> two layers. Reject addresses that can never receive mail (domain doesn't exist, publishes "no mail", or the username breaks the provider's rules). Then make the verification email the gate: don't hand out the free credits until the link is clicked.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-many-real-accounts-at-free-providers">4. Many real accounts at free providers<a href="https://www.signitize.io/blog/free-trial-abuse#4-many-real-accounts-at-free-providers" class="hash-link" aria-label="Direct link to 4. Many real accounts at free providers" title="Direct link to 4. Many real accounts at free providers" translate="no">​</a></h2>
<p><strong>The trick:</strong> creating several genuine Gmail or Outlook accounts. Each one is a real, separate inbox.</p>
<p><strong>The honest answer:</strong> no email check can tell that <code>alice.w@gmail.com</code> and <code>wonderland.alice@gmail.com</code> belong to the same person, and anyone who claims otherwise is guessing. Making new Google accounts takes effort and, increasingly, a phone number, which limits how far this scales. Beyond that, you need signals other than email:</p>
<ul>
<li class="">a payment method on file for the higher tiers, even if you don't charge it;</li>
<li class="">phone verification for the most valuable perks;</li>
<li class="">rate limits per IP address range and per device on account creation.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-scripts-and-bots">5. Scripts and bots<a href="https://www.signitize.io/blog/free-trial-abuse#5-scripts-and-bots" class="hash-link" aria-label="Direct link to 5. Scripts and bots" title="Direct link to 5. Scripts and bots" translate="no">​</a></h2>
<p><strong>The trick:</strong> automating the signup form to create accounts in bulk.</p>
<p><strong>The fix:</strong> a challenge on the signup form (Cloudflare Turnstile, hCaptcha, reCAPTCHA) and per-IP rate limits on the signup endpoint. Email checks help here too: bots need many addresses, and the cheap sources of addresses are aliases and disposable inboxes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-referral-and-coupon-loops">6. Referral and coupon loops<a href="https://www.signitize.io/blog/free-trial-abuse#6-referral-and-coupon-loops" class="hash-link" aria-label="Direct link to 6. Referral and coupon loops" title="Direct link to 6. Referral and coupon loops" translate="no">​</a></h2>
<p><strong>The trick:</strong> referring yourself. Sign up a second account with an alias, claim the referral bonus on both sides, repeat.</p>
<p><strong>The fix:</strong> pay referral rewards only when the referred account is verified and has done something real (made a purchase, used the product for a week). Compare canonical emails of referrer and referred: <code>john@gmail.com</code> referring <code>john+2@gmail.com</code> is the same person.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-restarting-a-trial-after-it-ends">7. Restarting a trial after it ends<a href="https://www.signitize.io/blog/free-trial-abuse#7-restarting-a-trial-after-it-ends" class="hash-link" aria-label="Direct link to 7. Restarting a trial after it ends" title="Direct link to 7. Restarting a trial after it ends" translate="no">​</a></h2>
<p><strong>The trick:</strong> when the trial ends, sign up again with a variation of the same address. Or come back after being banned.</p>
<p><strong>The fix:</strong> never delete expired or banned accounts outright; keep at least their canonical email. A returning alias then matches the old account, and you can show "Your trial has ended" instead of starting a new one.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="put-the-perks-behind-the-checks-not-the-user">Put the perks behind the checks, not the user<a href="https://www.signitize.io/blog/free-trial-abuse#put-the-perks-behind-the-checks-not-the-user" class="hash-link" aria-label="Direct link to Put the perks behind the checks, not the user" title="Direct link to Put the perks behind the checks, not the user" translate="no">​</a></h2>
<p>The pattern that ties these together:</p>
<ol>
<li class="">Check the email at signup. Reject disposable, undeliverable and duplicate addresses with a clear message.</li>
<li class="">If the check can't run (timeout, outage), <strong>don't block the signup</strong>. Create the account as <code>pending</code>.</li>
<li class="">Hand out free credits, trial time and referral rewards only when the account is checked <strong>and</strong> verified.</li>
</ol>
<p>Real users barely notice step 3. Abusers lose the reason to sign up. <a class="" href="https://www.signitize.io/docs/handling-failures">Never block a signup</a> has the code for this, including the job that rechecks pending accounts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-signitize-fits">Where Signitize fits<a href="https://www.signitize.io/blog/free-trial-abuse#where-signitize-fits" class="hash-link" aria-label="Direct link to Where Signitize fits" title="Direct link to Where Signitize fits" translate="no">​</a></h2>
<p>Signitize covers tricks 1, 2 and 3 with one call: a canonical email for duplicates, <code>disposable</code> for throwaway domains and <code>deliverable</code> for addresses that can never receive mail. It does not solve 4 to 7 on its own; those need the product rules above.</p>
<p>The Free plan includes 2,500 checks a month, enough for most early products. <a class="" href="https://www.signitize.io/pricing">Get a free API key</a>, or read the <a class="" href="https://www.signitize.io/docs">Quickstart</a>.</p>]]></content>
        <author>
            <name>Signitize</name>
            <uri>https://www.signitize.io</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[How to stop users creating multiple accounts with Gmail aliases]]></title>
        <id>https://www.signitize.io/blog/gmail-aliases-duplicate-accounts</id>
        <link href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts"/>
        <updated>2026-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Gmail ignores dots, +tags and googlemail.com, so one inbox can open hundreds of accounts. How email normalization stops duplicate signups, with code.]]></summary>
        <content type="html"><![CDATA[<p><code>john.smith@gmail.com</code>, <code>johnsmith+trial2@gmail.com</code> and <code>J.O.H.N.S.M.I.T.H@googlemail.com</code> are three different strings and one inbox. If your signup treats them as three users, one person gets three free trials, three sets of credits or three referral bonuses.</p>
<p>The fix is not to block these addresses: real people use them. The fix is to know they belong to the same inbox.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-one-gmail-inbox-has-endless-addresses">Why one Gmail inbox has endless addresses<a href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts#why-one-gmail-inbox-has-endless-addresses" class="hash-link" aria-label="Direct link to Why one Gmail inbox has endless addresses" title="Direct link to Why one Gmail inbox has endless addresses" translate="no">​</a></h2>
<p>Gmail delivers mail to the same inbox no matter how the address is written:</p>
<table><thead><tr><th>Trick</th><th>Example</th><th>Delivered to</th></tr></thead><tbody><tr><td>Dots</td><td><code>j.o.h.n.smith@gmail.com</code></td><td><code>johnsmith@gmail.com</code></td></tr><tr><td><code>+tag</code></td><td><code>johnsmith+anything@gmail.com</code></td><td><code>johnsmith@gmail.com</code></td></tr><tr><td>Old domain</td><td><code>johnsmith@googlemail.com</code></td><td><code>johnsmith@gmail.com</code></td></tr><tr><td>Upper case</td><td><code>JohnSmith@Gmail.com</code></td><td><code>johnsmith@gmail.com</code></td></tr></tbody></table>
<p>Combine them and a nine-letter username has thousands of spellings. Scripts that farm free tiers generate them automatically: <code>johnsmith+1</code>, <code>johnsmith+2</code>, and so on.</p>
<p><code>+tags</code> (called <em>subaddressing</em>) are a legitimate feature. People use them to filter mail or to see who leaked their address. Rejecting every address with a <code>+</code> blocks honest users and does nothing against dots or <code>googlemail.com</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-fix-a-canonical-email-in-a-unique-column">The fix: a canonical email in a unique column<a href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts#the-fix-a-canonical-email-in-a-unique-column" class="hash-link" aria-label="Direct link to The fix: a canonical email in a unique column" title="Direct link to The fix: a canonical email in a unique column" translate="no">​</a></h2>
<p>Store two values for every user:</p>
<ul>
<li class="">the address the user <strong>typed</strong>, for sending mail;</li>
<li class="">a <strong>canonical</strong> version, where every alias of one inbox gives the same value, with a unique constraint.</li>
</ul>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">ALTER</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> users </span><span class="token keyword" style="color:#00009f">ADD</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">COLUMN</span><span class="token plain"> email_canonical </span><span class="token keyword" style="color:#00009f">text</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">UNIQUE</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>At signup, compute the canonical email and look it up. If it exists, the person already has an account. Keep banned accounts (or at least their canonical email) instead of deleting them, and every alias of a banned inbox stays banned too.</p>
<p>Always send your verification email to the typed address. The canonical one is a duplicate-check key; for some providers it is not a deliverable mailbox.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="doing-it-yourself-the-gmail-rule">Doing it yourself: the Gmail rule<a href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts#doing-it-yourself-the-gmail-rule" class="hash-link" aria-label="Direct link to Doing it yourself: the Gmail rule" title="Direct link to Doing it yourself: the Gmail rule" translate="no">​</a></h2>
<p>For Gmail alone the rule is short:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">canonicalGmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">local</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> domain</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">toLowerCase</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">'@'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domain </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'gmail.com'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> domain </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'googlemail.com'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">trim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">toLowerCase</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#b8105a">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">local</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation method function property-access" style="color:#c02d3c">split</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation string" style="color:#b8105a">'+'</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation punctuation" style="color:#393A34">[</span><span class="token template-string interpolation number" style="color:#00797a">0</span><span class="token template-string interpolation punctuation" style="color:#393A34">]</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation method function property-access" style="color:#c02d3c">replaceAll</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation string" style="color:#b8105a">'.'</span><span class="token template-string interpolation punctuation" style="color:#393A34">,</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation string" style="color:#b8105a">''</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#b8105a">@gmail.com</span><span class="token template-string template-punctuation string" style="color:#b8105a">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#c02d3c">canonicalGmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">'J.O.H.N.Smith+promo@GoogleMail.com'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#6b6b5e;font-style:italic">// 'johnsmith@gmail.com'</span><br></div></code></pre></div></div>
<p>It gets harder from here, because every provider has different rules:</p>
<ul>
<li class=""><strong>Outlook and Hotmail</strong> support <code>+tags</code>, but dots <strong>do</strong> matter: <code>john.smith@outlook.com</code> and <code>johnsmith@outlook.com</code> are different people. Applying the Gmail rule to them merges strangers.</li>
<li class=""><strong>Yahoo</strong> uses <code>-keyword</code> instead of <code>+tag</code> for its "disposable addresses" (<code>nick-shopping@yahoo.com</code>), and the base name is not the login.</li>
<li class=""><strong>iCloud</strong> has three domains (<code>icloud.com</code>, <code>me.com</code>, <code>mac.com</code>) for the same inbox.</li>
<li class=""><strong>Proton</strong> ignores dots, hyphens and underscores, and has four domains.</li>
<li class=""><strong>Google Workspace</strong> custom domains (<code>sales+crm@company.com</code>) follow Gmail's <code>+tag</code> rule, but you only know a domain is on Google Workspace by looking up its MX records.</li>
<li class=""><strong>Every other domain</strong> decides for itself. On <code>wikipedia.org</code>, <code>jo.hn+x</code> may be a different mailbox, so the only safe change is lowercasing.</li>
</ul>
<p>Get one of these wrong and you either let duplicates through or, worse, tell a real new user that they already have an account.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="doing-it-with-one-api-call">Doing it with one API call<a href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts#doing-it-with-one-api-call" class="hash-link" aria-label="Direct link to Doing it with one API call" title="Direct link to Doing it with one API call" translate="no">​</a></h2>
<p>Signitize applies all of these rules and returns the canonical email, together with two other checks you want at signup anyway:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#c02d3c">curl</span><span class="token plain"> https://api.signitize.io/v1/check </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#00797a">-H</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">"Authorization: Bearer </span><span class="token string variable" style="color:#00797a">$SIGNITIZE_API_KEY</span><span class="token string" style="color:#b8105a">"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#00797a">-H</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#00797a">-d</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'{"email":"J.O.H.N.Smith+promo@googlemail.com"}'</span><br></div></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#00797a">"email"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">"johnsmith@gmail.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#00797a">"disposable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#00797a">"deliverable"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#00797a">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>In Node.js:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> response </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#c02d3c">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">'https://api.signitize.io/v1/check'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#00797a">method</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'POST'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#00797a">headers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#00797a">Authorization</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#b8105a">`</span><span class="token template-string string" style="color:#b8105a">Bearer </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">env</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation constant" style="color:#00797a">SIGNITIZE_API_KEY</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#b8105a">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-property property" style="color:#00797a">'Content-Type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#b8105a">'application/json'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#00797a">body</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#00797a">email</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> typedEmail </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#00797a">signal</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">AbortSignal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">timeout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#00797a">5000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> email </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> db</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">users</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#c02d3c">findOne</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#00797a">emailCanonical</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> email </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#b8105a">'You already have an account.'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The full rule table per provider is in <a class="" href="https://www.signitize.io/docs/normalization">Normalization</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="two-mistakes-to-avoid">Two mistakes to avoid<a href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts#two-mistakes-to-avoid" class="hash-link" aria-label="Direct link to Two mistakes to avoid" title="Direct link to Two mistakes to avoid" translate="no">​</a></h2>
<p><strong>Blocking the signup when the check fails.</strong> If the API (yours or ours) is slow, create the account as <code>pending</code> and check it later. Hold back the free credits until then. <a class="" href="https://www.signitize.io/docs/handling-failures">Never block a signup</a> has the complete code.</p>
<p><strong>Telling attackers which emails have accounts.</strong> "This email is already registered" lets anyone test addresses. For a consumer product, consider a neutral message ("Check your inbox to continue") and handle the duplicate by email instead.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<ul>
<li class="">Don't block <code>+tags</code> or dots: real users rely on them.</li>
<li class="">Store a canonical email in a unique column and check it at signup.</li>
<li class="">Send mail to the typed address, never to the canonical one.</li>
<li class="">Keep banned users' canonical emails so aliases can't come back.</li>
</ul>
<p>You can <a class="" href="https://www.signitize.io/pricing">get a free API key</a> (2,500 checks a month, no card) and test your own aliases in the <a class="" href="https://www.signitize.io/docs">Quickstart</a>.</p>]]></content>
        <author>
            <name>Signitize</name>
            <uri>https://www.signitize.io</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Should you block disposable emails? When it hurts conversion and when it doesn't]]></title>
        <id>https://www.signitize.io/blog/should-you-block-disposable-emails</id>
        <link href="https://www.signitize.io/blog/should-you-block-disposable-emails"/>
        <updated>2026-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[An honest look at blocking temporary emails at signup. Who uses them, what blocking costs in conversions, and a middle path that stops abuse without losing users.]]></summary>
        <content type="html"><![CDATA[<p>We sell a disposable email check, so you might expect this post to say "always block them". It doesn't. Blocking throwaway addresses is right for many products and wrong for some, and doing it carelessly costs you real users.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="who-signs-up-with-a-disposable-address">Who signs up with a disposable address<a href="https://www.signitize.io/blog/should-you-block-disposable-emails#who-signs-up-with-a-disposable-address" class="hash-link" aria-label="Direct link to Who signs up with a disposable address" title="Direct link to Who signs up with a disposable address" translate="no">​</a></h2>
<p>Not only abusers. The people behind a temp-mail address are usually one of three groups:</p>
<ol>
<li class=""><strong>Free tier farmers.</strong> They want another trial, more credits, another referral bonus. They are the reason the check exists.</li>
<li class=""><strong>Privacy-minded users.</strong> They want to try your product without joining your mailing list. Some become paying customers once they trust you.</li>
<li class=""><strong>Testers.</strong> Developers and QA, often your own, trying the signup flow.</li>
</ol>
<p>Blocking hits all three. Whether that is a good trade depends on what a new account costs you.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-blocking-is-clearly-right">When blocking is clearly right<a href="https://www.signitize.io/blog/should-you-block-disposable-emails#when-blocking-is-clearly-right" class="hash-link" aria-label="Direct link to When blocking is clearly right" title="Direct link to When blocking is clearly right" translate="no">​</a></h2>
<ul>
<li class=""><strong>Each account has real cost:</strong> free AI credits, compute, SMS, storage, or anything you pay for per user.</li>
<li class=""><strong>Free trials or credits are the main draw.</strong> Farmers create accounts because the perk is valuable.</li>
<li class=""><strong>You need to reach the user later:</strong> billing notices, security alerts, account recovery. A temp inbox disappears within hours.</li>
<li class=""><strong>Referral or coupon programs</strong> where each new account earns something.</li>
<li class=""><strong>Communities and marketplaces</strong> where throwaway accounts are used for spam, fake reviews or ban evasion.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-be-careful">When to be careful<a href="https://www.signitize.io/blog/should-you-block-disposable-emails#when-to-be-careful" class="hash-link" aria-label="Direct link to When to be careful" title="Direct link to When to be careful" translate="no">​</a></h2>
<ul>
<li class=""><strong>Content sites and newsletters</strong> where an account costs you nothing and a signup is the start of a relationship. Blocking turns privacy-minded readers away for no gain.</li>
<li class=""><strong>Products for privacy-focused audiences.</strong> Your users may have good reasons to hide their main address.</li>
<li class=""><strong>Early products</strong> that need every signup for feedback, and have no free perk worth farming yet.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-cost-of-blocking">The cost of blocking<a href="https://www.signitize.io/blog/should-you-block-disposable-emails#the-cost-of-blocking" class="hash-link" aria-label="Direct link to The cost of blocking" title="Direct link to The cost of blocking" translate="no">​</a></h2>
<p>The conversion loss is real but usually small: in most products, disposable addresses are a small share of signups. The real risk is blocking the <strong>wrong</strong> addresses:</p>
<ul>
<li class=""><strong>Privacy relays</strong> such as Firefox Relay, DuckDuckGo Email Protection and Apple's Hide My Email forward to a long-lived real inbox. Treating them as disposable blocks careful people, not abusers. Signitize returns <code>disposable: false</code> for them.</li>
<li class=""><strong><code>+tags</code></strong> (<code>maria+shop@gmail.com</code>) are a normal feature, not a disposable address. Rejecting them blocks honest users; handle them with <a class="" href="https://www.signitize.io/blog/gmail-aliases-duplicate-accounts">duplicate detection</a> instead.</li>
<li class=""><strong>Yahoo "disposable addresses"</strong> (<code>nick-shopping@yahoo.com</code>) despite the name deliver to a real inbox. They should collapse to one account, not be blocked.</li>
<li class=""><strong>Outages.</strong> If your signup fails whenever the email check fails, an outage blocks everyone. Always <a class="" href="https://www.signitize.io/docs/handling-failures">fail open</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-middle-path-let-them-in-hold-back-the-perks">A middle path: let them in, hold back the perks<a href="https://www.signitize.io/blog/should-you-block-disposable-emails#a-middle-path-let-them-in-hold-back-the-perks" class="hash-link" aria-label="Direct link to A middle path: let them in, hold back the perks" title="Direct link to A middle path: let them in, hold back the perks" translate="no">​</a></h2>
<p>If you are unsure, you don't have to choose between "block" and "allow":</p>
<ol>
<li class="">Let disposable addresses sign up, but mark the account.</li>
<li class="">Give marked accounts the product, not the perks: no free credits, no trial extension, no referral rewards.</li>
<li class="">Show a friendly note: <em>"Add a permanent email address to unlock your free credits."</em></li>
</ol>
<p>Privacy-minded users can still try the product. Farmers get nothing worth farming. You can also track how many marked accounts upgrade their address, which tells you whether blocking outright would cost anything.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-decide">How to decide<a href="https://www.signitize.io/blog/should-you-block-disposable-emails#how-to-decide" class="hash-link" aria-label="Direct link to How to decide" title="Direct link to How to decide" translate="no">​</a></h2>
<p>Ask one question: <strong>what does a fake account cost me?</strong></p>
<ul>
<li class="">If the answer is "money" (credits, compute, rewards), block disposable addresses at signup, with a clear message.</li>
<li class="">If the answer is "a row in a table", allow them, or use the middle path, and focus on duplicates and verification instead.</li>
</ul>
<p>Either way, the check itself is the same single call; only what you do with <code>disposable: true</code> changes. <a class="" href="https://www.signitize.io/pricing">Get a free API key</a> and try it on your own signup data, or start with the <a class="" href="https://www.signitize.io/docs">Quickstart</a>.</p>]]></content>
        <author>
            <name>Signitize</name>
            <uri>https://www.signitize.io</uri>
        </author>
    </entry>
</feed>