Author

Thomas Tsui

Founder, Boundstone

Thomas Tsui is the founder of Boundstone, a trust-first phone, email and IP validation API. He writes about validating email, phone and IP data — and, above all, about being honest about what each check can and can't prove.

74posts published 353minutes of reading July 18, 2026writing here since

Posts by Thomas Tsui

November 9, 2026 · 4 min read

What is a catch-all email domain (and why it breaks verification)?

A catch-all email domain accepts mail to every address, so an SMTP yes proves nothing about a specific mailbox — why that inflates false 'valid' results.

November 6, 2026 · 5 min read

What is a spam trap email address, and can validation catch one?

A spam trap is an email address that catches senders with poor list hygiene. Pristine vs recycled traps, why no validator detects them, and how cleaning helps.

November 4, 2026 · 4 min read

What is a role-based email address?

A role-based email address like info@ or support@ belongs to a team, not a person — why that matters for onboarding, deliverability, and how to detect it.

November 2, 2026 · 5 min read

How to validate emails in Zapier without a native app

There's no native Boundstone Zapier app yet. Here's how to validate emails in Zapier using a Webhooks by Zapier POST step, plus a Filter step on disposable.

October 30, 2026 · 5 min read

How to validate emails in Google Sheets

Validate emails in Google Sheets three honest ways: the free tool for a few, a bulk CSV for a column, or Apps Script UrlFetchApp for live in-sheet checks.

October 28, 2026 · 5 min read

How to validate email addresses in WordPress

WordPress is_email() only checks syntax. Add a functions.php hook that calls Boundstone's API with wp_remote_post() to catch disposable and dead-domain emails.

October 26, 2026 · 5 min read

How to validate an email address in Spring Boot

Spring's @Email checks syntax only — it even accepts user@localhost. Add a custom ConstraintValidator that calls Boundstone for MX, disposable and role checks.

October 23, 2026 · 4 min read

Validate email in a React form: client-side UX, server-side truth

Validate email in a React form: type="email" and checkValidity() for instant UX, then check MX, disposable and role server-side so your API key never ships.

October 21, 2026 · 4 min read

Validate an email address in Rails

Rails validates email with URI::MailTo::EMAIL_REGEXP — syntax only, no MX. Add a custom ActiveModel validator that checks MX, disposable and role addresses.

October 20, 2026 · 4 min read

How to read a validation vendor's accuracy claim

Six questions that separate a measured accuracy number from a marketing one — including the two that most published figures cannot survive.

October 19, 2026 · 5 min read

How to validate an email address in Next.js

Validate email in Next.js the right way: instant client-side syntax for UX, then MX and disposable checks in a Route Handler so your API key stays a server secret.

October 16, 2026 · 5 min read

How to validate email in Make (formerly Integromat)

There's no native Boundstone module in Make (formerly Integromat). Wire email validation through the HTTP module, no code, then filter on the disposable field.

October 14, 2026 · 5 min read

Validate an email address in Laravel

Laravel's email:dns rule already checks syntax and MX. Here's what it catches, what it misses, and how to add disposable and role-account checks with one rule.

October 12, 2026 · 5 min read

How to validate an email address in Flask

Flask-WTF's Email() validator handles syntax and, with check_deliverability, MX. Here's how to add the disposable and role-account checks WTForms has no rule for.

October 9, 2026 · 6 min read

Validate an email address in an Express API

Validate email in Express with express-validator for syntax, dns.resolveMx for MX, then disposable and role checks in a POST /signup handler where the key lives.

October 7, 2026 · 5 min read

Validate an email address in Django past the syntax check

Django's EmailField checks email syntax only — not MX. Add a custom validator or clean_email() that checks deliverability, disposable, and role accounts.

October 5, 2026 · 5 min read

Validate an email address in C#

Validate an email in C#: use .NET's EmailAddressAttribute for syntax, DnsClient.NET for an MX lookup, then the Boundstone API for disposable and role checks.

October 2, 2026 · 5 min read

How to reduce your email bounce rate

Reduce your email bounce rate by validating syntax, MX records, and disposable domains before you send — and know exactly what validation can't promise.

October 1, 2026 · 4 min read

