Skip to content

AI assistant (copilot chat)

AI assistant — a chat built into the admin that knows Notifly’s capabilities and helps configure them. You describe a task in natural language (“I want to be notified if the nightly backup didn’t run”, “check that the site is up”), and the assistant replies with a step-by-step instruction with examples and — importantly — offers ready action-buttons that open a pre-filled creation dialog for the required entity.

The chat opens from the floating “Open AI assistant” button, which is visible on every admin page once you are logged in, and slides out as a side panel on the right.

This is not the same AI as the AI helpers in forms (suggesting webhook router and email inbox rules, content monitor CSS selectors and so on): the assistant has a separate daily quota (assistantRequestsPerDay), it does not consume the events limit and is not counted against the AI helpers limit (aiRequestsPerDay).

  • Answer questions about the platform: what a heartbeat is, how monitor types differ, what limits Free has, how to configure email delivery.
  • Suggest actions. When you ask to “create / add / configure” something, the reply includes an action block — a button that opens the creation dialog (heartbeat, monitor, HTTP monitor, content monitor, port monitor, workflow monitor, metric source, email inbox, webhook router, web script or a new channel) with fields already filled. You only need to choose the channel and confirm.
  • Diagnose. The assistant sees a short summary of your account: what’s currently down/degraded/alerting, how many active and online devices there are, quota usage, recent notifications. To questions like “what’s not working” or “why aren’t notifications arriving” it responds based on the actual state (for example, it may point out that all devices are suspended due to the plan limit — and there is physically no one to show notifications to).

The chat is multi-turn: the assistant remembers previous messages within the same conversation (up to the last 20 messages are passed into the model context). Each conversation is a separate thread with its own title (taken from the first message).

  • The first message without a threadId creates a new conversation — its threadId is returned in the response; pass it in subsequent requests to continue the same dialog.
  • List of conversations — GET /assistant/threads, their history — GET /assistant/threads/:id/messages.
  • A conversation can be deleted entirely — DELETE /assistant/threads/:id.

When the assistant suggests configuring something, the response contains an array actions. Each element is a pre-fill for a creation dialog, not an automatic change: nothing is created until you confirm in the opened window.

{
"kind": "heartbeat",
"label": "Set up backup monitoring",
"params": {
"name": "Nightly backup",
"intervalSec": 86400,
"graceSec": 3600,
"alertTitle": "Backup did not run",
"alertMessage": "The backup job ping did not arrive in time"
}
}
  • kind — the entity type: heartbeat, monitor, http_monitor, content_monitor, port_monitor, workflow_monitor, metric_source, email_inbox, webhook_router, web_script, application.
  • label — the button caption in the user’s language.
  • params — fields for pre-filling (all optional, any can be modified in the dialog). The channel (appid) is not included in the action — you choose it when confirming.

A single response may contain several actions (for example, create a channel and a heartbeat to it at once). For entities without a creation dialog — interactive questions (ask) and the browser workflow monitor — there is no ready action: the assistant will explain and point you to the appropriate page.

Each dialog turn (one POST /assistant/chat) consumes one request from the assistant’s separate daily quota. The limit depends on the plan and is not included in the overall events limit or the AI helpers limit:

PlanassistantRequestsPerDay
Free100
Pro5000
Business100000

The quota is decremented before calling the model; when exhausted the request returns 429. Reset occurs at 00:00 MSK, like other daily limits. More — Quotas and tariffs.

The minimal request is only text (a new conversation is created automatically). NOTIFLY_URL for cloud Notifly is https://api.notifly.ru:

Окно терминала
curl -X POST "$NOTIFLY_URL/assistant/chat" \
-H "X-Notifly-Key: $NOTIFLY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"text":"I want to know if the nightly backup fails"}'

Response:

{
"threadId": 184,
"messageId": 921,
"text": "A heartbeat fits backup monitoring: after a successful run the job pings a unique URL, and if the ping does not arrive in time, Notifly sends an alert. Click the button below to create the monitor.",
"actions": [
{
"kind": "heartbeat",
"label": "Set up backup monitoring",
"params": {
"name": "Nightly backup",
"intervalSec": 86400,
"graceSec": 3600
}
}
]
}

