Reverse OTP Technology

Phone Verification

User-initiated verification that's secure, global, and affordable. With Reverse OTP, users send messages TO us via Telegram, WhatsApp, or SMS.

Proof Holdingsproof.holdings · verification api
AttestationNº 2026-0042
subject+370 691 •• •99
channelSMS/WhatsApp/TelegramReverse OTP
challengeVRF-4821 — sent by the user, not to them
receivedVRF-4821 · 14:02:07 UTC
verdictControl provenno code to intercept or phish
Mintedph_ctl_2f9a…e41 · ES256

Why Reverse OTP?

Traditional SMS verification sends codes TO users. We flip it - users send codes TO us. This simple change transforms cost, reliability, and security.

Traditional OTP

You
Your Server
$0.0457–$0.3868 per SMS abroad
User

You send SMS → User receives code → User enters code → You verify

$0.0457–$0.3868 per SMS abroad

Sending SMS costs vary widely by country, and verifying users abroad gets expensive fast. Twilio rates, October 2026.

Codes That Never Arrive

Carrier filtering, network issues, and regional blocks stop codes on the way. Microsoft has reported SMS delivery as low as 50% in some regions.

SIM Swaps

An attacker who gets the number moved to their SIM receives the code and passes the check.

Regional Complications

Different carriers, regulations, and formats per country. A global nightmare.

Reverse OTP

User
up to 97% less
Us
proof.holdings

User sends code to us → We verify instantly → You get proof token

Up to 97% less than sending an SMS abroad

Receiving a message costs a fraction of sending one abroad: Twilio charges $0.0457–$0.3868 to send one SMS to the 10 countries below and $0.0075 to receive one on a European number (October 2026). One proof on the €79 plan costs €0.0079. Over 90% less for Germany, the Netherlands, the UAE and Nigeria.

Nothing Outbound to Filter

The user sends the message, so no outgoing SMS is waiting on a carrier's spam filter.

The User Starts It

The code goes from the user to us, so there is no incoming code to intercept or phish.

Instant Verification

No waiting for SMS delivery. Message sent = verified within seconds.

What a SIM Swap Can Still Do

On Telegram and WhatsApp the proof comes from the messaging account, so a SIM swap alone is not enough — the attacker must also take over the account, which two-step verification blocks when the user has turned it on. On plain SMS, whoever holds the SIM can send the message, and a proof attests control at the moment it was made.

Sending one SMS (Twilio, outbound per segment, October 2026; price list) against one proof at €0.0079 on the €79 plan, at 1.1193 USD per EUR (ECB euro reference rate, 2026-10-23).
CountrySending one SMSOne proof costs less by
Germany$0.11292%
France$0.079888%
Netherlands$0.114392%
Lithuania$0.057884%
Poland$0.045780%
United Kingdom$0.05684%
United Arab Emirates$0.117692%
India$0.083289%
Nigeria$0.386897%
Brazil$0.059985%

Users verify via their preferred channel

telegram logoTelegram
whatsapp logoWhatsApp
SMS
How It Works

User sends a message to prove they control the phone number

§ 01

Create Verification

Call our API with the phone number to verify. We generate a unique challenge code and verification link.

§ 02

User Sends Message

User sends the challenge code to our number via their preferred channel (WhatsApp, Telegram, or SMS).

§ 03

Proof Generated

We verify the message came from the claimed number and return a cryptographic proof token.

API Integration

Integrate phone verification 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": "telegram",
    "identifier": "+37069199199"
  }'

2. Verify the Proof Token

# Poll for verification status
curl https://api.proof.holdings/api/v1/verifications/VERIFICATION_ID \
  -H "Authorization: Bearer pk_live_YOUR_API_KEY"

Response Example

{
  "id": "507f1f77bcf86cd799439011",
  "type": "phone",
  "channel": "telegram",
  "status": "verified",
  "identifier": "+37069199199",
  "verified_at": "2026-03-15T10:51:30Z",
  "verified_data": {
    "telegram_user_id": "123456789"
  },
  "proof": {
    "token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...",
    "expires_at": "2027-03-15T10:51:30Z"
  }
}