How often to re-validate the contact data in your CRM

Validation is a reading, not a property — it starts decaying the moment it is taken. How to pick a re-check cadence from how your data actually ages, instead of a calendar habit.

September 30, 2026 · 5 min read

Real-time vs batch email validation: which should you use?

Real-time vs batch email validation on Boundstone: a single /v1/verify/email call at signup versus a bulk CSV job for an existing list — when to use each.

September 29, 2026 · 4 min read

Screening checkout for fake orders — and the line where it stops

Email, phone and IP signals worth checking before you fulfil an order, and an explicit list of the fraud questions this cannot answer, including whether the shipping address is real.

September 28, 2026 · 5 min read

How to verify an email address without sending an email

You can verify an email without sending: syntax, MX, and disposable/role checks. Confirming the exact mailbox exists needs an SMTP probe — here's the ceiling.

September 25, 2026 · 4 min read

How to bulk-validate a CSV of email addresses

Post a raw CSV to Boundstone's /v1/bulk/email endpoint, get a job_id, then fetch results.csv — each row gets syntax, MX, disposable and role checks, not SMTP.

September 24, 2026 · 3 min read

Proving list quality to a client, without a number you made up

Lead-gen agencies get paid for lists and judged on bounces. How to hand over evidence a client can re-run themselves, instead of a quality score only you can see.

September 23, 2026 · 4 min read

How to validate an IP address in Ruby

Validate an IP address in Ruby with the stdlib IPAddr class, no gem — catch invalid input, detect IPv4 vs IPv6, and classify private and loopback addresses.

September 22, 2026 · 4 min read

What to do after a signup check comes back dirty

Detection is the easy half. Designing the allow / limit / review / block ladder — and deciding who owns the false positives — is where signup screening usually falls over.

September 21, 2026 · 5 min read

Validate an IP address in PHP (filter_var, and when you need more)

PHP's filter_var validates IP format and rejects private or reserved ranges natively — often all you need. Here's how, plus when an API adds classification.

September 18, 2026 · 5 min read

Validate an IP address in Java without a DNS lookup

Validate an IP address in Java with Guava's InetAddresses — no DNS lookup, no getByName trap — then classify private, loopback and public addresses locally.

September 17, 2026 · 4 min read

When a live HLR dip is worth five credits

Metadata answers whether a number could ring. An HLR dip answers whether it does. Here is the decision rule for which rows deserve the second question — and which do not.

September 16, 2026 · 6 min read

Validate an IP address in Go with the standard library

Validate an IP address in Go using net.ParseIP and the stdlib Is* methods — format, version and private/loopback/public classification, zero dependencies. Plus when an API helps.

September 15, 2026 · 4 min read

When the order confirmation never arrives

A mistyped email at checkout costs you a support ticket, a tracking-number chase and sometimes a chargeback. Catching it while the customer is still on the page costs one API call.

September 14, 2026 · 5 min read

What is CIDR notation?

What is CIDR notation? A plain guide to how a base address plus a /prefix names a range of IPs, how prefix length maps to host count, and why classification uses it.

September 11, 2026 · 5 min read

What is a private IP address? Private, reserved, and bogon addresses, explained

What is a private IP address? RFC 1918, loopback, link-local, reserved and bogon ranges explained — why a private source IP on a public request is a red flag.

September 10, 2026 · 4 min read

Routing an outbound list by line type

Mobile to SMS, fixed line to calls, ambiguous to its own bucket. How to segment an outbound list on line_type — and why the ambiguous bucket is the one that decides whether the segmentation was worth doing.

September 9, 2026 · 5 min read

Validate an IP address in C#

Validate an IP address in C# with IPAddress.TryParse for format, built-in classification, a manual RFC 1918 check, and full public/private/bogon over HTTP.

September 8, 2026 · 4 min read

Stopping free-trial abuse without punishing real signups

Trial farming runs on cheap, renewable identities. Which signals actually raise the cost of a second account, which ones just annoy honest users, and where the checks stop.

September 7, 2026 · 6 min read

IPv4 vs IPv6: what developers actually need to know

IPv4 vs IPv6 for developers: dotted-quad vs eight hextets, the :: zero-compression rules, embedded IPv4, dual-stack, and why your validation has to accept both.

