Developers

NotifyBD API

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.

Getting started

NotifyBD is a reminder and alert service from Bangladesh. The API lets scripts, apps and AI assistants create reminders that repeat until someone answers Yes, send notifications by app push, SMS, WhatsApp or email, and watch websites and servers.

  1. Create an account at app.notify.bd (free plan included).
  2. Open Developer in the app (app.notify.bd/developer) and press Create API key.
  3. Send the key in the X-API-Key header (or Authorization: Bearer KEY) with every request.
Base URLhttps://app.notify.bd/api/v1
FormatJSON in, JSON out (Content-Type: application/json). Every reply has ok.
AuthX-API-Key: nbd_… header (or Authorization: Bearer nbd_…; ?api_key= also works).
TimesDates yyyy-MM-dd, times HH:mm, in the account's time zone (default Asia/Dhaka). Timestamps in replies are UTC.
MoneyBDT (৳). SMS/WhatsApp cost the plan's rate per message; app and email notifications are free.
LimitsThe account's plan: reminders, monitors, fastest check, notifications per month. See pricing and GET /me.
Machine-readableOpenAPI 3.1 spec · this page as Markdown · llms.txt

Account

GET /api/v1/me

Your account, balance and plan. 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).

Example

curl https://app.notify.bd/api/v1/me \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "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
  }
}

Reminders

A reminder fires at its time and, with requireAck, keeps asking every repeatEveryMin minutes (up to maxRepeats more times) until the person answers Yes. Times are in the account's time zone (default Asia/Dhaka). Phases send advance alerts (e.g. 15, 7 and 1 day before a domain or bill expiry). alarm makes the NotifyBD Android app ring and vibrate like an alarm clock.

POST /api/v1/reminders

Create a reminder.

JSON body

NameTypeDescription
title requiredstringWhat to remind about (max 120 characters).
messagestringExtra text (max 500).
repeatstringonce (default), daily, weekly, monthly or yearly.
datestringyyyy-MM-dd. First/only date; default today. Monthly uses its day of month, yearly its day and month.
timestringHH:mm, 24-hour, account time zone. Required unless inMinutes is given.
inMinutesintegerInstead of date/time: fire this many minutes from now (1–525600), rounded up to the next whole minute.
daysinteger[]Weekly only: days of the week, 0 = Sunday … 6 = Saturday.
phasesinteger[]Days before the date to alert, e.g. [15,7,1,0]. Default [0] = on the day. For once, monthly and yearly.
methodsstring[]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).
requireAckbooleanKeep asking until answered Yes (default true).
repeatEveryMinintegerMinutes between asks while waiting (default 10). Snooze waits the same time.
maxRepeatsintegerHow many more times to ask (0–20, default 3). After that the reminder is marked No answer.
alarmbooleanRing and vibrate like an alarm clock in the Android app, with a full-screen alarm page (default false).
colorstringOne of orange, navy, blue, green, purple, pink, teal, amber (default orange).
iconstringOne of bell, alarm, calendar-event, globe, server, capsule, cup-hot, dribbble, book, cash-coin, briefcase, house, heart-pulse, car-front, airplane, gift (default alarm).

Example

curl -X POST https://app.notify.bd/api/v1/reminders \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"title":"example.com renewal","repeat":"yearly","date":"2026-12-01","time":"10:00","phases":[15,7,1,0],"methods":["app","sms"]}'

Response 201

{
  "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"
  }
}

GET /api/v1/reminders

List reminders. All your reminders, sorted by title.

Example

curl https://app.notify.bd/api/v1/reminders -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "data": [
    {
      "id": "3f1c…",
      "title": "Go to play",
      "repeat": "daily",
      "time": "17:00",
      "active": true
    }
  ]
}

GET /api/v1/reminders/{id}

Get one reminder.

Path parameters

NameTypeDescription
id requireduuidReminder id.

Example

curl https://app.notify.bd/api/v1/reminders/REMINDER_ID -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "data": {
    "id": "3f1c…",
    "title": "Go to play",
    "active": true
  }
}

