TUTORIAL

Quickstart: Score your first signup

Send a signup risk request, inspect the 0–100 score, review the risk details, and use the allow/review/block recommendation in your app.

Beginner • 10 minutes • Real-time signup scoring

What you will build

In this quickstart, you will send one signup risk request to Signup Risk API and use the response to decide whether your app should allow, review, or block a signup attempt. By the end, you will know how to:

  • Create an API key and authenticate
  • Send a signup risk request
  • Include check results and explanation details
  • Read the 0–100 risk score and risk band
  • Use the action recommendation
  • Add simple allow/review/block logic to your app

Before you start

You need a Signup Risk API account and an API key. The Free plan works for this tutorial: 200 requests and 50 explanations per month, no credit card required.

Account Create one at app.signuprisk.com/sign-up.

API key In the dashboard, open API Keys and select Create key. Copy the secret right away; it is shown once. Production keys start with eisk_live_, test keys with eisk_test_.

Server-side environment Keep the key in a server-side environment variable or secret manager. Never put it in browser code, mobile bundles, or source control. Call the API from your backend.

JSON client You can test with curl, Postman, Insomnia, or your application code.

Send your first signup risk request

Send an email address from your backend and ask the API to include the check breakdown and explanation. The key goes in the Authorization header as a Bearer token; that is the only accepted way to authenticate.

bash
curl https://api.signuprisk.com/v1/analyze-email \
  -H "Authorization: Bearer $SIGNUPRISK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "maria.garcia@protonmail.com",
    "options": {
      "include_checks": true,
      "include_explanation": true
    }
  }'

Test with a real address. Documentation-reserved domains such as example.com, example.org, and example.net can never receive email, so the API always returns block with a risk score of 100 for them. Other reserved special-use names (for example .example, .test, .invalid) are also identified as names that can never receive email (see checks.domain_infrastructure.reserved_special_use).

Optional signup context. email is the only required field. You can add more context on the same request:

FieldPlanWhat it does
nameAll plansThe submitted name, used for name/email alignment (name_match)
ipGrowth and aboveThe signup IP, used for IP reputation and network type (datacenter, VPN, proxy, Tor). On lower plans the request still succeeds, IP evidence is omitted, and you get an IP_INTELLIGENCE_NOT_AVAILABLE warning
industryScale and aboveSelects an industry scoring profile (default, fintech, marketplace, saas, ecommerce, community). On lower plans the request is scored with the default profile and you get an INDUSTRY_NOT_AVAILABLE warning
json
{
  "email": "maria.garcia@protonmail.com",
  "name": "Maria Garcia",
  "options": { "include_checks": true, "include_explanation": true }
}

Field-level details are in the API reference.

Read the response

The response has up to five top-level objects: email and decision always, checks and explanation when you ask for them, and metadata always (usage, warnings, plan context, and cache status when a result came from the cache). Illustrative response, not a real API result. Trimmed to email, decision, and metadata; the values are the illustrative example from the docs quickstart. Your scores depend on current data, and metadata reflects your own account.

Illustrative response, not a real API result.

json
{
  "email": {
    "input": "maria.garcia@protonmail.com",
    "normalized": "maria.garcia@protonmail.com",
    "normalized_preserving_case": "maria.garcia@protonmail.com",
    "canonical": "maria.garcia@protonmail.com",
    "is_well_formed": true,
    "format_issues": [],
    "format_explanation": "The email address is structurally well formed. This does not mean it is safe, trusted, deliverable, or non-disposable.",
    "is_internationalized": false
  },
  "decision": {
    "action": "allow",
    "risk_score": 5,
    "risk_band": "low",
    "summary": "Low-risk signup. No significant risk checks failed.",
    "assessment": {
      "confidence": "high",
      "evidence_strength": "moderate",
      "evidence_coverage": "broad",
      "uncertainty": "low",
      "limitations": []
    }
  },
  "metadata": {
    "warnings": [],
    "usage": {
      "requests": { "used": 1, "limit": 10000, "unlimited": false, "remaining": 9999 },
      "explanations": { "used": 0, "limit": 500, "unlimited": false, "remaining": 500 }
    },
    "plan": {
      "current_plan": "Developer",
      "billing_period": { "starts": "2026-09-16T00:00:00Z", "ends": "2026-10-16T00:00:00Z" },
      "reset_at": "2026-10-16T00:00:00Z"
    },
    "assessment_version": "2026.08.28"
  }
}

The example account is on the Developer plan: 10,000 requests and 500 explanations per month, 30 requests per minute.