September 4, 2026 · 4 min read

Validate a phone number in Ruby with phonelib

Validate a phone number in Ruby with the phonelib gem: check validity, format to E.164, and read line type locally for free, plus when to reach for an API.

September 3, 2026 · 4 min read

What bad phone data actually costs an outbound team

The cost of a wrong "valid" is never the credit — it is the rep-minutes, the routing spend and the forecast it quietly inflates. Here is how to price it with your own numbers.

September 2, 2026 · 5 min read

How to validate a phone number in PHP

Validate a phone number in PHP with libphonenumber-for-php: parse, check validity, format to E.164, and read the line type — plus the honest line where an API earns its place.

August 31, 2026 · 5 min read

How to validate a phone number in Java with libphonenumber

Validate a phone number in Java with Google's libphonenumber — isValidNumber, E.164, and line type — plus where an honest API fits past it: one contract across languages, with carrier and HLR named honestly, not faked.

August 28, 2026 · 5 min read

How to validate a phone number in Go

Validate a phone number in Go with nyaruka/phonenumbers: parse, check validity, format to E.164, and read line type in-process for free. Plus where an API fits.

August 26, 2026 · 6 min read

What is phone line type? Mobile, landline, and VoIP

Phone number line type tells mobile from landline from VoIP. Learn where it comes from, what libphonenumber's labels mean, and where the plan can't tell.

August 24, 2026 · 5 min read

What is phone number porting (and why it breaks carrier lookups)?

Phone number porting moves a number between carriers while keeping the digits — the reason offline carrier lookups from libphonenumber quietly go stale.

August 21, 2026 · 5 min read

What is an HLR lookup? The live query behind whether a number rings

An HLR lookup is a live query to a carrier's Home Location Register: the only way to know a mobile number is active and reachable — metadata can't say.

August 19, 2026 · 5 min read

Validate a phone number in C# with libphonenumber-csharp

Validate a phone number in C# with libphonenumber-csharp: parse, check validity, format to E.164, and read line type — plus where an API honestly fits.

August 17, 2026 · 5 min read

How to validate email, phone and IP in n8n

Validate email in n8n with the built-in HTTP Request node: configure the POST call, store your key in a credential, then branch on the result with an IF node.

August 14, 2026 · 5 min read

How to validate phone numbers in Clay

Add phone validation to a Clay table with an HTTP enrichment column — no native app needed. Normalize to E.164, route by line type, and see exactly which checks ran.

August 12, 2026 · 5 min read

How to normalize phone numbers to E.164

Normalize phone numbers to E.164 with libphonenumber in JavaScript and Python: parse messy input, supply a default region, and store the canonical +cc form once.

August 10, 2026 · 4 min read

How to clean a phone number list before an outbound campaign

Clean a phone number list before you dial: bulk-validate with /v1/bulk/phone, drop unparseable rows, segment by line type. Metadata-grade, honestly bounded.

July 27, 2026 · 4 min read

Check if an IP address is valid in Python

Validate an IP address in Python with the stdlib ipaddress module — check format, version, and whether it's private, loopback, reserved, or globally routable.

July 24, 2026 · 5 min read

How to validate a phone number in Python

Validate a phone number in Python with the phonenumbers library: parse, check is_valid_number, and format to E.164 — plus the honest line where an API helps.

July 22, 2026 · 5 min read

How to validate an email address in PHP

Validate email in PHP the right way: filter_var for syntax, checkdnsrr for MX, then an API for disposable and role detection. Real code, honest boundaries.

July 20, 2026 · 5 min read

How to validate an email in Node.js (without fooling yourself)

Validate an email in Node.js the honest way: a regex for shape, dns.resolveMx for the domain, and an API for disposable and role checks. Real code, no lies.

July 18, 2026 · 5 min read

Choosing a phone validation API for outbound sales

The best phone validation API for outbound isn't the flashiest one — it's the one honest about what it checked. What to evaluate, and who's good at what.

July 18, 2026 · 5 min read

How to block disposable email at signup

Read the disposable flag from one API call at signup, then choose to block, review, or tag — and handle the honest limit: no blocklist is ever complete.

