A Twilio Verify alternative for SMS codes in Georgia
Twilio is a global platform with many channels, countries and products. NOTIFY does one narrow thing: it sends verification, sign-in and password-reset codes by SMS to Georgian mobile numbers, through a small API, billed in GEL. If that is what you use Twilio for in Georgia, this page shows how the two compare and how to switch.
When NOTIFY fits
- Your users have Georgian mobile numbers (
+995 5…). - You send one-time codes: verification, sign-in, password reset.
- You want the message text ready in Georgian or English, without writing it yourself.
- You want to pay in GEL with VAT included, and know the monthly cost in advance.
- You, or your coding agent, want to build and test the whole integration before anyone creates an account: a test key takes one request.
When it does not, yet
- NOTIFY does not create or check codes for you. Twilio Verify can do both. With NOTIFY, your application creates the code, keeps it, and checks what the user types.
- Georgian mobile numbers only, and SMS only: no other countries, no voice, WhatsApp or email.
- No custom text. Every message comes from one of three built-in templates.
- There are no webhooks yet. You read a message's status when you need it.
-
Every message goes out under the shared sender name
NOTIFY, unless we have approved a sender name of your own for your project. - NOTIFY is in private beta. Payment is by bank transfer, month by month; there is no card billing and nothing renews by itself.
What maps to what
| With Twilio | With NOTIFY |
|---|---|
| Verify: start a verification, and Twilio creates and sends the code | Your application creates the code and sends it: POST /v1/messages with the verification_code template |
| Verify: check the code the user entered | Your application compares it with the code it kept |
| Messaging: send an SMS with your own text | Choose a template: verification_code, login_code or password_reset_code, in Georgian (ka, the default) or English (en) |
| A status callback URL that Twilio calls | Read GET /v1/messages/{id} while the status is queued or submitted |
| Account SID and Auth Token, sent with HTTP Basic authentication | Test and live API keys for each project, sent as Authorization: Bearer |
| A form-encoded request body | A JSON body, plus an Idempotency-Key header: a retry with the same key within 24 hours never sends a second SMS |
On status, NOTIFY keeps two things apart: submitted means the provider
accepted the message, and delivered appears only after a real delivery
confirmation.
Moving a sign-in code
- Create a 6-digit code with a secure random generator. Keep a hash of it with the user, with an expiry time, ten minutes for example.
- Send it with
POST /v1/messagesand a newIdempotency-Key. - When the user types the code, compare it with the hash and check the expiry. Accept each code once, and limit the number of attempts.
Try it from a terminal
Get a test key. No account is needed, and a test key never sends a real SMS:
curl -sS -X POST https://api.n0t1fy.dev/v1/test-keys
Copy the api_key from the answer (it starts with sk_test_) into your shell:
export NOTIFY_API_KEY=sk_test_your_key_here
Send a code. uuidgen makes a new Idempotency-Key; it comes with
macOS and most Linux systems, and any unique string works:
curl -sS -X POST https://api.n0t1fy.dev/v1/messages \
-H "Authorization: Bearer $NOTIFY_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H 'Content-Type: application/json' \
--data '{
"to": "+995500000000",
"template": "verification_code",
"variables": { "code": "482913" },
"locale": "en"
}'
Then read it with GET /v1/messages/{id} until it settles. The
examples on GitHub do all of this in Node,
Python and curl, and the API reference has the full contract.
Price
Prices are in GEL, VAT included, and every template is one SMS. Twilio publishes its own prices for Georgia on its website.