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-abcdef123456

The 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.

FieldTypeDescription
titlestringBold first line of the notification.
bodystringThe message text.
tagstringFree-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

StatusBodyMeaning
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

LimitValue
Per IP60 requests per minute
Free tier100 notifications per day
ProUnlimited notifications (fair use: 10,000/day)
Body size4KB

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

ToolArguments
send_notification body (required), title, tag

Once it's connected, just ask: "notify my phone when the tests finish."