July 18, 2026 · 5 min read

Bulk phone number validation for outbound sales teams

Run your whole call list through one job: drop impossible numbers, normalize to E.164, and route by line type. Free 250 rows per job, no card, metadata-grade.

July 18, 2026 · 5 min read

How to clean an email list before a cold outreach campaign

Clean your email list before cold outreach: bulk-validate to remove syntax, no-MX, disposable and role addresses before they bounce and sink sender reputation.

July 18, 2026 · 5 min read

How to detect and stop fake account signups

Detect fake signups with a layered playbook: build honeypots and per-IP velocity limits yourself, then add disposable-email, phone, and IP signal checks.

July 18, 2026 · 6 min read

How to detect VoIP phone numbers

Detect VoIP phone numbers with line-type metadata — flag numbers in VoIP-designated ranges before you dial, and stay clear on the VoIP metadata can't catch.

July 18, 2026 · 5 min read

DNC scrubbing vs phone validation: what's the difference?

DNC scrubbing checks numbers against Do-Not-Call registries. Phone validation checks a number is well-formed and its line type. Two jobs, run them in order.

July 18, 2026 · 4 min read

The perfect email validation regex is a myth (RFC 5322 and what to do instead)

The perfect email validation regex doesn't exist. See why RFC 5322 fails both ways, a short strict-enough pattern with a 254 cap, and the checks that matter.

July 18, 2026 · 5 min read

Email validation vs verification vs deliverability

Email validation, verification, and deliverability are three different things. Here is what each layer actually checks, and why an SMTP "yes" so often lies.

July 18, 2026 · 5 min read

Landline vs mobile: telling them apart before you dial or text

Route SMS to mobiles and calls to landlines. See how line_type metadata splits landline vs mobile — and where it honestly abstains and needs a live check.

July 18, 2026 · 6 min read

Multi-signal signup fraud prevention: phone, email, and IP

Combine disposable-email, phone plausibility, and IP classification into a signup-fraud risk score — plus a plain note on what Boundstone doesn't check.

July 18, 2026 · 5 min read

TCPA and cold calling: where phone validation fits (and where it does not)

TCPA phone validation, scoped honestly: it drops invalid numbers and segments by line type—but it isn't DNC scrubbing, consent, or legal advice.

July 18, 2026 · 5 min read

Validate an email address in Python: regex, stdlib, and API

A practical guide to checking email addresses in Python — the regex everyone pastes, the standard-library trap, the MX lookup that actually helps, and the checks no local code can do. With honest notes on what each layer proves.

July 18, 2026 · 4 min read

Check if an IP address is valid in Node.js: stdlib, regex, and classification

How to validate an IP address in Node.js — why net.isIP beats a regex, how to handle IPv4 and IPv6, and the difference between a valid address and a trustworthy one.

July 18, 2026 · 5 min read

How to validate leads before they hit your CRM

Bulk-validate email and phone at import so provably-bad rows never reach your CRM: drop the junk, normalize phones to E.164, and segment cleanly by line type.

July 18, 2026 · 4 min read

Phone number validation in JavaScript: regex, libphonenumber, and E.164

How to validate phone numbers in JavaScript — why the regex you found won't hold up internationally, how libphonenumber-js does it properly, and an honest account of what metadata can and can't tell you.

July 18, 2026 · 5 min read

What is a honeypot field?

A honeypot field is a form input hidden from humans but filled by bots. Learn how to build one, why it costs nothing, and the fraud it still can't catch.

July 18, 2026 · 5 min read

What is an MX record? And how email validation uses it

An MX record is the DNS record naming a domain's mail servers. Here's how MX priority, the A-record fallback, and a live MX lookup power email validation.

July 18, 2026 · 6 min read

What is a disposable email address (and what it costs you)?

A disposable email address is a throwaway inbox like Mailinator or Guerrilla Mail. Learn why they cost you, how detection works, and where it falls short.

July 18, 2026 · 4 min read

What is E.164? The phone number format, explained

E.164 is the international standard format for phone numbers. Here's what it is, how it's structured, why you should store numbers in it, and how to convert a number to E.164 correctly.