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.
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.
redphonr is a plain HTTP API — no SDK required. Send a POST /api/redphonr/requests with your key in the header.
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 simport 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));
}By default redphonr emails the address on your account. Set up your preferred channels in Reach me — voice calls, SMS, Slack, Telegram, or Discord.
If your agent uses Claude, add the redphonr MCP server and call request_approval as a tool — no polling loop needed.
claude mcp add --transport http redphonr https://mcp.redphonr.com/mcp# 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()redphonr handles five patterns agents need humans for:
Binary decision before an irreversible action
Human picks from 2–10 choices
Human checks work before it ships
Gather structured values the agent needs
Agent hands control back, human takes over
Open a support chat from any dashboard page, or email support@redphonr.app.
Go to dashboard