Docs / Publishing messagesMenu

Publishing messages

Send Hook a notification you wrote yourself: a title, a message, a priority, a link and buttons, from curl, a script or any service.

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.

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

HeaderQueryMeaning
Hook-TitletitleNotification title, up to 250 characters.
Hook-MessagemessageNotification text, up to 4,096 characters. With a text body, the body is the message.
Hook-Prioritypriority1–5, or min, low, default, high, urgent. Default 3.
Hook-TagstagsComma-separated, up to 10. Added to any tags already in the URL.
Hook-ClickclickAn 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-IconiconAn http(s) image URL shown with the message.
Hook-Markdownmarkdowntrue 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:

terminal
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:

endpoint
https://gethook.app/workspace/{workspace_key}/stripe?title=Stripe%20payment&priority=high&click=https%3A%2F%2Fdashboard.stripe.com

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