Your agent has no terminal. Now it has you.
One MCP server + REST API for durable human approvals, notifications, inbound webhooks, and scheduled wake-ups — for agents that run unattended.
# crontab: 0 3 * * * claude -p "Deploy release/1.4.0 to prod" --mcp-config mcp.json
> mcp: request_approval(
title: "Deploy release/1.4.0 to prod",
details: "42 files changed, 2 migrations, tests: passing",
options: ["approve", "deny"], timeout: 1800)
… agent blocks, process stays alive, no TTY needed …
[telegram 03:14] "Deploy release/1.4.0 to prod? [Approve] [Deny]"
[operator] taps Approve
< { "status": "approve", "by": "you", "at": "2026-08-29T03:15:02Z" }
$ agent resumes, runs the deploy, exits 0
What it does
request_approval(title, details, options?, timeout?)
Your cron agent hits a deploy step at 3am and either crashes waiting for a TTY that was never
there, or someone reaches for --dangerously-skip-permissions so the job stops blowing
up overnight. request_approval sends the question to your channels the moment it's
called and returns a request_id right away — the agent can long-poll for up to the
timeout you set, or walk away and pick the answer back up later with that id, durable for days.
You answer with a tap or a line of text.
notify(message, level)
A scheduled job fails silently at 4am and you find out three days later from a customer, not
from the job. notify is fire-and-forget — no round trip, no blocking — so an agent can
push a success ping, a warning, or a hard-failure alert to whichever channels you've wired up
without waiting on anyone to answer.
Inbound endpoints
Your headless agent needs to catch a webhook, an OAuth redirect, or an async reply from a
third-party API, but it's a script on a VPS or a homelab box with no public URL and nothing
listening. Every workspace gets a stable https://api.pendnt.dev/in/<slug>
endpoint (with its own secret) that stores whatever hits it, and wait_for_event(endpoint,
since_seq, wait_s) long-polls for the next one.
schedule_wakeup(at | in_s, payload)
Your agent needs to check back in six hours, or at a specific time next week, but a cron'd
process that already exited has no way to wake itself. schedule_wakeup stores a
wakeup event that shows up the next time the agent calls wait_for_event, and can
optionally also fire an outbound webhook to nudge a long-running supervisor process in the
meantime.
kv_get / kv_set
Your agent needs to remember exactly one thing between runs — the last processed record ID, a
flag, a small counter — and standing up a database for three keys is not worth the operational
weight. kv_get/kv_set gives every workspace small persistent scratch
storage over the same API and auth you're already using, nothing else to provision.
That's the core five. The full tool set (13 MCP tools / REST routes, including
check_request, create_endpoint, list_wakeups,
whoami, and more) is in the MCP reference and
REST reference.
Works with
| Integration | What you get |
|---|---|
| Claude Code | Headless (claude -p) via the pendnt plugin — a hook and a
--permission-prompt-tool adapter, so request_approval slots into the
existing permission flow instead of replacing it.
Set up |
| Claude Agent SDK | Drop-in snippet for canUseTool (TypeScript and Python), so a long-running SDK
daemon can pause on a real decision instead of auto-approving or auto-denying.
Set up |
| OpenClaw cron | An OpenClaw skill for the cron jobs OpenClaw's own ask_user doesn't cover — see
the FAQ below. Set up |
| LangGraph, OpenAI Agents SDK, anything else | Call the REST API or MCP server directly from a node in your graph — no framework-specific package required. |
| Plain scripts (curl) | It's a REST API underneath everything else — three curl calls get a bash
script the same durable approval flow the SDKs get.
Examples |
Pricing
| Free | Pro — $9/mo | Team — $29/mo | |
|---|---|---|---|
| Workspaces | 1 | 1 | 1 (shared) |
| Approvals + notifications | 100/month | Unlimited | Unlimited |
| Inbound endpoints | 1 | 10 | 10 |
| Retention | 7 days | 90 days | 90 days |
| Channels | All (email, Telegram, Slack, Discord, web push, web inbox) | ||
| Policies (auto-allow, escalation) | — | Coming soon | Coming soon |
| Operators | 1 | 1 | 5 |
| Shared inbox | — | — | Included |
| Audit export | — | — | Included |
FAQ
Doesn't Claude Code Remote Control already do this?
For an interactive session, yes — Remote Control and push notifications already get you from
your phone back into a running Claude Code session. pendnt is for the sessions Remote Control
doesn't reach: a claude -p run kicked off by cron, a headless Agent SDK daemon, or any
script with no interactive session to remote into in the first place.
What about OpenClaw's ask_user?
ask_user works well inside a live OpenClaw chat session, where there's a
conversation to ask into. It doesn't help a job OpenClaw itself started on a schedule, with no chat
session open and no one currently looking at it — that's the gap pendnt's OpenClaw skill fills.
Do you see my secrets?
No. The agent's only credential to us is our own API key, scoped to your workspace. We never ask for — and have no use for — your cloud credentials, deploy keys, or any secret the agent uses to do its actual work.
What happens if you go down?
request_approval calls time out per the timeout_s you passed in, same
as if no one answered in time — the default is deny, not approve, so a pendnt outage fails closed,
not open.
Who runs this?
An autonomous agent builds and operates pendnt day to day, under a human owner who's accountable for it. See the footer for the changelog, which doubles as the build log.
How long do you keep my data?
7 days on Free, 90 days on Pro and Team. Team additionally gets an audit export, so you can pull and archive a full history yourself for as long as you need it past the 90-day window.
Can I self-host it?
Not today. pendnt is a hosted, multi-tenant service (Cloudflare Workers, Durable Objects, D1) — there's no self-hosted build. If that turns out to matter to enough people, it's something we'd consider, but it isn't on the roadmap now.
Is it open source?
The core service is closed-source — that's what funds ongoing development. The SDK snippets, Claude Code plugin, OpenClaw skill, and integration examples are open, so you can see exactly what code is talking to us and fork it if you need to.
Docs
Start with the quickstart (3 minutes), or jump straight to the REST reference, the MCP tools reference, or channels.