vevee.guard.outcome()POST /api/v1/guard/outcomesk_live_

Optional. Tell Vevee how a guarded signup turned out. Outcomes feed per-domain counters that help surface new throwaway domains for review. Requires a secret key (sk_*) and SDK 1.15.0 or later.

Signature

vevee.guard.outcome(p: {
  userId: string;   // the id you passed to guard.signup()
  email: string;
  outcome: 'verified' | 'never_verified' | 'abuse';
}): Promise<void>

Example

// When the user confirms their email
await vevee.guard.outcome({ userId, email, outcome: 'verified' });

// From a daily job: accounts that never confirmed within 7 days
for (const u of await usersNeverVerified({ olderThanDays: 7 })) {
  await vevee.guard.outcome({ userId: u.id, email: u.email, outcome: 'never_verified' });
}

// When you ban an account for farming free credits
await vevee.guard.outcome({ userId, email, outcome: 'abuse' });

What it does

  • Only the email domain is counted, with the outcome. Nothing about the person is stored.
  • A domain is proposed for review only with at least 20 signups, outcomes from at least 3 different apps, and more than 80% never_verified or abuse. Big consumer domains are never proposed, and nothing is added without a human approving it.
  • Outcome calls do not count against the guard allowance.
  • Calls made with a test key (sk_test_) are accepted and ignored.

Never throws

outcome() resolves to undefined whatever happens; failures go to onGuardError if you set it. Raw HTTP errors: invalid_key (401), requires_secret_key (403), invalid_request (400, for example an unknown outcome value).