Use Case

2FA, Recovery & Settings Verification

Step-up checks for 2FA, account recovery and settings changes, on a different channel than the login. With Reverse OTP the user sends the code to us, so someone who only knows the password cannot start it. Choose WhatsApp, Telegram, Reverse SMS or email.

Proof Holdingsproof.holdings · verification api
Step-up recordNº 2026-0110
factorWhatsApp — chosen channel
methodReverse OTP step-up
challengea different channel than the login
received14:44:03 UTC
verdictStep-up provenan attacker can't intercept what they didn't start
Mintedph_ctl_4c9b…e65 · ES256
How It Works

Add an extra layer of security for sensitive user actions

§ 01

Trigger Verification

User initiates 2FA, account recovery, or sensitive settings change. Request verification via their preferred channel.

§ 02

Quick Confirmation

The user sends a code to us over WhatsApp, Telegram or SMS, or confirms by email with a magic link or a one-time code.

§ 03

Action Confirmed

We verify proof of control and confirm the action. Secure 2FA, recovery, or settings update complete.

API Integration

Add 2FA and recovery verification to your app in minutes

1. Create Verification Request

curl -X POST https://api.proof.holdings/api/v1/verifications \
  -H "Authorization: Bearer pk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "phone",
    "channel": "whatsapp",
    "identifier": "+37069199199"
  }'

2. Verify the Proof Token

# Poll until the user has sent the code (step-up complete)
curl -X GET https://api.proof.holdings/api/v1/verifications/VERIFICATION_ID \
  -H "Authorization: Bearer pk_live_YOUR_API_KEY"

Response Example

{
  "id": "507f1f77bcf86cd799439011",
  "type": "phone",
  "channel": "whatsapp",
  "status": "pending",
  "identifier": "+37069199199",
  "challenge": {
    "code": "X7K9M2",
    "deep_link": "https://wa.me/15557766633?text=Verify%20X7K9M2",
    "qr_code": "data:image/png;base64,...",
    "expires_at": "2026-03-15T10:45:00Z"
  }
}