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).
Two modes
Section titled “Two modes”| Mode | What it does | When to use |
|---|---|---|
| Static | Sends a pre-set text. Request body is ignored. | Button-like events: “Courier left”, “Build failed”, “Alarm”. |
| Dynamic | Accepts title/message/priority from the request; settings = defaults. | Logs, monitoring, website forms, any calls with custom text. |
How to create a webhook
Section titled “How to create a webhook”- Open the admin: https://app.notifly.ru/.
- Create a channel in the “Channels” section (if you don’t have one yet).
- Go to “Webhooks” in the sidebar → “Create webhook”.
- 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.
Static webhook
Section titled “Static webhook”The simplest way: one URL = one fixed notification.
A GET or POST without a body is enough.
# curlcurl -X POST "https://api.notifly.ru/webhook/W<TOKEN>"
# or just GET — convenient to open from the browser address bar / bookmarkcurl "https://api.notifly.ru/webhook/W<TOKEN>"// JS from the browserfetch("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.
Dynamic webhook
Section titled “Dynamic webhook”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 (JSON)
Section titled “curl (JSON)”curl -X POST "https://api.notifly.ru/webhook/W<TOKEN>" \ -H "Content-Type: application/json" \ -d '{"title":"Деплой","message":"Бэкенд раскатан","priority":5}'curl (form)
Section titled “curl (form)”curl "https://api.notifly.ru/webhook/W<TOKEN>" \ -F "title=Деплой" -F "message=Бэкенд раскатан" -F "priority=5"From browser (GET)
Section titled “From browser (GET)”https://api.notifly.ru/webhook/W<TOKEN>?title=Hello&message=pingJavaScript (fetch)
Section titled “JavaScript (fetch)”await fetch("https://api.notifly.ru/webhook/W<TOKEN>", { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({ title: "Заявка с сайта", message: "Иван оставил телефон +7…", priority: 6, }),});Python
Section titled “Python”import requests
requests.post("https://api.notifly.ru/webhook/W<TOKEN>", json={ "title": "Новый платёж", "message": "₽12 500 от user@example.com", "priority": 7,})PowerShell
Section titled “PowerShell”Invoke-RestMethod -Uri "https://api.notifly.ru/webhook/W<TOKEN>" -Method POST -Body @{ title = "Сборка упала" message = "build #482 failed" priority = 8}GitHub Actions
Section titled “GitHub Actions”- 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}"Security
Section titled “Security”- 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.
How is it different from POST /message?
Section titled “How is it different from POST /message?”POST /message | POST /webhook/:token | |
|---|---|---|
| Token | in header X-Notifly-Key | in the URL |
| CORS-preflight | yes (custom header) | no |
| From browser | requires preflight | works directly |
| Message text | always from the request | can be preset (static mode) |
| How many per channel | 1 token | unlimited — 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).