Build a signup triage agent that recommends, never acts

An agent that investigates a flagged signup, writes up what it found with the exact field behind every claim, and hands the decision to a person through a review queue it cannot bypass.

Your signup pipeline already flags suspicious registrations: a burst from one network, an address pattern you have seen before, a datacenter IP on a consumer product. Somebody then has to look at each flag, run the same five checks, and decide. It is repetitive work, and it is exactly the kind of work people want to hand to an agent.

Hand over the investigation. Keep the decision.

This lesson builds an agent that does the legwork on a flagged signup: validates the email, checks the IP, looks for earlier accounts by the same person, and writes a short recommendation with every claim tied to a specific field from a specific tool. Then it stops. The recommendation lands in a review queue, a person makes the call, and only the person's decision changes anything. The agent has no tool that can approve, suspend or email anyone, and that absence is the most important design decision in the lesson.

Why recommend-only is the design, not a limitation

There are three separate reasons, and any one of them would be enough.

The signals are probabilistic and the costs are not symmetric. A datacenter IP means the traffic came from a cloud provider. That covers scrapers and fraud rings, and it also covers someone on a corporate VPN, a developer testing from a cloud workstation and a privacy-conscious person on a commercial VPN. Wrongly rejecting a real customer costs you the customer and probably a complaint. Wrongly approving a throwaway account costs you a few credits of free tier. A model weighing those signals will sometimes weigh them wrong, and you want a person between that mistake and the customer.

Automated decisions about people carry legal weight. In the EU and UK, GDPR Article 22 restricts decisions based solely on automated processing that significantly affect a person, and refusing someone service can qualify. Other jurisdictions have similar rules. A human who genuinely reviews the evidence and can disagree changes the nature of the decision. A human who clicks "approve all" does not, which is why the review screen below shows evidence first. Take advice on your own obligations; the design here is what makes compliance possible, not a guarantee of it.

The model's write-up can be wrong in ways that look right. It may say "the IP is a VPN" when the tool said datacenter, not VPN. You will catch that in code, by checking every evidence item against the actual tool results, but a mistake that slips through should land on a reviewer's screen, not on an account.

The evidence, and what each field is worth

Three APIs from the catalog, all already in your catalog.json from lesson 1.

Email Validator is the richest source. Try it on a sub-addressed Gmail address:

Try it liveEmail Validator20 credits
GEThttps://api.apiverve.com/v1/emailvalidator
curl "https://api.apiverve.com/v1/emailvalidator?email=Jane.Doe%2Bnewsletter%40gmail.com" \
  -H "x-api-key: YOUR_API_KEY"
Sign in or create a free account to run this with your own key.

isSubaddressed is true and normalizedEmail is [email protected]: the dots and the +tag are gone.

normalizedEmail is the field that makes this agent useful. Gmail ignores dots and anything after a +, so [email protected] and [email protected] are the same inbox. Someone collecting repeat free trials relies on exactly that. Look up existing accounts by the normalised address and the repeat shows up immediately.

VPN Proxy Detector answers two yes-or-no questions about an IP:

Try it liveVPN Proxy Detector10 credits
GEThttps://api.apiverve.com/v1/vpndetector
curl "https://api.apiverve.com/v1/vpndetector?ip=173.172.81.20" \
  -H "x-api-key: YOUR_API_KEY"
Sign in or create a free account to run this with your own key.

Residential: is_vpn and is_datacenter are both false.

IP Lookup locates it:

Try it liveIP Lookup10 credits
GEThttps://api.apiverve.com/v1/iplookup
curl "https://api.apiverve.com/v1/iplookup?ip=8.8.8.8" \
  -H "x-api-key: YOUR_API_KEY"
Sign in or create a free account to run this with your own key.

region and regionName come back null for this address. Null means unknown, not false.

That last result is a useful warning. Some fields are null for some inputs, and city, coordinates, ASN and the EU flag are premium on IP Lookup, as is_tor and risk_level are on the VPN detector. The agent must treat a missing value as unknown. A prompt that says "reject if is_tor is true" will behave strangely on a plan where is_tor never arrives.

Here is how the signals should be weighted. This table goes into the system prompt in condensed form, and it is the part of the agent you will tune most:

SignalFieldWeight
Throwaway email domainisDisposable: trueStrong
Mail cannot be deliveredcanReceiveMail: false or isMxValid: falseStrong
Same inbox already has an accountnormalizedEmail matches an existing accountStrong for trial abuse, weak otherwise
Plus-addressingisSubaddressed: trueNeutral alone; context for the match above
Cloud or hosting networkis_datacenter: trueWeak alone
Commercial VPNis_vpn: trueWeak alone
Shared mailboxisRoleAccount: trueNot a fraud signal
Country or regioncountryName, regionNameNever a reason on its own

The last row deserves a sentence of its own. Rejecting signups because of where an IP is located turns a fraud check into a discrimination problem, and IP geolocation is wrong often enough that it would not be a fair proxy even if that were acceptable. Location is context for a reviewer, for example when it contradicts other information the person gave you, never a verdict.

Check yourself

A flagged signup has is_vpn true and every email check is clean: a deliverable address, not disposable, no existing account. What should the agent recommend?

Answer the check above to continue.

Run every example on your own key. Free plan, no card.

Scaling up?

Volume pricing, custom SLAs, and dedicated support for high-traffic teams.

Contact sales