AI agents
An agent is about to do something it cannot decide alone.
Your agentM91Priya
M91 notifies the right person's phone so they can approve, decide or act, and keeps ringing until somebody responds.
Free forever. Built by MSG91.
CriticalOpenResolved
Approve a ₹82,000 refund to Acme?
Above your ₹50,000 auto-approval limit. The customer has been waiting two days.
Use cases
An agent is about to do something it cannot decide alone.
Your agentM91Priya
Money stops moving and nobody is watching the dashboard.
Your checkoutM91Neha
Something breaks at the hour nobody is awake.
Your monitorM91Ali
A person has to physically go and deal with it.
Your sensorM91Imran
The bot has run out and the customer wants a person.
Your botM91Arjun
A deal comes back to life and needs an owner.
Your CRMM91Nikhil
Features
Watch each one play out, step by step.
Release ₹8,50,000 to Sunrise Logistics?
PDFinvoice-4471.pdf JPGdelivery-photo.jpg Delivered to Ravi · 11:40NoteChecked with the vendor. OK to release.
Refund ₹82,000 to Acme?
ApproveRejectAsk for receiptCard payments are failing
Send to channelPayments API is down
Sent to the on-call teamCard payments are failing
payments-api error rate 12%
Sending a critical alert…Payments API is down
Tap to respondM91 calling
Payments API is downDeclineAcceptPayments API is down
I’m on itEscalateCritical alerts and calls depend on the permissions the person grants and need a network connection.
$ export M91_SEND_LINK=… # from the app
$ curl -X POST "$M91_SEND_LINK" \
-d '{"title":"Test alert"}'
Test alert
It works. Your send link is live.Pick one and see what M91 does with it: who gets the alert, and what they tap.
Northwind requested a $240,000 demo.
Integrations
There is no SDK to install. Paste your M91 send link into a workflow tool, a coding agent or your own code. Pick one to see how.
Automation platforms 4
Add one HTTP step to an existing workflow.
Developer tools 2
Paste the setup prompt into your coding agent.
AI frameworks 9
Give your agent an ask_human tool.
APIs & webhooks 1
Call your send link from anything that speaks HTTP.
→Add an HTTP step after your trigger
# viaSocket: Step → HTTP request
Method POST
URL your M91 send link
Body { "title": "Refund needs OK" }
The person’s answer comes back
to the next step.
→Drop in an HTTP Request node
# n8n: HTTP Request node
Method POST
URL your M91 send link
Body {{ $json.summary }}
Branch on what they tapped.
→Use Webhooks by Zapier as an action
# Zapier: Webhooks by Zapier → POST URL your M91 send link Data title = Lead replied Any Zap can now reach a person on their phone.
→Add the HTTP → Make a request module
# Make: HTTP → Make a request Method POST URL your M91 send link Body JSON from the previous module
→Paste the setup prompt into Claude Code
# Claude Code, Claude Desktop Before a risky step, Claude sends the alert and waits. The person approves or rejects on their phone, and Claude carries on with the answer.
→Paste the same setup prompt into any coding agent
# Codex, Cursor, Windsurf, Gemini CLI The prompt points the agent at m91-api.msg91.com/llms.txt. It reads the docs, asks you for your send link and wires it in.
→Add a node before the risky step
# LangGraph: a node in your graph
graph.add_node("ask_human", ask_human)
def ask_human(question: str) -> str:
r = requests.post(
M91_SEND_LINK,
json={"title": question},
)
return r.text
→Give the agent an ask_human tool
# Deep Agents
# create_deep_agent(tools=[ask_human])
def ask_human(question: str) -> str:
r = requests.post(
M91_SEND_LINK,
json={"title": question},
)
return r.text
→Register it with @agent.tool_plain
@agent.tool_plain
def ask_human(question: str) -> str:
r = requests.post(
M91_SEND_LINK,
json={"title": question},
)
return r.text
→Wrap it in @function_tool
@function_tool
def ask_human(question: str) -> str:
r = requests.post(
M91_SEND_LINK,
json={"title": question},
)
return r.text
→Expose it as a custom tool
# Claude Agent SDK: a custom tool
def ask_human(question: str) -> str:
r = requests.post(
M91_SEND_LINK,
json={"title": question},
)
return r.text
→Pass it in the agent’s tools list
# Google ADK
# Agent(..., tools=[ask_human])
def ask_human(question: str) -> str:
r = requests.post(
M91_SEND_LINK,
json={"title": question},
)
return r.text
→Decorate it with @tool
@tool("Ask a human")
def ask_human(question: str) -> str:
r = requests.post(
M91_SEND_LINK,
json={"title": question},
)
return r.text
→Define it with tool()
const askHuman = tool({
description: "Ask a person first",
execute: async ({ question }) => {
const r = await fetch(
M91_SEND_LINK,
{
method: "POST",
body: JSON.stringify({
title: question,
}),
},
);
return r.text();
},
});
→Define it with createTool()
const askHuman = createTool({
id: "ask-human",
execute: async ({ question }) => {
const r = await fetch(
M91_SEND_LINK,
{
method: "POST",
body: JSON.stringify({
title: question,
}),
},
);
return r.text();
},
});
→Call it from anything that speaks HTTP
$ curl -X POST \
https://m91-api.msg91.com/s/sk_… \
-d '{"title":"Payments down"}'
# Monitors, CRMs, cron jobs,
# your own code.
Pricing
Everything M91 does, for everyone. No trial, no card, no seat count.
Free forever
₹0/ forever
Every feature, every alert, every person on your team.
What you get
Blog
Your software can do the work.
Some decisions still need you.
M91 reaches you when they do.
Your software sends the alert. M91 finds the human. They answer. Work carries on.
Free forever · Built by MSG91