POST /api/v1/reminders/{id}/pause

Pause a reminder. Stops it from firing. Use /resume to turn it back on.

Path parameters

NameTypeDescription
id requireduuidReminder id.

Example

curl -X POST https://app.notify.bd/api/v1/reminders/REMINDER_ID/pause -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "data": {
    "id": "3f1c…",
    "active": false
  }
}

POST /api/v1/reminders/{id}/resume

Resume a reminder.

Path parameters

NameTypeDescription
id requireduuidReminder id.

Example

curl -X POST https://app.notify.bd/api/v1/reminders/REMINDER_ID/resume -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "data": {
    "id": "3f1c…",
    "active": true
  }
}

DELETE /api/v1/reminders/{id}

Delete a reminder. Deletes the reminder and its history. Cannot be undone.

Path parameters

NameTypeDescription
id requireduuidReminder id.

Example

curl -X DELETE https://app.notify.bd/api/v1/reminders/REMINDER_ID -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true
}

POST /api/v1/answer/{occurrenceId}

Answer a waiting reminder. 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).

Path parameters

NameTypeDescription
occurrenceId requireduuidoccurrenceId from GET /notifications.

JSON body

NameTypeDescription
answer requiredstringyes, snooze or notyet.

Example

curl -X POST https://app.notify.bd/api/v1/answer/OCCURRENCE_ID \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" -d '{"answer":"yes"}'

Response 200

{
  "ok": true,
  "message": "Great! “Go to play” is done."
}

Notifications

POST /api/v1/notify

Notify yourself now. 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.

JSON body

NameTypeDescription
title requiredstringTitle (max 160).
messagestringBody text (max 1000).
methodsstring[]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).
severitystringinfo (default), success, warning or danger.

Example

curl -X POST https://app.notify.bd/api/v1/notify \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"title":"Backup finished","message":"db.bak 2.3 GB","methods":["app"],"severity":"success"}'

Response 202

{
  "ok": true,
  "id": "9b2e…",
  "deliveries": [
    {
      "method": "app",
      "status": "queued",
      "cost": 0,
      "error": null
    }
  ]
}

GET /api/v1/notifications

Read your inbox. Latest notifications, newest first. waitingForAnswer = a reminder is still waiting for Yes (answer it with POST /answer).

Query parameters

NameTypeDescription
unreadbooleanOnly unread (default false).
limitinteger1–200 (default 50).

Example

curl "https://app.notify.bd/api/v1/notifications?unread=true&limit=20" -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "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
    }
  ]
}

Monitors

Uptime checks for websites and servers. A monitor turns down after a few failed checks in a row and up after one good check; only changes send alerts.

POST /api/v1/monitors

Watch a site or server.

JSON body

NameTypeDescription
target requiredstringhttp: a URL; tcp / ping: a host name or IP.
kindstringhttp (default; down on status ≥ 400 or missing keyword), tcp (host + port) or ping.
namestringDisplay name.
portintegertcp only.
keywordstringhttp only: text that must appear on the page.
intervalSecintegerSeconds between checks (default 300; the plan sets the minimum).
methodsstring[]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).

Example

curl -X POST https://app.notify.bd/api/v1/monitors \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"Shop","kind":"http","target":"https://shop.example.com","intervalSec":300,"methods":["app"]}'

Response 201

{
  "ok": true,
  "data": {
    "id": "c7aa…",
    "name": "Shop",
    "kind": "http",
    "target": "https://shop.example.com",
    "intervalSec": 300,
    "methods": [
      "app"
    ],
    "active": true,
    "state": "unknown"
  }
}

GET /api/v1/monitors

List monitors. With state (up / down / unknown / paused), last check time, latency and last error.

Example

curl https://app.notify.bd/api/v1/monitors -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "data": [
    {
      "id": "c7aa…",
      "name": "Shop",
      "state": "up",
      "latencyMs": 182,
      "lastCheckAt": "2026-09-28T11:02:10Z"
    }
  ]
}

DELETE /api/v1/monitors/{id}

Delete a monitor.

Path parameters

