Trial abuse, AI credit farming, self-referrals and coupon stacking are one move: someone signing up again and again. One API call links the accounts and returns allow, review or block, with the reason.
1,000 screenings a month freeNo card to startLive in one API call
Events · live
Every decision, with its reason
Screened today
1,284
7 event types
Blocked
37
2.9%
In review
12
4 payouts held
Linked clusters
9
31 accounts
Why the referral was held
reviewThe referrer and the claimer are one identity: same device, same card.
Recommended action: hold the payout
Sound familiar?
Every one of these is the same move: one person pretending to be many.
Free trials
Same person, new email, every two weeks. A one-trial-per-email rule stops nobody who owns a second inbox.
Every repeat trial is compute you pay for and a signup you count as growth.
AI credits
Scripts spin up accounts in bulk to mine your free credits. By the time the usage graph looks odd, the tokens are spent.
You pay inference for users who were never going to pay you.
Referrals & promos
A second account on the same card claims the bonus. A launch code gets redeemed forty times by one household.
Rewards meant to buy customers go to one person, over and over.
Why Portreeve
Everything you already run is good at its own job. None of it can tell that two of your accounts belong to the same person — and that is the only question abuse turns on.
| What you use now | Portreeve | |
|---|---|---|
| Fake signups | CAPTCHA and a disposable-email list Stops bots. Waves through a person with forty real Gmail addresses. | Links the accounts by device, card and email, and flags the fortieth. |
| Trial abuse | One trial per email address A new inbox is a new trial. | One trial per person, however many inboxes they own. |
| Card testing | Stripe Radar Scores each payment well. Doesn't know this is the same device's sixth card. | Counts distinct cards per device and per identity, across your accounts. |
| Self-referrals | Your referral tool checks the two account IDs differ Two accounts, one human, one card. | Checks the two sides are different people, and holds the payout if not. |
| Coupon abuse | One redemption per customer account Per account is not per person. | Counts redemptions of each code per identity, not per login. |
| Reviewing it all | CSV exports and a gut call No record of why anything was stopped. | A review queue with the reason on every decision. |
Fake signups
What you use now
CAPTCHA and a disposable-email list
Stops bots. Waves through a person with forty real Gmail addresses.
Portreeve
Links the accounts by device, card and email, and flags the fortieth.
Trial abuse
What you use now
One trial per email address
A new inbox is a new trial.
Portreeve
One trial per person, however many inboxes they own.
Card testing
What you use now
Stripe Radar
Scores each payment well. Doesn't know this is the same device's sixth card.
Portreeve
Counts distinct cards per device and per identity, across your accounts.
Self-referrals
What you use now
Your referral tool checks the two account IDs differ
Two accounts, one human, one card.
Portreeve
Checks the two sides are different people, and holds the payout if not.
Coupon abuse
What you use now
One redemption per customer account
Per account is not per person.
Portreeve
Counts redemptions of each code per identity, not per login.
Reviewing it all
What you use now
CSV exports and a gut call
No record of why anything was stopped.
Portreeve
A review queue with the reason on every decision.
Portreeve sits between your customer and your product — screening every event inline, returning a verdict, and remembering it in a per-tenant abuse graph.
See the decision, follow the evidence, and act. Explore an example below to see how event history becomes a clear next step.
Every decision has a history you can inspect.
A fresh email does not mean a fresh start. Shared device history connects this trial to earlier activity.
Sent to your review queue
Inspect the evidence and record your decision in one place.
Illustrative data. Your verdicts use your own event history.
Try it with your trafficBan an abuser and they return on a fresh burner email. A lookup API forgets each request, so it falls for it every time. Portreeve keeps your history, so the same device is judged against everything it has done before — no matter how the email changes.
| Seen | Device | Verdict | |
|---|---|---|---|
| 09:14 | a.nguyen@gmail.com | dtk_7f2a91 | allow |
| 11:02 | jrt91@mailinator.com | dtk_7f2a91 | review |
| 11:05 | k85x@guerrillamail.com | dtk_7f2a91 | review |
| 11:09 | temp9@sharklasers.com | dtk_7f2a91 | block |

One device, four burner emails — the verdict hardens from allow to review to block.
Drop one call into your signup, trial, checkout, login, referral or coupon path. It returns before you commit the action, with the reason codes that produced it.
import { Portreeve } from "portreeve";
const gate = new Portreeve(process.env.PORTREEVE_SECRET_KEY!);
// at signup, before you create the account
const { verdict, reasons } = await gate.verdict({
event_type: "signup",
email: input.email,
ip: req.ip,
device_token: input.device_token,
});
if (verdict === "block") return reject(reasons);Place one verdict call before the action. It returns a clear decision and the reason codes behind it, so your application can act before committing the signup or checkout.
One clear decision plus the reason codes behind it. No risk score to interpret, no recommended_action to second-guess.
The engine is the same on every plan. Price scales with your monthly screening volume, overage rates, and support needs.
Connect your signup or checkout flow, see the evidence behind each verdict, and give your team one place to resolve the cases that need a closer look.