Agents

Send an agent reply

Send a message or side-effect into an existing agent conversation from your backend.

Use this endpoint when you are not using @notifly/framework (for example Python, Go, PHP, .NET, or Java SDKs), or when a server process outside the bridge needs to post into a live conversation.

Message actions

  • reply — markdown, interactive card, or tool-approval card (optional files)
  • edit — update a previously delivered message in place
  • deleteMessages — remove rendered platform messages (history is kept)
  • addReactions — add emoji reactions to existing messages

Turn control

  • typing — { status?: string } to set status, or "stop" to clear
  • resolve — mark the conversation resolved (optionally with a final reply)
  • error: true — report a customer-runtime failure (cannot combine with other actions)

Signals & tools

  • signals — metadata set/delete/clear, or trigger a Novu workflow
  • toolResults — persist tool outputs into conversation history
  • toolApprovalRequest — ledger a gated tool call (pair with an approval card reply)

Returns { data: { messageId, platformThreadId } } when a reply or edit is delivered; otherwise { data: null }.

post/v1/agents/{agentId}/reply

Request

  • Base URL: https://api.notifly.io
  • URL: https://api.notifly.io/v1/agents/{agentId}/reply
  • Auth: API key in header Authorization

Path parameters

agentIdstring required

Agent identifier (slug) for the agent that owns the conversation.

Request body

conversationIdstring required

Conversation id to reply into. Obtained from the inbound agent event / bridge payload.

integrationIdentifierstring required

Channel integration identifier linked to the agent for this conversation (e.g. slack-support).

errorboolean

Bridge reports that the customer runtime failed this turn. Cannot be combined with other actions. Novu delivers generic user-facing error copy.

Example request

{
  "conversationId": "64f5a1c2e8b7a3d9f0c1b2a3",
  "integrationIdentifier": "slack-support",
  "reply": {
    "markdown": "**Report ready.** Your weekly summary is attached.",
    "files": [
      {
        "filename": "report.pdf",
        "mimeType": "application/pdf",
        "data": "JVBERi0xLjQK...",
        "url": "https://example.com/files/report.pdf"
      }
    ]
  },
  "toolApprovalRequest": {
    "approvalId": "apr_01HZX",
    "toolCallId": "call_refund_1",
    "name": "issue_refund",
    "input": {
      "orderId": "ORD-42",
      "amountCents": 2500
    },
    "approveActionId": "tool-approval:approve:apr_01HZX",
    "denyActionId": "tool-approval:deny:apr_01HZX",
    "mcpServerName": "GitHub"
  },
  "edit": {
    "messageId": "1712345678.123456",
    "content": {
      "markdown": "**Report ready.** Your weekly summary is attached.",
      "files": [
        {
          "filename": "report.pdf",
          "mimeType": "application/pdf",
          "data": "JVBERi0xLjQK...",
          "url": "https://example.com/files/report.pdf"
        }
      ]
    }
  },
  "resolve": {
    "summary": "Answered billing question about invoice INV-42."
  },
  "signals": [
    {
      "key": "crm:ticketId"
    }
  ],
  "toolResults": [
    {
      "toolCallId": "call_abc123",
      "toolName": "lookup_order",
      "preview": "Order ORD-42 is shipped"
    }
  ],
  "addReactions": [
    {
      "messageId": "1712345678.123456",
      "emojiName": "white_check_mark"
    }
  ],
  "deleteMessages": [
    {
      "messageId": "1712345678.123456"
    }
  ],
  "typing": {
    "status": "Looking up your order…"
  },
  "error": true
}

Response

OK. When a reply or edit is delivered, data contains the platform message identifiers. Side-effect-only requests (typing, reactions, deletes, signals without an outbound message) return data: null.

Example response

{
  "data": {
    "messageId": "1712345678.123456",
    "platformThreadId": "C0123456789"
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.