Skip to content

Webhooks

Webhook — is a user-facing public URL bound to a channel. Each webhook is created in the admin dashboard and works independently: you can create as many webhooks for a single channel as you like, each with its own URL and settings.

Webhooks do not require headers — the token is embedded in the URL. Therefore they work directly from the browser via fetch() without CORS-preflight, from CI, from IoT devices, and from any no-code platforms (n8n, Zapier, IFTTT, Make).

ModeWhat it doesWhen to use
StaticSends a pre-set text. Request body is ignored.Button-like events: “Courier left”, “Build failed”, “Alarm”.
DynamicAccepts title/message/priority from the request; settings = defaults.Logs, monitoring, website forms, any calls with custom text.
  1. Open the admin: https://app.notifly.ru/.
  2. Create a channel in the “Channels” section (if you don’t have one yet).
  3. Go to “Webhooks” in the sidebar → “Create webhook”.
  4. Fill in:
    • Name — a label for convenience.
    • Channel — where to post messages.
    • Mode — static or dynamic.
    • Title / Text / Priority — for static this is the message content; for dynamic — default values.

After creation you’ll see a URL like:

https://api.notifly.ru/webhook/W<...>

And ready-made snippets for curl / fetch / GET. The ✈️ button next to the webhook sends a test message.

The simplest way: one URL = one fixed notification. A GET or POST without a body is enough.

Окно терминала
# curl
curl -X POST "https://api.notifly.ru/webhook/W<TOKEN>"
# or just GET — convenient to open from the browser address bar / bookmark
curl "https://api.notifly.ru/webhook/W<TOKEN>"
// JS from the browser
fetch("https://api.notifly.ru/webhook/W<TOKEN>", {method: "POST"});

Ideal for:

  • “household” automation buttons (Home Assistant, ESP32);
  • triggers in no-code (Zapier, n8n, IFTTT);
  • browser bookmarks: open it — it sends.

Accepts message (required), title, priority in any way: JSON (Content-Type: application/json), form-data, query parameters.

Webhook settings (title/text/priority) are used as default values — if a field is not provided, it will be taken from the settings.

Окно терминала
curl -X POST "https://api.notifly.ru/webhook/W<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"title":"Деплой","message":"Бэкенд раскатан","priority":5}'
Окно терминала
curl "https://api.notifly.ru/webhook/W<TOKEN>" \
-F "title=Деплой" -F "message=Бэкенд раскатан" -F "priority=5"
https://api.notifly.ru/webhook/W<TOKEN>?title=Hello&message=ping
await fetch("https://api.notifly.ru/webhook/W<TOKEN>", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({
title: "Заявка с сайта",
message: "Иван оставил телефон +7…",
priority: 6,
}),
});
import requests
requests.post("https://api.notifly.ru/webhook/W<TOKEN>", json={
"title": "Новый платёж",
"message": "₽12 500 от user@example.com",
"priority": 7,
})
Окно терминала
Invoke-RestMethod -Uri "https://api.notifly.ru/webhook/W<TOKEN>" -Method POST -Body @{
title = "Сборка упала"
message = "build #482 failed"
priority = 8
}
- name: Notify on failure
if: failure()
run: |
curl -fsS -X POST "https://api.notifly.ru/webhook/${{ secrets.NOTIFLY_WEBHOOK }}" \
-H "Content-Type: application/json" \
-d "{\"title\":\"CI упал\",\"message\":\"${{ github.repository }}@${{ github.sha }}\",\"priority\":8}"
  • Webhook token in the URL = permission to send only to one channel.
  • If the token leaked — delete the webhook in the admin, its URL will stop working immediately. Other webhooks of the channel will continue to work.
  • Do not publish the webhook URL in public code if the channel is critical.
  • Webhooks can be made “one-time”: create → use → delete.
POST /messagePOST /webhook/:token
Tokenin header X-Notifly-Keyin the URL
CORS-preflightyes (custom header)no
From browserrequires preflightworks directly
Message textalways from the requestcan be preset (static mode)
How many per channel1 tokenunlimited — each has its own text and mode

For servers and CLI both options work; webhooks are more convenient when you need to:

  • send a pre-set text with one click;
  • create several different “triggers” into a single channel;
  • integrate without configuring headers (no-code, browser, IoT).