Verify customers for 0₮
Verify customers and earnYour user sends an SMS from their own phone to 150073 and pays their operator 150₮. It costs you nothing. You receive the verification result on your server automatically.
This message costs 150₮
Number verified
9911 2233
Verified by SMS to 150073
ContinueHow it works
Three steps. One verification.
- 1
Create a code.
Create a verification with the API and get a one-time code.
POST /v1/sessions - 2
The user sends an SMS.
The user sends the code from their own phone to 150073.
sms:150073?body=482913 - 3
Get the result.
2fa.mn checks the message and notifies your server of the result by webhook.
verification.succeeded
Connect with the widget
In 10 lines
Add one button to your page. The widget shows the modal with the number field, the price, the code, the SMS button and the QR code. Your server gets the verified number with one call.
- The user enters their number and proves it by sending the SMS from that phone.
- The price-before-button rule is met for you.
- Theme, colour and language are set in the Dashboard.
<div id="twofa"></div>
<script src="https://verify.2fa.mn/embed/v1/embed.js"></script>
<script>
TwoFA.button('#twofa', { key: 'pk_live_...', state: '<random value from your session>' })
.on('verified', ({ token }) => fetch('/login', { method: 'POST', body: token }));
</script>Sign in
Sign in to Example with your phone number.
Why it beats SMS codes
Proves the SIM
The message comes from the user's own SIM, so it proves they hold that number.
No SMS pumping
Nothing is sent at your expense, so fake requests can't drain your money.
No cost for you
The user pays their operator 150₮ for the SMS, and you earn on every verification.
Pricing
Know the price up front. Verify with confidence.
When the user sends the SMS to 150073, they pay their operator 150₮.
Show the price clearly to the user before they start a paid action.
See the pricing detailsPaid by the user
Connect with the API
Start connecting in a few steps.
Connect 2fa.mn to your system with a REST API, signed webhooks and clear documentation.
- Start in the test environment.
- Send your API request.
- Verify the webhook signature.
- Process the verification result in your system.
curl https://api.2fa.mn/v1/sessions \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{"metadata": {"user_id": "42"}}'const res = await fetch('https://api.2fa.mn/v1/sessions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TWOFA_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ metadata: { user_id: '42' } }),
});
const session = await res.json();
// session.sms_uri === "sms:150073?body=482913"body := strings.NewReader(`{"metadata": {"user_id": "42"}}`)
req, _ := http.NewRequest("POST", "https://api.2fa.mn/v1/sessions", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("TWOFA_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer res.Body.Close()
var session struct {
ID string `json:"id"`
SMSURI string `json:"sms_uri"`
}
err = json.NewDecoder(res.Body).Decode(&session)<?php
$ch = curl_init('https://api.2fa.mn/v1/sessions');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('TWOFA_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['metadata' => ['user_id' => '42']]),
]);
$session = json_decode(curl_exec($ch), true);
// $session['sms_uri'] === "sms:150073?body=482913"import os
import requests
res = requests.post(
"https://api.2fa.mn/v1/sessions",
headers={"Authorization": f"Bearer {os.environ['TWOFA_KEY']}"},
json={"metadata": {"user_id": "42"}},
)
session = res.json()
# session["sms_uri"] == "sms:150073?body=482913"The same 150073 on every operator
Users send the SMS to 150073 from their own operator. All six operators are connected: Unitel, Mobicom, Skytel, G-Mobile, ONDO and Lime. Toki (on Unitel's network) and KAOS (on Mobicom's network) work too.
Questions
Who pays the 150₮?
The user who sends the SMS pays their operator 150₮. You pay nothing and earn on every verification. Our terms require you to show the price before the SMS button and hide the button once the number is verified. The docs include a ready-made component.
When and how do I get paid?
Every successful live verification earns the amount set in your contract. Earnings for a month are paid by the end of the following month, based on operator-confirmed counts. The minimum payout is 10,000₮; if you close your account, a final balance under 10,000₮ is not paid out. Individuals have 10% income tax withheld and paid on their behalf; VAT-registered companies get 10% VAT added. If unusual traffic is detected, the related earnings are held until it has been reviewed. Add your bank account under Earnings in the Dashboard.
Which operators work?
All six operators are connected and live: Unitel, Mobicom, Skytel, G-Mobile, ONDO and Lime. Users verify from their own operator, and ported numbers work too. Toki (on Unitel's network) and KAOS (on Mobicom's network) work too.
Where is the data stored?
All data stays on servers in Mongolia. Phone numbers and message contents are used only for verification, and message contents are deleted after 90 days.
Do ported numbers work?
Yes. We never guess the operator from the number prefix. We see which operator's network delivered the message.
Does testing cost anything?
No. Test keys never reach an operator. Call POST /v1/test/mo to simulate the user's SMS and run the whole flow for free.
Start verifying numbers today.
Try the connection with a test key, then connect 2fa.mn to your system.