When AI agents / software
need a human in payments

M91 notifies the right person's phone so they can approve, decide or act, and keeps ringing until somebody responds.

See how it works See demo video

Free forever. Built by MSG91.

Use cases

Where people are using M91.

AI agents

An agent is about to do something it cannot decide alone.

M91 · Critical Delete 40,000 customer records? ApproveReject
Priya alerted on her phone Rejected — the agent stopped

Your agentM91Priya

Payments

Money stops moving and nobody is watching the dashboard.

M91 · High Card payments are timing out. On itNot me
Payments on-call alerted Neha took it in 40s

Your checkoutM91Neha

Infrastructure

Something breaks at the hour nobody is awake.

M91 · Critical Database will stop writing tonight. I’m on itEscalate
Called at 2 AM until answered Ali owned it in 1m 12s

Your monitorM91Ali

Devices and IoT

A person has to physically go and deal with it.

M91 · High Warehouse door left open 22 minutes. I’m goingEscalate
Night guard desk rang Imran closed it

Your sensorM91Imran

Customer support

The bot has run out and the customer wants a person.

M91 · Take over Customer has asked for a human twice. Take overCoach me
Shift lead alerted with the chat Arjun took over

Your botM91Arjun

Sales and CRM

A deal comes back to life and needs an owner.

M91 · Acknowledge A ₹22L lead just replied. I’ll handle itReassign
Account owner alerted Nikhil claimed it same hour

Your CRMM91Nikhil

Your send link lives in the M91 app.
Open the app, copy the link, paste it into your system, and the first alert lands on your own phone.

Features

What M91 provides you.

Watch each one play out, step by step.

Step 1 of 5

Your system

Release ₹8,50,000 to Sunrise Logistics?

PDFinvoice-4471.pdf JPGdelivery-photo.jpg Delivered to Ravi · 11:40
invoice-4471.pdf Total  ₹8,50,000
Ravi JPGsigned-po.jpg

NoteChecked with the vendor. OK to release.

Approved · file and note sent back
Set by youbuttons: ["Approve", "Reject"]
Chosen by your agentRefund is above the limit and no receiptbuttons: ["Approve", "Reject", "Ask for receipt"]
M91 · Refund agent

Refund ₹82,000 to Acme?

ApproveRejectAsk for receipt
Refund agentanswer → "Ask for receipt" Emailed Acme for the receipt
#payments-oncallChannel created
Members · 5RaviDanaPriyaArjunMeera
New alert · to #payments-oncall

Card payments are failing

Send to channel
RRavi Delivered DDana Delivered PPriya Delivered AArjun Delivered MMeera Delivered
M91 · Critical

Payments API is down

Sent to the on-call team
RRaviRingingOn it DDanaRingingStood down PPriyaRingingStood down
Owned by Ravi · everyone can see it
Responses · #payments-oncall

Card payments are failing

RRaviDeliveredApproved · 11:42 AArjunDeliveredEscalated · 11:43 DDanaDeliveredSeen · no action PPriyaDeliveredNot opened MMeeraDeliveredSeen · no action
2 acted3 ignored
11:42 Silent Do Not Disturb
Your monitor

payments-api error rate 12%

Sending a critical alert…
Critical alert

Payments API is down

Tap to respond
Not acknowledgedCalling Ravi in 45s

M91 calling

Payments API is downDeclineAccept
Answered · 11:43

Payments API is down

I’m on itEscalate

Critical alerts and calls depend on the permissions the person grants and need a network connection.

How do I add a human approval step to my agent? AI assistantYou can use M91. Follow m91-api.msg91.com/llms.txt, or install the skill: npx skills add MSG91/m91-skillCopyCopied
$ export M91_SEND_LINK=…   # from the app
$ curl -X POST "$M91_SEND_LINK" \
    -d '{"title":"Test alert"}'
M91 · now

Test alert

It works. Your send link is live.

Alerts you already have.

Pick one and see what M91 does with it: who gets the alert, and what they tap.

M91 2m ago
Sales

Northwind requested a $240,000 demo.

Woke the assigned rep
Whatever they tap goes straight back to your system.

Integrations

Works with the tools you already use.

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.

viaSocketWORKFLOW

→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

Free. Forever.

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

  • Alerts on iPhone and Android
  • A phone call if nobody answers
  • Answer buttons set by you or your AI
  • Attachments and notes on every alert
  • Broadcast to a channel
  • Send to a team, one person takes it
  • See who acted and who ignored
  • Critical alerts that escalate to a call
  • One send link, no SDK
  • Works with workflow tools, coding agents and agent frameworks

Your software can do the work.

Some decisions still need you.

M91 reaches you when they do.

Give your software a way
to get human approval.

Your software sends the alert. M91 finds the human. They answer. Work carries on.

Free forever · Built by MSG91