---
title: "POST /notifiers"
method: POST
path: "/notifiers"
tags: ["Monitors"]
---

# POST /notifiers

`POST /notifiers`

## Request

- Base URL: `https://api.axiom.co/v2`
- URL: `https://api.axiom.co/v2/notifiers`
- Auth: OAuth 2
  - Authorization code: `https://accounts.google.com/o/oauth2/v2/auth`
  - Token URL: `https://www.googleapis.com/oauth2/v4/token` scopes: `notifiers|create`
- TypeScript: <https://skmtc.dev/axiom/apis/axiom-public-api/docs/notifiers/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates a notifier. Set exactly one channel under `properties`, such as `slack`, `email`, or `webhook`. Returns `400` if the channel type isn't enabled for your organization. `labelIds` replaces assignments when supplied; [] clears them. Omitted or null `labelIds` preserves assignments on updates and creates an unlabeled resource on creation. IDs must belong to existing labels in your organization and are validated before saving.

## Request body

- NotifierUpsertRequest: Configuration for a notification channel. Notifiers can be configured for various services like: - Slack - Email - PagerDuty - OpsGenie - Discord - Microsoft Teams - Custom Webhooks - Cursor - Claude Code - Jira Service Management
  - `createdAt` string, date-time: Timestamp when the notifier was created
  - `createdBy` string: Email or ID of the user who created the notifier
  - `createdByAgent` boolean: true when the MCP server created this notifier
  - `disabled` boolean: Whether repeated delivery failures disabled the notifier. False when a user snoozed it with disabledUntil. Ignored on requests
  - `disabledUntil` string: ISO timestamp until which the notifier is disabled (null if enabled)
  - `lastError` string: The delivery error that disabled the notifier. Empty for email notifiers and when disabled is false. Ignored on requests
  - `name` string, required: Human-readable name for the notifier
  - `properties` NotifierProperties, required: Configuration options for different notification channels. Only one channel should be configured per notifier.
    - `amp` AmpConfig: Amp Orb webhook. The receiving plugin must accept {"text": "<monitor summary>"}.
      - `webhookUrl` string, required: Secret HTTPS URL from the Amp plugin createWebhook registration. Returned encrypted on reads; submit it unchanged to retain it on updates.
    - `chatgptWorkspaceAgent` ChatGPTWorkspaceAgentConfig: Published ChatGPT Workspace Agent API channel. Axiom sends {"input": "<monitor summary>"}.
      - `token` string, required: ChatGPT access token with the Workspace Agents scope
      - `triggerId` string, required: API channel trigger ID beginning with agtch_
    - `claudeCode` ClaudeCodeConfig: Claude Code routine. Axiom sends a fixed text body when the monitor fires.
      - `routineId` string, required: Routine ID from a Claude Code API trigger
      - `token` string, required: Bearer token for the routine
    - `cursor` CursorConfig: Cursor automation webhook. Axiom sends a fixed context body when the monitor fires.
      - `token` string, required: Bearer token for the automation webhook
      - `webhookUrl` string, required: Automation webhook URL from a Cursor automation
    - `customWebhook` CustomNotifierConfig: Configuration for custom webhook notifications with flexible headers and body template. Supports variable substitution in the body template using {{.Variable}} syntax.
      - `body` string, required: Template for the webhook body, supports variable substitution
      - `headers` object: HTTP headers to include in the request
      - `secretHeaders` object: Sensitive HTTP headers (tokens, keys) that should be masked in logs
      - `url` string, required: Custom webhook endpoint URL
    - `discord` DiscordConfig: Configuration for Discord notifications using bot token
      - `discordChannel` string: Discord channel ID to send notifications
      - `discordToken` string: Discord bot token for authentication
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
    - `discordWebhook` DiscordWebhookConfig: Configuration for Discord notifications using webhooks
      - `discordWebhookUrl` string: Discord webhook URL
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
    - `email` EmailConfig: Configuration for email notifications
      - `emails` string[]: List of email addresses to receive notifications
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
    - `jiraServiceManagement` JiraServiceManagementConfig: Configuration for Jira Service Management Ops alerts using an API integration
      - `apiKey` string, required: API key of the Jira Service Management API integration
    - `microsoftTeams` MicrosoftTeamsConfig: Configuration for Microsoft Teams notifications
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
      - `microsoftTeamsUrl` string: Microsoft Teams webhook URL
    - `opsgenie` OpsGenieConfig: Configuration for OpsGenie integration
      - `apiKey` string: OpsGenie API key for authentication
      - `isEU` boolean: Whether to use EU region endpoints
    - `pagerduty` PagerDutyConfig: Configuration for PagerDuty integration
      - `routingKey` string: PagerDuty integration key for routing alerts
      - `token` string: PagerDuty API token for additional functionality
    - `slack` SlackConfig: Configuration for Slack notifications using incoming webhooks
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
      - `slackUrl` string: Slack incoming webhook URL
    - `webhook` WebhookConfig: Configuration for simple webhook notifications
      - `url` string: Webhook endpoint URL
  - `updatedAt` string, date-time: Timestamp when the notifier was last updated
  - `labelIds` LabelID[]: Existing label IDs; replaces assignments when supplied, clears with [], and preserves them when omitted or null.

