{
  "openapi": "3.1.0",
  "info": {
    "title": "NotifyBD API",
    "version": "1",
    "description": "NotifyBD REST API (/api/v1, JSON, API-key auth) and MCP server for AI assistants: create reminders that repeat until answered, send notifications by app push, SMS, WhatsApp or email, watch websites and servers, and (for resellers) manage users and broadcast. Docs: https://notify.bd/api",
    "contact": {
      "url": "https://notify.bd"
    }
  },
  "servers": [
    {
      "url": "https://app.notify.bd/api/v1"
    }
  ],
  "security": [
    {
      "ApiKey": []
    },
    {
      "Bearer": []
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key"
      },
      "Bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "The same API key as a bearer token."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": false
          },
          "error": {
            "type": "string",
            "enum": [
              "invalid_api_key",
              "account_inactive",
              "api_not_in_plan",
              "admin_only",
              "limit_reached",
              "method_not_in_plan",
              "monthly_limit_reached",
              "invalid",
              "missing_title",
              "bad_repeat",
              "bad_in_minutes",
              "bad_kind",
              "weak_password",
              "missing_active",
              "missing_amount",
              "not_found"
            ]
          },
          "message": {
            "type": "string"
          }
        }
      }
    }
  },
  "paths": {
    "/me": {
      "get": {
        "operationId": "me",
        "summary": "Your account, balance and plan",
        "tags": [
          "Account"
        ],
        "description": "Who the key belongs to, the balance in taka, the account's time zone and current local time, and the plan's limits (including notifications per month and how many are used this month; null = unlimited).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "name": "Rahim Uddin",
                  "username": "rahim@example.com",
                  "role": "user",
                  "now": "2026-09-28T10:15",
                  "balance": 120.0,
                  "currency": "BDT",
                  "timeZone": "Asia/Dhaka",
                  "plan": {
                    "name": "Pro",
                    "expiresAt": "2026-10-28T00:00:00Z",
                    "expired": false,
                    "maxReminders": 300,
                    "maxMonitors": 20,
                    "notificationsPerMonth": 600,
                    "notificationsUsedThisMonth": 42,
                    "sms": true,
                    "whatsapp": true,
                    "email": true,
                    "smsRate": 0.35,
                    "whatsappRate": 0.8
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/reminders": {
      "post": {
        "operationId": "create_reminder",
        "summary": "Create a reminder",
        "tags": [
          "Reminders"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "What to remind about (max 120 characters)."
                  },
                  "message": {
                    "type": "string",
                    "description": "Extra text (max 500)."
                  },
                  "repeat": {
                    "type": "string",
                    "description": "once (default), daily, weekly, monthly or yearly."
                  },
                  "date": {
                    "type": "string",
                    "description": "yyyy-MM-dd. First/only date; default today. Monthly uses its day of month, yearly its day and month."
                  },
                  "time": {
                    "type": "string",
                    "description": "HH:mm, 24-hour, account time zone. Required unless inMinutes is given."
                  },
                  "inMinutes": {
                    "type": "integer",
                    "description": "Instead of date/time: fire this many minutes from now (1–525600), rounded up to the next whole minute."
                  },
                  "days": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    },
                    "description": "Weekly only: days of the week, 0 = Sunday … 6 = Saturday."
                  },
                  "phases": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    },
                    "description": "Days before the date to alert, e.g. [15,7,1,0]. Default [0] = on the day. For once, monthly and yearly."
                  },
                  "methods": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Array of \"app\", \"sms\", \"whatsapp\", \"email\". Default [\"app\"]. sms/whatsapp need a paid plan and are charged per message from the balance; app and email are free (email: user accounts only)."
                  },
                  "requireAck": {
                    "type": "boolean",
                    "description": "Keep asking until answered Yes (default true)."
                  },
                  "repeatEveryMin": {
                    "type": "integer",
                    "description": "Minutes between asks while waiting (default 10). Snooze waits the same time."
                  },
                  "maxRepeats": {
                    "type": "integer",
                    "description": "How many more times to ask (0–20, default 3). After that the reminder is marked No answer."
                  },
                  "alarm": {
                    "type": "boolean",
                    "description": "Ring and vibrate like an alarm clock in the Android app, with a full-screen alarm page (default false)."
                  },
                  "color": {
                    "type": "string",
                    "description": "One of orange, navy, blue, green, purple, pink, teal, amber (default orange)."
                  },
                  "icon": {
                    "type": "string",
                    "description": "One of bell, alarm, calendar-event, globe, server, capsule, cup-hot, dribbble, book, cash-coin, briefcase, house, heart-pulse, car-front, airplane, gift (default alarm)."
                  }
                },
                "required": [
                  "title"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": {
                    "id": "3f1c…",
                    "title": "example.com renewal",
                    "repeat": "yearly",
                    "date": "2026-12-01",
                    "time": "10:00",
                    "phases": [
                      15,
                      7,
                      1,
                      0
                    ],
                    "methods": [
                      "app",
                      "sms"
                    ],
                    "requireAck": true,
                    "alarm": false,
                    "repeatEveryMin": 10,
                    "maxRepeats": 3,
                    "active": true,
                    "nextRunAt": "2026-11-16T04:00:00Z"
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "list_reminders",
        "summary": "List reminders",
        "tags": [
          "Reminders"
        ],
        "description": "All your reminders, sorted by title.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": [
                    {
                      "id": "3f1c…",
                      "title": "Go to play",
                      "repeat": "daily",
                      "time": "17:00",
                      "active": true
                    }
                  ]
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/reminders/{id}": {
      "get": {
        "operationId": "get_reminder",
        "summary": "Get one reminder",
        "tags": [
          "Reminders"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Reminder id.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": {
                    "id": "3f1c…",
                    "title": "Go to play",
                    "active": true
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "delete_reminder",
        "summary": "Delete a reminder",
        "tags": [
          "Reminders"
        ],
        "description": "Deletes the reminder and its history. Cannot be undone.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Reminder id.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/reminders/{id}/pause": {
      "post": {
        "operationId": "pause_reminder",
        "summary": "Pause a reminder",
        "tags": [
          "Reminders"
        ],
        "description": "Stops it from firing. Use /resume to turn it back on.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Reminder id.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": {
                    "id": "3f1c…",
                    "active": false
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/reminders/{id}/resume": {
      "post": {
        "operationId": "resume_reminder",
        "summary": "Resume a reminder",
        "tags": [
          "Reminders"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Reminder id.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": {
                    "id": "3f1c…",
                    "active": true
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/answer/{occurrenceId}": {
      "post": {
        "operationId": "answer",
        "summary": "Answer a waiting reminder",
        "tags": [
          "Reminders"
        ],
        "description": "yes = done (stops asking); snooze and notyet both ask again after the reminder's repeatEveryMin. The occurrenceId comes from GET /notifications (items with waitingForAnswer = true).",
        "parameters": [
          {
            "name": "occurrenceId",
            "in": "path",
            "required": true,
            "description": "occurrenceId from GET /notifications.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "answer": {
                    "type": "string",
                    "description": "yes, snooze or notyet."
                  }
                },
                "required": [
                  "answer"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "message": "Great! “Go to play” is done."
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/notify": {
      "post": {
        "operationId": "notify",
        "summary": "Notify yourself now",
        "tags": [
          "Notifications"
        ],
        "description": "Sends a notification to your own devices right away — handy for backups, cron jobs and scripts. It goes through the same queue; SMS/WhatsApp are charged from your balance. Counts toward the plan's monthly notification limit.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "Title (max 160)."
                  },
                  "message": {
                    "type": "string",
                    "description": "Body text (max 1000)."
                  },
                  "methods": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Array of \"app\", \"sms\", \"whatsapp\", \"email\". Default [\"app\"]. sms/whatsapp need a paid plan and are charged per message from the balance; app and email are free (email: user accounts only)."
                  },
                  "severity": {
                    "type": "string",
                    "description": "info (default), success, warning or danger."
                  }
                },
                "required": [
                  "title"
                ]
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "id": "9b2e…",
                  "deliveries": [
                    {
                      "method": "app",
                      "status": "queued",
                      "cost": 0,
                      "error": null
                    }
                  ]
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/notifications": {
      "get": {
        "operationId": "list_notifications",
        "summary": "Read your inbox",
        "tags": [
          "Notifications"
        ],
        "description": "Latest notifications, newest first. waitingForAnswer = a reminder is still waiting for Yes (answer it with POST /answer).",
        "parameters": [
          {
            "name": "unread",
            "in": "query",
            "required": false,
            "description": "Only unread (default false).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–200 (default 50).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": [
                    {
                      "id": "9b2e…",
                      "kind": "reminder",
                      "severity": "info",
                      "title": "Go to play",
                      "body": "",
                      "createdAt": "2026-09-28T11:00:00Z",
                      "read": false,
                      "occurrenceId": "5d0a…",
                      "waitingForAnswer": true
                    }
                  ]
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/monitors": {
      "post": {
        "operationId": "create_monitor",
        "summary": "Watch a site or server",
        "tags": [
          "Monitors"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target": {
                    "type": "string",
                    "description": "http: a URL; tcp / ping: a host name or IP."
                  },
                  "kind": {
                    "type": "string",
                    "description": "http (default; down on status ≥ 400 or missing keyword), tcp (host + port) or ping."
                  },
                  "name": {
                    "type": "string",
                    "description": "Display name."
                  },
                  "port": {
                    "type": "integer",
                    "description": "tcp only."
                  },
                  "keyword": {
                    "type": "string",
                    "description": "http only: text that must appear on the page."
                  },
                  "intervalSec": {
                    "type": "integer",
                    "description": "Seconds between checks (default 300; the plan sets the minimum)."
                  },
                  "methods": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Array of \"app\", \"sms\", \"whatsapp\", \"email\". Default [\"app\"]. sms/whatsapp need a paid plan and are charged per message from the balance; app and email are free (email: user accounts only)."
                  }
                },
                "required": [
                  "target"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": {
                    "id": "c7aa…",
                    "name": "Shop",
                    "kind": "http",
                    "target": "https://shop.example.com",
                    "intervalSec": 300,
                    "methods": [
                      "app"
                    ],
                    "active": true,
                    "state": "unknown"
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "list_monitors",
        "summary": "List monitors",
        "tags": [
          "Monitors"
        ],
        "description": "With state (up / down / unknown / paused), last check time, latency and last error.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": [
                    {
                      "id": "c7aa…",
                      "name": "Shop",
                      "state": "up",
                      "latencyMs": 182,
                      "lastCheckAt": "2026-09-28T11:02:10Z"
                    }
                  ]
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/monitors/{id}": {
      "delete": {
        "operationId": "delete_monitor",
        "summary": "Delete a monitor",
        "tags": [
          "Monitors"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Monitor id.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/users": {
      "get": {
        "operationId": "list_users",
        "summary": "List your users",
        "tags": [
          "Resellers (admin keys)"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": [
                    {
                      "id": "…",
                      "name": "Rahim Uddin",
                      "username": "rahim@example.com",
                      "active": true,
                      "balance": 100.0,
                      "plan": "Pro"
                    }
                  ]
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "create_user",
        "summary": "Create a user",
        "tags": [
          "Resellers (admin keys)"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Full name."
                  },
                  "email": {
                    "type": "string",
                    "description": "Email — also the sign-in name."
                  },
                  "password": {
                    "type": "string",
                    "description": "At least 6 characters."
                  },
                  "phone": {
                    "type": "string",
                    "description": "Mobile number for SMS/WhatsApp."
                  },
                  "packageId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Plan id (the Developer page in the app lists yours)."
                  },
                  "chargePlan": {
                    "type": "boolean",
                    "description": "Take the plan price from the user's balance (default false)."
                  }
                },
                "required": [
                  "name",
                  "email",
                  "password"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": {
                    "id": "…",
                    "username": "rahim@example.com",
                    "active": true
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/users/{email}/password": {
      "put": {
        "operationId": "set_password",
        "summary": "Change a user's password",
        "tags": [
          "Resellers (admin keys)"
        ],
        "description": "Sets a new password and signs the user out everywhere.",
        "parameters": [
          {
            "name": "email",
            "in": "path",
            "required": true,
            "description": "The user's email (sign-in name).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "password": {
                    "type": "string",
                    "description": "At least 6 characters."
                  }
                },
                "required": [
                  "password"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "message": "Password updated. The user's other sessions are signed out."
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/users/{email}/status": {
      "put": {
        "operationId": "set_status",
        "summary": "Activate or suspend a user",
        "tags": [
          "Resellers (admin keys)"
        ],
        "description": "active false suspends the user (signed out, no notifications).",
        "parameters": [
          {
            "name": "email",
            "in": "path",
            "required": true,
            "description": "The user's email.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "active": {
                    "type": "boolean",
                    "description": "true = active, false = suspended."
                  }
                },
                "required": [
                  "active"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": {
                    "username": "rahim@example.com",
                    "active": false
                  }
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/users/{email}/topup": {
      "post": {
        "operationId": "topup",
        "summary": "Add or deduct balance",
        "tags": [
          "Resellers (admin keys)"
        ],
        "description": "Positive amount adds taka to the user's balance, negative deducts.",
        "parameters": [
          {
            "name": "email",
            "in": "path",
            "required": true,
            "description": "The user's email.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "amount": {
                    "type": "number",
                    "description": "Taka; negative to deduct."
                  },
                  "note": {
                    "type": "string",
                    "description": "e.g. a bKash transaction id."
                  }
                },
                "required": [
                  "amount"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "balance": 100.0
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/topics": {
      "get": {
        "operationId": "list_topics",
        "summary": "List your channels",
        "tags": [
          "Resellers (admin keys)"
        ],
        "description": "Channels (topics) with subscriber counts.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "data": [
                    {
                      "id": "…",
                      "name": "Server alerts",
                      "open": true,
                      "subscribers": 42
                    }
                  ]
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/broadcast": {
      "post": {
        "operationId": "broadcast",
        "summary": "Broadcast",
        "tags": [
          "Resellers (admin keys)"
        ],
        "description": "Message all your users, or one channel's subscribers. SMS/WhatsApp are charged to your balance.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "description": "Title."
                  },
                  "message": {
                    "type": "string",
                    "description": "Body text."
                  },
                  "topicId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Channel id from GET /topics; leave out for all users."
                  },
                  "methods": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Array of \"app\", \"sms\", \"whatsapp\", \"email\". Default [\"app\"]. sms/whatsapp need a paid plan and are charged per message from the balance; app and email are free (email: user accounts only)."
                  },
                  "severity": {
                    "type": "string",
                    "description": "info, success, warning or danger."
                  }
                },
                "required": [
                  "title"
                ]
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "id": "…",
                  "recipients": 87
                }
              }
            }
          },
          "default": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  }
}