Skip to main content
Fake sign ups waste free trials, skew your metrics and send mail to addresses that bounce. Three checks catch most of them: is the email real, is the phone number real, and where is the request coming from. This guide runs all three in parallel when someone registers, then turns the answers into one decision.

How it fits in your flow

1

User submits the sign-up form

Run your usual checks first, such as required fields. They are free and instant.
2

Your server calls Finowl three times, in parallel

Send the email to POST /v1/email/validate, the client IP to POST /v1/ip/lookup and the phone number to POST /v1/phone/validate. Each costs 1 credit, so a sign up costs 3.
3

Combine the answers

Block what can’t work, such as an email that can’t receive mail. Challenge what looks suspicious, such as a Tor exit node. Allow the rest.

Example

Python (Flask)
The IP lookup runs first because its country is a useful hint for reading a phone number typed without a +. The email check runs alongside it, so the whole check takes about as long as two lookups.

Acting on each answer

No single signal proves fraud. A traveler can have a phone from one country and an IP from another, and many people use VPNs. Combine signals and prefer a challenge over a block for anything except an email that can’t receive mail.

Using the IP country in your own logic

country_code from ip/lookup is reliable at country level, so it works well as a default and as a signal:
  • Prefill forms. Use it as the default country for the phone field, currency and tax region. Let the user change it.
  • Read local phone numbers. Pass it as country to phone/validate when the user didn’t pick one, as in the example.
  • Compare with what the user tells you. A billing country or phone country that differs from the IP country is a weak risk signal on its own and a stronger one alongside hosting or tor.
  • Apply regional rules. Route sign ups from countries you don’t serve to a waitlist, or show the right terms and consent wording.
Store the country with the account, as in signup_country above, rather than the IP address itself. It is less sensitive and is usually all you need later. If you show users a location from ip/lookup, credit “IP geolocation by DB-IP”.

Design decisions

The example fails open: if Finowl is slow or unavailable, the sign up continues without that check. A 503 such as dns_unavailable or data_unavailable is not charged, so you can also retry once while the user waits.
No. Email validation alone catches typos and throwaway addresses, which are the most common problems. Add the IP check if you offer a free trial or credits, and the phone check if you collect a number anyway.
Explain what to fix: “This email address can’t receive mail. Did you mean jane@gmail.com?” Don’t tell users which risk signals you saw, because that helps abusers adjust.
Email, phone and IP lookups process personal data. Mention them, and their purpose of preventing fraud, in your privacy notice. See Data handling and privacy.