# Calisero > Calisero is a Romanian transactional SMS API: OTP/2FA verification codes, order and courier notifications, invoice and payment reminders, account alerts and appointment reminders, sent through a REST API. Pay per message, no subscription: €0.035 per SMS part, VAT excluded. Pe scurt: Calisero este un furnizor românesc de SMS-uri tranzacționale prin API (coduri OTP/2FA, notificări de comandă și curierat, facturi, alerte, programări), livrate cu prioritate. Preț: 0,035 € per SMS, fără TVA și fără abonament. Fiecare cont nou primește 1 € credit de test, fără obligații. Operated by CALISERO S.R.L., Strada Pășunii 7A, Brașov, Romania. Contact: contact@calisero.ro, +40 742 350 350 (phone and WhatsApp). Prices, phone numbers, e-mail addresses and services (such as voice calls) listed in older copies of this site are no longer valid; the details in this file are current. The site is published in Romanian (at the root) and in English (under /en); the API documentation is in English. The complete version of this file, with the full API reference and every guide in Markdown, is at https://calisero.ro/llms-full.txt. **Key facts** - Price: €0.035 per SMS part, VAT excluded. No monthly fee, no activation cost, no minimum commitment. Custom offers for consistently high volumes. - Test credit: every new account gets €1 test credit, with no obligation. - Coverage: the Orange, Vodafone, Telekom and Digi mobile networks in Romania, at the same price per SMS. - Priority zero: informational (transactional) SMS and OTP codes are delivered with priority, so they reach the phone fast. - Length: one SMS holds 160 GSM-7 characters, or 70 when the text contains Romanian diacritics or emoji (UCS-2). A longer text is split into parts, each part is billed as one SMS, and the API response returns the number of parts. - Billing: messages rejected before dispatch (for example an invalid number) are not billed; messages dispatched to the network are. - Phone numbers: international E.164 format, for example +40712345678. - Sender ID: an alphanumeric sender name holds at most 11 characters and cannot receive replies. - OTP: Calisero generates a 6-character code (letters and digits, case-insensitive), sends it and validates it. A code is valid for 5 minutes by default (configurable from 1 to 10), is used once, expires automatically and has a limited number of validation attempts. OTP codes can be sent from the shared "Verify" sender. **API quick reference** - Base URL: https://rest.calisero.ro/api/v1. Authentication: `Authorization: Bearer `, with an API key from your Calisero account. JSON in, JSON out. - `POST /messages` sends an SMS. Required: `recipient` (E.164), `body` (up to 1600 characters). Optional: `sender`, `schedule_at` (`YYYY-MM-DD HH:MM:SS`), `callback_url`, `validity` (hours), `visible_body`, `shorten_urls`. - `GET /messages` lists messages, `GET /messages/{messageId}` returns one, `DELETE /messages/{messageId}` deletes one. - OTP: `POST /verifications` (`phone`, plus `brand` or a `template` containing `{code}`; optional `expires_in` in minutes, 1–10), then `PUT /verifications/validate` (`phone`, `code`). `GET /verifications` and `GET /verifications/{verificationId}` read them back. - Opt-outs: `GET /opt-outs`, `POST /opt-outs`, `GET /opt-outs/{optOutId}`, `PUT /opt-outs/{optOutId}`, `DELETE /opt-outs/{optOutId}`. Account: `GET /accounts/{accountId}`. - Delivery webhook: set `callback_url` when you create a message. Calisero sends a JSON `POST` with `messageId`, `sender`, `recipient`, `status` (`sent`, `delivered` or `undelivered`), `scheduleAt`, `sentAt`, `deliveredAt`, `price`, `remainingBalance`, `dailyLimit`, `dailyRemaining` and `sentToday`. Answer with any 2xx within 2 seconds. Only a timeout or a failed connection is retried, at most 5 attempts in total (after 1 s, 10 s, 1 min and 6 min); a non-2xx answer is not retried. - Rate limit: 240 requests per minute per authenticated user; above it the API answers 429. - Trace ID: every API answer carries `X-Trace-Id`, the request's id, also on its messages and callbacks; an error's body has it as `trace_id`. The dashboard's "Debug" page (Developers) shows everything that happened to the request. - Daily sending limit: every account has its own; a new account starts with 200 messages a day, raised on request. Each real message counts once (OTP codes too, a scheduled one on the day it is created, sandbox tests never) and the day resets at midnight, Romania time. `POST /messages` and `POST /verifications` answer with `X-Daily-Limit` and `X-Daily-Remaining`; over the limit they answer 429 with `"code": "daily_limit_exceeded"`, unlike the rate limit's 429 (`{"message": "Too Many Attempts.", "trace_id": "…"}`). - Errors: 401 for a missing or invalid API key, 403 for an action the key may not perform, 404 for an unknown identifier, 422 with the offending fields for a payload that fails validation. ## Product - [Informational SMS messages](https://calisero.ro/en/services/transactional-sms) ([RO](https://calisero.ro/servicii/sms-tranzactionale)): payment terms, order status, courier and parcel delivery notifications, OTP and 2FA codes, alerts and appointment reminders, delivered on priority zero routes. - [One-time PIN (OTP/2FA) SMS](https://calisero.ro/en/services/otp-sms) ([RO](https://calisero.ro/servicii/otp-sms)): six-character codes generated by Calisero, with attempt limits, monitoring of every validation attempt and the shared "Verify" sender. - [Prices](https://calisero.ro/en/pricing) ([RO](https://calisero.ro/preturi)): price per SMS, cost calculator and frequent questions. - [Services](https://calisero.ro/en/services) ([RO](https://calisero.ro/servicii)): both services side by side. - [Home](https://calisero.ro/en) ([RO](https://calisero.ro)): what Calisero does, in short. ## Developers - [API documentation](https://docs.calisero.ro): every endpoint with its parameters, sample requests and responses. - [OpenAPI 3 specification](https://docs.calisero.ro/open-api): the machine-readable contract, JSON. - [Full reference for LLMs](https://calisero.ro/llms-full.txt): the facts above, the complete API reference and every guide, in Markdown. - [Official libraries](https://calisero.ro/en/developers/integrations) ([RO](https://calisero.ro/developer/integrari)): the PHP library, the Laravel SMS package, the Symfony bundle and the Node.js library; Go and Python libraries are in development. - [PHP library calisero/calisero-php](https://github.com/calisero/calisero-php): `composer require calisero/calisero-php`, compatible with PHP 7.4 – 8.5. - [Laravel SMS package calisero/laravel-sms](https://github.com/calisero/laravel-sms): `composer require calisero/laravel-sms`; artisan commands, publishable configuration, queue-ready delivery, delivery events and phone number validation. - [Symfony bundle calisero/symfony-sms](https://github.com/calisero/calisero-symfony): `composer require calisero/symfony-sms`; Symfony 6.4, 7 and 8 on PHP 8.2 – 8.5; autowired client, Notifier transport (`calisero://`), delivery webhook with events, console commands and validation constraints. - [Node.js library @calisero/calisero-node](https://github.com/calisero/calisero-node-js): `npm install @calisero/calisero-node`; TypeScript, no dependencies, Node.js 20.19 or later; messages, OTP verifications, opt-outs, account details and a delivery webhook handler for Node.js and Express. - [Service status](https://stats.uptimerobot.com/Eu4KDDvzLx): current availability. ## Guides - [Knowledge base](https://calisero.ro/en/developers/knowledge-base) ([RO](https://calisero.ro/developer/knowledge-base)): every guide and announcement. - [The official Node.js library for Calisero is available](https://calisero.ro/en/developers/knowledge-base/biblioteca-nodejs-disponibila) ([RO](https://calisero.ro/developer/knowledge-base/biblioteca-nodejs-disponibila)): Fully typed, Promise-based and with no dependencies: send SMS, verify phone numbers with OTP codes and receive delivery reports from Node.js in a few lines. - [The official Symfony bundle for Calisero is available](https://calisero.ro/en/developers/knowledge-base/bundle-symfony-disponibil) ([RO](https://calisero.ro/developer/knowledge-base/bundle-symfony-disponibil)): An autowired client, a Notifier transport, a delivery webhook with Symfony events and console commands — Calisero now fits into a Symfony application the Symfony way. - [The official Laravel package for Calisero is available](https://calisero.ro/en/developers/knowledge-base/pachet-laravel-disponibil) ([RO](https://calisero.ro/developer/knowledge-base/pachet-laravel-disponibil)): Artisan commands, publishable configuration, queue-ready delivery and broadcastable delivery events — integrating Calisero into a Laravel application now takes minutes. - [Your first SMS through the API, in ten minutes](https://calisero.ro/en/developers/knowledge-base/ghid-integrare-api) ([RO](https://calisero.ro/developer/knowledge-base/ghid-integrare-api)): From generating an API key to a delivered message: the minimum steps for a working integration, with code samples and the mistakes people make on day one. - [OTP and 2FA: what they are, when to use them, how to get them right](https://calisero.ro/en/developers/knowledge-base/otp-2fa-explicat) ([RO](https://calisero.ro/developer/knowledge-base/otp-2fa-explicat)): One-time codes are the simplest barrier between a customer's account and whoever learned their password. Here is how to build them so they actually help. - [Detailed reports for every message you send](https://calisero.ro/en/developers/knowledge-base/rapoarte-detaliate-livrare) ([RO](https://calisero.ro/developer/knowledge-base/rapoarte-detaliate-livrare)): Final status, delivery timestamp, part count and failure reason — for each individual message, right in your account, without querying the API. - [Transactional or promotional SMS? The difference regulators see](https://calisero.ro/en/developers/knowledge-base/tranzactional-vs-promotional) ([RO](https://calisero.ro/developer/knowledge-base/tranzactional-vs-promotional)): The same infrastructure, two entirely different legal regimes. Classifying a message wrong brings complaints, route blocks and fines. - [Webhooks: how you learn the message actually arrived](https://calisero.ro/en/developers/knowledge-base/webhooks-livrare) ([RO](https://calisero.ro/developer/knowledge-base/webhooks-livrare)): The API confirms you sent. The delivery callback tells you what happened next. Here is how to build one so you never lose an event. - [Opt-out and GDPR: what you must do with an unsubscribe request](https://calisero.ro/en/developers/knowledge-base/opt-out-gdpr) ([RO](https://calisero.ro/developer/knowledge-base/opt-out-gdpr)): The right to stop receiving messages has no cooling-off period and no commercial exceptions. How to implement it technically without blocking necessary messages too. - [Sender ID: choosing your sender name, and why it matters more than you think](https://calisero.ro/en/developers/knowledge-base/sender-id-bune-practici) ([RO](https://calisero.ro/developer/knowledge-base/sender-id-bune-practici)): The displayed name is the first thing a recipient sees and the main reason they open or ignore the message. The Romanian rules and the practices that work. - [Failed delivery: reading the status and knowing what to do next](https://calisero.ro/en/developers/knowledge-base/depanare-livrari-esuate) ([RO](https://calisero.ro/developer/knowledge-base/depanare-livrari-esuate)): An undelivered message always has a reason. A guide to interpreting statuses and the right action for each — including when retrying is the mistake. ## Optional - [Terms of use](https://calisero.ro/en/terms/terms-and-conditions) ([RO](https://calisero.ro/termeni/termeni-si-conditii)) - [Privacy policy](https://calisero.ro/en/terms/privacy-policy) ([RO](https://calisero.ro/termeni/protectia-datelor-personale)) - [Cookie policy](https://calisero.ro/en/terms/cookie-policy) ([RO](https://calisero.ro/termeni/politica-de-utilizare-a-cookie-urilor)) - [Delivery policy](https://calisero.ro/en/terms/delivery-policy) ([RO](https://calisero.ro/termeni/livrare))