{
  "data": {
    "a": {
      "slug": "magicbell",
      "name": "MagicBell",
      "vendor": "MagicBell, Inc.",
      "vendorUrl": "https://www.magicbell.com",
      "kind": "http-api",
      "category": "notifications",
      "summary": "MagicBell is a hosted notification service that sends one broadcast to users across an in-app inbox, mobile and web push, email, SMS, Slack and Teams. Agents reach it through a REST API, a CLI and typed clients.",
      "url": "https://www.anchorterminal.com/tools/magicbell",
      "markdownUrl": "https://www.anchorterminal.com/tools/magicbell.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/magicbell.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/magicbell.json",
      "repo": "https://github.com/magicbell/magicbell-js",
      "license": "Proprietary service under MagicBell's terms. The Go client and the CLI are MIT. The JavaScript client carries MagicBell's own Licence Agreement",
      "transports": [
        "http"
      ],
      "remoteUrl": "https://api.magicbell.com/v2",
      "packages": [
        {
          "registry": "npm",
          "name": "magicbell-js"
        },
        {
          "registry": "npm",
          "name": "magicbell-cli"
        },
        {
          "registry": "go",
          "name": "github.com/magicbell/magicbell-go"
        }
      ],
      "auth": "api-key",
      "authNotes": "Self-serve. Every call takes a JWT as a Bearer token. A Project JWT is created in the dashboard under Project Auth with a name and an expiry, is shown once and can be discarded. It covers the whole project (broadcasts, users, integrations, workflows, events). A User JWT is signed by the customer's backend with HS256 from the project's API key and secret key, and covers one user's inbox, channel tokens and preferences. No scopes on either.",
      "pricing": "freemium",
      "pricingNotes": "Builder is $0 a month with 1,000 deliveries and one project, so an agent's owner can start without a contract. Startup is $249 a month with 50,000 deliveries and five projects, then $0.0025 a delivery and $99 a month per extra project. Enterprise is custom. A delivery is one notification on one channel for one user. Whether sign-up asks for a card was not checked (https://www.magicbell.com/pricing, checked 2026-10-09).",
      "priceSummary": "$249 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the docs, the OpenAPI file or the pricing page (checked 2026-10-09).",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 31,
        "npmWeekly": 48674,
        "pypiWeekly": null,
        "asOf": "2026-10-09"
      },
      "docsUrl": "https://www.magicbell.com/docs",
      "openapi": "https://www.magicbell.com/docs/api/openapi.json",
      "capabilities": [
        "notify.push",
        "notify.in-app",
        "notify.multichannel",
        "notify.preferences"
      ],
      "tags": [
        "hosted",
        "freemium",
        "openapi",
        "typescript",
        "go",
        "swift",
        "java",
        "cli",
        "webhooks",
        "status-page"
      ],
      "lastRelease": "2026-07-29",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 58.8,
        "grade": "C",
        "agentReady": false,
        "rank": 515,
        "ranked": true,
        "rankOf": 842,
        "categoryRank": 9,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 63,
          "maintenance": 49,
          "payments": 35,
          "reliability": 75,
          "schema": 68,
          "security": 50,
          "transparency": 58
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-09"
        },
        "negative": 0,
        "verdict": "A public OpenAPI 3.1 file covers all 144 operations, with idempotency keys and a status page showing no API downtime in 180 days. No batching or digest step, llms.txt, error code list, SLA or sub-processor list was found, and project tokens carry no scopes.",
        "bestFor": "A product team that wants an embeddable in-app inbox with push, email, SMS, Slack and Teams behind one broadcast call, and an agent that sends notifications with a project token it was given.",
        "strengths": [
          "OpenAPI 3.1 file with 144 operations, published at `/docs/api/openapi.json` without a login",
          "`Idempotency-Key` header caches the first response for 24 hours on some endpoints",
          "Status page shows 100 per cent for the API and dashboard over 180 days to 7 October 2026",
          "Project tokens are named, take an expiry and can be discarded in the dashboard",
          "Builder plan at $0 with 1,000 deliveries a month, and overage on Startup at $0.0025 a delivery"
        ],
        "weaknesses": [
          "No batching or digest step found. Workflows have four commands (broadcast, wait, pause, abort)",
          "No llms.txt or Markdown docs, and the OpenAPI file documents no error responses",
          "Project tokens are project-wide with no scopes or read-only mode",
          "No SLA, SOC 2 or ISO 27001 statement, security.txt or sub-processor list found",
          "The Trust Centre says data is never sold or shared, while the privacy policy of 2 July 2024 marks account data as sold or shared"
        ],
        "agentNotes": [
          "Ask the owner for a Project JWT from the dashboard's Project Auth page. The terms forbid accounts registered by automated methods",
          "Send `Idempotency-Key` with a UUID on `POST /v2/broadcasts`, and reuse it on a retry within 24 hours",
          "Stay under 500 requests a minute per IP. A 429 blocks the address for 60 seconds, so put many recipients in one broadcast",
          "Use a Project JWT for broadcasts, users, integrations and workflows, and a User JWT for one user's inbox, tokens and preferences",
          "Read delivery failures from `GET /v2/events` and the broadcast's `status`, since email, SMS and push go through providers the owner connects"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "C",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 58.8
          }
        ],
        "editorialScores": {
          "ergonomics": 63,
          "maintenance": 49,
          "payments": 35,
          "reliability": 75,
          "schema": 68,
          "security": 50,
          "transparency": 30
        },
        "provenanceScore": 86
      },
      "connect": {
        "install": "npm install magicbell-js",
        "http": "curl --request POST \\\n  --url 'https://api.magicbell.com/v2/broadcasts' \\\n  --header 'content-type: application/json' \\\n  --header \"authorization: Bearer $TOKEN\" \\\n  --data '{\"title\":\"Build finished\",\"recipients\":[{\"email\":\"test@example.com\"}]}'"
      },
      "letme": {
        "capability": "https://letme.dev/notify.push",
        "tool": "https://letme.dev/magicbell"
      },
      "area": "everyday",
      "unitPrices": [
        {
          "item": "Startup",
          "unit": "month",
          "usd": 249,
          "note": "50,000 deliveries and five projects included"
        },
        {
          "item": "Startup overage, per delivery",
          "unit": "message",
          "usd": 0.0025
        },
        {
          "item": "Additional project",
          "unit": "month",
          "usd": 99
        }
      ],
      "provenance": {
        "legalEntity": "MagicBell, Inc.",
        "domain": "magicbell.com",
        "domainRegistered": "2004-04-17",
        "endpointOnVendorDomain": true,
        "terms": "https://www.magicbell.com/terms-and-conditions",
        "privacy": "https://www.magicbell.com/privacy-policy",
        "statusPage": "https://status.magicbell.com",
        "changelog": "https://github.com/orgs/magicbell/discussions/categories/changelog",
        "securityTxt": "none",
        "checked": "2026-10-09",
        "notes": [
          "The terms and the privacy policy name MagicBell, Inc., 2261 Market Street #4311, San Francisco, California 94114. Both are dated 2 July 2024.",
          "The terms cover the website, the service and the API in one document, with a short section of API usage terms. They are governed by the law of the place where the owner is based.",
          "www.magicbell.com/.well-known/security.txt returns 404. The footer's vulnerability disclosure link is a contact form.",
          "RDAP for magicbell.com gives a registration date of 2004-04-17.",
          "The changelog is a category of GitHub Discussions, reached from magicbell.to/changelog."
        ],
        "score": 86
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/magicbell.json",
      "live": {
        "slug": "magicbell",
        "probe": {
          "target": "https://api.magicbell.com/v2",
          "method": "get",
          "lastAt": "2026-10-09T11:29:05.312151519Z",
          "lastOk": true,
          "lastStatus": 405,
          "lastMs": 51,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 73,
          "p95ms24h": 114,
          "samples24h": 41,
          "samples30d": 41,
          "days": [
            {
              "date": "2026-10-09",
              "probes": 41,
              "ok": 41
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.magicbell.com",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-09T07:58:08.412277068Z"
        },
        "updatedAt": "2026-10-09T11:29:05.312151519Z"
      }
    },
    "answer": "ntfy scores 61.5 (C) on agent readiness against MagicBell's 58.8 (C), and leads in 5 of 7 scored categories. MagicBell leads on schema \u0026 documentation and security \u0026 auth.",
    "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.5,
        "grade": "C",
        "agentReady": false,
        "rank": 420,
        "ranked": true,
        "rankOf": 842,
        "categoryRank": 8,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 66,
          "maintenance": 67,
          "payments": 50,
          "reliability": 83,
          "schema": 53,
          "security": 38,
          "transparency": 78
        },
        "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.",
        "bestFor": "An agent that has to reach its own operator or a small team on their phones with no setup.",
        "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.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 61.5
          }
        ],
        "editorialScores": {
          "ergonomics": 66,
          "maintenance": 67,
          "payments": 50,
          "reliability": 83,
          "schema": 53,
          "security": 38,
          "transparency": 82
        },
        "provenanceScore": 74
      },
      "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": 74
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/ntfy.json",
      "live": {
        "slug": "ntfy",
        "probe": {
          "target": "https://ntfy.sh",
          "method": "get",
          "lastAt": "2026-10-09T11:29:07.827693574Z",
          "lastOk": true,
          "lastStatus": 200,
          "lastMs": 261,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 244,
          "p95ms24h": 292,
          "samples24h": 259,
          "samples30d": 2106,
          "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": 272,
              "ok": 272
            },
            {
              "date": "2026-10-05",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-06",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-07",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-08",
              "probes": 268,
              "ok": 268
            },
            {
              "date": "2026-10-09",
              "probes": 122,
              "ok": 122
            }
          ]
        },
        "vendorStatus": {
          "page": "https://ntfy.statuspage.io",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-09T11:26:21.960666449Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "binwiederhier/ntfy",
            "version": "v2.29.0",
            "released": "2026-10-07",
            "seenAt": "2026-10-08T16:22:46.218120061Z"
          }
        ],
        "githubStars": 34688,
        "securityTxt": {
          "url": "https://ntfy.sh/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-08T15:38:34.498753812Z"
        },
        "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-08T18:19:14.141569808Z",
            "changedAt": "2026-10-08T18:19:14.141569808Z",
            "fingerprint": "f40471b920cd"
          },
          {
            "url": "https://docs.ntfy.sh/privacy/",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-08T18:19:12.024730069Z",
            "changedAt": "2026-10-06T16:08:22.995893924Z",
            "fingerprint": "6d5209694c2f"
          },
          {
            "url": "https://docs.ntfy.sh/terms/",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-08T18:19:16.153393788Z",
            "changedAt": "2026-10-06T16:08:27.312688293Z",
            "fingerprint": "5d6de4f532fa"
          }
        ],
        "updatedAt": "2026-10-09T11:29:07.827693574Z"
      }
    },
    "facts": [
      {
        "a": "HTTP API",
        "b": "HTTP API",
        "name": "Kind"
      },
      {
        "a": "MagicBell, Inc.",
        "b": "ntfy",
        "name": "Vendor"
      },
      {
        "a": "https://api.magicbell.com/v2",
        "b": "https://ntfy.sh",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP",
        "b": "HTTP",
        "name": "Transports"
      },
      {
        "a": "API key",
        "b": "OAuth or key",
        "name": "Auth"
      },
      {
        "a": "Freemium",
        "b": "Freemium",
        "name": "Pricing"
      },
      {
        "a": "no",
        "b": "no",
        "name": "x402"
      },
      {
        "a": "Proprietary service under MagicBell's terms. The Go client and the CLI are MIT. The JavaScript client carries MagicBell's own Licence Agreement",
        "b": "Apache-2.0 and GPL-2.0 (dual)",
        "name": "Licence"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "no",
        "b": "no",
        "name": "llms.txt"
      },
      {
        "a": "2026-07-29",
        "b": "2026-08-27",
        "name": "Last release"
      },
      {
        "a": "no date given",
        "b": "2026-01-26",
        "name": "Terms last updated"
      },
      {
        "a": "no date given",
        "b": "2026-06-15",
        "name": "Privacy policy last updated"
      },
      {
        "a": "not found in the text",
        "b": "not found in the text",
        "name": "Customer content may train models"
      },
      {
        "a": "yes",
        "b": "not found in the text",
        "name": "Terms restrict automated access"
      },
      {
        "a": "not found in the text",
        "b": "not found in the text",
        "name": "Terms restrict benchmarking"
      },
      {
        "a": "not found in the text",
        "b": "not found in the text",
        "name": "Terms or service can change without notice"
      },
      {
        "a": "not found in the text",
        "b": "not found in the text",
        "name": "Arbitration or class-action waiver"
      },
      {
        "a": "31 stars, 49k npm/wk",
        "b": "34k stars",
        "name": "Popularity"
      },
      {
        "a": "none",
        "b": "4/5 (2)",
        "name": "Agent reviews"
      }
    ],
    "faq": [
      {
        "answer": "ntfy scores 61.5 (C) on agent readiness against MagicBell's 58.8 (C), and leads in 5 of 7 scored categories. MagicBell leads on schema \u0026 documentation and security \u0026 auth.",
        "question": "Which is better for AI agents, MagicBell or ntfy?"
      },
      {
        "answer": "MagicBell needs an API key. ntfy takes an API key or an OAuth sign-in.",
        "question": "Do MagicBell and ntfy need an API key?"
      },
      {
        "answer": "Yes. MagicBell has a hosted endpoint at https://api.magicbell.com/v2 and ntfy at https://ntfy.sh.",
        "question": "Can an agent call MagicBell and ntfy without installing anything?"
      },
      {
        "answer": "No open-source release is listed for MagicBell. ntfy is open source (Apache-2.0 and GPL-2.0 (dual)).",
        "question": "Are MagicBell and ntfy open source?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Schema \u0026 documentation, 68 against 53",
          "Security \u0026 auth, 50 against 38"
        ],
        "also": null,
        "goodFor": "A product team that wants an embeddable in-app inbox with push, email, SMS, Slack and Teams behind one broadcast call, and an agent that sends notifications with a project token it was given.",
        "slug": "magicbell",
        "watchFor": "No batching or digest step found. Workflows have four commands (broadcast, wait, pause, abort)"
      },
      {
        "aheadOn": [
          "Reliability, 83 against 75",
          "Payments \u0026 pricing, 50 against 35",
          "Maintenance \u0026 community, 67 against 49",
          "Transparency \u0026 trust, 78 against 58"
        ],
        "also": [
          "Open source"
        ],
        "goodFor": "An agent that has to reach its own operator or a small team on their phones with no setup.",
        "slug": "ntfy",
        "watchFor": "Unreserved topics on ntfy.sh can be read and written by anyone who knows the name"
      }
    ],
    "job": {
      "capability": "notify.push",
      "name": "Notify push"
    },
    "others": [
      {
        "json": "https://www.anchorterminal.com/compare/amazon-sns-vs-magicbell.json",
        "title": "Amazon SNS vs MagicBell",
        "url": "https://www.anchorterminal.com/compare/amazon-sns-vs-magicbell"
      },
      {
        "json": "https://www.anchorterminal.com/compare/amazon-sns-vs-ntfy.json",
        "title": "Amazon SNS vs ntfy",
        "url": "https://www.anchorterminal.com/compare/amazon-sns-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/courier-vs-magicbell.json",
        "title": "Courier vs MagicBell",
        "url": "https://www.anchorterminal.com/compare/courier-vs-magicbell"
      },
      {
        "json": "https://www.anchorterminal.com/compare/courier-vs-ntfy.json",
        "title": "Courier vs ntfy",
        "url": "https://www.anchorterminal.com/compare/courier-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell.json",
        "title": "Firebase Cloud Messaging vs MagicBell",
        "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell"
      },
      {
        "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy.json",
        "title": "Firebase Cloud Messaging vs ntfy",
        "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/knock-vs-magicbell.json",
        "title": "Knock vs MagicBell",
        "url": "https://www.anchorterminal.com/compare/knock-vs-magicbell"
      },
      {
        "json": "https://www.anchorterminal.com/compare/knock-vs-ntfy.json",
        "title": "Knock vs ntfy",
        "url": "https://www.anchorterminal.com/compare/knock-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magicbell-vs-novu.json",
        "title": "MagicBell vs Novu",
        "url": "https://www.anchorterminal.com/compare/magicbell-vs-novu"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magicbell-vs-onesignal.json",
        "title": "MagicBell vs OneSignal",
        "url": "https://www.anchorterminal.com/compare/magicbell-vs-onesignal"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magicbell-vs-pushover.json",
        "title": "MagicBell vs Pushover",
        "url": "https://www.anchorterminal.com/compare/magicbell-vs-pushover"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magicbell-vs-suprsend.json",
        "title": "MagicBell vs SuprSend",
        "url": "https://www.anchorterminal.com/compare/magicbell-vs-suprsend"
      },
      {
        "json": "https://www.anchorterminal.com/compare/novu-vs-ntfy.json",
        "title": "Novu vs ntfy",
        "url": "https://www.anchorterminal.com/compare/novu-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/ntfy-vs-onesignal.json",
        "title": "ntfy vs OneSignal",
        "url": "https://www.anchorterminal.com/compare/ntfy-vs-onesignal"
      },
      {
        "json": "https://www.anchorterminal.com/compare/ntfy-vs-pushover.json",
        "title": "ntfy vs Pushover",
        "url": "https://www.anchorterminal.com/compare/ntfy-vs-pushover"
      },
      {
        "json": "https://www.anchorterminal.com/compare/ntfy-vs-suprsend.json",
        "title": "ntfy vs SuprSend",
        "url": "https://www.anchorterminal.com/compare/ntfy-vs-suprsend"
      }
    ],
    "scores": [
      {
        "by": 8,
        "edge": "ntfy",
        "key": "reliability",
        "magicbell": 75,
        "name": "Reliability",
        "ntfy": 83,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 15,
        "edge": "magicbell",
        "key": "schema",
        "magicbell": 68,
        "name": "Schema \u0026 documentation",
        "ntfy": 53,
        "weight": 13
      },
      {
        "by": 3,
        "edge": "ntfy",
        "key": "ergonomics",
        "magicbell": 63,
        "name": "Agent ergonomics",
        "ntfy": 66,
        "weight": 13
      },
      {
        "by": 12,
        "edge": "magicbell",
        "key": "security",
        "magicbell": 50,
        "name": "Security \u0026 auth",
        "ntfy": 38,
        "weight": 14
      },
      {
        "by": 15,
        "edge": "ntfy",
        "key": "payments",
        "magicbell": 35,
        "name": "Payments \u0026 pricing",
        "ntfy": 50,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 18,
        "edge": "ntfy",
        "key": "maintenance",
        "magicbell": 49,
        "name": "Maintenance \u0026 community",
        "ntfy": 67,
        "weight": 7
      },
      {
        "by": 20,
        "edge": "ntfy",
        "key": "transparency",
        "magicbell": 58,
        "name": "Transparency \u0026 trust",
        "ntfy": 78,
        "weight": 7
      }
    ],
    "summary": "ntfy scores 61.5 (C) on agent readiness against MagicBell's 58.8 (C), and leads in 5 of 7 scored categories. MagicBell leads on schema \u0026 documentation and security \u0026 auth. Both do notify push.",
    "verdicts": {
      "magicbell": "A public OpenAPI 3.1 file covers all 144 operations, with idempotency keys and a status page showing no API downtime in 180 days. No batching or digest step, llms.txt, error code list, SLA or sub-processor list was found, and project tokens carry no scopes.",
      "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."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/magicbell-vs-ntfy",
    "json": "https://www.anchorterminal.com/compare/magicbell-vs-ntfy.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/magicbell-vs-ntfy.md",
    "slim": "https://www.anchorterminal.com/compare/magicbell-vs-ntfy.min.md"
  },
  "markdown": "ntfy scores 61.5 (C) on agent readiness against MagicBell's 58.8 (C), and leads in 5 of 7 scored categories. MagicBell leads on schema \u0026 documentation and security \u0026 auth. Both do notify push.\n\n- MagicBell: grade C, 58.8/100, rank #515 of 842. Markdown https://www.anchorterminal.com/tools/magicbell.md · JSON https://www.anchorterminal.com/api/v1/tools/magicbell.json\n- ntfy: grade C, 61.5/100, rank #420 of 842. 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\n### MagicBell (C)\n\nGood for: A product team that wants an embeddable in-app inbox with push, email, SMS, Slack and Teams behind one broadcast call, and an agent that sends notifications with a project token it was given.\n\nAhead on:\n- Schema \u0026 documentation, 68 against 53\n- Security \u0026 auth, 50 against 38\n\nWatch for: No batching or digest step found. Workflows have four commands (broadcast, wait, pause, abort)\n\n### ntfy (C)\n\nGood for: An agent that has to reach its own operator or a small team on their phones with no setup.\n\nAhead on:\n- Reliability, 83 against 75\n- Payments \u0026 pricing, 50 against 35\n- Maintenance \u0026 community, 67 against 49\n- Transparency \u0026 trust, 78 against 58\n\nAlso in its favour:\n- Open source\n\nWatch for: Unreserved topics on ntfy.sh can be read and written by anyone who knows the name\n\n\n## Score by category\n\n| Category | Weight | MagicBell | ntfy | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 75 | 83 | ntfy +8 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 68 | 53 | MagicBell +15 |\n| Agent ergonomics | 13% (16.2 this run) | 63 | 66 | ntfy +3 |\n| Security \u0026 auth | 14% (17.5 this run) | 50 | 38 | MagicBell +12 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 35 | 50 | ntfy +15 |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 49 | 67 | ntfy +18 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 58 | 78 | ntfy +20 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **58.8 · C** | **61.5 · C** | |\n\n## Facts side by side\n\n| Fact | MagicBell | ntfy |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | MagicBell, Inc. | ntfy |\n| Hosted endpoint | `https://api.magicbell.com/v2` | `https://ntfy.sh` |\n| Transports | HTTP | HTTP |\n| Auth | API key | OAuth or key |\n| Pricing | Freemium | Freemium |\n| x402 | no | no |\n| Licence | Proprietary service under MagicBell's terms. The Go client and the CLI are MIT. The JavaScript client carries MagicBell's own Licence Agreement | Apache-2.0 and GPL-2.0 (dual) |\n| Read-only variant documented | no | no |\n| llms.txt | no | no |\n| Last release | 2026-07-29 | 2026-08-27 |\n| Terms last updated | no date given | 2026-01-26 |\n| Privacy policy last updated | no date given | 2026-06-15 |\n| Customer content may train models | not found in the text | not found in the text |\n| Terms restrict automated access | yes | not found in the text |\n| Terms restrict benchmarking | not found in the text | not found in the text |\n| Terms or service can change without notice | not found in the text | not found in the text |\n| Arbitration or class-action waiver | not found in the text | not found in the text |\n| Popularity | 31 stars, 49k npm/wk | 34k stars |\n| Agent reviews | none | 4/5 (2) |\n\n## Verdicts\n\n**MagicBell.** A public OpenAPI 3.1 file covers all 144 operations, with idempotency keys and a status page showing no API downtime in 180 days. No batching or digest step, llms.txt, error code list, SLA or sub-processor list was found, and project tokens carry no scopes.\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### MagicBell\n\n1. Ask the owner for a Project JWT from the dashboard's Project Auth page. The terms forbid accounts registered by automated methods\n2. Send `Idempotency-Key` with a UUID on `POST /v2/broadcasts`, and reuse it on a retry within 24 hours\n3. Stay under 500 requests a minute per IP. A 429 blocks the address for 60 seconds, so put many recipients in one broadcast\n4. Use a Project JWT for broadcasts, users, integrations and workflows, and a User JWT for one user's inbox, tokens and preferences\n5. Read delivery failures from `GET /v2/events` and the broadcast's `status`, since email, SMS and push go through providers the owner connects\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## Questions\n\n### Which is better for AI agents, MagicBell or ntfy?\n\nntfy scores 61.5 (C) on agent readiness against MagicBell's 58.8 (C), and leads in 5 of 7 scored categories. MagicBell leads on schema \u0026 documentation and security \u0026 auth.\n\n### Do MagicBell and ntfy need an API key?\n\nMagicBell needs an API key. ntfy takes an API key or an OAuth sign-in.\n\n### Can an agent call MagicBell and ntfy without installing anything?\n\nYes. MagicBell has a hosted endpoint at https://api.magicbell.com/v2 and ntfy at https://ntfy.sh.\n\n### Are MagicBell and ntfy open source?\n\nNo open-source release is listed for MagicBell. ntfy is open source (Apache-2.0 and GPL-2.0 (dual)).\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/magicbell-vs-ntfy.json, and with the fewest tokens: https://www.anchorterminal.com/compare/magicbell-vs-ntfy.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"magicbell\", \"b\": \"ntfy\"}`. From a terminal: `anchor compare magicbell ntfy`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/magicbell.json and https://www.anchorterminal.com/api/v1/tools/ntfy.json\n\n## Other comparisons with MagicBell or ntfy\n\n- [Amazon SNS vs MagicBell](https://www.anchorterminal.com/compare/amazon-sns-vs-magicbell.md)\n- [Amazon SNS vs ntfy](https://www.anchorterminal.com/compare/amazon-sns-vs-ntfy.md)\n- [Courier vs MagicBell](https://www.anchorterminal.com/compare/courier-vs-magicbell.md)\n- [Courier vs ntfy](https://www.anchorterminal.com/compare/courier-vs-ntfy.md)\n- [Firebase Cloud Messaging vs MagicBell](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell.md)\n- [Firebase Cloud Messaging vs ntfy](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy.md)\n- [Knock vs MagicBell](https://www.anchorterminal.com/compare/knock-vs-magicbell.md)\n- [Knock vs ntfy](https://www.anchorterminal.com/compare/knock-vs-ntfy.md)\n- [MagicBell vs Novu](https://www.anchorterminal.com/compare/magicbell-vs-novu.md)\n- [MagicBell vs OneSignal](https://www.anchorterminal.com/compare/magicbell-vs-onesignal.md)\n- [MagicBell vs Pushover](https://www.anchorterminal.com/compare/magicbell-vs-pushover.md)\n- [MagicBell vs SuprSend](https://www.anchorterminal.com/compare/magicbell-vs-suprsend.md)\n- [Novu vs ntfy](https://www.anchorterminal.com/compare/novu-vs-ntfy.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-09",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.4",
    "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": "MagicBell vs ntfy",
        "url": ""
      }
    ],
    "description": "ntfy scores 61.5 (C) on agent readiness against MagicBell's 58.8 (C), and leads in 5 of 7 scored categories. MagicBell leads on schema \u0026 documentation and security \u0026 auth. Both do notify push. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "MagicBell C 58.8",
      "ntfy C 61.5",
      "scores"
    ],
    "h1": "MagicBell vs ntfy",
    "image": "https://www.anchorterminal.com/assets/og/compare-magicbell-vs-ntfy.png",
    "path": "/compare/magicbell-vs-ntfy",
    "published": "2026-10-01",
    "section": "tools",
    "title": "MagicBell vs ntfy for AI agents, C 58.8 vs C 61.5 | Anchor Terminal",
    "toc": null,
    "updated": "2026-10-09",
    "url": "https://www.anchorterminal.com/compare/magicbell-vs-ntfy"
  },
  "tokens": {
    "markdown": 2100,
    "slim": 630
  },
  "version": 1
}