To continue the same dialog — add the threadId from the response:

Окно терминала
curl -X POST "$NOTIFLY_URL/assistant/chat" \
-H "X-Notifly-Key: $NOTIFLY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"threadId":184,"text":"What if the backup runs weekly rather than daily?"}'

In the response actions may be empty (the array absent) — for purely informational questions there will be no buttons.

Method and pathAuthorizationPurpose
GET /assistant/threadsdevice token or API tokenlist of user’s conversations
GET /assistant/threads/:id/messagesdevice token or API tokenconversation message history
DELETE /assistant/threads/:iddevice token or API tokendelete a conversation entirely
POST /assistant/chatdevice token or API tokensend a message, receive a response + actions
GET /assistant/insightsdevice token or API tokenproactive recommendations about the account

Request body of POST /assistant/chat: text (required), threadId (optional — to continue a conversation; without it a new one is created).

Response of POST /assistant/chat: threadId, messageId, text, actions[] (kind, label, params).

Errors of POST /assistant/chat:

CodeWhen
400empty text (or the body is not JSON)
403a request with a channel token (A…) or a share token (S…)
404the threadId does not exist or belongs to another user
429the assistant’s daily quota is exhausted
502the LLM call failed; the quota turn has already been charged by then
503no LLM is configured on the server — the assistant is unavailable (no quota is charged)

GET /assistant/threads/:id/messages and DELETE /assistant/threads/:id also answer 404 for another user’s or a non-existent conversation.

Besides the dialog, the assistant can look at the account itself and point out what is not fully configured. In the admin panel these hints are the “Recommendations” card on the “All messages” home page: you can refresh or collapse it, and hide an individual recommendation with the “Dismiss” button (this hides every recommendation with that code and is remembered in the browser). When there is nothing to report, the card is not shown. The same data is available through GET /assistant/insights:

Окно терминала
curl "$NOTIFLY_URL/assistant/insights" -H "X-Notifly-Key: $NOTIFLY_API_TOKEN"
{
"insights": [
{
"code": "channel_no_recipient",
"severity": "warn",
"title": "Nobody can receive the alerts",
"detail": "Channels Prod, Staging receive events, but the account has no active devices and delivery is not enabled for them."
},
{
"code": "no_ssl_monitor",
"severity": "info",
"title": "No SSL certificate check for example.com",
"detail": "The host is checked over HTTPS, but its certificate expiry is not monitored.",
"action": {
"kind": "monitor",
"label": "Create an SSL monitor",
"params": {"kind": "ssl", "target": "example.com", "name": "SSL example.com"}
}
}
],
"generatedAt": "2026-06-23T10:00:00Z"
}

Recommendations are built by deterministic heuristics over a snapshot of the account (channels and their delivery, heartbeats, monitors, devices, API tokens) — the model does not invent facts. Each heuristic yields at most 5 recommendations. The codes are stable and usable in your own logic:

codeWhat it warns about
channel_no_recipientthe channel receives events, but the account has no active devices and the channel has no delivery configured — nobody will see the alerts
delivery_enabled_emptya delivery method is enabled but its address is empty: email, SMS, call, Slack, Telegram, webhook, Discord, Teams, Mattermost, PagerDuty or Opsgenie
monitor_flappinga monitor (regular or HTTP) is unstable: its consecutive failed checks are at least twice the alert threshold
no_ssl_monitora host is checked over HTTPS, but there is no SSL monitor for its TLS certificate expiry
heartbeat_never_pingeda heartbeat was created over a day ago and never received a ping
api_token_no_scopean API token with write access was issued without a scope restriction

Query parameters:

ParameterMeaning
polish=1rephrase the texts with the LLM (charges one assistant quota turn; on any error the original wording is returned)
refresh=1rebuild the snapshot without waiting for the cache to expire
langthe language of the polished text (ru by default)

The response is cached for 10 minutes per user — account state changes slowly while building the snapshot costs about a dozen database queries. A plain call (without polish=1) does not consume the quota.