QUICKSTART

First approval in 5 minutes

redphonr pauses your agent and contacts a human when a decision is needed. This guide gets you from API key to a working approval flow.

1

Get your API key

Go to the API Keys page in your dashboard, create a key, and copy it. Keep it secret — it authorises all requests on your behalf.

Your API key looks like rp_live_… and is shown once. Store it in your environment, never in source code.
2

Send your first approval request

redphonr is a plain HTTP API — no SDK required. Send a POST /api/redphonr/requests with your key in the header.

python
import httpx, os, time

API_KEY = os.environ["REDPHONR_API_KEY"]
BASE    = "https://cronecho-production.up.railway.app"

# 1 — create an approval request
resp = httpx.post(
    f"{BASE}/api/redphonr/requests",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={
        "type":        "approval",
        "title":       "Transfer $4,200 to vendor ACME Corp",
        "description": "Invoice #INV-2024-0892. Due date: today. Approve to proceed.",
    },
)
req_id = resp.json()["id"]
print(f"Request created: {req_id}")

# 2 — poll until the human responds (≤ 24 h)
while True:
    status = httpx.get(
        f"{BASE}/api/redphonr/requests/{req_id}",
        headers={"Authorization": f"Bearer {API_KEY}"},
    ).json()["status"]

    if status == "approved":
        print("Approved — proceeding with transfer")
        break
    elif status == "denied":
        print("Denied — aborting")
        break

    time.sleep(10)  # check every 10 s
typescript
import axios from "axios";

const API_KEY = process.env.REDPHONR_API_KEY!;
const BASE    = "https://cronecho-production.up.railway.app";
const headers = { Authorization: `Bearer ${API_KEY}` };

// 1 — create request
const { data } = await axios.post(`${BASE}/api/redphonr/requests`, {
  type:        "approval",
  title:       "Transfer $4,200 to vendor ACME Corp",
  description: "Invoice #INV-2024-0892. Due date: today.",
}, { headers });

const reqId = data.id;

// 2 — poll for response
while (true) {
  const { data: req } = await axios.get(
    `${BASE}/api/redphonr/requests/${reqId}`,
    { headers }
  );
  if (req.status === "approved") { /* proceed */ break; }
  if (req.status === "denied")   { /* abort */   break; }
  await new Promise(r => setTimeout(r, 10_000));
}
3

Configure how you get notified

By default redphonr emails the address on your account. Set up your preferred channels in Reach me — voice calls, SMS, Slack, Telegram, or Discord.

Voice calls use DTMF: press 1 to approve, 2 to deny, 3 to hear full details, 9 to record a voice note.
4

Use with Claude / any AI agent via MCP

If your agent uses Claude, add the redphonr MCP server and call request_approval as a tool — no polling loop needed.

bash
claude mcp add --transport http redphonr https://mcp.redphonr.com/mcp
python
# Claude agent — tool call (MCP)
result = await mcp.request_approval(
    title="Delete 12,000 stale user records",
    description="Users inactive for > 2 years. GDPR Article 17. Reversible via backup.",
)
# result.status == "approved" | "denied"
if result.status == "approved":
    await delete_stale_users()
5

All request types

redphonr handles five patterns agents need humans for:

Approve / Deny·"type": "approval"

Binary decision before an irreversible action

Choose an option·"type": "ambiguity"

Human picks from 2–10 choices

Verify output·"type": "verification"

Human checks work before it ships

Collect input·"type": "input"

Gather structured values the agent needs

Hand off to human·"type": "handoff"

Agent hands control back, human takes over

Need help?

Open a support chat from any dashboard page, or email support@redphonr.app.

Go to dashboard