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.

38posts published 187minutes of reading July 18, 2026writing here since

Posts by Thomas Tsui

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.