Channel Links
A channel link is a URL that can send to one channel and do nothing else:
https://send.pushtower.com/pt_link_3f9c…
It is the easiest way to let something notify you:
- Tell an AI agent: “Do this task. When you’re done, notify me at
<link>.” - Put it in a script or a CI secret and
curlit when a job finishes. - Hand it to a teammate’s tool without giving out your API key.
A link can send notifications and update Live Activities on its channel. It cannot read notifications, list or change channels, manage keys, or reach any of your other channels. You can revoke it at any time without affecting your API keys or other links.
Create a link
The quickest way for a script or agent to get a link is QR Connect: it shows a QR code and you approve it in the app. You can also create links yourself:
- App: open a channel, tap Channel Info → Links for agents & scripts → Create link. The link is copied to your clipboard, and you can also copy a ready-made prompt for your agent.
- Web dashboard: Channels → 🔗 on the channel → Create.
- API:
curl -X POST https://api.pushtower.com/api/channels/$CHANNEL_ID/links \
-H "X-API-Key: $PUSHTOWER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Claude Code"}'
{
"success": true,
"data": {
"id": "7d1c…",
"channelId": "…",
"name": "Claude Code",
"prefix": "pt_link_3f9c",
"url": "https://send.pushtower.com/pt_link_3f9c…",
"key": "pt_link_3f9c…",
"expiresAt": null,
"requestCount": 0,
"createdAt": "2026-09-29T09:00:00.000Z"
}
}
The full URL is returned only once. Afterwards the link is listed by name
and prefix. Pass expiresAt (ISO 8601) for a link that stops working on its
own, for example one handed to an agent for a single task.
Give it to an agent
When you finish this task, or if you get blocked and need my input,
notify me via PushTower: https://send.pushtower.com/pt_link_3f9c…
Fetch that URL first (GET) for instructions on how to send.
Keep the URL secret: don't print it, log it, or commit it.
The agent needs no PushTower skill, SDK, or MCP server. A link describes
itself: GET on it returns Markdown instructions covering the payload,
examples with the link filled in, guidance on what to send, Live Activity usage
(when the channel owner’s plan includes it), and error handling. Send
Accept: application/json for a machine-readable version.
curl https://send.pushtower.com/pt_link_3f9c…
Send with a link
# JSON
curl -X POST "$PUSHTOWER_LINK" \
-H "Content-Type: application/json" \
-d '{"title": "Deploy finished", "message": "api v2.4.1 is live", "priority": "normal"}'
# Plain text: the channel name becomes the title
curl -X POST "$PUSHTOWER_LINK" -H "Content-Type: text/plain" -d "Backup finished"
| Field | Required | Notes |
|---|---|---|
message |
yes | Body text, max 4000 characters |
title |
no | Max 255 characters; defaults to the channel name |
priority |
no | low, normal (default), high, critical |
data |
no | Object of custom key/values |
imageUrl |
no | HTTPS image shown with the notification |
sender |
no | {"name", "avatarUrl"}: who it is from, with a circular avatar; defaults to the channel’s sender |
sound |
no | Sound name |
badge |
no | App badge count |
Live Activities
On Pro and Ultimate plans, a link can also drive the channel’s Live Activity:
curl -X POST "$PUSHTOWER_LINK/live-activity" \
-H "Content-Type: application/json" \
-d '{"title": "Build", "message": "Running tests", "metrics": [{"kind": "progress", "id": "build", "progress": 0.6}]}'
curl -X DELETE "$PUSHTOWER_LINK/live-activity"
Using the key as a header
The part after the last / is a regular key (pt_link_…). It also works as an
X-API-Key header on the send endpoints (POST /api/notifications,
POST /api/notifications/preview, POST /api/channels/:id/notifications, and
the channel Live Activity endpoints), for example to use presets, actions, or
idempotency keys. It is still limited to its own channel there.
Limits and errors
- Sends through a link count toward the channel owner’s monthly notification quota, like any other send.
- Rate limit: 2 requests per second and 30 per minute per link.
401: the link was revoked or has expired.403: the request is outside what the link allows (another channel, a non-send endpoint, or Live Activities without a Pro plan).429: rate limit or monthly quota reached.
A channel can have up to 25 active links. Deleting a channel revokes its links.
Security
A link is a credential, just a narrow one. Treat it like a password: keep it in an environment variable or secret store, and don’t commit it or paste it into notification content. If a link leaks, revoke it and create a new one. Nobody can use a link to read your data or to send anywhere except this channel.
| Endpoint | Scope | Description |
|---|---|---|
GET /api/channels/:id/links |
channels:read |
List active links |
POST /api/channels/:id/links |
channels:write |
Create a link |
DELETE /api/channels/:id/links/:linkId |
channels:write |
Revoke a link |
GET <link> |
none | Usage instructions |
POST <link> |
none | Send |
POST/DELETE <link>/live-activity |
none | Live Activity |
Only the channel owner can list, create, or revoke its links.