Lert docs
Send a push notification to your phone with a single HTTP POST. No API key, no auth header, no SDK.
Quick start
Download the Lert app, copy the endpoint URL it shows you, and POST to it:
curl -X POST https://lert.dev/p/YOUR_ID \ -H "Content-Type: application/json" \ -d '{"title":"It works","body":"Hello from my server"}'
Your phone buzzes. That's the whole thing.
Your endpoint
Every install gets one unique URL:
https://lert.dev/p/a1b2c3d4-0000-4000-8000-abcdef123456The URL is the authentication. There is no API key because the URL is the key — anyone holding it can send you notifications. Treat it like a password: keep it out of public repos and client-side code. If it leaks, regenerate it in the app and the old one dies instantly.
Message fields
POST a JSON body. Every field is optional.
| Field | Type | Description |
|---|---|---|
| title | string | Bold first line of the notification. |
| body | string | The message text. |
| tag | string | Free-form label (e.g. orders) for grouping and filtering in the app. |
{
"title": "New order!",
"body": "$47.50 — Saviour Pendant",
"tag": "orders"
}Plain text
Don't want to build JSON? POST raw text and it becomes the notification body.
No Content-Type needed.
curl -X POST https://lert.dev/p/YOUR_ID -d 'Backup finished'Responses
| Status | Body | Meaning |
|---|---|---|
| 200 | {"delivered":1} | Sent. The number is how many of your devices accepted it. |
| 200 | {"delivered":0} | Endpoint is valid but no device is currently registered. |
| 404 | {"error":"unknown endpoint"} | No endpoint with that id. Check the URL. |
| 429 | {"error":"too many requests"} | Rate limited. See below. |
| 413 | {"error":"payload too large"} | Body exceeded 4KB. |
Rate limits
| Limit | Value |
|---|---|
| Per IP | 60 requests per minute |
| Free tier | 100 notifications per day |
| Pro | Unlimited notifications (fair use: 10,000/day) |
| Body size | 4KB |
A 429 includes a Retry-After header. Back off and retry.
curl
curl -X POST https://lert.dev/p/YOUR_ID \ -H "Content-Type: application/json" \ -d '{"title":"Deploy finished","body":"api → production","tag":"deploys"}'
JavaScript
await fetch("https://lert.dev/p/YOUR_ID", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title: "New signup", body: "tom@example.com just registered", tag: "signups" }) });
Python
import requests requests.post("https://lert.dev/p/YOUR_ID", json={ "title": "Scrape complete", "body": "1,204 rows written", "tag": "jobs" })
PHP
<?php $ch = curl_init("https://lert.dev/p/YOUR_ID"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([ "title" => "New order", "body" => "$47.50" ])); curl_exec($ch);
Shell / cron
Notify yourself when any long job finishes — success or failure:
#!/bin/bash LERT="https://lert.dev/p/YOUR_ID" if ./run-backup.sh; then curl -s -X POST "$LERT" -d 'Backup finished ✅' else curl -s -X POST "$LERT" -d 'Backup FAILED ❌' fi
Recipe: Shopify order
In a Shopify webhook handler for orders/create:
app.post("/webhooks/orders", async (req, res) => { const order = req.body; await fetch("https://lert.dev/p/YOUR_ID", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title: "New order!", body: `$${order.total_price} — ${order.line_items[0].title}`, tag: "orders" }) }); res.sendStatus(200); });
Recipe: Stripe payment
if (event.type === "payment_intent.succeeded") { const pi = event.data.object; await fetch("https://lert.dev/p/YOUR_ID", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title: "Payment received", body: `$${(pi.amount / 100).toFixed(2)} from ${pi.receipt_email}`, tag: "payments" }) }); }
Recipe: GitHub Actions
Buzz your phone when a workflow finishes. Put your endpoint in a repo secret:
- name: Notify me if: always() run: | curl -s -X POST "${{ secrets.LERT_URL }}" \ -H "Content-Type: application/json" \ -d '{"title":"CI ${{ job.status }}","body":"${{ github.repository }} on ${{ github.ref_name }}","tag":"ci"}'
Recipe: AI coding agent
Get buzzed when a long-running agent task finishes, so you can walk away from the terminal:
curl -s -X POST https://lert.dev/p/YOUR_ID \
-d "Agent finished: $(git log -1 --format=%s)"MCP server
Let your AI coding assistant buzz your phone directly — when a long task finishes, a build breaks, or it needs your input. Nothing to install. Lert's MCP server is just a URL, in keeping with the rest of it.
Claude Code
claude mcp add --transport http lert https://lert.dev/mcp/YOUR_ID
Claude Desktop / Cursor / any MCP client
Add this to your MCP config:
{
"mcpServers": {
"lert": {
"url": "https://lert.dev/mcp/YOUR_ID"
}
}
}Your MCP URL contains your endpoint id, which is your credential — treat the config like a secret and keep it out of shared repos. If it leaks, regenerate in the app.
The tool
| Tool | Arguments |
|---|---|
| send_notification | body (required), title, tag |
Once it's connected, just ask: "notify my phone when the tests finish."