# M91 Documentation

**An interface for any software or AI to reach a human.**

Everything a program can already do, it does without us. The one thing it cannot
is get a person's attention when it needs a decision — and every channel built
for that reaches people quietly. Email, SMS and chat arrive and wait to be read.

M91 is the other kind. An alert rings every phone in a channel at full volume,
through silent mode and Do Not Disturb, repeats until somebody answers, and
escalates to a phone call. It records who took responsibility, and hands the
answer back to the software that asked.

A send link is one URL with no headers and no account at the other end, so any
language can call it over plain HTTPS. That is where to start.

An **API key** reaches people your software finds at runtime, rather than a
channel somebody made in advance. The **TypeScript SDK** (`@msg91comm/m91`)
carries the waiting for code that cannot carry on until a person has answered,
and plugs into agent frameworks.

## Start here

- [**Quickstart**](https://m91-api.msg91.com/api/public/quickstart.md) — one real alert
  ringing a real phone, verified, in five minutes.
- [**What goes in an alert**](https://m91-api.msg91.com/api/public/fields.md) — every field,
  what it is for, and **when a request needs it**. Read this before choosing
  what to send.

## Working with M91

- [**Playbook**](https://m91-api.msg91.com/api/public/playbook.md) — where alerting belongs in
  a codebase, how to decide what is worth waking somebody for, worked
  integrations for shell, Node, Python, Go and anything with a webhook field,
  and [the TypeScript library](https://m91-api.msg91.com/api/public/playbook.md#library) with
  its LangChain, LangGraph and Vercel AI adapters.

## Reference

- [**API**](https://m91-api.msg91.com/api/public/api.md) — every endpoint, every field, the
  exact response shapes, limits and errors.
- [**Troubleshooting**](https://m91-api.msg91.com/api/public/troubleshoot.md) — the exact
  string to match on, what caused it, what to do. Grouped by where in the
  lifecycle it went wrong.
- [**Limitations and recommendations**](https://m91-api.msg91.com/api/public/limitations-and-recommendations.md)
  — what M91 does and does not guarantee, each paired with what to do about it.

## Two credentials

| | Send link | API key |
|---|---|---|
| Looks like | `https://m91-api.msg91.com/s/sk_…` | `m91sk_…` |
| Comes from | a channel, in the M91 app | the M91 app, Settings → API keys |
| Alerts | everyone in that one channel | any phone number you have invited |
| Held by | the system doing the sending | your backend |
| Can create channels | no | yes |

**Use a send link** when the people are a fixed team. It is a URL with no
headers, called over plain HTTPS or through the SDK.

**Use an API key** when your product alerts its own users and you do not know at
build time who they are.

A send link is a credential in a URL. Anyone holding it can alert that channel.
Keep it where you keep passwords, and never log the path of a request to it.

## If you are an AI agent

Fetch [llms.txt](https://m91-api.msg91.com/llms.txt) for the machine-readable index, then read
[the quickstart](https://m91-api.msg91.com/api/public/quickstart.md) and
[what goes in an alert](https://m91-api.msg91.com/api/public/fields.md). There is an installable
skill — `npx skills add MSG91/m91-skill` — but **these documents are complete on
their own**: if the skill will not install, use them and carry on rather than
working from memory.

**Where two documents disagree, the [API reference](https://m91-api.msg91.com/api/public/api.md)
wins** — and tell the person which two lines disagree, because that is a bug.
