Any request to your endpoint becomes a notification, and Hook writes the text for you. When you already know what the notification should say — a backup script, a cron job, a CI step — set it yourself. Hook then shows exactly that, skips the automatic summary, and keeps the full request underneath as usual.
curl https://gethook.app/workspace/{workspace_key}/backups \
-H "Hook-Title: Backup finished" \
-H "Hook-Priority: low" \
-d "db-1 backed up in 4 minutes (12.4 GB)"Topics
Add a topic to the path to group messages: https://gethook.app/workspace/{workspace_key}/backups. A topic is 1–64 letters, digits, dots, dashes or underscores. It is the same thing as the?identifier= parameter the app uses, so templates, proxies and filters keyed on an identifier apply to the topic too. Topics get their own entry in the web app's sidebar.
Title and message
Set Hook-Title, Hook-Message, or both. With a plain-text body and any Hook-* field, the body becomes the message. Without any of them, a text body is treated as an ordinary webhook and summarised as before.
Priority
Priority decides how loudly a message arrives:
- 1 · min — silent, straight to Notification Center.
- 2 · low — delivered quietly; iOS may batch it.
- 3 · default — a normal notification.
- 4 · high — delivered immediately, marked high in the inbox.
- 5 · urgent — like high, and stays on screen in the browser until dismissed.
All fields
Each field works as a header or, where listed, as a query parameter. A header wins over the query.
| Header | Query | Meaning |
|---|---|---|
Hook-Title | title | Notification title, up to 250 characters. |
Hook-Message | message | Notification text, up to 4,096 characters. With a text body, the body is the message. |
Hook-Priority | priority | 1–5, or min, low, default, high, urgent. Default 3. |
Hook-Tags | tags | Comma-separated, up to 10. Added to any tags already in the URL. |
Hook-Click | click | An http(s) link opened when the notification is tapped in the browser. |
Hook-Actions | — | Up to 3 buttons, as JSON: [{"type":"open","label":"…","url":"https://…"}]. |
Hook-Icon | icon | An http(s) image URL shown with the message. |
Hook-Markdown | markdown | true to render **bold**, *italic*, `code`, links and lists in the web app. |
A field Hook cannot accept — priority 9, a javascript: link, too many actions — is rejected with 400 and the name of the field, so a broken script fails loudly instead of sending a notification you never see.
Send it as JSON
With Content-Type: application/vnd.hook.message+json the body itself carries the fields:
curl https://gethook.app/workspace/{workspace_key}/alerts \
-H "Content-Type: application/vnd.hook.message+json" \
-d '{
"title": "Disk 91% full",
"message": "**db-1** `/var` is filling up",
"priority": 4,
"tags": ["db", "disk"],
"markdown": true,
"actions": [{ "type": "open", "label": "Grafana", "url": "https://grafana.example.com/d/db" }]
}'Services you do not control
Stripe, GitHub and most other senders cannot add headers, but the URL is yours. Put the fields in the query string and Hook still receives the full payload:
https://gethook.app/workspace/{workspace_key}/stripe?title=Stripe%20payment&priority=high&click=https%3A%2F%2Fdashboard.stripe.comMute a topic
In the web app, open a topic and use the bell to mute it, or theNotify menu to get notifications only from a priority up. Muted and lower-priority messages are still saved; they just arrive without a notification.
Something wrong on this page? Email office@swiftapps.us.