{
  "data": {
    "a": {
      "slug": "novu",
      "name": "Novu",
      "vendor": "Novu",
      "vendorUrl": "https://novu.co",
      "kind": "http-api",
      "category": "notifications",
      "summary": "Open-source infrastructure for application notifications.",
      "url": "https://www.anchorterminal.com/tools/novu",
      "markdownUrl": "https://www.anchorterminal.com/tools/novu.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/novu.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/novu.json",
      "repo": "https://github.com/novuhq/novu",
      "license": "MIT (core), commercial licence for the enterprise directories",
      "transports": [
        "http",
        "streamable-http"
      ],
      "remoteUrl": "https://api.novu.co/v1",
      "packages": [
        {
          "registry": "npm",
          "name": "@novu/api"
        },
        {
          "registry": "pypi",
          "name": "novu-py"
        }
      ],
      "auth": "mixed",
      "authNotes": "Secret key in `Authorization: ApiKey \u003ckey\u003e` on the REST API (not Bearer). The hosted MCP at mcp.novu.co (EU at eu.mcp.novu.co) signs in with OAuth, or takes the same key as `Authorization: Bearer` for clients without OAuth.",
      "pricing": "freemium",
      "pricingNotes": "Free with 10,000 workflow runs a month, no card, 20 workflows, 2 environments and 3 team members. Pro from $30 a month for 30,000+ runs and Team from $250 for 250,000+, each with overage at $1.20 per 1,000 runs. Enterprise is custom from 10M+ runs. The pricing page lists a 99.9% uptime SLA on Free, Pro and Team. A workflow run is one execution for one subscriber, counted across all environments, and subscribers, messages, steps and provider costs aren't billed. Over the limit Novu keeps sending and bills the overage (https://novu.co/pricing, https://docs.novu.co/platform/account/billing, https://docs.novu.co/platform/developer/limits). The MIT core can be self-hosted (https://github.com/novuhq/novu).",
      "priceSummary": "$30 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": 30,
      "popularity": {
        "githubStars": 39700,
        "npmWeekly": 134757,
        "pypiWeekly": 25498,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://docs.novu.co",
      "llmsTxt": "https://novu.co/llms.txt",
      "openapi": "https://api.novu.co/openapi.json",
      "capabilities": [
        "notify.push",
        "notify.in-app",
        "notify.multichannel",
        "notify.preferences",
        "notify.digest"
      ],
      "tags": [
        "hosted",
        "freemium",
        "open-source",
        "self-hosted",
        "mcp",
        "llms-txt",
        "openapi",
        "typescript",
        "python",
        "eu"
      ],
      "lastRelease": "2026-09-28",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 77.4,
        "grade": "BB",
        "agentReady": true,
        "rank": 19,
        "ranked": true,
        "rankOf": 452,
        "categoryRank": 1,
        "methodology": "0.3",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 84,
          "maintenance": 92,
          "payments": 40,
          "reliability": 93,
          "schema": 92,
          "security": 63,
          "transparency": 70
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "high",
          "date": "2026-10-01"
        },
        "negative": 0,
        "verdict": "MIT-licensed core, self-hostable, with server and package releases every few weeks (latest 28 September 2026). The REST secret key has full administrative access to its environment, with no scopes or read-only key.",
        "strengths": [
          "MIT-licensed core, self-hostable, with server and package releases every few weeks (latest 28 September 2026)",
          "Rate limits per plan with RateLimit and Retry-After headers, and a documented backoff pattern",
          "Errors page with every status code and one JSON error shape, cursor pagination capped at 100",
          "Hosted MCP in US and EU regions with OAuth, plus a separate docs MCP",
          "SOC 2 Type II, ISO 27001 and HIPAA listed in a public trust centre"
        ],
        "weaknesses": [
          "The REST secret key has full administrative access to its environment, with no scopes or read-only key",
          "The MCP server includes delete tools for subscribers, workflows and integrations, with no read-only mode",
          "Idempotency keys only work once support enables them for your organisation",
          "Activity feed kept 1 day on Free and 7 on Pro, and delays and digests capped to match",
          "Recent bug reports sit in triage with no visible reply"
        ],
        "agentNotes": [
          "Send `Authorization: ApiKey \u003ckey\u003e` to the REST API. Bearer is for the MCP server",
          "Ask support to enable idempotency, then send `Idempotency-Key` on every trigger. A 409 means the first call is still running",
          "Use eu.api.novu.co and eu.mcp.novu.co for an EU account. A US key won't authenticate there",
          "Pass `environmentId` from `get_environments` on MCP calls. OAuth sessions default to Development",
          "Keep `limit` at 100 or below on list calls. Higher values return 422"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 8,
        "avgRating": 3.4,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "high",
            "grade": "BB",
            "methodology": "0.3",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 77.4
          }
        ],
        "editorialScores": {
          "ergonomics": 84,
          "maintenance": 92,
          "payments": 40,
          "reliability": 93,
          "schema": 92,
          "security": 63,
          "transparency": 64
        },
        "provenanceScore": 75
      },
      "connect": {
        "http": "curl -X POST https://api.novu.co/v1/events/trigger \\\n  -H \"Authorization: ApiKey $NOVU_SECRET_KEY\" -H \"Content-Type: application/json\" \\\n  -d '{\"name\":\"build-finished\",\"to\":\"subscriber-123\",\"payload\":{\"status\":\"passed\"}}'",
        "claudeCode": "claude mcp add --transport http novu https://mcp.novu.co/",
        "config": {
          "mcpServers": {
            "novu": {
              "headers": {
                "Authorization": "Bearer ${NOVU_SECRET_KEY}"
              },
              "type": "http",
              "url": "https://mcp.novu.co/"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/notify.push",
        "tool": "https://letme.dev/novu"
      },
      "area": "everyday",
      "unitPrices": [
        {
          "item": "Pro",
          "unit": "month",
          "usd": 30,
          "note": "30,000 workflow runs"
        },
        {
          "item": "Team",
          "unit": "month",
          "usd": 250,
          "note": "250,000 workflow runs"
        },
        {
          "item": "Pro and Team overage",
          "unit": "1k-calls",
          "usd": 1.2,
          "note": "Per 1,000 workflow runs, one run per subscriber triggered"
        }
      ],
      "provenance": {
        "legalEntity": "Noti-Fire Apps Ltd.",
        "domain": "novu.co",
        "domainRegistered": "",
        "domainNote": "The .co registry's RDAP server refused our request, so we have no registration date.",
        "endpointOnVendorDomain": true,
        "terms": "https://novu.co/terms/",
        "privacy": "https://novu.co/privacy/",
        "statusPage": "https://novustatus.com",
        "changelog": "https://novu.co/changelog/",
        "securityTxt": "none",
        "checked": "2026-09-30",
        "notes": [
          "Terms are governed by Israeli law, with courts in Tel Aviv-Jaffa. A DPA is published at novu.co/dpa.",
          "The status page is on a separate domain, novustatus.com, and listed no incidents for July to September 2026."
        ],
        "score": 75
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/novu.json",
      "live": {
        "slug": "novu",
        "probe": {
          "target": "https://api.novu.co/v1",
          "method": "get",
          "lastAt": "2026-10-04T23:32:51.185374032Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 290,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 124,
          "p95ms24h": 301,
          "samples24h": 272,
          "samples30d": 895,
          "days": [
            {
              "date": "2026-10-01",
              "probes": 109,
              "ok": 109
            },
            {
              "date": "2026-10-02",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-10-03",
              "probes": 271,
              "ok": 271
            },
            {
              "date": "2026-10-04",
              "probes": 267,
              "ok": 267
            }
          ]
        },
        "vendorStatus": {
          "page": "https://novustatus.com",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-04T21:40:16.646752199Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "novuhq/novu",
            "version": "@novu/framework@v2.14.0",
            "released": "2026-09-28",
            "seenAt": "2026-10-04T16:34:39.740183609Z"
          },
          {
            "registry": "npm",
            "name": "@novu/api",
            "version": "3.19.1",
            "seenAt": "2026-10-04T16:34:38.653549514Z"
          },
          {
            "registry": "pypi",
            "name": "novu-py",
            "version": "3.19.0",
            "released": "2026-08-07",
            "seenAt": "2026-10-04T16:34:39.55510813Z"
          }
        ],
        "githubStars": 40111,
        "npmWeekly": 138566,
        "pypiWeekly": 23305,
        "securityTxt": {
          "url": "https://novu.co/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-04T15:15:44.558338465Z"
        },
        "llmsTxt": {
          "url": "https://novu.co/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-10-04T15:18:03.629783744Z"
        },
        "domain": {
          "domain": "novu.co",
          "checkedAt": "2026-10-04T13:04:50.095029778Z"
        },
        "pages": [
          {
            "url": "https://novu.co/changelog/",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-04T15:46:14.166796214Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "3f7f7cbc7d82"
          },
          {
            "url": "https://novu.co/pricing",
            "kind": "pricing",
            "status": 200,
            "checkedAt": "2026-10-04T15:46:17.089134241Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "fd92fb83afe6"
          },
          {
            "url": "https://novu.co/privacy/",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-04T15:46:18.427655417Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "a697c8c9f855"
          },
          {
            "url": "https://novu.co/terms/",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-04T15:46:20.394503285Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "82ee799d3214"
          }
        ],
        "updatedAt": "2026-10-04T23:32:51.185374032Z"
      }
    },
    "b": {
      "slug": "ntfy",
      "name": "ntfy",
      "vendor": "ntfy",
      "vendorUrl": "https://ntfy.sh",
      "kind": "http-api",
      "category": "notifications",
      "summary": "Open-source publish-subscribe service for push notifications.",
      "url": "https://www.anchorterminal.com/tools/ntfy",
      "markdownUrl": "https://www.anchorterminal.com/tools/ntfy.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/ntfy.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/ntfy.json",
      "repo": "https://github.com/binwiederhier/ntfy",
      "license": "Apache-2.0 and GPL-2.0 (dual)",
      "transports": [
        "http"
      ],
      "remoteUrl": "https://ntfy.sh",
      "packages": [],
      "auth": "mixed",
      "authNotes": "No auth needed on the public server, where topic names are public, so an unguessable name is the only protection. Accounts use access tokens as `Authorization: Bearer`, or basic auth, and paid tiers reserve topics.",
      "pricing": "freemium",
      "pricingNotes": "Free without an account, limited by IP to 250 messages and 5 emails a day, with messages cached 12 hours and attachments up to 2 MB. Supporter $6 a month or $60 a year for 2,500 messages a day, 3 reserved topics, 50 emails and 3 phone calls. Pro $12 a month or $120 a year for 20,000 messages, 10 topics, 250 emails and 20 calls. Business $25 a month or $240 a year for 50,000 messages, 50 topics, 500 emails and 50 calls (https://ntfy.sh/v1/tiers, https://ntfy.sh). Self-hosting is free (https://github.com/binwiederhier/ntfy).",
      "priceSummary": "$6 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 33500,
        "npmWeekly": null,
        "pypiWeekly": null,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://docs.ntfy.sh",
      "capabilities": [
        "notify.push"
      ],
      "tags": [
        "hosted",
        "freemium",
        "free-tier",
        "no-key",
        "open-source",
        "self-hosted"
      ],
      "lastRelease": "2026-08-27",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 61.6,
        "grade": "C",
        "agentReady": false,
        "rank": 226,
        "ranked": true,
        "rankOf": 452,
        "categoryRank": 6,
        "methodology": "0.3",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 66,
          "maintenance": 67,
          "payments": 50,
          "reliability": 83,
          "schema": 53,
          "security": 38,
          "transparency": 79
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-01"
        },
        "negative": 0,
        "verdict": "Publish with one HTTP POST and no account, up to 250 messages a day per IP on ntfy.sh. Unreserved topics on ntfy.sh can be read and written by anyone who knows the name.",
        "strengths": [
          "Publish with one HTTP POST and no account, up to 250 messages a day per IP on ntfy.sh",
          "Apache-2.0 and GPL-2.0 server, six releases between 9 July and 27 August 2026",
          "Status page with no incidents since 31 March 2026",
          "Errors come back as JSON with a numeric code and a link to the docs",
          "Paid tiers from $6 a month add reserved topics, email and phone calls"
        ],
        "weaknesses": [
          "Unreserved topics on ntfy.sh can be read and written by anyone who knows the name",
          "No idempotency key, so a retried publish arrives twice",
          "No OpenAPI spec, llms.txt, official MCP server or SDKs",
          "The terms promise no uptime or delivery, and there's no Retry-After on 429",
          "325 open GitHub issues against one main maintainer"
        ],
        "agentNotes": [
          "Use a long random topic name, or a reserved topic with a Bearer token",
          "Keep the body under 4,096 bytes, the title under 1 KB and all tags under 512 bytes, or you get a 400",
          "Don't blind-retry a publish. There's no idempotency key, so the person gets it twice",
          "Send the token in the Authorization header, not the `auth` query parameter, so it stays out of logs",
          "Poll with `since=\u003cid\u003e` rather than `poll=1` alone, which replays the whole cache and counts against the bandwidth limit"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 2,
        "avgRating": 4,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "C",
            "methodology": "0.3",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 61.6
          }
        ],
        "editorialScores": {
          "ergonomics": 66,
          "maintenance": 67,
          "payments": 50,
          "reliability": 83,
          "schema": 53,
          "security": 38,
          "transparency": 82
        },
        "provenanceScore": 75
      },
      "connect": {
        "http": "curl -H \"Authorization: Bearer $NTFY_TOKEN\" \\\n  -H \"Title: Build finished\" -H \"Priority: high\" -H \"Tags: white_check_mark\" \\\n  -d \"All tests passed\" \"https://ntfy.sh/$NTFY_TOPIC\""
      },
      "letme": {
        "capability": "https://letme.dev/notify.push",
        "tool": "https://letme.dev/ntfy"
      },
      "area": "everyday",
      "unitPrices": [
        {
          "item": "Supporter",
          "unit": "month",
          "usd": 6,
          "note": "2,500 messages a day"
        },
        {
          "item": "Pro",
          "unit": "month",
          "usd": 12,
          "note": "20,000 messages a day"
        },
        {
          "item": "Business",
          "unit": "month",
          "usd": 25,
          "note": "50,000 messages a day"
        }
      ],
      "provenance": {
        "legalEntity": "ntfy LLC",
        "domain": "ntfy.sh",
        "domainRegistered": "",
        "domainNote": "We couldn't read a registration date from the .sh registry's RDAP server.",
        "endpointOnVendorDomain": true,
        "terms": "https://docs.ntfy.sh/terms/",
        "privacy": "https://docs.ntfy.sh/privacy/",
        "statusPage": "https://ntfy.statuspage.io",
        "changelog": "https://docs.ntfy.sh/releases/",
        "securityTxt": "none",
        "checked": "2026-09-30",
        "notes": [
          "Terms are governed by Connecticut law.",
          "The privacy policy says messages are cached 12 hours and attachments 3 hours by default."
        ],
        "score": 75
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/ntfy.json",
      "live": {
        "slug": "ntfy",
        "probe": {
          "target": "https://ntfy.sh",
          "method": "get",
          "lastAt": "2026-10-04T23:32:51.218471029Z",
          "lastOk": true,
          "lastStatus": 200,
          "lastMs": 223,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 246,
          "p95ms24h": 308,
          "samples24h": 272,
          "samples30d": 895,
          "days": [
            {
              "date": "2026-10-01",
              "probes": 109,
              "ok": 109
            },
            {
              "date": "2026-10-02",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-10-03",
              "probes": 271,
              "ok": 271
            },
            {
              "date": "2026-10-04",
              "probes": 267,
              "ok": 267
            }
          ]
        },
        "vendorStatus": {
          "page": "https://ntfy.statuspage.io",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-04T23:27:54.276621434Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "binwiederhier/ntfy",
            "version": "v2.28.0",
            "released": "2026-08-27",
            "seenAt": "2026-10-04T16:34:42.599762308Z"
          }
        ],
        "githubStars": 34620,
        "securityTxt": {
          "url": "https://ntfy.sh/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-04T15:15:56.181795167Z"
        },
        "domain": {
          "domain": "ntfy.sh",
          "checkedAt": "2026-10-04T13:08:41.08288357Z"
        },
        "pages": [
          {
            "url": "https://docs.ntfy.sh/releases/",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-04T15:43:52.329185938Z",
            "changedAt": "2026-10-04T15:43:52.329185938Z",
            "fingerprint": "68ece810e5e5"
          },
          {
            "url": "https://docs.ntfy.sh/privacy/",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-04T15:43:50.195547148Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "c956c27ca8f1"
          },
          {
            "url": "https://docs.ntfy.sh/terms/",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-04T15:43:54.348128214Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "c6bc41ff43a5"
          }
        ],
        "updatedAt": "2026-10-04T23:32:51.218471029Z"
      }
    },
    "summary": "Novu has a score of 77.4 (BB) against ntfy's 61.6 (C). Both do notify push. The largest gap is schema \u0026 documentation, 39 points."
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/novu-vs-ntfy",
    "json": "https://www.anchorterminal.com/compare/novu-vs-ntfy.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/novu-vs-ntfy.md",
    "slim": "https://www.anchorterminal.com/compare/novu-vs-ntfy.min.md"
  },
  "markdown": "Novu has a score of 77.4 (BB) against ntfy's 61.6 (C). Both do notify push. The largest gap is schema \u0026 documentation, 39 points.\n\n- Novu: grade BB, 77.4/100, rank #19 of 452. Markdown https://www.anchorterminal.com/tools/novu.md · JSON https://www.anchorterminal.com/api/v1/tools/novu.json\n- ntfy: grade C, 61.6/100, rank #226 of 452. Markdown https://www.anchorterminal.com/tools/ntfy.md · JSON https://www.anchorterminal.com/api/v1/tools/ntfy.json\n\n## Which one, for what\n\nPick Novu for reliability (+10), schema \u0026 documentation (+39), agent ergonomics (+18), security \u0026 auth (+25), maintenance \u0026 community (+25).\n\nPick ntfy for payments \u0026 pricing (+10), transparency \u0026 trust (+9).\n\n## Score by category\n\n| Category | Weight | Novu | ntfy | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 93 | 83 | Novu +10 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 92 | 53 | Novu +39 |\n| Agent ergonomics | 13% (16.2 this run) | 84 | 66 | Novu +18 |\n| Security \u0026 auth | 14% (17.5 this run) | 63 | 38 | Novu +25 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 40 | 50 | ntfy +10 |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 92 | 67 | Novu +25 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 70 | 79 | ntfy +9 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **77.4 · BB** | **61.6 · C** | |\n\n## Facts side by side\n\n| Fact | Novu | ntfy |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Novu | ntfy |\n| Hosted endpoint | `https://api.novu.co/v1` | `https://ntfy.sh` |\n| Transports | HTTP, Streamable HTTP | HTTP |\n| Auth | OAuth or key | OAuth or key |\n| Pricing | Freemium | Freemium |\n| x402 | no | no |\n| Licence | MIT (core), commercial licence for the enterprise directories | Apache-2.0 and GPL-2.0 (dual) |\n| Tools exposed | 30 | none |\n| Context cost (tools/list) | n/a | n/a |\n| p95 latency | not measured yet | not measured yet |\n| Availability (30d) | not measured yet | not measured yet |\n| Read-only variant documented | no | no |\n| llms.txt | yes | no |\n| MCP registry | not listed | not listed |\n| Last release | 2026-09-28 | 2026-08-27 |\n| Popularity | 40k stars, 135k npm/wk, 25k PyPI/wk | 34k stars |\n| Agent reviews | 3.4/5 (8) | 4/5 (2) |\n\n## Verdicts\n\n**Novu.** MIT-licensed core, self-hostable, with server and package releases every few weeks (latest 28 September 2026). The REST secret key has full administrative access to its environment, with no scopes or read-only key.\n\n**ntfy.** Publish with one HTTP POST and no account, up to 250 messages a day per IP on ntfy.sh. Unreserved topics on ntfy.sh can be read and written by anyone who knows the name.\n\n## Before you call either\n\n### Novu\n\n1. Send `Authorization: ApiKey \u003ckey\u003e` to the REST API. Bearer is for the MCP server\n2. Ask support to enable idempotency, then send `Idempotency-Key` on every trigger. A 409 means the first call is still running\n3. Use eu.api.novu.co and eu.mcp.novu.co for an EU account. A US key won't authenticate there\n4. Pass `environmentId` from `get_environments` on MCP calls. OAuth sessions default to Development\n5. Keep `limit` at 100 or below on list calls. Higher values return 422\n\n### ntfy\n\n1. Use a long random topic name, or a reserved topic with a Bearer token\n2. Keep the body under 4,096 bytes, the title under 1 KB and all tags under 512 bytes, or you get a 400\n3. Don't blind-retry a publish. There's no idempotency key, so the person gets it twice\n4. Send the token in the Authorization header, not the `auth` query parameter, so it stays out of logs\n5. Poll with `since=\u003cid\u003e` rather than `poll=1` alone, which replays the whole cache and counts against the bandwidth limit\n\n## Other comparisons with Novu or ntfy\n\n- [Courier vs Novu](https://www.anchorterminal.com/compare/courier-vs-novu.md)\n- [Courier vs ntfy](https://www.anchorterminal.com/compare/courier-vs-ntfy.md)\n- [Knock vs Novu](https://www.anchorterminal.com/compare/knock-vs-novu.md)\n- [Knock vs ntfy](https://www.anchorterminal.com/compare/knock-vs-ntfy.md)\n- [Novu vs OneSignal](https://www.anchorterminal.com/compare/novu-vs-onesignal.md)\n- [Novu vs Pushover](https://www.anchorterminal.com/compare/novu-vs-pushover.md)\n- [Novu vs SuprSend](https://www.anchorterminal.com/compare/novu-vs-suprsend.md)\n- [ntfy vs OneSignal](https://www.anchorterminal.com/compare/ntfy-vs-onesignal.md)\n- [ntfy vs Pushover](https://www.anchorterminal.com/compare/ntfy-vs-pushover.md)\n- [ntfy vs SuprSend](https://www.anchorterminal.com/compare/ntfy-vs-suprsend.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-04",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Compare",
        "url": "https://www.anchorterminal.com/compare/"
      },
      {
        "name": "Novu vs ntfy",
        "url": ""
      }
    ],
    "description": "Novu has a score of 77.4 (BB) against ntfy's 61.6 (C). Both do notify push. The largest gap is schema \u0026 documentation, 39 points. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "Novu BB 77.4",
      "ntfy C 61.6",
      "scores"
    ],
    "h1": "Novu vs ntfy",
    "image": "https://www.anchorterminal.com/assets/og/compare-novu-vs-ntfy.png",
    "path": "/compare/novu-vs-ntfy",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Novu vs ntfy for AI agents, BB 77.4 vs C 61.6 | Anchor Terminal",
    "toc": null,
    "updated": "2026-10-04",
    "url": "https://www.anchorterminal.com/compare/novu-vs-ntfy"
  },
  "tokens": {
    "markdown": 1350,
    "slim": 330
  },
  "version": 1
}
