API Reference

STAMPT API Reference

Bank-verified identity infrastructure. Verify humans, gate by age, score trust — all through one API. Replace CAPTCHAs, KYC checkboxes, and fake accounts with real identity.

Authentication

All API requests are made to:

https://api.stampt.tech

Authenticate using your API key in the request header:

Headers
Authorization: Bearer sk_live_your_secret_key
Content-Type: application/json
Publishable vs Secret keys: Use pk_live_ keys client-side (JavaScript embed). Use sk_live_ keys server-side only — never expose secret keys in frontend code.

API Keys

Key TypePrefixUsage
Publishablepk_live_Client-side JavaScript embed. Safe to expose in frontend code.
Publishable Testpk_test_Client-side sandbox. Returns mock verification results.
Secretsk_live_Server-side API calls. Never expose in frontend code.
Secret Testsk_test_Server-side sandbox. No real Plaid calls, returns mock data.

Test Mode Live

Use test mode to integrate without real bank connections. All test mode requests use pk_test_ or sk_test_ keys and return deterministic mock responses.

Test mode is free — no Plaid calls, no verification fees. Use it for development, staging, and CI/CD testing.

Test Mode Behavior

EndpointBehaviorResponse
/api/plaid/link-tokenstringReturns a mock link_token (skips Plaid)
/api/plaid/exchangestringReturns mock STAMPT ID + gem_tier based on test email
/api/verify/age-gatestringReturns meets_age_requirement: true
/api/verify/trust-scorestringReturns score: 85, tier: "emerald"

Test Emails → GEM Tiers

Use these emails in test mode to trigger specific GEM tiers:

// Test mode email → tier mapping
amber@test.stampt.tech   → Amber  (score: 25)
ruby@test.stampt.tech    → Ruby   (score: 45)
emerald@test.stampt.tech → Emerald (score: 72)
diamond@test.stampt.tech → Diamond (score: 95)
any-other@example.com    → Topaz  (score: 55)

Quickstart

Add bank-verified identity to your site in three lines of code.

HTML
<!-- 1. Add the SDK -->
<script src="https://stampted.com/stampt-verify.js"></script>

<!-- 2. Add a container -->
<div id="verify"></div>

<!-- 3. Initialize -->
<script>
  const stampt = StamptVerify.init({
    publishableKey: 'pk_test_your_key'
  });
  stampt.mount('#verify');
  stampt.on('verified', (result) => {
    console.log(result.stamptId);  // STMPT-I-XXXXXXXX
    console.log(result.gemTier);   // emerald
    console.log(result.token);     // verification token
  });
</script>

Server-Side Validation

Always validate the verification token server-side before trusting it.

Node.js
const response = await fetch('https://api.stampt.tech/api/sso/userinfo', {
  headers: {
    'Authorization': `Bearer ${token}`
  }
});

const user = await response.json();
// { stampt_id, gem_tier, verified: true }

Exchange Token Live

POST /api/plaid/exchange

Exchanges a Plaid public token for a STAMPT verification. Creates the user's STAMPT ID, determines their GEM tier, and stores their verified identity.

ParameterTypeDescription
public_tokenrequiredstringPlaid public token from Link success callback
userIdrequiredstringUser session identifier
emailrequiredstringUser's email address
200 — Success
{
  "success": true,
  "stampt_id": "STMPT-I-A7K3M9X2",
  "gem_tier": "emerald",
  "total_liquidity": 350000,
  "verified_at": "2026-08-07T19:30:00Z"
}

User Info Live

GET /api/sso/userinfo

Returns the verified user's identity information. Use this to validate a verification token server-side.

Authentication: Pass the verification token as a Bearer token in the Authorization header.
200 — Success
{
  "stampt_id": "STMPT-I-A7K3M9X2",
  "gem_tier": "emerald",
  "verified": true,
  "verified_at": "2026-08-07T19:30:00Z"
}

Age Gate Live

POST /api/verify/age-gate

Verifies whether a STAMPT-verified user meets a minimum age requirement. Returns pass/fail only — never exposes the user's date of birth. Designed for legal compliance in alcohol, cannabis, gambling, and age-restricted industries.

ParameterTypeDescription
stampt_idrequiredstringUser's STAMPT ID
min_ageintegerMinimum age requirement. Default: 21
200 — Success
{
  "success": true,
  "verified": true,
  "meets_age_requirement": true,
  "min_age": 21,
  "stampt_id": "STMPT-I-A7K3M9X2"
}
Privacy by design: This endpoint never returns the user's date of birth or actual age. Only a boolean pass/fail against the minimum age you specify.

Trust Score Beta

POST /api/verify/trust-score

Returns a 1–100 trust score for a verified user, derived from their GEM tier, account age, and verification history. Use it to make real-time decisions: "Should I approve this $5,000 transaction? Should I trust this marketplace seller?"