NameTypeDescription
id requireduuidMonitor id.

Example

curl -X DELETE https://app.notify.bd/api/v1/monitors/MONITOR_ID -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true
}

Resellers (admin keys)

Only API keys of Admin (reseller) accounts can call these; other keys get 403 admin_only. Users sign in with their email.

GET /api/v1/users admin key

List your users.

Example

curl https://app.notify.bd/api/v1/users -H "X-API-Key: YOUR_ADMIN_KEY"

Response 200

{
  "ok": true,
  "data": [
    {
      "id": "…",
      "name": "Rahim Uddin",
      "username": "rahim@example.com",
      "active": true,
      "balance": 100.0,
      "plan": "Pro"
    }
  ]
}

POST /api/v1/users admin key

Create a user.

JSON body

NameTypeDescription
name requiredstringFull name.
email requiredstringEmail — also the sign-in name.
password requiredstringAt least 6 characters.
phonestringMobile number for SMS/WhatsApp.
packageIduuidPlan id (the Developer page in the app lists yours).
chargePlanbooleanTake the plan price from the user's balance (default false).

Example

curl -X POST https://app.notify.bd/api/v1/users \
  -H "X-API-Key: YOUR_ADMIN_KEY" -H "Content-Type: application/json" \
  -d '{"name":"Rahim Uddin","email":"rahim@example.com","password":"secret123","phone":"01712345678"}'

Response 201

{
  "ok": true,
  "data": {
    "id": "…",
    "username": "rahim@example.com",
    "active": true
  }
}

PUT /api/v1/users/{email}/password admin key

Change a user's password. Sets a new password and signs the user out everywhere.

Path parameters

NameTypeDescription
email requiredstringThe user's email (sign-in name).

JSON body

NameTypeDescription
password requiredstringAt least 6 characters.

Example

curl -X PUT https://app.notify.bd/api/v1/users/rahim@example.com/password \
  -H "X-API-Key: YOUR_ADMIN_KEY" -H "Content-Type: application/json" -d '{"password":"newSecret1"}'

Response 200

{
  "ok": true,
  "message": "Password updated. The user's other sessions are signed out."
}

PUT /api/v1/users/{email}/status admin key

Activate or suspend a user. active false suspends the user (signed out, no notifications).

Path parameters

NameTypeDescription
email requiredstringThe user's email.

JSON body

NameTypeDescription
active requiredbooleantrue = active, false = suspended.

Example

curl -X PUT https://app.notify.bd/api/v1/users/rahim@example.com/status \
  -H "X-API-Key: YOUR_ADMIN_KEY" -H "Content-Type: application/json" -d '{"active":false}'

Response 200

{
  "ok": true,
  "data": {
    "username": "rahim@example.com",
    "active": false
  }
}

POST /api/v1/users/{email}/topup admin key

Add or deduct balance. Positive amount adds taka to the user's balance, negative deducts.

Path parameters

NameTypeDescription
email requiredstringThe user's email.

JSON body

NameTypeDescription
amount requirednumberTaka; negative to deduct.
notestringe.g. a bKash transaction id.

Example

curl -X POST https://app.notify.bd/api/v1/users/rahim@example.com/topup \
  -H "X-API-Key: YOUR_ADMIN_KEY" -H "Content-Type: application/json" -d '{"amount":100,"note":"bKash 8H3K2"}'

Response 200

{
  "ok": true,
  "balance": 100.0
}

GET /api/v1/topics admin key

List your channels. Channels (topics) with subscriber counts.

Example

curl https://app.notify.bd/api/v1/topics -H "X-API-Key: YOUR_ADMIN_KEY"

Response 200

{
  "ok": true,
  "data": [
    {
      "id": "…",
      "name": "Server alerts",
      "open": true,
      "subscribers": 42
    }
  ]
}

POST /api/v1/broadcast admin key

Broadcast. Message all your users, or one channel's subscribers. SMS/WhatsApp are charged to your balance.

JSON body