What to read first

  • decision.action: the recommendation (allow, review, or block).
  • decision.risk_score and decision.risk_band: how risky the signup looks (Step 3).
  • decision.assessment: how strongly the available evidence supports the decision. confidence is high, medium, or low; limitations lists caveats such as name_not_supplied or ip_not_supplied.
  • email.canonical: an identity form that folds googlemail.com into gmail.com and strips plus-addressing (and Gmail dots). Use it to spot repeat signups. It is not a delivery address.
  • metadata.warnings: non-fatal notices. A warning never means the request failed.

Checks. With include_checks, all eight checks are returned: disposable_email, domain_infrastructure, provider, role_address, domain_typo, synthetic_identity, name_match, and ip_reputation. Most checks have a result, confidence, method, evidence, and risk_contribution, plus fields of their own. Here is the docs' illustrative checks.disposable_email for a clean address (illustrative, not a real API result):

json
{
  "result": "none",
  "confidence": "high",
  "method": "dataset_exact",
  "evidence": [],
  "risk_contribution": 0,
  "is_disposable": false
}

When a check could not be evaluated, its result is unknown and it contributes 0. A temporary DNS failure shows up as unavailable on domain_infrastructure. Unavailable evidence is never counted as a pass or a failure. Explanation. With include_explanation, the explanation object adds a plain-language summary, top_reasons (each an object with reason, check, and contribution), risk_factors and neutral_factors (each with factor and contribution), and a recommendation_reason. Explanations use a separate monthly allowance. If it runs out, the analysis still succeeds and explanation.explanation_available is false. Exact fields can vary by plan and options. The API reference is the source of truth for the full response schema.

Understand the 0–100 risk score

decision.risk_score is an integer from 0 to 100; higher means more signup risk. The band comes from the score, and the recommended action comes from the band:

Risk scorerisk_banddecision.actionTypical handling
0–24lowallowUsually safe to allow. No significant risk checks failed.
25–49moderatereviewMay deserve light friction, verification, or monitoring depending on your product.
50–74highreviewShould usually be reviewed, challenged, limited, or routed through extra verification.
75–100very_highblockUsually a strong candidate for blocking or strict manual review.

The action is a recommendation. Signup Risk API never allows, challenges, or blocks anyone itself; your app decides what allow, review, and block mean.

Use the recommendation in your app

The fastest way to integrate the API is to use decision.action directly in your signup flow.

javascript
function routeSignup(result) {
  switch (result?.decision?.action) {
    case "allow":
      return {
        action: "create_account",
        message: "Signup allowed."
      };
    case "review":
      return {
        action: "hold_for_review",
        message: "Signup needs additional verification."
      };
    case "block":
      return {
        action: "deny_signup",
        message: "Signup blocked due to risk findings."
      };
    default:
      return {
        action: "hold_for_review",
        message: "Unknown recommendation. Review manually."
      };
  }
}

For early integrations, start by allowing low-risk signups, reviewing uncertain signups, and blocking only the highest-risk attempts. You can tighten rules later as you learn your product's normal signup patterns.

Place the check before account creation

In a real product, call Signup Risk API from your backend after the user submits the signup form but before you create the account, grant trial access, accept a seller, add a lead to CRM, or allow community access.

  1. Submit Form — User submits signup form
  2. Send Context — Your backend sends the signup context to Signup Risk API
  3. Get Score — The API returns email details, decision, checks, explanation, and metadata
  4. Route User — Your app allows, reviews, or blocks the signup
  5. Log Decision — Your product logs the decision for audit and tuning

Signup Risk API analyzes the address, its domain, and the context you send. It does not send email or verify mailboxes over SMTP, so keep your own email-confirmation step if you need proof that the user owns the inbox.

Scoring more than one address

  • Batch: POST /v1/analyze-email/batch scores up to 50 emails per request, on every plan. Each email uses one request from your monthly allowance and counts as one unit against your per-minute rate limit. A full 50-email batch needs at least 50 requests per minute (Growth and above), so on Free (5 per minute) or Developer (30 per minute), keep each batch within your plan's per-minute limit. See Analyze up to 50 emails.
  • Bulk CSV: asynchronous bulk jobs (/v1/bulk/jobs) are available on Scale and above, for files up to 1,000,000 rows. See Create a bulk job.

Where to go next

  • Block Disposable Email Signups — Learn how to detect burner domains and temporary inboxes before fake users enter your product. Read tutorial →
  • Should You Block Disposable Emails at Signup? — Choose a policy for allow, review, and block, with working code. Read the guide →
  • Understanding the Response — What every field in the decision, checks, explanation, and metadata means. View docs →

Score your first signup in minutes

Use Signup Risk API to turn signup details into a clear 0–100 score and an allow, review, or block recommendation.