ParameterTypeDescription
stampt_idrequiredstringUser's STAMPT ID
200 — Success
{
  "success": true,
  "stampt_id": "STMPT-I-A7K3M9X2",
  "score": 78,
  "tier": "emerald",
  "risk_level": "low",
  "verified": true
}

SSO / OAuth 2.0 Live

Full OAuth 2.0 authorization code flow for enterprise partners who want STAMPT as their identity provider.

GET /api/sso/authorize

Initiates the OAuth 2.0 authorization flow. Redirect users here to begin SSO authentication.

ParameterTypeDescription
client_idrequiredstringYour OAuth client ID
redirect_urirequiredstringCallback URL for your application
response_typestringMust be "code"
scopestringRequested scopes: identity, gem_tier, age_gate
statestringCSRF protection token
POST /api/sso/token

Exchanges an authorization code for an access token.

ParameterTypeDescription
grant_typerequiredstringMust be "authorization_code"
coderequiredstringAuthorization code from callback
client_idrequiredstringYour OAuth client ID
client_secretrequiredstringYour OAuth client secret
GET /api/sso/userinfo

Returns the authenticated user's verified identity. Requires a valid access token.

Webhooks Live

STAMPT sends webhook events to your registered URL when verification events occur. Configure your webhook URL in the partner dashboard at partner.stampt.tech.

Events

EventDescriptionTrigger
verification.completedstringUser successfully verified their identity
verification.failedstringVerification attempt failed
age_gate.passedstringUser passed age verification
age_gate.failedstringUser did not meet age requirement

Webhook Payload

POST to your webhook URL
{
  "event": "verification.completed",
  "data": {
    "stampt_id": "STMPT-I-A7K3M9X2",
    "gem_tier": "emerald",
    "verified_at": "2026-08-07T19:30:00Z",
    "client_id": "GRATON-EVOTLX"
  },
  "timestamp": "2026-08-07T19:30:01Z"
}

Signature Verification

Each webhook includes a X-STAMPT-Signature header containing an HMAC-SHA256 signature. Verify it against your webhook secret to ensure authenticity.

Node.js verification
const crypto = require('crypto');

const sig = req.headers['x-stampt-signature'];
const expected = crypto
  .createHmac('sha256', process.env.WEBHOOK_SECRET)
  .update(JSON.stringify(req.body))
  .digest('hex');

if (sig !== expected) {
  return res.status(401).json({ error: 'Invalid signature' });
}

JavaScript Embed SDK

The fastest way to add STAMPT Verify to any website. One script tag, three lines of code.

API Reference

MethodReturnsDescription
StamptVerify.init(config)instanceInitialize with { publishableKey, theme, label }
.mount(selector)instanceMount verify button into a DOM element
.on(event, handler)instanceListen: 'verified', 'error', 'cancel'
.verify()PromiseProgrammatically trigger verification (headless)
.destroy()voidRemove button and clean up listeners

Verified Result Object

{
  "token":    "STMPT-I-A7K3M9X2",   // validate server-side
  "stamptId": "STMPT-I-A7K3M9X2",   // user's STAMPT ID
  "gemTier":  "emerald",             // financial trust tier
  "verified": true
}

WordPress Plugin

Install from the WordPress Plugin Directory. Search "STAMPT Verify" or upload the plugin zip manually.

Settings → STAMPT Verify → paste your publishable key → choose where to show the button (login, registration, comments, WooCommerce checkout, or anywhere via [stampt_verify] shortcode).

Shopify App

Install from the Shopify App Store. The STAMPT Verify app adds a verification button to your checkout flow. Configure placement (checkout, account creation, or both) and age gate settings from the app dashboard.

Error Codes

CodeHTTPDescription
invalid_key401Invalid or missing API key
invalid_token401Verification token is invalid or expired
user_not_found404STAMPT ID does not exist
user_not_verified400User exists but has not completed verification
age_data_unavailable400User verified but DOB not captured — needs re-verification
rate_limited429Too many requests — retry after the period in Retry-After header
token_already_used400Plaid public token has already been exchanged (replay prevention)
server_error500Internal error — retry or contact support

Rate Limits

Endpoint GroupLimitWindow
/api/plaid/*10 requests15 minutes
/api/verify/*100 requests15 minutes
/api/sso/*100 requests15 minutes
All other /api/*100 requests15 minutes

Rate limit status is returned in response headers: X-RateLimit-Remaining, X-RateLimit-Reset.

GEM Tiers

Every verified user is assigned a GEM tier based on their total bank liquidity. Tiers enable risk-aware decisions without exposing exact financial data.

TierLiquidity RangeTrust Score Range
amberstring$1 – $25,000     1–20
topazstring$25K – $100K     21–40
rubystring$100K – $250K    41–55
emeraldstring$250K – $1M     56–72
sapphirestring$1M – $10M     73–85
diamondstring$10M – $50M    86–92
onyxstring$50M – $100M   93–96
royalstring$100M – $1B    97–99
crownstring$1B+           100