NameTypeDescription
title requiredstringTitle.
messagestringBody text.
topicIduuidChannel id from GET /topics; leave out for all users.
methodsstring[]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).
severitystringinfo, success, warning or danger.

Example

curl -X POST https://app.notify.bd/api/v1/broadcast \
  -H "X-API-Key: YOUR_ADMIN_KEY" -H "Content-Type: application/json" \
  -d '{"title":"Server maintenance tonight","methods":["app"],"severity":"warning"}'

Response 202

{
  "ok": true,
  "id": "…",
  "recipients": 87
}

Errors

Errors return {"ok": false, "error": "code", "message": "…"} with the HTTP status below. The message is in the account's language.

StatuserrorMeaning
401invalid_api_keyMissing or wrong API key.
403account_inactiveThe account (or its reseller) is not active.
403api_not_in_planThe plan does not include the API.
403admin_onlyOnly reseller (Admin) keys can call this.
402limit_reachedThe plan's reminder or monitor limit is reached.
402method_not_in_planSMS or WhatsApp is not in the plan.
402monthly_limit_reachedThe plan's notifications for this month are used up.
400invalidA value is missing or wrong; message says which.
400missing_titlePOST /notify without a title.
400bad_repeatrepeat is not once, daily, weekly, monthly or yearly.
400bad_in_minutesinMinutes is not 1–525600.
400bad_kindMonitor kind is not http, tcp or ping.
400weak_passwordPassword shorter than 6 characters.
400missing_activeStatus change without active true/false.
400missing_amountTop-up without an amount.
404not_foundNo such reminder / monitor / user in your account.

MCP server for AI assistants

NotifyBD is also a Model Context Protocol server, so Claude, ChatGPT, Gemini, Cursor and other AI apps can use it as tools — e.g. “remind me to renew example.com on 1 December, 15, 7 and 1 day before” or “wake me up in 30 minutes with an alarm”.

URLhttps://app.notify.bd/mcp
TransportStreamable HTTP (JSON-RPC over POST, stateless)
Sign-inOAuth 2.1 (“Sign in with NotifyBD”, PKCE, dynamic client registration) — or an API key: Authorization: Bearer nbd_…

Connect

  • Claude, ChatGPT, Cursor and apps with OAuth: add a custom connector / MCP server with the URL https://app.notify.bd/mcp, leave client id and secret empty, then sign in and press Allow.
  • Gemini: add it as a custom app and use it from the Spark tab (type @NotifyBD).
  • Claude Code:
claude mcp add --transport http notifybd https://app.notify.bd/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"
  • JSON config (Cursor, Claude Desktop, VS Code …):
{
  "mcpServers": {
    "notifybd": { "type": "http", "url": "https://app.notify.bd/mcp",
                   "headers": { "Authorization": "Bearer YOUR_API_KEY" } }
  }
}

Tools

ToolWhat it does
whoamiAccount, balance, time zone + local time, plan and monthly notification usage.
list_reminders / get_reminderRead reminders.
create_reminderSame fields as POST /reminders, including inMinutes ("in 30 minutes") and alarm.
pause_reminder / resume_reminder / delete_reminderChange a reminder.
answer_reminderAnswer yes / snooze / notyet.
send_notificationNotify yourself now.
list_notificationsRead the inbox.
list_monitors / create_monitor / delete_monitorUptime monitors.
list_users / create_user / set_user_password / set_user_status / topup_user / list_topics / broadcastReseller (Admin) accounts only.

OAuth discovery

https://app.notify.bd/.well-known/oauth-protected-resource/mcp and https://app.notify.bd/.well-known/oauth-authorization-server (authorize /oauth/authorize, token /oauth/token, register /oauth/register). Access tokens last 1 hour and work only on /mcp.

Public data

GET /api/public/plans

Plans and prices. No key needed. The active plans with price (BDT), days, notifications per month (null = unlimited), reminders, monitors, fastest check, SMS/WhatsApp rates and API access. Cached 5 minutes; CORS open.

curl https://app.notify.bd/api/public/plans

Last built 2026-09-29. Questions or a missing feature? Sign in at app.notify.bd and contact support.