## Response `200`

Created notifier.

- NotifierWithId: Configuration for a notification channel. Notifiers can be configured for various services like: - Slack - Email - PagerDuty - OpsGenie - Discord - Microsoft Teams - Custom Webhooks - Cursor - Claude Code - Jira Service Management
  - `createdAt` string, date-time: Timestamp when the notifier was created
  - `createdBy` string: Email or ID of the user who created the notifier
  - `createdByAgent` boolean: true when the MCP server created this notifier
  - `disabled` boolean: Whether repeated delivery failures disabled the notifier. False when a user snoozed it with disabledUntil. Ignored on requests
  - `disabledUntil` string: ISO timestamp until which the notifier is disabled (null if enabled)
  - `lastError` string: The delivery error that disabled the notifier. Empty for email notifiers and when disabled is false. Ignored on requests
  - `name` string, required: Human-readable name for the notifier
  - `properties` NotifierProperties, required: Configuration options for different notification channels. Only one channel should be configured per notifier.
    - `amp` AmpConfig: Amp Orb webhook. The receiving plugin must accept {"text": "<monitor summary>"}.
      - `webhookUrl` string, required: Secret HTTPS URL from the Amp plugin createWebhook registration. Returned encrypted on reads; submit it unchanged to retain it on updates.
    - `chatgptWorkspaceAgent` ChatGPTWorkspaceAgentConfig: Published ChatGPT Workspace Agent API channel. Axiom sends {"input": "<monitor summary>"}.
      - `token` string, required: ChatGPT access token with the Workspace Agents scope
      - `triggerId` string, required: API channel trigger ID beginning with agtch_
    - `claudeCode` ClaudeCodeConfig: Claude Code routine. Axiom sends a fixed text body when the monitor fires.
      - `routineId` string, required: Routine ID from a Claude Code API trigger
      - `token` string, required: Bearer token for the routine
    - `cursor` CursorConfig: Cursor automation webhook. Axiom sends a fixed context body when the monitor fires.
      - `token` string, required: Bearer token for the automation webhook
      - `webhookUrl` string, required: Automation webhook URL from a Cursor automation
    - `customWebhook` CustomNotifierConfig: Configuration for custom webhook notifications with flexible headers and body template. Supports variable substitution in the body template using {{.Variable}} syntax.
      - `body` string, required: Template for the webhook body, supports variable substitution
      - `headers` object: HTTP headers to include in the request
      - `secretHeaders` object: Sensitive HTTP headers (tokens, keys) that should be masked in logs
      - `url` string, required: Custom webhook endpoint URL
    - `discord` DiscordConfig: Configuration for Discord notifications using bot token
      - `discordChannel` string: Discord channel ID to send notifications
      - `discordToken` string: Discord bot token for authentication
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
    - `discordWebhook` DiscordWebhookConfig: Configuration for Discord notifications using webhooks
      - `discordWebhookUrl` string: Discord webhook URL
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
    - `email` EmailConfig: Configuration for email notifications
      - `emails` string[]: List of email addresses to receive notifications
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
    - `jiraServiceManagement` JiraServiceManagementConfig: Configuration for Jira Service Management Ops alerts using an API integration
      - `apiKey` string, required: API key of the Jira Service Management API integration
    - `microsoftTeams` MicrosoftTeamsConfig: Configuration for Microsoft Teams notifications
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
      - `microsoftTeamsUrl` string: Microsoft Teams webhook URL
    - `opsgenie` OpsGenieConfig: Configuration for OpsGenie integration
      - `apiKey` string: OpsGenie API key for authentication
      - `isEU` boolean: Whether to use EU region endpoints
    - `pagerduty` PagerDutyConfig: Configuration for PagerDuty integration
      - `routingKey` string: PagerDuty integration key for routing alerts
      - `token` string: PagerDuty API token for additional functionality
    - `slack` SlackConfig: Configuration for Slack notifications using incoming webhooks
      - `messageTemplate` MessageTemplate: Go templates that replace the title and body of the notifier's default message. An empty field keeps the default. Variables include {{.Title}}, {{.Body}}, {{.Name}}, {{.Action}}, {{.Value}}, {{.Threshold}}, {{.Labels}}, {{.Groups}} and {{.MatchedEvent}}. If a template fails when a notification is sent, the default message is sent and the delivery records the error.
        - `body` string: Template for the message body
        - `title` string: Template for the message title
      - `slackUrl` string: Slack incoming webhook URL
    - `webhook` WebhookConfig: Configuration for simple webhook notifications
      - `url` string: Webhook endpoint URL
  - `updatedAt` string, date-time: Timestamp when the notifier was last updated
  - `id` string: Unique identifier for the notifier
  - `labelIds` LabelID[], required: IDs of labels assigned to this notifier.
  - `labelNames` string[], required: Names of assigned labels, including with exclude=labels; [] when unassigned.
  - `labels` Label[]: Resolved labels assigned to this notifier.
    - `color` LabelColor, required
      - `name` 'red' | 'coral' | 'orange' | 'amber' | 'yellow' | 'lime' | 'green' | 'teal' | 'blue' | 'iris' | 'purple' | 'pink', required
      - `type` 'palette', required
    - `description` string, nullable
    - `id` string, required
    - `name` string, required

## Other responses

- `400`: Bad request

## Changes

- **2026-11-02** (v2) `e3baf3b85e8d`: 2 breaking, 3 warning, 12 info
  - added `#/components/schemas/Notifier, subschema #2` to the request body `allOf` list
  - the request's body type changed from `object` to no type
  - removed the request property `disabledUntil`
  - removed the request property `name`
  - …13 more
- **2026-10-16** (v2) `fbc1b8430feb`: 1 info
  - added the non-success response with the status `400`
- **2026-10-14** (v2) `8920e1697284`: 1 breaking, 6 info
  - the `allOf[subschema #2]/` response's property type changed from no type to `object` for status `200`
  - added the new optional request property `properties/claudeCode`
  - added the new optional request property `properties/cursor`
  - added the optional property `allOf[#/components/schemas/Notifier]/properties/claudeCode` to the response with the `200` status
  - …3 more

[Operation history](https://skmtc.dev/axiom/apis/axiom-public-api/changes/notifiers/post.md)

---

[API](https://skmtc.dev/axiom/apis/axiom-public-api.md) - [All operations](https://skmtc.dev/axiom/apis/axiom-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/axiom/apis/axiom-public-api/revisions/7e39a295e3ba?raw)
