{
  "data": {
    "a": {
      "slug": "firebase-cloud-messaging",
      "name": "Firebase Cloud Messaging",
      "vendor": "Google",
      "vendorUrl": "https://firebase.google.com/products/cloud-messaging",
      "kind": "http-api",
      "category": "notifications",
      "summary": "Google's push messaging service for Android, Apple and web apps. A server sends notification or data messages to devices, topics or conditions through the HTTP v1 API or the Firebase Admin SDKs.",
      "url": "https://www.anchorterminal.com/tools/firebase-cloud-messaging",
      "markdownUrl": "https://www.anchorterminal.com/tools/firebase-cloud-messaging.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/firebase-cloud-messaging.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/firebase-cloud-messaging.json",
      "repo": "https://github.com/firebase/firebase-admin-node",
      "license": "Proprietary service under the Google APIs Terms of Service. The Firebase Admin SDKs are Apache-2.0",
      "transports": [
        "http"
      ],
      "remoteUrl": "https://fcm.googleapis.com",
      "packages": [
        {
          "registry": "npm",
          "name": "firebase-admin"
        },
        {
          "registry": "pypi",
          "name": "firebase-admin"
        }
      ],
      "auth": "oauth",
      "authNotes": "OAuth 2.0 bearer token minted from a service account key or Application Default Credentials, with the scope `https://www.googleapis.com/auth/firebase.messaging`. Sending needs the IAM permission `cloudmessaging.messages.create` on the project. Access is self-serve. A person creates the Firebase project and the service account in the console, with no review or sales step.",
      "pricing": "free",
      "pricingNotes": "No charge. The pricing page lists Cloud Messaging as no-cost on the Spark and Blaze plans, and Spark needs no billing account or card, so an agent's owner can start without a contract. The optional BigQuery export of delivery data is billed by BigQuery (https://firebase.google.com/pricing, checked 2026-10-08).",
      "priceSummary": "Free",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the FCM docs, the Discovery document or the pricing page (checked 2026-10-08).",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": null,
        "npmWeekly": 11536195,
        "pypiWeekly": 3790113,
        "asOf": "2026-10-08"
      },
      "docsUrl": "https://firebase.google.com/docs/cloud-messaging",
      "llmsTxt": "https://firebase.google.com/docs/llms.txt",
      "openapi": "https://fcm.googleapis.com/$discovery/rest?version=v1",
      "capabilities": [
        "notify.push"
      ],
      "tags": [
        "hosted",
        "free",
        "push",
        "oauth",
        "llms-txt",
        "typescript",
        "python",
        "java",
        "go",
        "dotnet",
        "mcp",
        "status-page",
        "soc2"
      ],
      "lastRelease": "2026-09-24",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 69.8,
        "grade": "B",
        "agentReady": false,
        "rank": 162,
        "ranked": true,
        "rankOf": 842,
        "categoryRank": 4,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 70,
          "maintenance": 83,
          "payments": 40,
          "reliability": 66,
          "schema": 86,
          "security": 68,
          "transparency": 81
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-08"
        },
        "negative": 0,
        "verdict": "Sending is free at any volume, with a published quota of 600,000 messages a minute per project and documented 429 handling. FCM is push transport only. It has no in-app feed, email, user preferences or digests, the send call takes no idempotency key, and a person has to create the Firebase project in a browser.",
        "bestFor": "The push transport under an app that already holds device registrations, at no charge.",
        "strengths": [
          "No charge for sending on either Firebase plan, and no billing account needed (https://firebase.google.com/pricing)",
          "Default quota of 600,000 messages a minute per project, with 429 responses that carry `retry-after` and written backoff guidance",
          "Short-lived OAuth 2.0 tokens with a `firebase.messaging` scope, and IAM permissions per action such as `cloudmessaging.messages.create`",
          "Public Discovery document (revision 20261006), a docs `llms.txt` and a Markdown twin of every docs page",
          "Dated deprecation notice in September 2026 that gives 12 months before the Instance ID server APIs and device groups stop on 29 September 2027"
        ],
        "weaknesses": [
          "Push transport only. No in-app feed, email, SMS, user preferences, digests or templates",
          "No idempotency key on `messages:send`, so a retried request can reach the device twice",
          "One HTTP request per message. Only the Admin SDKs group up to 500 sends in a call",
          "FCM is absent from Google Cloud's list of services with audit logs, and per-message delivery data needs a BigQuery export",
          "One incident on 1 September 2026 lowered availability in North America for 3 hours 51 minutes, and no SLA names FCM"
        ],
        "agentNotes": [
          "Mint an access token from a service account with the scope `https://www.googleapis.com/auth/firebase.messaging`, then POST to `https://fcm.googleapis.com/v1/projects/\u003cproject-id\u003e/messages:send`",
          "Set `validate_only` to true to test a message or a registration without sending it",
          "On 429 wait for the `retry-after` header, or 60 seconds if it is absent. Retry 500 and 503 with exponential backoff and jitter, and never retry 400, 401, 403 or 404",
          "Drop a registration when the error is `UNREGISTERED` (404). Keep your own record of sends, because a retry after a timeout can produce a duplicate",
          "Target `fid` in new code. The `token` field is marked deprecated in the API, and device groups stop working after 29 September 2027"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 69.8
          }
        ],
        "editorialScores": {
          "ergonomics": 70,
          "maintenance": 83,
          "payments": 40,
          "reliability": 66,
          "schema": 86,
          "security": 68,
          "transparency": 68
        },
        "provenanceScore": 94
      },
      "connect": {
        "install": "npm install firebase-admin   # or: pip install firebase-admin",
        "http": "curl -X POST \"https://fcm.googleapis.com/v1/projects/$FIREBASE_PROJECT_ID/messages:send\" \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"message\":{\"topic\":\"news\",\"notification\":{\"title\":\"Build finished\",\"body\":\"All tests passed\"}}}'",
        "claudeCode": "claude mcp add firebase npx -- -y firebase-tools@latest mcp"
      },
      "letme": {
        "capability": "https://letme.dev/notify.push",
        "tool": "https://letme.dev/firebase-cloud-messaging"
      },
      "sameCompany": [
        "gemini-api",
        "gemini-embedding",
        "vertex-ai-tuning",
        "google-model-armor",
        "google-imagen",
        "google-veo",
        "google-lyria",
        "google-speech-to-text",
        "gemini-live",
        "google-adk",
        "google-secret-manager",
        "google-weather-api",
        "chrome-devtools-mcp",
        "google-maps-platform",
        "google-cloud-translation",
        "google-calendar-api",
        "google-drive-api",
        "gemini-cli",
        "google-search-console",
        "google-ads-api",
        "google-forms",
        "google-sheets-api",
        "gmail-api"
      ],
      "area": "everyday",
      "provenance": {
        "legalEntity": "Google LLC",
        "domain": "google.com",
        "domainRegistered": "1997-09-15",
        "domainNote": "The endpoint is on googleapis.com, Google's API domain. The docs are on firebase.google.com.",
        "endpointOnVendorDomain": true,
        "terms": "https://developers.google.com/terms",
        "privacy": "https://policies.google.com/privacy",
        "statusPage": "https://status.firebase.google.com",
        "changelog": "https://firebase.google.com/support/releases",
        "securityTxt": "valid",
        "checked": "2026-10-08",
        "notes": [
          "firebase.google.com/terms, last modified 24 September 2026, places Cloud Messaging under the Google APIs Terms of Service and the Firebase Data Processing and Security Terms.",
          "The Google APIs Terms of Service were last modified on 9 November 2021, name Google LLC of Mountain View, California, and choose California law.",
          "Google's privacy policy is effective 1 October 2026. Firebase's own privacy and security page, last modified 15 September 2026, gives the per-service data and retention table.",
          "www.google.com/.well-known/security.txt expires on 2030-04-01. firebase.google.com/.well-known/security.txt returns 404.",
          "The registration date of google.com is taken from our earlier Google listings and was not looked up again today."
        ],
        "score": 94
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/firebase-cloud-messaging.json",
      "live": {
        "slug": "firebase-cloud-messaging",
        "probe": {
          "target": "https://fcm.googleapis.com",
          "method": "get",
          "lastAt": "2026-10-09T10:14:14.794168889Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 37,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 39,
          "p95ms24h": 99,
          "samples24h": 28,
          "samples30d": 28,
          "days": [
            {
              "date": "2026-10-09",
              "probes": 28,
              "ok": 28
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.firebase.google.com",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-09T07:57:54.993043607Z"
        },
        "updatedAt": "2026-10-09T10:14:14.794168889Z"
      }
    },
    "answer": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against MagicBell's 58.8 (C), and leads in 6 of 7 scored categories. MagicBell leads on reliability.",
    "b": {
      "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-09T10:14:19.706231467Z",
          "lastOk": true,
          "lastStatus": 405,
          "lastMs": 61,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 72,
          "p95ms24h": 108,
          "samples24h": 28,
          "samples30d": 28,
          "days": [
            {
              "date": "2026-10-09",
              "probes": 28,
              "ok": 28
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.magicbell.com",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-09T07:58:08.412277068Z"
        },
        "updatedAt": "2026-10-09T10:14:19.706231467Z"
      }
    },
    "facts": [
      {
        "a": "HTTP API",
        "b": "HTTP API",
        "name": "Kind"
      },
      {
        "a": "Google",
        "b": "MagicBell, Inc.",
        "name": "Vendor"
      },
      {
        "a": "https://fcm.googleapis.com",
        "b": "https://api.magicbell.com/v2",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP",
        "b": "HTTP",
        "name": "Transports"
      },
      {
        "a": "OAuth",
        "b": "API key",
        "name": "Auth"
      },
      {
        "a": "Free",
        "b": "Freemium",
        "name": "Pricing"
      },
      {
        "a": "no",
        "b": "no",
        "name": "x402"
      },
      {
        "a": "Proprietary service under the Google APIs Terms of Service. The Firebase Admin SDKs are Apache-2.0",
        "b": "Proprietary service under MagicBell's terms. The Go client and the CLI are MIT. The JavaScript client carries MagicBell's own Licence Agreement",
        "name": "Licence"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "yes",
        "b": "no",
        "name": "llms.txt"
      },
      {
        "a": "2026-09-24",
        "b": "2026-07-29",
        "name": "Last release"
      },
      {
        "a": "2021-11-09",
        "b": "no date given",
        "name": "Terms last updated"
      },
      {
        "a": "2026-10-01",
        "b": "no date given",
        "name": "Privacy policy last updated"
      },
      {
        "a": "yes",
        "b": "not found in the text",
        "name": "Customer content may train models"
      },
      {
        "a": "yes",
        "b": "yes",
        "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": "11.5M npm/wk, 3.8M PyPI/wk",
        "b": "31 stars, 49k npm/wk",
        "name": "Popularity"
      }
    ],
    "faq": [
      {
        "answer": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against MagicBell's 58.8 (C), and leads in 6 of 7 scored categories. MagicBell leads on reliability.",
        "question": "Which is better for AI agents, Firebase Cloud Messaging or MagicBell?"
      },
      {
        "answer": "Firebase Cloud Messaging uses an OAuth sign-in. MagicBell needs an API key.",
        "question": "Do Firebase Cloud Messaging and MagicBell need an API key?"
      },
      {
        "answer": "Yes. Firebase Cloud Messaging has a hosted endpoint at https://fcm.googleapis.com and MagicBell at https://api.magicbell.com/v2.",
        "question": "Can an agent call Firebase Cloud Messaging and MagicBell without installing anything?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Schema \u0026 documentation, 86 against 68",
          "Agent ergonomics, 70 against 63",
          "Security \u0026 auth, 68 against 50",
          "Payments \u0026 pricing, 40 against 35",
          "Maintenance \u0026 community, 83 against 49",
          "Transparency \u0026 trust, 81 against 58"
        ],
        "also": null,
        "goodFor": "The push transport under an app that already holds device registrations, at no charge.",
        "slug": "firebase-cloud-messaging",
        "watchFor": "Push transport only. No in-app feed, email, SMS, user preferences, digests or templates"
      },
      {
        "aheadOn": [
          "Reliability, 75 against 66"
        ],
        "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)"
      }
    ],
    "job": {
      "capability": "notify.push",
      "name": "Notify push"
    },
    "others": [
      {
        "json": "https://www.anchorterminal.com/compare/amazon-sns-vs-firebase-cloud-messaging.json",
        "title": "Amazon SNS vs Firebase Cloud Messaging",
        "url": "https://www.anchorterminal.com/compare/amazon-sns-vs-firebase-cloud-messaging"
      },
      {
        "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/courier-vs-firebase-cloud-messaging.json",
        "title": "Courier vs Firebase Cloud Messaging",
        "url": "https://www.anchorterminal.com/compare/courier-vs-firebase-cloud-messaging"
      },
      {
        "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/firebase-cloud-messaging-vs-knock.json",
        "title": "Firebase Cloud Messaging vs Knock",
        "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-knock"
      },
      {
        "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu.json",
        "title": "Firebase Cloud Messaging vs Novu",
        "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu"
      },
      {
        "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/firebase-cloud-messaging-vs-onesignal.json",
        "title": "Firebase Cloud Messaging vs OneSignal",
        "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-onesignal"
      },
      {
        "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pushover.json",
        "title": "Firebase Cloud Messaging vs Pushover",
        "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pushover"
      },
      {
        "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-suprsend.json",
        "title": "Firebase Cloud Messaging vs SuprSend",
        "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-suprsend"
      },
      {
        "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/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-ntfy.json",
        "title": "MagicBell vs ntfy",
        "url": "https://www.anchorterminal.com/compare/magicbell-vs-ntfy"
      },
      {
        "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"
      }
    ],
    "scores": [
      {
        "by": 9,
        "edge": "magicbell",
        "firebase-cloud-messaging": 66,
        "key": "reliability",
        "magicbell": 75,
        "name": "Reliability",
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 18,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 86,
        "key": "schema",
        "magicbell": 68,
        "name": "Schema \u0026 documentation",
        "weight": 13
      },
      {
        "by": 7,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 70,
        "key": "ergonomics",
        "magicbell": 63,
        "name": "Agent ergonomics",
        "weight": 13
      },
      {
        "by": 18,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 68,
        "key": "security",
        "magicbell": 50,
        "name": "Security \u0026 auth",
        "weight": 14
      },
      {
        "by": 5,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 40,
        "key": "payments",
        "magicbell": 35,
        "name": "Payments \u0026 pricing",
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 34,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 83,
        "key": "maintenance",
        "magicbell": 49,
        "name": "Maintenance \u0026 community",
        "weight": 7
      },
      {
        "by": 23,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 81,
        "key": "transparency",
        "magicbell": 58,
        "name": "Transparency \u0026 trust",
        "weight": 7
      }
    ],
    "summary": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against MagicBell's 58.8 (C), and leads in 6 of 7 scored categories. MagicBell leads on reliability. Both do notify push.",
    "verdicts": {
      "firebase-cloud-messaging": "Sending is free at any volume, with a published quota of 600,000 messages a minute per project and documented 429 handling. FCM is push transport only. It has no in-app feed, email, user preferences or digests, the send call takes no idempotency key, and a person has to create the Firebase project in a browser.",
      "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."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell",
    "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell.md",
    "slim": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell.min.md"
  },
  "markdown": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against MagicBell's 58.8 (C), and leads in 6 of 7 scored categories. MagicBell leads on reliability. Both do notify push.\n\n- Firebase Cloud Messaging: grade B, 69.8/100, rank #162 of 842. Markdown https://www.anchorterminal.com/tools/firebase-cloud-messaging.md · JSON https://www.anchorterminal.com/api/v1/tools/firebase-cloud-messaging.json\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\n## Which one, for what\n\n### Firebase Cloud Messaging (B)\n\nGood for: The push transport under an app that already holds device registrations, at no charge.\n\nAhead on:\n- Schema \u0026 documentation, 86 against 68\n- Agent ergonomics, 70 against 63\n- Security \u0026 auth, 68 against 50\n- Payments \u0026 pricing, 40 against 35\n- Maintenance \u0026 community, 83 against 49\n- Transparency \u0026 trust, 81 against 58\n\nWatch for: Push transport only. No in-app feed, email, SMS, user preferences, digests or templates\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- Reliability, 75 against 66\n\nWatch for: No batching or digest step found. Workflows have four commands (broadcast, wait, pause, abort)\n\n\n## Score by category\n\n| Category | Weight | Firebase Cloud Messaging | MagicBell | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 66 | 75 | MagicBell +9 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 86 | 68 | Firebase Cloud Messaging +18 |\n| Agent ergonomics | 13% (16.2 this run) | 70 | 63 | Firebase Cloud Messaging +7 |\n| Security \u0026 auth | 14% (17.5 this run) | 68 | 50 | Firebase Cloud Messaging +18 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 40 | 35 | Firebase Cloud Messaging +5 |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 83 | 49 | Firebase Cloud Messaging +34 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 81 | 58 | Firebase Cloud Messaging +23 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **69.8 · B** | **58.8 · C** | |\n\n## Facts side by side\n\n| Fact | Firebase Cloud Messaging | MagicBell |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Google | MagicBell, Inc. |\n| Hosted endpoint | `https://fcm.googleapis.com` | `https://api.magicbell.com/v2` |\n| Transports | HTTP | HTTP |\n| Auth | OAuth | API key |\n| Pricing | Free | Freemium |\n| x402 | no | no |\n| Licence | Proprietary service under the Google APIs Terms of Service. The Firebase Admin SDKs are Apache-2.0 | Proprietary service under MagicBell's terms. The Go client and the CLI are MIT. The JavaScript client carries MagicBell's own Licence Agreement |\n| Read-only variant documented | no | no |\n| llms.txt | yes | no |\n| Last release | 2026-09-24 | 2026-07-29 |\n| Terms last updated | 2021-11-09 | no date given |\n| Privacy policy last updated | 2026-10-01 | no date given |\n| Customer content may train models | yes | not found in the text |\n| Terms restrict automated access | yes | yes |\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 | 11.5M npm/wk, 3.8M PyPI/wk | 31 stars, 49k npm/wk |\n\n## Verdicts\n\n**Firebase Cloud Messaging.** Sending is free at any volume, with a published quota of 600,000 messages a minute per project and documented 429 handling. FCM is push transport only. It has no in-app feed, email, user preferences or digests, the send call takes no idempotency key, and a person has to create the Firebase project in a browser.\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## Before you call either\n\n### Firebase Cloud Messaging\n\n1. Mint an access token from a service account with the scope `https://www.googleapis.com/auth/firebase.messaging`, then POST to `https://fcm.googleapis.com/v1/projects/\u003cproject-id\u003e/messages:send`\n2. Set `validate_only` to true to test a message or a registration without sending it\n3. On 429 wait for the `retry-after` header, or 60 seconds if it is absent. Retry 500 and 503 with exponential backoff and jitter, and never retry 400, 401, 403 or 404\n4. Drop a registration when the error is `UNREGISTERED` (404). Keep your own record of sends, because a retry after a timeout can produce a duplicate\n5. Target `fid` in new code. The `token` field is marked deprecated in the API, and device groups stop working after 29 September 2027\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## Questions\n\n### Which is better for AI agents, Firebase Cloud Messaging or MagicBell?\n\nFirebase Cloud Messaging scores 69.8 (B) on agent readiness against MagicBell's 58.8 (C), and leads in 6 of 7 scored categories. MagicBell leads on reliability.\n\n### Do Firebase Cloud Messaging and MagicBell need an API key?\n\nFirebase Cloud Messaging uses an OAuth sign-in. MagicBell needs an API key.\n\n### Can an agent call Firebase Cloud Messaging and MagicBell without installing anything?\n\nYes. Firebase Cloud Messaging has a hosted endpoint at https://fcm.googleapis.com and MagicBell at https://api.magicbell.com/v2.\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell.json, and with the fewest tokens: https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"firebase-cloud-messaging\", \"b\": \"magicbell\"}`. From a terminal: `anchor compare firebase-cloud-messaging magicbell`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/firebase-cloud-messaging.json and https://www.anchorterminal.com/api/v1/tools/magicbell.json\n\n## Other comparisons with Firebase Cloud Messaging or MagicBell\n\n- [Amazon SNS vs Firebase Cloud Messaging](https://www.anchorterminal.com/compare/amazon-sns-vs-firebase-cloud-messaging.md)\n- [Amazon SNS vs MagicBell](https://www.anchorterminal.com/compare/amazon-sns-vs-magicbell.md)\n- [Courier vs Firebase Cloud Messaging](https://www.anchorterminal.com/compare/courier-vs-firebase-cloud-messaging.md)\n- [Courier vs MagicBell](https://www.anchorterminal.com/compare/courier-vs-magicbell.md)\n- [Firebase Cloud Messaging vs Knock](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-knock.md)\n- [Firebase Cloud Messaging vs Novu](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu.md)\n- [Firebase Cloud Messaging vs ntfy](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy.md)\n- [Firebase Cloud Messaging vs OneSignal](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-onesignal.md)\n- [Firebase Cloud Messaging vs Pushover](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pushover.md)\n- [Firebase Cloud Messaging vs SuprSend](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-suprsend.md)\n- [Knock vs MagicBell](https://www.anchorterminal.com/compare/knock-vs-magicbell.md)\n- [MagicBell vs Novu](https://www.anchorterminal.com/compare/magicbell-vs-novu.md)\n- [MagicBell vs ntfy](https://www.anchorterminal.com/compare/magicbell-vs-ntfy.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",
  "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": "Firebase Cloud Messaging vs MagicBell",
        "url": ""
      }
    ],
    "description": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against MagicBell's 58.8 (C), and leads in 6 of 7 scored categories. MagicBell leads on reliability. Both do notify push. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "Firebase Cloud Messaging B 69.8",
      "MagicBell C 58.8",
      "scores"
    ],
    "h1": "Firebase Cloud Messaging vs MagicBell",
    "image": "https://www.anchorterminal.com/assets/og/compare-firebase-cloud-messaging-vs-magicbell.png",
    "path": "/compare/firebase-cloud-messaging-vs-magicbell",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Firebase Cloud Messaging vs MagicBell for AI agents, B 69.8 vs C 58.8",
    "toc": null,
    "updated": "2026-10-09",
    "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell"
  },
  "tokens": {
    "markdown": 2350,
    "slim": 680
  },
  "version": 1
}
