Send a code by SMS
send_messageSend one transactional SMS to a Georgian mobile number. The text comes from a built-in template; there is no free text (every template: https://n0t1fy.dev/templates).
Team templates (service_down, service_up, incident_opened, support_ticket_urgent, job_failed, agent_alert) go only to numbers the project's owner confirmed on the dashboard's team page; with a test key, use the test numbers +995512345670 to +995512345679. A recipient_not_on_team error means the number is not confirmed on the team: ask the human to add it on the dashboard, and never retry by yourself. With a live key, a service or job must be a name on the owner's list there.
With a test key (sk_test_) nothing is really sent: a simulator answers. These recipients simulate outcomes: +995512345671 rejected (status failed); +995512345672 provider unreachable (error provider_unavailable: nothing was sent, retry with the same idempotency_key); +995512345673 ambiguous (status unknown); +995512345674 accepted, then undeliverable. Any other valid number is accepted, then delivered, within about 30 seconds. With a live key it sends a real SMS and spends one credit per segment.
Read message.status in the result. submitted: the provider accepted it, which is not yet delivery to the phone. failed: refused; message.error says why. unknown: it may or may not have been sent, so do not send it again automatically. replayed: true: this idempotency_key and request were already processed, and no second SMS was sent. Call get_message to learn the final outcome.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient in E.164 format: `+9955` followed by eight digits. No other country or format is accepted, and numbers are never normalized on your behalf. | |
| locale | No | Language of the message: `ka` (Georgian, the default) or `en`. | ka |
| api_key | No | An sk_test_ key, for example from create_test_key. Leave it out to use the key in this MCP server's Authorization header. A live key (sk_live_) is refused here: tool arguments are kept in the conversation, so a live key belongs in the header. | |
| template | Yes | Which message to send. Message text is never free-form: every message is rendered from one of these templates. - `verification_code` (`code`): Your verification code is {code}. Do not share it with anyone. - `login_code` (`code`): Your sign-in code is {code}. If you did not request it, ignore this message. - `password_reset_code` (`code`, `minutes`): Your password reset code is {code}. It expires in {minutes} minutes. - `service_down` (`service`): Alert: {service} is down. Team only. - `service_up` (`service`): Resolved: {service} is up again. Team only. - `incident_opened` (`incident`): Urgent: incident {incident} needs attention. Team only. - `support_ticket_urgent` (`ticket`): Urgent: support ticket {ticket} is waiting for a reply. Team only. - `job_failed` (`job`): Failed: scheduled job {job} did not finish. Team only. - `agent_alert` (`agent`, `count`): {agent}: {count} new updates. Check your app. Team only. Team templates go only to numbers confirmed on the project's team on the dashboard (a test key: the test numbers only); any other number answers `403 recipient_not_on_team`. Every template, its blanks and who it may go to: /templates. | |
| variables | Yes | Values for the template's placeholders, all as JSON strings. A `code` is 4 to 8 digits; `minutes` is 1 to 999; an `incident` or `ticket` 1 to 8 digits; a `count` 1 to 99; an `agent` `your_agent` or `ai_assistant`; a `service` or `job` a name on the project's team page (a live key). Values that look like a link, a web address, or a phone number are refused. | |
| idempotency_key | Yes | A new unique value (a UUID) for each logical message. Reuse it only to retry the identical request: the retry then returns the original message instead of sending a second SMS. |