For developers

Send things to Pending You

Give any service an address, and what it sends shows up in your queue as an update: an error, a failed deploy, a site that went down. Nothing to install, nothing to answer.

Make a webhook
ShellShell
curl -X POST https://www.pendingyou.com/in/pyin_YOUR-WEBHOOK-ADDRESS -H 'content-type: application/json' -d '{"title":"Checkout is failing","dedupeKey":"checkout-500"}'

Make a webhook

Each webhook is one address for one job, with its own name and area. Make one for each service, so you can pause or remove them on their own.

  1. Open Assistants › Incoming webhooks › New webhook.In the Pending You app, signed in as you.
  2. Name it for what it sends, and pick its area.“Production errors” in RecordPlane, say. Its cards read “Production errors · Cloudflare”, so you know at a glance what sent them.
  3. Copy its address.It looks like https://www.pendingyou.com/in/pyin_…, and you see it once. Lost it? Replace it on the same page; the old one stops working at once.
The address is the password
Anyone with it can post notices to your queue. Keep it in your service’s secret settings, not in code or chat. Pending You keeps only a fingerprint of it, never the address itself.

Send a notice

POST JSON to the address. A title is all it needs; the rest makes the card more useful.

TerminalShell
curl -X POST https://www.pendingyou.com/in/pyin_YOUR-WEBHOOK-ADDRESS \
-H 'content-type: application/json' \
-d '{
"title": "Checkout is failing",
"summary": "POST /api/checkout answered 500 for 12 requests in a minute.",
"url": "https://dash.example.com/errors/checkout-500",
"dedupeKey": "checkout-500",
"severity": "error"
}'
JSONJSON
{ "ok": true, "result": "created", "cardId": "req_4f1c9a0e2b7d6c5a8e31", "count": 1 }

The JSON

Fields Pending You doesn’t know are ignored, so you can send your own alongside. Text longer than its limit is shortened rather than refused.

Field ? optionalTypeWhat it’s for
titlestringWhat happened, in one line. Up to 140 characters.
summary?stringA sentence or two of detail. Up to 400 characters.
url?stringA link to open from the card, such as the error in your dashboard.
dedupeKey?stringRepeats of the same thing share it. While its card is open, a repeat adds to that card instead of making another.
status?"open" | "resolved""open" by default. "resolved" closes the open card with the same dedupeKey.
severity?"critical" | "error" | "warning" | "info"How bad it is, shown on the card.
from?stringWho sent it, shown after the webhook’s name. "Webhook" by default. Up to 40 characters.
Notices only, for now
A webhook’s cards are updates: they wait quietly in your stack without buzzing your phone, you tap Got it, and nothing goes back to the sender. Questions you can answer, with the answer sent back to your service, come later; until then, "kind": "question" and callbackUrl are refused with a 422.

Repeats and resolves

An alert that fires every minute shouldn’t become sixty cards. Give each kind of trouble a dedupeKey, and Pending You keeps it to one.

  • Repeats add to the open card.While a card for a dedupeKey is waiting on you (in your stack or in Later), the same key again adds to it: “Happened 14 times · last 3 min ago”. It keeps its place in your stack.
  • Resolved closes it.Send the same dedupeKey with "status": "resolved" and the card closes on its own. Done says “Resolved by Production errors”.
  • After you’ve seen it, it starts again.Once you tap Got it, or it’s resolved, the next notice with that key is a new card: it happened again after you’d seen it.
Close the cardShell
curl -X POST https://www.pendingyou.com/in/pyin_YOUR-WEBHOOK-ADDRESS \
-H 'content-type: application/json' \
-d '{"title": "Checkout is working again", "dedupeKey": "checkout-500", "status": "resolved"}'

Cloudflare

Paste the address into Cloudflare as a Generic Webhook. Pending You reads Cloudflare’s own payload, so there’s nothing to map.

  1. Workers & Pages › your Worker › Issues › Automations › Add automation.Pick the trigger: how many times an error happens before you hear about it, or an error coming back after a quiet spell.
  2. Destination: Generic Webhook.Give it a name, paste your webhook’s address as the URL, and type any long random text as the secret. Pending You doesn’t need the secret (the address is the secret), and never keeps it.
  3. Turn on Enabled, then Create.Each issue is one card, with its Worker, how often it’s been seen and a link back to it. Cloudflare doesn’t say when you resolve an issue, so tap Got it once it’s fixed.

Answers and limits

Every answer is JSON and comes back fast. Each webhook takes up to 60 deliveries a minute and holds up to 50 notices waiting on you; what’s over is counted on the Assistants page, never shown as cards.

StatusResult or codeWhat it means
201createdA new card, with its cardId.
200repeatedCounted on the card already open for its dedupeKey.
200resolvedThe open card for its dedupeKey closed.
200nothing_openA resolve with no open card to close. Nothing changed.
202pausedThe webhook is paused: counted, not shown.
400not_jsonThe body isn’t JSON.
401unknown_tokenNo webhook has this address: it was replaced or removed, or never made.
413too_largeThe body is over 64 KB.
422invalidA field Pending You can’t take: the answer names it and says why.
429rate_limitedOver 60 a minute. Counted, not shown; Retry-After says when.
429too_many_open50 of its notices already wait on you. Counted, not shown.
Paused
Pausing a webhook on the Assistants page keeps its address working: deliveries are counted and answered 202, and nothing shows until you resume it.